webentwicklung-frage-antwort-db.com.de

Rufen Sie eine Mitgliedsfunktion bind_param () für ein Nicht-Objekt auf

Ich versuche, eine Variable in dieser vorbereiteten Anweisung zu binden, erhalte aber weiterhin den Fehler:

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

Die Funktion wird aufgerufen und Variablen werden an sie übergeben. Wenn ich die Funktion ändere, um nur die Variable wiederzugeben, wird die Variable auf der Seite gut gedruckt, aber wenn ich versuche, sie hier zu binden, erhalte ich den Fehler. Kann jemand helfen?

//CALL FROM PAGE ONE
check($username);

//FUNCTION ON PAGE 2
function check($username){
$DBH = getDBH();
$qSelect = $DBH->prepare("SELECT * FROM users WHERE username = ?");
$qSelect->bind_param("s", $username);
}

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

26
mcbeav

wie die Fehlermeldung besagt, scheint $qSelect kein Objekt zu sein. Versuchen Sie dies zu debuggen, indem Sie var_dump($qSelect); direkt nach Ihrem Aufruf zur Vorbereitung verwenden. Überprüfen Sie auch, ob getDBH() das zurückgibt, was Sie benötigen.

klingt so, als ob der Vorbereitungsaufruf fehlschlägt (ich weiß nicht warum) und daher false - false kein Objekt ist, sodass Sie bind_param() nicht aufrufen können Das.

EDIT: Sie haben die Informationen nicht angegeben, aber es sieht so aus, als würden Sie das PDO von PHP verwenden. In diesem Fall werfen Sie einen Blick auf die Dokumentation .

Wenn der Datenbankserver die Anweisung erfolgreich vorbereitet, gibt PDO :: prepare () ein PDOStatement-Objekt zurück. Wenn der Datenbankserver die Anweisung nicht erfolgreich vorbereiten kann, gibt PDO :: prepare () FALSE zurück oder gibt PDOException aus (abhängig von der Fehlerbehandlung).

Sie sollten Ihren Server so konfigurieren, dass er diese PDO-Ausnahmen zurückgibt, aus denen hervorgeht, warum der Vorbereitungsaufruf fehlschlägt.

24
oezi

Ein Grund, warum prepare() fehlschlagen kann, ist, dass die an sie gesendete SQL-Anweisung in der aktuellen Datenbank nicht gültig ist.

prepare() gibt dann false zurück.

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

68
Stefan

ich verwende auch den Mysqli-Ansatz und habe den gleichen Fehler erhalten, als ich vor dem Schließen der ersten Instanz eine weitere Instanz von Mysqli erstellt habe. Daher ist es wichtig, close() zu verwenden, bevor derselbe Code gestartet wird. Beispielsweise:

$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;
17
fvdz

Es scheint, dass die Vorbereitung ziemlich dumm ist. Es verlässt sich nicht ausschließlich auf die MySQL-Seite. Ich meine, wenn Sie in Ihrer Abfrage eine Tabelle haben, die zufällig den gleichen Namen wie ein Schlüsselwort hat, sagen Sie "user", "order", ... Wird es nur nicht als Tabelle erkannt, sondern als das, was die Schlüsselwortbefehle tatsächlich tun, so stellt sich die Abfrage als Chaos heraus und die Vorbereitung schlägt einfach fehl.

Um dieses Problem zu beheben, müssen Sie es "korrekt" eingeben und "` "auf beiden Seiten des Tabellennamens einfügen. Beispiel:

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

Es ist richtig, aber ich finde es albern, mich auf dieses Verhalten vorzubereiten.

2
PHP Hater

Nur für den Versuch, Menschen ohne Erfahrung in PHP wie ich zu helfen.

In meinem Fall trat dieser Fehler auf, weil ich einen Fehler in SQL Sintax hatte. Der Konsolenstapel-Trace zeigt dieses Problem nicht an.

Als ich die SQL reparierte, ging der Prozess in Ordnung.

1

Überprüfen Sie die Berechtigungen des Benutzers in der Datenbank. Ein Benutzer ohne die Berechtigung "Einfügen" führt beim Versuch, eine Nachricht einzufügen, ebenfalls zum Fehler "Aufrufen einer Mitgliedsfunktion bind_param () bei einem Nicht-Objekt".

1
itsites