PHP PDO BindValue () Не работай
Вопрос
<?php
try
{
$db = new PDO("mysql:host=localhost;dbname=DBNAME", "USER", "PASSWD");
$stmt = $db->prepare("SELECT id, name FROM testdb ORDER BY time DESC LIMIT :index, 10");
$stmt->bindValue(":index", $_GET['index'], PDO::PARAM_INT);
$stmt->execute();
while( $r = $stmt->fetch(PDO::FETCH_ASSOC) )
{
echo var_dump($r);
}
}
catch( PDOException $e )
{
die("Exception");
}
Проблема в этой строке: $stmt->bindValue(":index", $_GET['index'], PDO::PARAM_INT);
И конкретный параметр - второй.
Код, как он выше, не работает, он ничего не возвращает, чтобы цикл пока не выполняется. Если я заменил $ _get ['index'] с номером, как 10, он работает нормально, он возвращает 10 строк. Enchoing $ _get ['index'] Отображает номер, поэтому он должен пройти номер. Я также попробовал BindParam, но результат такой же.
Почему это не работает?
РЕДАКТИРОВАТЬ:
Интересно ... если я заменил $_GET['index'] with (int)$_GET['index']
оно работает.
Решение
Если вы проверяете $ STMT-> Errorinfo (), вы на самом деле найдете, что ваш запрос не удался.
PDO :: param_int рассказывает pdo, что вы даете ему целое число. Если вы не даете PDO целое число, PDO будет процитировать значение в строке SQL.
SELECT id, name FROM testdb ORDER BY time DESC LIMIT "1", 10
Все значения в $ _get - это либо массив, либо строка. Вы сделали правильную вещь, принудившись $ _Гежет [«Индекс»] в целое число, прежде чем привязывать его как значение. Делая это, PDO получает целое число, ожидал целое число от PDO :: param_int, и поэтому не будет цитировать значение в строке SQL.
SELECT id, name FROM testdb ORDER BY time DESC LIMIT 1, 10
Другие советы
Ценности в $_GET
Super-Global Array - это строки: PHP не догадается, что прошло Iin QueryString.
Если вы хотите одно значение от $_GET
Чтобы рассматриваться как целое число - это то, что вы хотите, здесь - вам нужно будет преобразовать его в целое число.
Для того, чтобы сделать это, вы можете использовать:
Похоже, $ _гет [«Индекс»] - это не то, что вы ожидаете, что это будет. Используйте var_dump (), чтобы осмотреть значение ближе. Обратите внимание на длину строки, которая сообщает var_dump, потому что некоторые символы не обнаруживаются визуально, но длина строки будет рассказывать скрытую историю.