kostenloser Webspace werbefrei: lima-city


Fehler beim einlesen von .csv Datei

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    sawei3

    Kostenloser Webspace von sawei3

    sawei3 hat kostenlosen Webspace.

    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&uuml;ssen eine Datei ausw&auml;hlen!";
    		}
    	}
    	
    	
    ?>


    Ich hoffe ihr kennt euch aus!

    Lg. und Danke

    Beitrag zuletzt geändert: 11.4.2012 13:14:48 von sawei3
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Fehlermeldung? Welche Zeile tritt der Fehler auf? Am besten im Code kenntlich machen!

    Sonst macht sich glaub niemand (also ich zumindest nicht) die Mühe die 100 Zeilen Code zu durchsuchen!

    Beitrag zuletzt geändert: 11.4.2012 12:58:12 von alfr3d
  4. Autor dieses Themas

    sawei3

    Kostenloser Webspace von sawei3

    sawei3 hat kostenlosen Webspace.

    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
  5. sawei3 schrieb:
    ... eine bestimmte CSV Datei ausliest und in eine MySQL Datenbank schreibt ...
    dafür gibt es einen eigenen mysql befehl, so dass du die ganze funktion dir ersparen kannst.
    sehe mal da rein: LOAD DATA INFILE
  6. 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


  7. Autor dieses Themas

    sawei3

    Kostenloser Webspace von sawei3

    sawei3 hat kostenlosen Webspace.

    Hi!
    Das mit den Spalten Namen mit Leerzeichen ist leider so vorgegeben und die funktion haut auch nicht hin!
    Lg.
  8. 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
  9. Autor dieses Themas

    sawei3

    Kostenloser Webspace von sawei3

    sawei3 hat kostenlosen Webspace.

    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
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!