2010-12-20 5 views
23

Ich versuche, eine Variable in dieser vorbereiteten Erklärung zu binden, aber ich halte erhalte die Fehlermeldung:Anruf auf eine Elementfunktion bind_param() auf einem Nicht-Objekt

Call to a member function bind_param() on a non-object 

Die Funktion aufgerufen wird, und Variablen passierte es. Wenn ich die Funktion so ändere, dass sie nur die Variable widergibt, wird die Variable auf der Seite gedruckt, aber wenn ich versuche, sie hier zu binden, erhalte ich den Fehler. Kann jemand helfen?

ich weiß, die Funktion ist hier nicht vollständig geschrieben, aber das sollte kein Problem sein. Ich verstehe nicht, warum ich diesen Fehler erhalte.

+3

'var_dump ($ qSelect)' zu überprüfen, ob es das ist, was Sie denken, dass es ist. – Mchl

Antwort

23

wie die Fehlermeldung sagt, $qSelect scheint kein Objekt zu sein. versuchen Sie, dies zu debuggen, indem Sie var_dump($qSelect); direkt nach Ihrem Prepare-Aufruf verwenden. Überprüfen Sie auch, ob getDBH() zurückgibt, was Sie brauchen.

klingt wie die Vorbereitung-Aufruf fehlschlägt (weiß nicht warum) und so gibt es false-false ist kein Objekt, so können Sie bind_param() auf das nicht nennen.

EDIT: Sie haben nicht die Informationen gegeben, aber es sieht aus wie Sie PHP-PDO verwenden. Sehen Sie sich in diesem Fall the documentation an.

If the database server successfully prepares the statement, PDO::prepare() returns a PDOStatement object. If the database server cannot successfully prepare the statement, PDO::prepare() returns FALSE or emits PDOException (depending on error handling).

Sie sollten Ihren Server so konfigurieren, dass er diese PDO-Ausnahmen zurückgibt, die Ihnen sagen würden, warum der Prepare-Aufruf fehlschlägt.

+0

yeah seine qSelect gibt Bool (falsch) zurück, aber das macht keinen Sinn, weil ich eine Funktion habe, die praktisch die gleiche ist und es funktioniert gut. – mcbeav

+0

Ich verwende mysqli – mcbeav

+0

Hm. Ich war auch in der Situation, eine Funktion zu haben, die praktisch die gleiche ist. Es stellte sich heraus, dass ich es kopiert und eingefügt hatte, um ein Feld hinzuzufügen. Aber ich habe das Komma vor dem neuen Feld vergessen! Dummer Fehler, aber es zeigt nur, dass es nur ein Tippfehler von Ihnen sein könnte. –

67

Nun, ein Grund prepare() fehlschlagen kann, ist -

if the sql statement sent to it is not valid in the current DB. 

prepare() wird dann false zurück.

ZB - wenn der Tabellenname nicht korrekt ist oder ein oder mehrere Felder in der Abfrage existieren nicht.

+0

perfekte Information. – ripa

+0

Danke! Das hat mir sehr geholfen. :) – dotslash

17

Ich benutze auch die mysqli-Methode und habe den gleichen Fehler, als ich eine andere Instanz von mysqli vor dem Schließen der ersten Instanz erstellt habe. So ist es wichtig, close() vor dem Starten des gleichen Stück Code zu verwenden. Zum Beispiel:

$DBH = getDBH(); 
$qSelect = $DBH->prepare("SELECT * FROM users WHERE username = ?"); 
$qSelect->bind_param("s", $username); 
$qSelect->close(); // <--- use close before calling the same function(wich contains $DBH code) again; 
+0

und wenn er solche Funktion viele Male verwendet, denke ich, sollte er reset() anstelle von close() verwenden, und prepare() außerhalb von funcion, zum Beispiel in Konstruktor, eine Put-Anweisung in die Eigenschaft wie folgt verschieben: $ this-> qWählen. – qdinar

2

Es scheint, dass Vorbereitung ziemlich dumm ist. Es verlässt sich nicht vollständig auf die MySQL-Seite, dh, wenn Sie in Ihrer Anfrage eine Tabelle haben, die zufällig den gleichen Namen eines Schlüsselwortes hat, sagen wir "Benutzer", "Reihenfolge", ... Es erkennt es einfach nicht als Tabelle, sondern als das, was die Schlüsselwortbefehle tatsächlich tun, so dass sich die Abfrage als unordentlich erweist und die Vorbereitung einfach fehlschlägt.

Um dies zu beheben ist es einfach, Sie müssen es in der "richtigen" Weise eingeben, indem Sie "" auf beiden Seiten des Tabellennamens hinzufügen. Beispiel:

`user`, `order`, `...` 

Es ist richtig, aber ich finde es albern von diesem Verhalten vorzubereiten.

1

Überprüfen Sie die Berechtigungen des Benutzers in der Datenbank. Benutzer ohne die Berechtigung "Einfügung" verursacht auch beim Versuch, eine Nachricht einzufügen, "Call to a member function bind_param() bei einem Nicht-Objekt" -Meldung Fehler.

1

Nur für versuchen, Menschen ohne Erfahrung in PHP wie mir zu helfen.

In meinem Fall trat dieser Fehler auf, weil ich einen Fehler in SQL sintax hatte. Die Konsolenstack-Ablaufverfolgung zeigt dieses Problem nicht an.

Wenn ich den SQL-Fehler behoben, ist der Prozess in Ordnung gegangen.