Mysqli Update casting Aufruf an eine Member-function bind_param () -Fehler

Hi ich habe eine 70/80 Feldform, die ich in eine Tabelle einfügen muss, anstatt manuell eine riesige Insert-statement zu erstellen, habe ich zuerst eine Tabelle in meinem db aus den Namen der Eingaben im Formular erstellt hier ist der Code, den ich Verwenden Sie zum Erstellen / Ändern der Tabelle

function createTable($array, $memberMysqli) { foreach ($array as $key => $value) { //echo "

Key: ".$key." => Value: ".$value . "

"; $query = "ALTER TABLE questionnaire ADD ".$key." text"; if($stmt = $memberMysqli->prepare($query)) { $success = $stmt->execute(); } } echo "

Array count: ". count($array) ."

" ; }

Das funktioniert gut und hat den Tisch genau so verändert, wie ich es wollte. Jetzt, um die Formularwerte einzufügen, um dies zu tun, mache ich ein grundlegendes Feld einfügen die ID der Zeile speichern und dann haben alle Post-Variablen Schleife diese Zeile aktualisieren. Hier ist mein Code dafür:

 $stmt = $memberMysqli->prepare("INSERT INTO questionnaire(userid) VALUES (?)"); $stmt->bind_param('s', $_POST['userid']); $stmt->execute(); $rowid = $stmt->insert_id; $stmt->close(); $memberMysqli->autocommit(FALSE); function updateColumn($memberMysqli, $query, $uid, $value) { if ($value) { $stmt = $memberMysqli->prepare($query); //Throws bind param error here $stmt->bind_param("ss", $value, $uid); $stmt->execute(); } } function loopInputs($array, $memberMysqli, $rowid) { foreach ($array as $key => $formvalue) { var_dump($key); updateColumn($memberMysqli, "UPDATE questionnaire SET $key = ? WHERE id = ?", $rowid, $formvalue); } } loopInputs($_POST, $memberMysqli, $rowid); $memberMysqli->commit(); $memberMysqli->close(); 

Dies triggers einen Bind-Param-Fehler aus und ich habe keine Ahnung warum. Jede Hilfe wäre großartig.

   

Oh, lasst uns eine kanonische Antwort versuchen.

Call to a member function (oder expects parameter 1 to be mysqli_result, boolean given für den prozeduralen Stil) ist kein Fehler selbst, sondern nur ein Symptom , für ein anderes Problem.
Diese Fehlermeldung bedeutet, dass kein Objekt erstellt wurde.

Also – es gab ein Problem beim Erstellen eines $stmt Objekts.
Wahrscheinlich ist es ein Problem mit der Abfrage. Also müssen wir diesen Fehler nachverfolgen.

Mysqli wird Ihnen nicht sagen, was vor sich geht, es sei denn, Sie werden ausdrücklich darum gebeten. Also, Sie müssen immer das Ergebnis jeder mysqli-function überprüfen, die mit dem Server interagiert und wenn das Ergebnis FALSE ist – überprüfen Sie $mysqli->error .

Es ist auch sehr wichtig, mysqli-Fehlermeldung in PHP-Fehler zu konvertieren, um es nach Site-weiten Fehlerberichtseinstellungen gehen zu lassen.

Wenn Sie mysqli_query () über den gesamten Anwendungscode hinweg verwenden, ohne ihn in eine trigger_error() zu kapseln, ist trigger_error() eine gute Möglichkeit, einen PHP-Fehler trigger_error() , da er Ihnen auch die Datei und die Zeilennummer mit dem Fehler meldet

Also müssen alle Aufrufe prepare() , execute () und query() folgendermaßen geschrieben werden:

 $stmt = $mysqli->prepare($query) or trigger_error($mysqli->error."[$query]"); 

oder im prozeduralen Stil

 $res = mysqli_query($mysqli,$query) or trigger_error(mysqli_error($mysqli)."[$query]"); 

in all deinen Skripten
und seitdem werden Sie über den Grund informiert, warum das Objekt nicht erstellt wurde. (Wenn Sie sich für diese or Syntax interessieren, habe ich das hier erklärt ) Beachten Sie, dass die Abfrage auch in der Fehlermeldung enthalten ist, damit Sie sie visuell untersuchen und in einer anderen Umgebung testen können.

Wenn Sie jedoch Ihre Abfrage in eine class kapseln, werden Datei- und Zeilenauslösererrors ziemlich nutzlos sein, da sie auf den Aufruf selbst verweisen, nicht auf den Anwendungscode, der ein bestimmtes Problem verursacht hat. Wenn man verkapselte mysqli-Befehle ausführt, muss man einen anderen Weg gehen:

 $result = $mysqli->query($sql); if (!$result) { throw new Exception($mysqli->error." [$query]"); } 

Als Exception erhalten Sie einen Stack-Trace , der Sie an die Stelle führt, von der aus eine errorshafte Abfrage aufgerufen wurde.

Beachten Sie, dass Sie PHP-Fehler im Allgemeinen sehen können. Auf einer Live-Site müssen Sie in Fehlerprotokolle schauen, also müssen Einstellungen vorgenommen werden

 error_reporting(E_ALL); ini_set('display_errors',0); ini_set('log_errors',1); 

Auf einem lokalen Entwicklungsserver können Sie Fehler auf dem Bildschirm machen:

 error_reporting(E_ALL); ini_set('display_errors',1); 

und natürlich sollten Sie niemals den Fehlerunterdrückungsoperator (@) vor Ihren statementen verwenden.