2013-03-16 10 views
5

Hallo ich habe eine 70/80 Feldform, die ich in eine Tabelle einfügen muss, anstatt manuell eine riesige Insert-Anweisung zu erstellen, habe ich zuerst eine Tabelle in meiner Datenbank erstellt hier aus den Namen der Eingänge in Form ist der Code, den ich erstellen können/ändern sie die TabelleMysqli update werfen Aufruf an eine Memberfunktion bind_param() error

function createTable($array, $memberMysqli) 
{ 
    foreach ($array as $key => $value) 
    { 
      //echo "<p>Key: ".$key." => Value: ".$value . "</p>"; 
      $query = "ALTER TABLE questionnaire ADD ".$key." text"; 

      if($stmt = $memberMysqli->prepare($query)) 
      { 
       $success = $stmt->execute(); 
      } 
    } 
     echo "<h1>Array count: ". count($array) ."</h1>" ; 
} 

Dies funktioniert gut, und der Tisch genau 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 löst einen Bind-Param-Fehler und ich habe keine Ahnung warum. Jede Hilfe wäre großartig.

Antwort

7

O, lass uns eine kanonische Antwort versuchen.

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

Also - es gab ein Problem mit der Erstellung eines $stmt Objekts.
Wahrscheinlich ist es ein Problem mit der Abfrage. Also, wir müssen diesen Fehler nachverfolgen.

Mysqli wird Ihnen nicht sagen, was vor sich geht, es sei denn explizit gefragt. Also, Sie müssen immer das Ergebnis jeder mysqli-Funktion ü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() im gesamten Anwendungscode verwenden, ohne ihn in eine Hilfsklasse zu kapseln, ist trigger_error() ein guter Weg, um einen PHP-Fehler auszulösen, da er Ihnen auch die Datei und die Zeilennummer mitteilt

Also, alle Ihre prepare(), execute() und query() Anrufe haben auf diese Weise geschrieben werden:

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

oder in prozeduralen Stil

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

in allen Ihren Skripten
und seit dann werden Sie über den Grund benachrichtigt, warum das Objekt nicht erstellt wurde. (Wenn Sie interessiert sind or Syntax, I've explained it here) Beachten Sie, dass die Abfrage auch in der Fehlermeldung enthalten ist, damit Sie es visuell überprüfen und in einer anderen Umgebung testen können.

Allerdings, wenn Sie Ihre Abfrage in eine Klasse kapseln, Datei und Zeile von Trigger-Fehler wird ziemlich nutzlos sein, da sie auf den Aufruf selbst zeigen, nicht der Anwendungscode, der bestimmte Probleme verursacht.Also, wenn Mysqli Befehle gekapselt ausgeführt wird, haben eine andere Art und Weise verwendet werden:

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

als Ausnahme, die Sie mit einem Stack-Trace liefert, die Sie den Ort, von dem eine fehlerhafte Abfrage genannt wurden führen.

Beachten Sie, dass Sie PHP-Fehler im Allgemeinen sehen können. Auf einer Live-Site müssen Sie in Fehlerprotokolle spähen, so haben Einstellungen

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

während auf einem lokalen Entwicklungsserver sein, es ist alles in Ordnung Fehler auf dem Bildschirm zu machen:

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

und natürlich Sie sollten nie einen Fehlerunterdrückungsoperator (@) vor Ihren Anweisungen verwenden.

+0

Danke! Das ist ein handliches Stück Code, von dem ich hätte wissen müssen. Das Problem war, dass wenn ich die Tabelle änderte, es ein Feld 'submit' erzeugte und dies das Problem beim Update verursachte. – lnelson92

Verwandte Themen