Schwerwiegender Fehler: Aufruf einer Memberfunktion bind_param () bei Boolean
Ich bin gerade auf eine Funktion, die ruft Einstellungen aus einer DB, und plötzlich lief ich in diese Fehlermeldung:
Fatal error: Call to a member function bind_param() on boolean in C:\xampp2\htdocs\application\classes\class.functions.php on line 16
Normalerweise würde dies bedeuten, dass ich die Auswahl Sachen von unexisting Tabellen und Kram. Aber in diesem Fall ich 'm nicht...
Hier ist die getSetting
Funktion:
public function getSetting($setting)
{
$query = $this->db->conn->prepare('SELECT value, param FROM ws_settings WHERE name = ?');
$query->bind_param('s', $setting);
$query->execute();
$query->bind_result($value, $param);
$query->store_result();
if ($query->num_rows() > 0)
{
while ($query->fetch())
{
return $value;
if ($param === '1')
{
$this->tpl->createParameter($setting, $value);
}
}
}
else
{
__('invalid.setting.request', $setting);
}
}
Den $this->db
variable übergeben wird, über einen Konstruktor. Im Falle der Notwendigkeit, hier ist es:
public function __construct($db, $data, $tpl)
{
$this->db = $db;
$this->tpl = $tpl;
$this->data = $data;
$this->data->setData('global', 'theme', $this->getSetting('theme'));
}
Auch, da bin ich auf eine Datenbank meine Datenbank-Verbindung:
class Database
{
private $data;
public function __construct($data)
{
$this->data = $data;
$this->conn = new MySQLi(
$this->data->getData('database', 'hostname'),
$this->data->getData('database', 'username'),
$this->data->getData('database', 'password'),
$this->data->getData('database', 'database')
);
if ($this->conn->errno)
{
__('failed.db.connection', $this->conn->errno);
}
date_default_timezone_set('Europe/Amsterdam');
}
Hab ich schon getestet, die Verbindung, 100% positiv, dass es funktioniert wie vorgesehen.
Ich werde die DB-Verbindungs-Dinge, die in einer Konfigurations-Datei:
'database' => array(
'hostname' => '127.0.0.1',
'username' => 'root',
'password' => ******,
'database' => 'wscript'
)
Nun ist die seltsame Sache ist, die Tabelle existiert, die angeforderte Einstellung existiert, wird die DB existiert aber noch, dass Fehler nicht verlassen. Hier ist ein Beweis dafür, dass die DB ist richtig:
InformationsquelleAutor der Frage Wesley Peeters | 2014-12-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Liegt das problem:
Den
prepare()
- Methode zurückgeben kannfalse
- und Sie sollten prüfen,. Als, warum gibt esfalse
vielleicht die Tabellennamen oder Spaltennamen (inSELECT
oderWHERE
- Klausel) sind nicht korrekt?Bedenken Sie auch, verwenden von etwas wie
$this->db->conn->error_list
zu prüfen, - Fehler, die aufgetreten sind, das Parsen von SQL. (Ich werde gelegentlich echo der eigentlichen SQL-Anweisung strings und einfügen in phpMyAdmin auch testen, aber es ist definitiv etwas versagt es.)InformationsquelleAutor der Antwort RobP
Jeder Zeit erhalten Sie das...
...es ist wahrscheinlich, weil es ein Problem mit Ihrer Anfrage. Die
prepare()
zurückkehren könnteFALSE
(a Boolean), aber diese generische Fehlermeldung nicht verlassen, Sie viel in der Art von hinweisen. Wie finden Sie heraus, was ist falsch an der Abfrage? Sie Fragen!Zunächst stellen Sie sicher, dass die Fehlerberichterstattung ist aktiviert und sichtbar: fügen Sie diese beiden Zeilen an den Anfang der Datei(en) direkt nach dem öffnen
<?php
tag:Wenn Ihr error reporting in der php.ini, die Sie nicht zu kümmern. So stellen Sie sicher behandeln von Fehlern, die sich anmutig und niemals die wahre Ursache der Probleme für Ihre Benutzer. Enthüllt die wahre Ursache der öffentlichkeit kann eine gold gravierte Einladung für diejenigen, die zu Schaden Ihre Websites und Server. Wenn Sie nicht wollen, senden Sie Fehler an den browser können Sie immer überwachen Sie Ihre web-server-Fehlerprotokolle. Log-Standorten variiert von server zu server z.B. unter Ubuntu die Fehler-Logdatei befindet sich normalerweise unter
/var/log/apache2/error.log
. Wenn Sie untersuchen, Fehlerprotokolle in einer Linux-Umgebung können Sie verwendentail -f /path/to/log
in einem Konsole-Fenster, um zu sehen, Fehler, wie Sie auftreten, in Echtzeit....oder wie Sie Sie machen.Einmal bist du squared entfernt auf standard-error-reporting hinzufügen, auf Fehler überprüft Ihre Datenbank-Verbindung und Abfragen wird Ihnen viel mehr Details über die Probleme Los. Haben Sie einen Blick auf dieses Beispiel, wo die Spalte name ist ungültig. Erstens, der code gibt die generische fatal error Nachricht:
Der Fehler ist allgemein und nicht sehr hilfreich, um Sie bei der Lösung, was Los ist.
Mit ein paar mehr Zeilen code können Sie erhalten sehr detaillierte Informationen, die Sie verwenden können, um das Problem zu lösen sofort. Überprüfen Sie die
prepare()
Anweisung für truthiness und wenn es gut ist, können Sie fortfahren, zu binden und ausführen.Wenn etwas falsch ist, können Sie spuckte eine Fehlermeldung, die Sie direkt zu dem Problem. In diesem Fall gibt es keine
foo
Spalte in der Tabelle, die Lösung des Problems ist trivial.Wenn Sie sich entscheiden, Sie können diese Prüfung in eine Funktion oder Klasse und erweitern Sie durch die Bearbeitung der Fehler anmutig wie zuvor erwähnt.
InformationsquelleAutor der Antwort Jay Blanchard
prepare
booleschen nur, wenn es scheitert daherFALSE
, um den Fehler zu vermeiden, müssen Sie überprüfen, ob esTrue
ersten, bevor Sie ausgeführt:InformationsquelleAutor der Antwort meda
Selbst wenn die syntax korrekt ist, vorbereiten zurückkehren konnte, false, wenn es eine Vorherige Anweisung und es war nicht geschlossen.
Immer in der Nähe Ihrer vorherigen Aussage mit
Wenn die syntax korrekt ist, wird die folgende Abfrage ausgeführt wird auch.
InformationsquelleAutor der Antwort Tamas Kalman
Anderen situation, die dieses problem verursachen können, ist falsch casting in Ihren Abfragen.
Ich weiß, es klingt vielleicht offensichtlich, aber ich habe in dieser durch die Verwendung
tablename
stattTablename
. Überprüfen Sie Ihre Abfragen, und stellen Sie sicher, dass Sie die gleiche Falle wie die tatsächlichen Namen der Spalten in Ihrer Tabelle.InformationsquelleAutor der Antwort 4ndyG
Manchmal ist es auch wegen einer falschen Tabelle Namen oder Spalte name in der prepare-Anweisung.
Sehen:
https://www.youtube.com/watch?v=LGHdQ1bBho8
InformationsquelleAutor der Antwort Reejesh PK
Sollten Sie immer versuchen, so viel wie möglich, immer Ihre Anweisungen in einen try-catch-block ... es wird immer helfen, die in Situationen wie diese, und lassen Sie wissen, was falsch ist. Vielleicht ist der name der Tabelle oder Spalte name ist falsch.
InformationsquelleAutor der Antwort Sam Banana
Dieser spezielle Fehler hat sehr wenig zu tun mit dem tatsächlichen Fehler. Hier ist meine ähnlichen Erfahrungen-und die Lösung...
Ich hatte eine Tabelle, die ich in meiner Erklärung mit "|Datenbank-name|.login" zusammengesetzten Namen. Ich dachte, das wäre kein problem. Es wurde das problem in der Tat. Einklammerung innerhalb von eckigen Klammern ist mein problem gelöst ("[|Datenbank-name|].[login]"). Das problem ist also, MySQL erhaltenen Worten (anders herum 😉 )... stellen Sie sicher, dass Ihre Spalten sind nicht zu Versagen, um diese Art von Fehler scdenario...
InformationsquelleAutor der Antwort Sam Saarian
Folgenden zwei sind die wahrscheinlichste Ursache für dieses Problem:
InformationsquelleAutor der Antwort Hari Das
Manchmal explizit unter Angabe Ihrer Tabelle die Spaltennamen (vor allem in einer insert-Abfrage) kann helfen. Zum Beispiel, die Abfrage:
INSERT INTO tableName(param1,param2,param3) VALUES(?,?,?)
kann besser funktionieren als Gegensatz zu:INSERT INTO tableName VALUES(?,?,?)
InformationsquelleAutor der Antwort ebite Zion