Hans-im-Glück: online DB mysql UPDATES in der Schleife

Hallo,

wieso macht dieses Skript nicht was es soll? Datensätze in meiner Onlinedatenbak updaten?

	for($i=1; $i < count($ueb)-1 ; $i++){
		$werte = explode(';', $ueb[$i]);

		$SQL = "UPDATE kopie_artikel SET preis = '$werte[1]',MENGE_AKT = '$werte[2]', MENGE_MIN ='$werte[3]', Beschaffungszeit ='$werte[4]' ,last_update = NOW() WHERE id = '$werte[0]'";
		echo $SQL . "<br>";
		$res = mysqli_query($ConnectHnd,$SQL);
		echo mysqli_error($ConnectHnd);
	}

Die Datenbank läuft auf meinem Server bei ionos. Das echo zeigt wunderbar die SQL Anweisungen mit den übernommenen Daten. Es wird kein Fehler angezeigt.

Kopiere ich eine SQL-Zeile von Hand in PHPmyadmin und führe die dort aus, wird die Zeile auch in die Datenbank übernommen.

Nach Beendigung des Skripts ist in der Tabelle nichts passiert.

Warum klappt es also wenn ich einen Datensatz von Hand update aber auf mein skript erfolgt 0 Reaktion?

Übersehe ich da was? Mach ich was falsch?

Stehe total auf dem Schlauch.

  1. Hi there,

    Warum klappt es also wenn ich einen Datensatz von Hand update aber auf mein skript erfolgt 0 Reaktion?

    Übersehe ich da was? Mach ich was falsch?

    Wenn das alles so ist, wie Du sagst, dann kann der Fehler ja eigentlich nur in $ConnectHnd liegen, oder?

  2. Tach!

    wieso macht dieses Skript nicht was es soll?

    Dazu muss zunächst einmal herausgefunden werden, was es denn konkret falsch macht.

    	for($i=1; $i < count($ueb)-1 ; $i++){
    

    Bist du sicher, dass die Schleife mit dem zweiten Element beginnen und auch das letzte Element auslassen soll?

    		$SQL = "UPDATE kopie_artikel SET preis = '$werte[1]',MENGE_AKT = '$werte[2]', MENGE_MIN ='$werte[3]', Beschaffungszeit ='$werte[4]' ,last_update = NOW() WHERE id = '$werte[0]'";
    

    Das Statement sieht defekt aus, weil kein Kontextwechsel beachtet wird. Oder hast du anderweitig sichergestellt, dass die Werte keine Zeichen enthalten, die einen ungewollten String erzeugen?

    Außerdem werden einige Werte wie Strings behandelt, die dem Feldnamen nach Zahlen sind.

    		$res = mysqli_query($ConnectHnd,$SQL);
    

    Warum wertest du $res nicht aus, um zu sehen, ob ein Fehler auftrat oder nicht? Beachte, dass in $res neben false auch 0 stehen kann, was im booleschen Kontext wie false gewertet wird.

    Es wird kein Fehler angezeigt.

    Ist überhaupt einer aufgetreten?

    Mach ich was falsch?

    Anscheinend. Außerdem ist deine Schleife ein klassischer Anwendungsfall für die Verwendung von Prepared Statements.

    dedlfix.

    1. Tach!

      wieso macht dieses Skript nicht was es soll?

      Dazu muss zunächst einmal herausgefunden werden, was es denn konkret falsch macht.

      	for($i=1; $i < count($ueb)-1 ; $i++){
      

      Ja das ist richtig.

      		$SQL = "UPDATE kopie_artikel SET preis = '$werte[1]',MENGE_AKT = '$werte[2]', MENGE_MIN ='$werte[3]', Beschaffungszeit ='$werte[4]' ,last_update = NOW() WHERE id = '$werte[0]'";
      

      Es ist sichergestellt, dass die Werte zu den Feldern passen.

      		$res = mysqli_query($ConnectHnd,$SQL);
      

      Warum wertest du $res nicht aus, um zu sehen, ob ein Fehler auftrat oder nicht? Beachte, dass in $res neben false auch 0 stehen kann, was im booleschen Kontext wie false gewertet wird.

      OK, das kann ich noch tun.

      Es ist halt seltsam das echo zeigt, dass die Schleife sauber arbeitet.

      Egal welche der SQL Anweisungen ich mit phpmyadmin einzeln ausführe, arbeite sie ebenfalls sauber.

      1. Tach!

        Es ist halt seltsam das echo zeigt, dass die Schleife sauber arbeitet.

        Also, es zeigt zumindest, dass ein SQL-Statement erzeugt wurde. Da kein Fehler ausgegeben wurde, hat es anscheinend auch keinen gegeben. Aber vielleicht sind keine Datensätze betroffen. Deswegen das $res auswerten, das gibt ein Anzahl an.

        Egal welche der SQL Anweisungen ich mit phpmyadmin einzeln ausführe, arbeite sie ebenfalls sauber.

        Vielleicht bearbeitest du unterschiedliche Datenbanken.

        dedlfix.

        1. Ich glaub ich habs - bin mir aber noch nicht ganz sicher.

          • einer der Werte ist leer, also noch nicht mal '0'. Ich könnte mir vorstellen, dass er da aussteigt. Aber warum meckert mysqli_error da nicht rum? Warum klappt es bei phpmyadmin?

          Muss in der Richtung forschen.

          1. Tach!

            • einer der Werte ist leer, also noch nicht mal '0'. Ich könnte mir vorstellen, dass er da aussteigt. Aber warum meckert mysqli_error da nicht rum?

            Warum? Ist doch gültige Syntax. Du hast zwar anzunehmenderweise Zahlenwerte, aber du notierst sie wie Strings. Leerstrings werden zu 0 konvertiert, wenn sie in einen numerischen Kontext kommen.

            Hättest du hingegen Zahlen als Zahlenliteral geschrieben, also ohne Anführungszeichen, dann wäre eine fehlende Zahl ein Syntaxfehler.

            dedlfix.

          2. BINGO

            das wars! Der eine Wert war NULL.