MySQL UPDATE-Befehl?

DonkeyShot  24.04.2020, 19:33

Was bedeutet "funktioniert nicht"? Kommt eine Fehlermeldung? Wenn ja, welche?

gehm1 
Fragesteller
 24.04.2020, 19:38

Die Fehlermeldung lautet:

Fatal error: Uncaught Error: Call to a member function fetch() on bool in [Pfad]/def.php:17 Stack trace: #0 {main} thrown in [Pfad]/def.php on line 17

2 Antworten

Laut Doku:

PDO::query() returns a PDOStatement object, or FALSE on failure.

Da die Fehlermeldung lautet "...on bool", scheint query() FALSE zurückzugeben, d.h. die query ist gescheitert.

Würde mir den SQL nochmal anzeigen lassen. Ist die ID numerisch? Wenn nicht, gehört sie wahrscheinlich in Hochkomma resp. Anführungszeichen eingeschlossen (kenne die MySQL resp. PHP Syntax nicht auswendig).

Woher ich das weiß:Studium / Ausbildung – Datenverarbeitungs-Kfm, Hobby- und Profi-Programmierer

Du machst da noch ein paar seltsame Sachen.

1) Du übergibst einen Template-String an die prepare-Funktion:

$statement = $pdo->prepare("UPDATE Kunden SET vorname='$vorname' WHERE nummer='$nummer'");

Die Variablen, die zwischen den doppelten Anführungszeichen stehen, werden ausgewertet / gegen ihre Werte ausgetauscht, danach wird der String, der zu dem Zeitpunkt dann so aussieht:

"UPDATE Kunden SET vorname='Leon' WHERE nummer='1'"

weitergereicht.

Nun übergibst du der execute-Funktion aber auch noch ein Array, sie solle doch bitte den Parameter nummer gegen den Wert von $nummer austauschen. Dein String hat aber keinen Platzhalter nummer, der dann noch sinnvoll auszutauschen wäre.

Zuerst solltest du also deinen String ändern:

$statement = $pdo->prepare("UPDATE Kunden SET vorname= :vorname WHERE nummer = :nummer");

Dann den Aufruf von execute:

$statement->execute(array(':vorname' => $vorname, ':nummer' => $nummer));

Zudem solltest du dich fragen, was du mit dem Ergebnis anstellen möchtest. Du verwendest es gar nicht.

2) Du verwendest nicht immer Prepared Statements. Wieso?

Ich gehe davon aus, dass die Variablen $vorname und $nummer später durch Eingaben von außen definiert werden sollen.

3) Wenn die query-Funktion nicht erfolgreich war, gibt sie kein Objekt zurück, sondern den boolschen Wert false. Dieser kennt keine Funktion fetch kennt.

Du solltest vor jeder Auswertung prüfen, ob die Anfrage an die Datenbank erfolgreich war oder nicht.

$result = $pdo->query($sql);

if ($result) {
  $data = $pdo->fetch();
  // ...
}
else {
  // error ...
}

4) Es reicht vollkommen aus, nur einmal eine Datenbankverbindung herzustellen und ein PDO-Objekt anzulegen. Diese Verbindung wird erst wieder geschlossen, wenn du sie explizit schließen lässt oder das Skript beendet wird.

5) In deinem UPDATE-Query hast du den Wert für die ID in Anführungszeichen gesetzt, bei den anderen Queries wiederum nicht. Von welchem Typ ist die Spalte ID denn nun? Wenn du Prepared Statements verwendest, schauen die anhand des Werttyps.

gehm1 
Fragesteller
 28.04.2020, 10:53

Danke

0