PHP PDO: wie die Rückkehr der integer -
Denke ich, es wäre ein Fehler in meiner pdo-abrufen von Daten-Methode,
public function fetch_all($query, $params = array())
{
try
{
# prepare the query
$stmt = $this->connection->prepare($query);
# if $params is not an array, let's make it array with one value of former $params
if (!is_array($params)) $params = array($params);
# execute the query
$stmt->execute($params);
# return the result
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
catch (PDOException $e)
{
# call the get_error function
$this->get_error($e);
}
}
Alle Parameter, die übergeben wurden, die in dieser Methode werden Zeichenfolgen, aber ich brauche Ganzzahlen für sql LIMIT Abfrage, wie unten
$sql = "
SELECT *
FROM root_pages
ORDER BY root_pages.pg_created DESC
LIMIT ?,?";
items = $connection->fetch_all($sql,array('0','6'));
Es gibt diesen Fehler zurück,
2SQLSTATE[42000]: Syntax error oder
access violation: 1064 Sie haben eine
Fehler in der SQL syntax; check the
das Handbuch, das entspricht Ihrer MySQL
server-version für den richtigen syntax
in der Nähe von "0" oder "6" in Zeile 32
Wie kann ich es beheben?
EDIT:
Wie angedeutet, änderte ich den code in meine Methode zu dieser unten,
# fetch a multiple rows of result as a nested array ( = multi-dimensional array)
public function fetch_all($query, $params = array())
{
try
{
# prepare the query
$stmt = $this->connection->prepare($query);
# if $params is not an array, let's make it array with one value of former $params
//if (!is_array($params)) $params = array($params);
foreach($params as $k=>$p){
if(is_numeric($p)){
$stmt->bindParam($k+1, $p, PDO::PARAM_INT);
}
else{
$stmt->bindParam($k+1, $p, PDO::PARAM_STR);
}
}
$stmt->execute();
# execute the query
//$stmt->execute($params);
# return the result
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
catch (PDOException $e)
{
# call the get_error function
$this->get_error($e);
}
}
$items = $connection->fetch_all($sql,array(0,6));
dann bekomme ich eine andere Fehlermeldung,
2SQLSTATE[42000]: Syntax error oder
access violation: 1064 Sie haben eine
Fehler in der SQL syntax; check the
das Handbuch, das entspricht Ihrer MySQL
server-version für den richtigen syntax
in der Nähe von "6" in Zeile 32
EDIT:
Ich habe gerade es geändert,
if(is_int($p)){..}
aber noch immer den gleichen Fehler... seufz...
- Können Sie noch brauchen
if (!is_array($params)) $params = array($params);
- du hast Recht! es funktioniert jetzt! Dank so viel. kann ich Fragen - warum
$k+1
? Danke! - Es ist
$k+1
da arrays in PHP sind null-indiziert, aberbindParam
will der 1. parameter1
, nicht0
(und so weiter). - habe es Dank 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie nicht tun können, diese durch Platzhalter.
PDO immer Zitate params, dass nicht
null
, auch wenn Sie zahlen. Normalerweise ist nicht so eine schlechte Sache, aberLIMIT
Klauseln nicht verarbeiten können, zitiert zahlen.Sind Sie gehen zu müssen, zu fallen, zurück zu guten, alten Zeiten Verkettung. Weil Sie wissen, dass diese gehen, um Integer-zahlen sein, können Sie behandeln Sie sicher in Ihrem code durch aufrufen der
intval
oder casting Sie vor der Verkettung.sollten Sie übergeben Ihre parameter mit Typ-PDO::PARAM_INT, wie:
Entfernen Sie die Anführungszeichen um den
0
und die6
:Dadurch sollte die Abfrage:
Mit Zitaten auf die
0
und die6
, die Abfrage ist:BEARBEITEN: Call
bindParam
rufen Sie vorexecute
.Dann rufen Sie
fetch_all
etwa so:bindParam
zu sagen, PDO, dass man mit INTs. (Siehe editiert Antwort)Versuchen:
Beachten Sie das fehlen von Anführungszeichen bei der
0
und6
- das macht PHP behandeln Sie so, wie die ganzen zahlen Sie sind, und nicht die Saiten, die Sie hatten.)
.