Я хочу использовать подготовленный оператор, в котором передаваемые параметры для 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);
возвраты ничто.
Кто-то может указать на то, что неправильная вещь, которую я делаю? Это может быть сделано? В противном случае, на что я должен сослаться для полного списка пунктов, где параметры могут использоваться?
Вы не можете привязать параметр, чтобы указать ключевое слово языка или имя поля - он должен заменять литерал. Поэтому я считаю, что ваши предельные значения подходят, а ваш заказ - нет. Лучше всего вручную заменить sort и dir в строке. Избегайте их, но не используйте для этого инструменты БД, поскольку они не являются строковыми литералами. В основном убедитесь, что нет специальных символов.
После использования:
$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);