Knut: PHP bind_param() on boolean ...

Guten Morgen,

ich komme mit diesem ganzen Bind Param nicht zurecht, es meldet:

Fatal error: Uncaught Error: Call to a member function bind_param() on boolean in

Der Code ist absolut überschaubar:

	$img = "http://beispiel.de";
	$shortlink = "1234";
	$content_kopie = "1";
	$id = "1";
	$sql = "UPDATE prisma SET geprueft = ? , img = ? , shortlink = ? WHERE id = ?";
					
	$stmt = $con->prepare($sql);   
	$stmt->bind_param('ssss', $content_kopie, $img, $shortlink, $id);
	$stmt->execute(); 	
	$stmt->close();

Ich finde den Fehler einfach nicht??

  1. Tach!

    Fatal error: Uncaught Error: Call to a member function bind_param() on boolean in

    Wenn du eine Variable hast, in der kein Objekt sondern etwas anderes steckt, kannst du keine Funktionen des gewünschten Objektes aufrufen. In diesem Fall hast du statt des gewünschten Objekts einen booleschen Wert in der Variable. Und das liegt daran, dass die Stelle, an der du die Zuweisung zur Variable vornimmst, etwas anderes liefert.

    $sql = "UPDATE prisma SET geprueft = ? , img = ? , shortlink = ? WHERE id = ?";

    Dabei gibt es anscheinend ein Problem ...

    $stmt = $con->prepare($sql);

    ... das dazu führt, dass das prepare nicht zufriedenstellend laufen konnte und damit kein Statement-Objekt liefert, sondern den Wert false. Das PHP-Handbuch erklärt nicht nur die Verwendungsweise von Funktionen, es gibt auch immer mit an, was im Fehlerfall zu erwarten ist. Das muss man beachten, wenn man robuste Programme schreiben möchte. Fehlerbehandlung ist oftmals länger als die eigentliche Lösung der Aufgabe.

    Ich finde den Fehler einfach nicht?

    Da das kein PHP-Fehler ist, sondern einer, der in der Datenbank aufgetaucht ist, gibt es keine PHP-Fehlermeldung, sondern nur den oben gezeigten Folgefehler.

    Fehler im DBMS können immer entstehen, auch wenn du alle offensichtlichen Ursachen beseitigt hast. Andere Fehler, die sporadisch auftreten könenn, sind zum Beispiel Verbindungsfehler oder Timeout oder Speicher alle. Du solltest dich und dein Programm darauf einstellen, dass sie auftreten können, und entsprechend reagieren, statt quasi nur auf Sonnenschein zu setzen.

    Wie kommst du nun an die Ursache? Den Meldungstext zur Ursache, wenn die Funktion mit false abbricht, findest du im Objekt, das in $con steckt. Da gibt es Eigenschaften oder Funktionen, die dir den Text liefern. Sieht bei dir nach mysqli aus, dann ist das die Eigenschaft $error.

    dedlfix.

  2. Hallo Knut,

    ich habe deine Backtick-Formatierung mal in ~~~ umgewandelt, das passt besser.

    Beachte zusätzlich zu Dedlfix Hinweis auch die korrekte Abfrage auf eine Fehlerbedingung.

    $stmt = $con->prepare(...);
    if (!$stmt) {
       // fehler behandeln
    }
    

    wäre FALSCH, auch wenn prepare wahlweise FALSE oder ein Objekt zurückliefert und Objekte normalerweise als true ausgewertet werden („truthy sind“).

    Richtig ist es bei diesen Prüfungen immer nur mit einer „ist identisch mit FALSE“ Abfrage, also dem Dreifach-Gleich:

    $stmt = $con->prepare(...);
    if ($stmt === FALSE) {
       // fehler behandeln
    }
    

    Rolf

    --
    sumpsi - posui - clusi
    1. Tach!

      Beachte zusätzlich zu Dedlfix Hinweis auch die korrekte Abfrage auf eine Fehlerbedingung.

      $stmt = $con->prepare(...);
      if (!$stmt) {
         // fehler behandeln
      }
      

      wäre FALSCH, auch wenn prepare wahlweise FALSE oder ein Objekt zurückliefert und Objekte normalerweise als true ausgewertet werden („truthy sind“).

      Nicht nur normalerweise sondern immer, ohne Ausnahme. Richtig ist, was zweifelsfrei immer das gewünschte Ergebnis liefert. Und das ist neben dem typsicheren Vergleich hier auch die einfache boolesche Auswertung. Andere Rückgabewerte, die mit dem einen oder anderen Zustand verwechselt werden könnten, gibt es hier nicht. Beides ist also richtig, weil zweifelsfrei zielführend.

      dedlfix.