Как я использую подготовленный оператор pdo для порядка и ограничиваю пункты?

Я хочу использовать подготовленный оператор, в котором передаваемые параметры для ORDER BY и LIMIT пункты, как так:

$sql = 'SELECT * FROM table ORDER BY :sort :dir LIMIT :start, :results';
$stmt = $dbh->prepare($sql);
$stmt->execute(array(
     'sort'  => $_GET['sort'], 
     'dir'  => $_GET['dir'], 
     'start'  => $_GET['start'],
     'results' => $_GET['results'],
     )
    );

Но $stmt->fetchAll(PDO::FETCH_ASSOC); возвраты ничто.

Кто-то может указать на то, что неправильная вещь, которую я делаю? Это может быть сделано? В противном случае, на что я должен сослаться для полного списка пунктов, где параметры могут использоваться?

16
задан beldaz 8 August 2011 в 06:18
поделиться

2 ответа

Вы не можете привязать параметр, чтобы указать ключевое слово языка или имя поля - он должен заменять литерал. Поэтому я считаю, что ваши предельные значения подходят, а ваш заказ - нет. Лучше всего вручную заменить sort и dir в строке. Избегайте их, но не используйте для этого инструменты БД, поскольку они не являются строковыми литералами. В основном убедитесь, что нет специальных символов.

3
ответ дан 30 November 2019 в 17:52
поделиться

После использования:

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

я получил сообщение:

Неперехваченное исключение 'PDOException' с сообщением 'SQLSTATE [42000]: Синтаксическая ошибка или нарушение прав доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте в руководстве , которое соответствует версии вашего сервера MySQL , правильный синтаксис для использования рядом с '' 0 ',' 10 '' в строке 1

Итак, когда вы используете массив для выполнения, он рассматривает ваши входные данные как строку, что не является хорошей идеей для LIMIT

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT * FROM table ORDER BY :sort :dir LIMIT :start, :results";
$stmt = $dbh->prepare($sql);
$stmt->bindParam(':start', $_GET['start'], PDO::PARAM_INT);
$stmt->bindParam(':results', $_GET['results'], PDO::PARAM_INT);
$stmt->bindParam(':sort', $_GET['sort']);
$stmt->bindParam(':dir', $_GET['dir']);
$stmt->execute();

$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
print_r($data);
20
ответ дан 30 November 2019 в 17:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: