Mysql-Übergabe fehlerhaft?

nordi

Erfahrenes Mitglied
Hallo, ich habe folgendes Problem! Ich habe eine CSV-Datei und will diese in eine Mysql-Datenbank abspeichern. Aber irgendwie übernimmt er die Werte aus der CSV-Datei nicht. Auf dem Server sind alle Rechte richtig gesetzt, ich glaube, dass da nur ein kleiner Fehler drinnen sein sollte, den ich aber nicht finde!? Könnt ihr mir da vielleicht helfen? Hier das Skript zu von CSV zu Mysql:

PHP:
<?php 

include("../../config/config.php");

if(isset($dateiname)){ 
if(!is_uploaded_file($dateiname)){ 
echo "FEHLER"; 
exit; 
} 
$uploadname="./excel/$dateiname_name"; 
move_uploaded_file($dateiname, $uploadname); 
printf("<b>Upload erfolgreich!</b><br>Die Datei <b>%s</b> wurde online gestellt in den Ordner %s und <br>in die Artists-Database eingetragen<br>\n", 
$dateiname_name, $uploadname); 
} 
$dateiname2="excel/cliplist.csv";
$datei=fopen($dateiname2,"r");
$daten=fread($datei,filesize($dateiname2));
fclose($datei);

$datensaetze=explode("\n",$daten);

for($i=0;$i<sizeof($datensaetze);$i++) {
     $datenfeld[$i]=explode(";",$datensaetze[$i]);
     }
$connect = mysql_connect($dbhost, $dbuser, $dbpass) or die("Verbindung zum Server nicht hergestellt!<br>");
$selectDB = mysql_select_db($dbtable) or die("Konnte die Datenbank <b>$dbName</b> nicht auswählen");

for($i=0;$i<sizeof($datensaetze);$i++) {
     $datenfeld[$i]=explode(";",$datensaetze[$i]);


mysql_query("INSERT INTO $artists (id, title, artist, duration, agent, category, code, filename, info, web, unity, bw, musicartist, musictitle, musiclabel, musicalbum, musicduration, generic, comment) VALUES('".$datenfeld[$i][0]."','".$datenfeld[$i][1]."','".$datenfeld[$i][2]."','".$datenfeld[$i][3]."','".$datenfeld[$i][4]."','".$datenfeld[$i][5]."','".$datenfeld[$i][6]."','".$datenfeld[$i][7]."','".$datenfeld[$i][8]."','".$datenfeld[$i][9]."','".$datenfeld[$i][10]."','".$datenfeld[$i][11]."','".$datenfeld[$i][12]."','".$datenfeld[$i][13]."','".$datenfeld[$i][14]."','".$datenfeld[$i][19]."')");

mysql_close();
    
?>

Vielen Dank im voraus! Im Anhang findet ihr die CSV-Datei.
 

Anhänge

2 Sachen fallen mir spontan auf:

- Die for-Schleife wird 2x ausgeführt. Warum dies?

-" mysql_query("INSERT INTO $artists .... " <--- Heisst deine Tabelle wirklich $artists?



Gruß
 
Bei näherer Betrachtung würd ich folgendes vorschlagen:

Code:
<?php  

include("../../config/config.php"); 

if(isset($dateiname)){  
if(!is_uploaded_file($dateiname)){  
echo "FEHLER";  
exit;  
}  
$uploadname="./excel/$dateiname_name";  
move_uploaded_file($dateiname, $uploadname);  
printf("<b>Upload erfolgreich!</b><br>Die Datei <b>%s</b> wurde online gestellt in den Ordner %s und <br>in die Artists-Database eingetragen<br>\n",  
$dateiname_name, $uploadname);  
}  
$dateiname2="excel/cliplist.csv"; 
$datei=fopen($dateiname2,"r"); 
$daten=fread($datei,filesize($dateiname2)); 
fclose($datei); 

$datensaetze=explode("\n",$daten); 

$connect = mysql_connect($dbhost, $dbuser, $dbpass) or die("Verbindung zum Server nicht hergestellt!<br>"); 
$selectDB = mysql_select_db($dbtable) or die("Konnte die Datenbank <b>$dbName</b> nicht auswählen"); 

for($i=0;$i<count($datensaetze);$i++)
{ 
  $datenfeld[]=explode(";",$datensaetze[$i]); 
  mysql_query("INSERT INTO table(id, title, artist, duration, agent, category, code, filename, info, web, unity, bw, musicartist, musictitle, musiclabel, musicalbum, musicduration, generic, comment) VALUES('".$datenfeld[0]."','".$datenfeld[1]."','".$datenfeld[2]."','".$datenfeld[3]."','".$datenfeld[4]."','".$datenfeld[5]."','".$datenfeld[6]."','".$datenfeld[7]."','".$datenfeld[8]."','".$datenfeld[9]."','".$datenfeld[10]."','".$datenfeld[11]."','".$datenfeld[12]."','".$datenfeld[13]."','".$datenfeld[14]."','".$datenfeld[15]."','".$datenfeld[16]."','".$datenfeld[17]."','".$datenfeld[18]."','".$datenfeld[19]."'')"); 
}

mysql_close(); 
?>


Habs aber nicht ausprobiert.


Gruß.

EDIT: Ein Fehler war schonmal, dass du in 20 Felder Inserten willst, aber nur 15 Values angibst.
 
Zuletzt bearbeitet:
Hi, danke erstmal für die Hilfe! Hab deinen Code ausprobiert, klappt aber nicht! Kann das evtl. an der CSV-Datei liegen? Hast du mal reingeguckt? Oder brauchst du die XXXXXXXXXXXXXXXxls datei?
 
Habs grad selbst ausprobiert und muss feststellen, dass keine Daten aus der .csv ausgelesen werden. Ich bastel mal was und meld mich dann wieder.

Gruß
 
Dank dir! Um dir evlt. etwas arbeit zu ersparen, hier mal die MySQL-Struktur:

HTML:
CREATE TABLE IF NOT EXISTS `artists` (
  `id` int(3) NOT NULL auto_increment,
  `title` varchar(255) NOT NULL default '',
  `artist` varchar(255) NOT NULL default '',
  `duration` varchar(255) NOT NULL default '',
  `agent` varchar(255) NOT NULL default '',
  `category` varchar(255) NOT NULL default '',
  `code` varchar(255) NOT NULL default '',
  `filename` varchar(255) NOT NULL default '',
  `info` varchar(255) NOT NULL default '',
  `web` varchar(255) NOT NULL default '',
  `unity` varchar(255) NOT NULL default '',
  `bw` varchar(255) NOT NULL default '',
  `musicartist` varchar(255) NOT NULL default '',
  `musictitle` varchar(255) NOT NULL default '',
  `musiclabel` varchar(255) NOT NULL default '',
  `musicalbum` varchar(255) NOT NULL default '',
  `musicduration` varchar(255) NOT NULL default '',
  `generic` varchar(255) NOT NULL default '',
  `comment` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
 
das Problem liegt darin, dass deine csv fehlerhaft ist. Es existiert keine Zeilentrennung (d.h., dass die ganze csv aus einer Zeile besteht.) Probier mal folögendes aus und du wirst es sehen:

PHP:
<?php  
$dateiname2="cliplist.csv"; 
$datei=fopen($dateiname2,'r'); 

while(($Daten = fgetcsv($datei, 100000, ";")) != FALSE)
{
  echo "<font color='#FF0000'>ZEILENANFANG</font><br>";

  for($i=0;$i<count($Daten);$i++)
  {
    echo $Daten[$i]." <--> ";
  }

  echo "<br><font color='#FF0000'>ZEILENENDE</font><br>";
}
fclose($datei);
?>


Ein weiterer Fehler war das Einlesen der csv allgemein. Im obrigen Beispiel siehst du nun, wie das Einlesen richtig funktioniert. (statt "fread()" muss man "fgetcsv()" benutzen).


Wenn also die csv in Ordnung ist, dann sollte dein Problem folgendermaßen gelöst sein:

PHP:
<?php  

include("../../config/config.php"); 

if(isset($dateiname)){  
if(!is_uploaded_file($dateiname)){  
echo "FEHLER";  
exit;  
}  
$uploadname="./excel/$dateiname_name";  
move_uploaded_file($dateiname, $uploadname);  
printf("<b>Upload erfolgreich!</b><br>Die Datei <b>%s</b> wurde online gestellt in den Ordner %s und <br>in die Artists-Database eingetragen<br>\n",  
$dateiname_name, $uploadname);  
}  

$connect = mysql_connect($dbhost, $dbuser, $dbpass) or die("Verbindung zum Server nicht hergestellt!<br>"); 
$selectDB = mysql_select_db($dbtable) or die("Konnte die Datenbank <b>$dbName</b> nicht auswählen"); 

$dateiname2="excel/cliplist.csv"; 
$datei=fopen($dateiname2,"r"); 

while(($datenfeld= fgetcsv($datei, 100000)) != FALSE)
{
  mysql_query("INSERT INTO table(id, title, artist, duration, agent, category, code, filename, info, web, unity, bw, musicartist, musictitle, musiclabel, musicalbum, musicduration, generic, comment) VALUES('".$datenfeld[0]."','".$datenfeld[1]."','".$datenfeld[2]."','".$datenfeld[3]."','".$datenfeld[4]."','".$datenfeld[5]."','".$datenfeld[6]."','".$datenfeld[7]."','".$datenfeld[8]."','".$datenfeld[9]."','".$datenfeld[10]."','".$datenfeld[11]."','".$datenfeld[12]."','".$datenfeld[13]."','".$datenfeld[14]."','".$datenfeld[15]."','".$datenfeld[16]."','".$datenfeld[17]."','".$datenfeld[18]."','".$datenfeld[19]."'')"); 
}

fclose($datei); 
mysql_close(); 
?>


Gruß
 
Zuletzt bearbeitet:
Super, vielen Dank! Also ich habe die xls ganz normal mit Excel (Office for Mac 2008) als CSV abgespeichert. Kann man da was falsch machen? Wüsste nicht, wie ich das sonst machen soll!
 
Vermutlich kann man Fehler machen, aber mit Mac kenn ich mich nicht aus. ;-)

das Problem deiner csv ist der Dateityp "CSV(Trennzeichen-getrennt)(*csv)". Damit gibts kein Zeilenende.

Ich hab deine csv mal unter dem Datentyp "CSV(MS-DOS)(*csv)" abgespeichert und angehangen. damit funktioniert es. Die Zeilen werden korrekt eingelesen.


Gruß.
 

Anhänge

Hi, danke für deine ganze Hilfe! Ich hab dein Skript 1 zu 1 übernommen und deine CSV-Datei hochgeladen. Bei mir füllt er die Datenbank nicht mit den Werten!? Hab natürlich bei der MySQL-Abfrage bei dem Skript "table" in "artists" umgeändert. Aber die Werte werden nicht übernommen! Wie kann das sein? Klappt das bei dir ohne Probleme? Hier nochmal mein Skript mit Eingabeformular:

Code:
<form action="<?php print $PHP_SELF ?>" method="post" enctype="multipart/form-data">  
<input type="file" name="dateiname">
<br />
<br /> 
<input name="send!" type="submit" id="send!" value="File Hochladen"> 
</form> 
<?php   

include("../../config/config.php");  

if(isset($dateiname)){   
if(!is_uploaded_file($dateiname)){   
echo "FEHLER";   
exit;   
}   
$uploadname="./excel/$dateiname_name";   
move_uploaded_file($dateiname, $uploadname);   
printf("<b>Upload erfolgreich!</b><br>Die Datei <b>%s</b> wurde online gestellt in den Ordner %s und <br>in die Artists-Database eingetragen<br>\n",   
$dateiname_name, $uploadname);   
}   

$connect = mysql_connect($dbhost, $dbuser, $dbpass) or die("Verbindung zum Server nicht hergestellt!<br>");  
$selectDB = mysql_select_db($dbtable) or die("Konnte die Datenbank <b>$dbName</b> nicht auswählen");  

$dateiname2="excel/cliplist.csv";  
$datei=fopen($dateiname2,"r");  

while(($datenfeld= fgetcsv($datei, 100000)) != FALSE) 
{ 
  mysql_query("INSERT INTO $artists (id, title, artist, duration, agent, category, code, filename, info, web, unity, bw, musicartist, musictitle, musiclabel, musicalbum, musicduration, generic, comment) VALUES('".$datenfeld[0]."','".$datenfeld[1]."','".$datenfeld[2]."','".$datenfeld[3]."','".$datenfeld[4]."','".$datenfeld[5]."','".$datenfeld[6]."','".$datenfeld[7]."','".$datenfeld[8]."','".$datenfeld[9]."','".$datenfeld[10]."','".$datenfeld[11]."','".$datenfeld[12]."','".$datenfeld[13]."','".$datenfeld[14]."','".$datenfeld[15]."','".$datenfeld[16]."','".$datenfeld[17]."','".$datenfeld[18]."','".$datenfeld[19]."'')");  
} 

fclose($datei);  
mysql_close();  
?>
 
Zuletzt bearbeitet:
Zurück