Вопрос

<?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 Чтобы рассматриваться как целое число - это то, что вы хотите, здесь - вам нужно будет преобразовать его в целое число.

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

  • А. typecast : (int)$_GET['yourval']
  • То intval() функция, которая позволяет одному определенному основу, которое будет использоваться

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top