Bernd: Warning: fgetcsv(): supplied resource is not a valid stream resource

Hallo,

wenn ich eine CSV Datei hochladen will und die Daten in eine MySQL Tabelle speichern möchte erhalte ich den Fehler

Warning: fgetcsv(): supplied resource is not a valid stream resource

Was mache ich falsch? Komischerweise den ersten Eintrag finde ich in der Datenbank

if(isset($_POST["abschicken"]))
	{
	 if($_FILES['file']['name'])
	 {
	  $filename = explode(".", $_FILES['file']['name']);
	  if($filename[1] == 'csv')
	  {
	   $handle = fopen($_FILES['file']['tmp_name'], "r");
	   while($data = fgetcsv($handle))
	   {
				
	if ($stmt = $mysqli->prepare("INSERT INTO excel_upload_jobnummern (excel_projektnummer, excel_jobtitel, excel_kunde) 
									VALUES (?, ?, ?)"))
			 {    
			 
				$excel_projektnummer	= $data[0];
				$excel_jobtitel			= $data[1];
				$excel_kunde			= $data[2];
				
				
				$stmt->bind_param("sss", $excel_projektnummer, $excel_jobtitel, $excel_kunde);

	$stmt->execute();

						}
				else {
						echo $mysqli -> error;
					
	}
	fclose($handle);
   echo "<script>alert('Import done');</script>";
  }
 }}
};
  1. Tach!

    Warning: fgetcsv(): supplied resource is not a valid stream resource

    Was mache ich falsch? Komischerweise den ersten Eintrag finde ich in der Datenbank

    Schlechtes Einrücken. fclose() gehört nicht in die Schleife, die den Inhalt der Datei lesen soll.

    dedlfix.

  2. Hallo Bernd,

    wenn der erste Satz verarbeitet wird, fgetcsv da also noch gültig war, und dann beim nächsten Schleifenumlauf nicht mehr ist, kann es eigentlich nur eine Ursache geben.

    Stelle mal alle zueinander gehörigen geschweiften Klammern sauber untereinander.

    Finde das } zum { des while.

    Es gibt gute Gründe, warum IDEs gerne vor zu tiefer Schachtelung warnen. Es könnte sinnvoll sein, alles ab Zeile 5 in eine Funktion auszulagern und das Fehlerhandling zu invertieren, d.h. jede Prüfung so zu formulieren, dass Du die Funktion mit return verlässt sobald ein Fehler auftaucht, der den Import verhindert.

    Unabhängig davon: Es ist weder sinnvoll noch richtig, prepare und bind innerhalb der Schleife durchzuführen. Das macht man vorher; innerhalb der Schleife wird nur an die Variablen zugewiesen und execute aufgerufen. Mit bind werden Variablenreferenzen an das Statement geknüpft, das muss man nur einmal tun. Guckst Du in die PHP Referenz, das siehst Du das & in der Beschreibung.

    bool mysqli_stmt::bind_param ( string $types , mixed &$var1 [, mixed &$... ] )
                                                        -^-             -^-
    

    Rolf

    --
    sumpsi - posui - clusi