SQLSTATE[HY093]: Invalid parameter number: keine Parameter gebunden waren, aber die Parameter sind
Baue ich ein Datenbank-Objekt, dass sich der PDO
Objekt mit der PDOStatement
- Objekt, um für die Verkettung zur Verfügung stehen. Im Grunde habe ich einfach nur die Methoden, die ich am häufigsten verwenden, aber bindParam
gibt mir eine harte Zeit.
private $stmt = null;
...
public function prepare($statement,array $driver_options = array()) {
if($this->stmt) throw new \Exception('PDO Statement already prepared, no override!');
$this->stmt = parent::prepare($statement, $driver_options);
return $this;
}
public function bindParam($place, &$val, $dataType){
if(!$this->stmt) throw new \Exception('PDO Statement is empty');
$this->stmt->bindParam($place, $val, $dataType);
return $this;
}
public function execute(array $params = array()){
if(!$this->stmt) throw new \Exception('PDO Statement is empty');
$this->stmt->execute($params);
return $this;
}
public function fetchAll($pdoFetchType){
if(!$this->stmt) throw new \Exception('PDO Statement is empty');
return $this->stmt->fetchAll($pdoFetchType);
}
...
public function getStmt(){
return $this->stmt;
}
public function clearStmt(){
$this->stmt = null;
}
Bekomme ich die Fehlermeldung aus dem Titel, in diesem code:
$i = 0;
$db->prepare('SELECT * FROM users LIMIT ?,1')->bindParam(1, $i, \PDO::PARAM_INT);
while($row = $db->execute()->fetchAll(\PDO::FETCH_ASSOC)){
echo "<pre>".print_r($row, true)."</pre>";
$i++;
}
Im Grunde, was ich herausgefunden habe über diesen Fehler ist, dass es tritt auf, wenn Variablen in bindParam
sind null
, aber $i
ist eindeutig nicht null. Können Sie mir helfen?
BEARBEITEN: Auch
var_dump($this->stmt->bindParam($place, $val, $dataType));
in der bindParam
Methode gibt TRUE
. Aus dem Handbuch:
Rückgabewerte
Gibt bei Erfolg TRUE zurück, im Fehlerfall FALSE.
Es gelingt aber nicht verbindlich den parameter ??? Ich habe das Gefühl mein Gehirn würde explodieren bald.
var_dump($val)
innerhalb der definierten bindParam()
? Und wenn du var_dump($this->stmt)
?int(0)
object(PDOStatement)#6 (1) { ["queryString"]=> string(29) "SELECT * FROM users LIMIT ?,1" }
Ich hasse es wirklich, wenn php
bedeutet das für mich..Ich bin mir langsam die Ideen aus, versuchen
bindValue()
statt bindParam()
Innenseite Ihrer Funktion public function bindParam
um zu sehen, ob sich etwas ändert. Von der doc, im Gegensatz zu PDOStatement::bindValue(), die variable gebunden ist, als Referenz und wird nur ausgewertet werden, zu der Zeit, PDOStatement::execute() aufgerufen wird. aber ich bin mir nicht sicher, ob es würde nichts ändern.auch die Fehlermeldung blieb die gleiche, zumindest das könnte sich geändert haben..
Q_Q
Der debugger ist dein Freund.
InformationsquelleAutor php_nub_qq | 2013-12-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, mit einem Verweis
&$val
statt des Wertes$val
ist, was das Problem verursacht.Bitte versuchen Sie diesen code statt:
BEARBEITEN
Meine obige Antwort ist falsch.
Versuchen Sie, ändern der
execute
Methode:Die übergabe eines leeren array als Parameter an die
execute
Methode entfernt alle vorherigen Bindungen. Dies ist der Grund, warumbindParam
true zurückgegeben (erfolgreich gebunden), noch die "no params gebunden waren" Fehler erschien, sobald Sie aufgerufenexecute
.bindParam
wie das eben keinen Sinn machtReferenzen sind gefährlich und es ist leicht zu brechen Dinge. Bitte versuchen Sie, Ihre Schleife und Aufruf
bindParam
in jeder iteration mit der aktualisierten$i
Wert, anstatt sich auf die Referenz. Ich bin mir sicher, dass es funktionieren wird, wie erwartet.Tut es das nicht. Und die Referenzen sind nicht gefährlich, wenn Sie richtig eingesetzt werden. Wenn die original -
PDO
FunktionbindParam
anhand einer Referenz, dann muss es einen guten Grund dafür, wie es ist. Ich habe versucht, was Sie vorgeschlagen und sowieso, leider, der Fehler ist der gleiche.Hiermit melde ich mich zurückziehen, meine Ansprüche bezüglich Ihrer angeblichen Referenz-Missbrauch - siehe meine bearbeitete Antwort.
Eins der Dinge, die macht Sie wanna go", Wie in der H-hab ich nicht sehen". Ich danke Ihnen sehr, sir!
InformationsquelleAutor mingos
Habe den gleichen Fehler, aber andere Ursache
Meine Anfrage hatte Kommentare, von denen enthalten eine verdammt Fragezeichen.
Für PDO, eine "
?
" ist, natürlich, einen parameter zu binden.Meine Anfrage hatte kein Problem, überall sonst, und ich hatte keine Ahnung, wo PDO würden Sie erfinden einen "parameter", während ich nicht, da ich immer benannte Platzhalter, wie
:value
Verbrachte mehr als eine Stunde 🙁
Kann diese Antwort die helfen, einige Menschen mit dieser dummerweise trivial.
InformationsquelleAutor Balmipour