PHP PDO bindValue () не работает - PullRequest
1 голос
/ 24 апреля 2010
<?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);

А конкретным параметром является второй.

Код, как указано выше, не работает, ничего не возвращает, поэтому цикл while не выполняется. Если я заменю $ _GET ['index'] на число, например, 10, оно будет работать нормально, оно возвращает 10 строк. Повтор $ _GET ['index'] отображает число, поэтому оно должно передавать число. Я также пробовал bindParam, но результат тот же.

Почему это не работает?

EDIT:

Интересно ... Если я заменю $_GET['index'] with (int)$_GET['index'], это сработает.

Ответы [ 3 ]

4 голосов
/ 25 апреля 2010

Если вы проверите $ stmt-> errorInfo (), вы фактически обнаружите, что ваш запрос не удался.

PDO :: PARAM_INT сообщает PDO, что вы даете ему целое число. Если вы не дадите PDO целое число, PDO будет указывать значение в строке sql.

SELECT id, name FROM testdb ORDER BY time DESC LIMIT "1", 10

Все значения в $ _GET являются либо массивом, либо строкой. Вы сделали правильную вещь, приведя $ _GET ['index'] к целому числу, прежде чем связать его как значение. Делая это, PDO получает целое число, ожидая целое число от PDO :: PARAM_INT, и, следовательно, не будет заключать в кавычки значение в строке sql.

SELECT id, name FROM testdb ORDER BY time DESC LIMIT 1, 10
1 голос
/ 25 апреля 2010

Значения в суперглобальном массиве $_GET являются строками: PHP не догадывается, что передано в строке запроса.


Если вы хотите, чтобы одно значение из $_GET рассматривалось как целое число - это то, что вам нужно, здесь - вам нужно преобразовать его в целое число самостоятельно.

Для этого вы можете использовать:

  • A typecast: (int)$_GET['yourval']
  • Функция intval(), которая позволяет определить базу, которая будет использоваться
0 голосов
/ 24 апреля 2010

Похоже, что $ _GET ['index'] не то, что вы ожидаете. Используйте var_dump (), чтобы проверить значение ближе. Обратите внимание на длину строки, которую сообщает var_dump, потому что некоторые символы не обнаруживаются визуально, но длина строки расскажет скрытую историю.

...