Fehler beim einlesen von .csv Datei
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
anzahl
array
code
country
datei
datenbank
fehler
file
formal name
funktion
header
letter
not
null
ordern
spalten
telephon
type
url
zeile
-
Hi!
bin grad dabei ein Script zu schreiben, dass mir eine bestimmte CSV Datei ausliest und in eine MySQL Datenbank schreibt!
Nun bekomm ich aber nen fehler und weiß ned mehr weiter!
Vll kann mir ja einer von euch helfen!
<?php /* CREATE TABLE `countrylist` ( `Sort Order` int(11) NOT NULL DEFAULT '0', `Common Name` varchar(250) DEFAULT NULL, `Formal Name` varchar(250) DEFAULT NULL, `Type` varchar(250) DEFAULT NULL, `Sub Type` varchar(250) DEFAULT NULL, `Sovereignty` varchar(250) DEFAULT NULL, `Capital` varchar(250) DEFAULT NULL, `ISO 4217 Currency Code` varchar(250) DEFAULT NULL, `ISO 4217 Currency Name` varchar(250) DEFAULT NULL, `ITU-T Telephone Code` varchar(250) DEFAULT NULL, `ISO 3166-1 2 Letter Code` varchar(250) DEFAULT NULL, `ISO 3166-1 3 Letter Code` varchar(250) DEFAULT NULL, `ISO 3166-1 Number` varchar(250) DEFAULT NULL, `IANA Country Code TLD` varchar(250) DEFAULT NULL, PRIMARY KEY (`Sort Order`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; */ $file = array(); $error = array(); /** * Setzt für die Zeile den SQL String zusammen und fügt die Daten in die Datenbank ein * @param line Die Zeile die in die Datenbank eingefügt werden soll */ function insert_line($line) { $sql = "INSERT INTO countrylist(`Sort Order`,`Common Name`,`Formal Name`,`Type`,`Sub Type`,`Sovereignty`,`Capital`,`ISO 4217 Currency Code`,`ISO 4217 Currency Name`,`ITU-T Telephone Code`,`ISO 3166-1 2 Letter Code`,`ISO 3166-1 3 Letter Code`,`ISO 3166-1 Number`,`IANA Country Code TLD`) VALUES ("; reset($line); foreach($line as $val) { if($line[0]!=$val) { $sql = $sql.","; } $sql = $sql.':'.key($line); next($line); } $sql = $sql.')'; reset($line); $prep_string; foreach($line as $val) { if(empty($val)) { $val = "NULL"; } if($line[0]!=$val) { $prep_string = $prep_string.","; } [b]$prep_string = $prep_string.':'.key($line).'=>'.$val;[/b] next($line); } // Aufbau der Datenbankverbindung $dsn = "mysql:dbname=phpaufgaben;host=127.0.0.1"; try { $dbh = new PDO($dsn, 'root', '********'); $sth = $dbh->prepare($sql); [b]$sth->execute(array($prep_string));[/b] } catch (PDOException $e) { $error['database'] = 'Connection failed: ' . $e->getMessage(); } } // Prüfen, ob das File per POST übergeben wurde if(isset($_POST['file'])) { if(!empty($_POST['file'])) { $zeilen = file($_POST['file']); $zeilen = str_replace("'", '"',$zeilen); $head = $zeilen[0]; foreach($zeilen as $zeile) { // Prüfen ob die Zeile gleich dem Header / Der Spaltennamen ist if($zeile != $head) { $line = explode(",",$zeile); insert_line($line); } } } else { $error['file'] = "Sie müssen eine Datei auswählen!"; } } ?>
Ich hoffe ihr kennt euch aus!
Lg. und Danke
Beitrag zuletzt geändert: 11.4.2012 13:14:48 von sawei3 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Meldungen:
Notice: Undefined variable: prep_string in /var/www/insert_db.php on line 59 Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in /var/www/insert_db.php on line 72
Sind die zwei Zeilen wo sind!
Lg.
Beitrag zuletzt geändert: 11.4.2012 13:15:34 von sawei3 -
sawei3 schrieb:
dafür gibt es einen eigenen mysql befehl, so dass du die ganze funktion dir ersparen kannst.
... eine bestimmte CSV Datei ausliest und in eine MySQL Datenbank schreibt ...
sehe mal da rein: LOAD DATA INFILE -
Hallo
Notice: Undefined variable: prep_string in /var/www/insert_db.php on line 59
da ist wohl $prep_string (noch) nicht definiert, man könnte weiter oben $prep_string = ''; machen
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number:
die Anzahl der Felder stimmt nich mit der Anzahl der Einträge (Feld-Inhalte) überein
ok, LOAD DATAINFILE ist natürlich das einfachste,
oder versuch mal mit folgendem Code
EDIT:
wollte hier nen Code posten, aber bekomme die Meldung:
Dieser "Text" kann doch nun wirklich nicht als neuer Beitrag durchgehen, oder? Bitte kürze auf das Wesentliche, kopiere keine fremden Texte!
wohl zu lang ?! ... schade, dann halt nicht
PS: ... ist es "Gut" wenn Spalten-Namen Leerzeichen enthalten ?
ich würde sowas wenn möglich verhindern / umschreiben
-
Hi!
Das mit den Spalten Namen mit Leerzeichen ist leider so vorgegeben und die funktion haut auch nicht hin!
Lg. -
sawei3 schrieb:
Hi!
Das mit den Spalten Namen mit Leerzeichen ist leider so vorgegeben und die funktion haut auch nicht hin!
Lg.
naja, aber zum Speichern in MySQL kann man doch Leerzeichen durch Unterstrich ersetzen ...
keine Ahnung ob "Leerzeichen" in Spaltennamen bei MySQL ein Problem ist ????
hat die CSV eine Kopfzeile? (Spalten-Namen oben in 1. Zeile ?)
... Teste mal bitte ...
<?php // ------------------------------------------------------- $csv_source = 'deinecsvdatei.csv'; $csv_trenner = ';'; $csv_hashead = true; // --- true Wenn die CSV Datei eine Kopfzeile hat (Spalten-Namen), false wenn nicht $empty_field = 'NULL'; // --- Leere Felder in MySQL speichern als z.B: NULL $table_name = 'countrylist'; // --- Name der MySQL Tabelle // ----- Spalten-Namen wenn die CSV Datei keine Kopf-Zeile hat ----- // ----- die Anzahl der Namen muss der Anzahl der Spalten entsprechen ----- $spalten_liste = array( 'Sort Order', 'Common Name', 'Formal Name', 'Type', 'Sub Type', 'Sovereignty', 'Capital', 'ISO 4217 Currency Code', 'ISO 4217 Currency Name', 'ITU-T Telephone Code', 'ISO 3166-1 2 Letter Code', 'ISO 3166-1 3 Letter Code', 'ISO 3166-1 Number', 'IANA Country Code TLD' ); // ------------------------------------------------------- $dbhost = 'localhost'; $dbuser = 'USERxxxxxx'; $dbpass = 'YyYyYyYy'; $dbname = 'db_zzzzzz1'; $con = mysql_connect($dbhost, $dbuser, $dbpass); if (!$con) { echo "<br />Could not connect: ".$dbhost."<br />\n" . mysql_error(); exit; } $sel = mysql_select_db($dbname, $con); if (!$sel) { echo "<br />Could not select: ".$dbname."<br />\n" . mysql_error(); exit; } // ------------------------------------------------------- function csv2array($csvfile,$trenner=';',$csvhead=false,$emptyval='NULL',$emptykey='',$rowlen=0) { $return = false; $handle = fopen($csvfile, "r"); if ($csvhead) { $header = fgetcsv($handle, $rowlen, $trenner); } $outdata = array(); while (($data = fgetcsv($handle, $rowlen, $trenner)) !== FALSE) { if ($csvhead AND isset($header)) { $x = 1; foreach ($header as $key=>$heading) { $heading = trim(chop($heading)); if (empty($heading)) { if (empty($emptykey)) { unset($header[$key]); } else { $heading = $emptykey.$x; $header[$key] = $emptykey.$x; $drow[$heading]=(!empty($data[$key])) ? $data[$key] : $emptyval; } } else { $drow[$heading]=(!empty($data[$key])) ? $data[$key] : $emptyval; } $x++; } $outdata[]=$drow; } else { $header = false; $outdata[]=$data; } } fclose($handle); return array($header, $outdata); } // ------------------------------------------------------- $empty_keys = ''; $csvdata = csv2array($csv_source, $csv_trenner, $csv_hashead, $empty_field); if ($csvdata[0] !== false) { $csv_header = $csvdata[0]; } else { $csv_header = $spalten_liste; } $csv_values = $csvdata[1]; // ------------------------------------------------------- $data_spalten = ''; foreach($csv_header as $spalte_key) { $data_spalten .= "`". mysql_real_escape_string($spalte_key) ."`,"; } $data_spalten = rtrim($data_spalten,','); // ------------------------------------------------------- $i=0; $data_values = array(); foreach($csv_values as $spalte_val) { $data_values[$i] = ''; foreach($spalte_val as $spalte_string) { $data_values[$i] .= "'". mysql_real_escape_string(stripslashes($spalte_string)) ."',"; } $data_values[$i] = rtrim($data_values[$i],','); $i++; } $anzahl = count($data_values); // ------------------------------------------------------- $clean = mysql_query("TRUNCATE `".$table_name."`"); if (!$clean) { die("<br /> MySQL TRUNCATE ... Fehler <br />\n" . mysql_error()); exit; } else { echo "<br /> MySQL TRUNCATE ... OK \n"; } $i=0; foreach($data_values as $data_item) { $sql_str[$i] = "INSERT INTO `".$table_name."` (".$data_spalten.") VALUES (".$data_item.")"; $n=($i+1); $result = mysql_query($sql_str[$i]); if (!$result) { die("<br /> MySQL Eintrag ".$n." von ".$anzahl." ... Fehler <br />\n" . mysql_error()); exit; } else { echo "<br /> MySQL Eintrag ".$n." von ".$anzahl." ... OK \n"; } $i++; } // ------------------------------------------------------- mysql_close($con); // ------------------------------------------------------- ?>
sonst gib uns mal link zu Beispiel-CSV, dann können wir damit testen
evtl ist die CSV ja auch "komisch" ...
Beitrag zuletzt geändert: 11.4.2012 19:43:43 von lukepress -
Hi!
Es ist gegangen, als ich ohne prepare statement gemacht hatte (sql string auf einmal zusammengesetzt mit foreach)
erst als ich mit pdo des gemacht hab, is nicht mehr gegangen!
Liebe Grüße -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage