Задать вопрос
@ood1n
Пытаюсь развиться

Почему PDO::execute не заменяет псевдопеременные в запросе?

Здравствуйте. Скажите, пожалуйста, почему PDO::execute не заменяет псевдопеременные в запросе. Если подставлять данные напрямую в запрос, то возвращает строки из бд. Ставил двоеточие в массиве, тоже не помогало.
$sql = 'SELECT * FROM vocabulary ORDER BY word_date DESC LIMIT :startLimit , :countLimit';
$lines = $db->query($sql, ['startLimit' => $_POST['slimit'], 'countLimit' => $_POST['limit']]);
var_dump($lines);
//Метод query
public function query($sql, $params = false) {
	$query = $this->db->prepare($sql);
	if ( $params ) {
		$query->execute($params);
	}else {
		$query->execute();
	}
	return $query->fetchAll(\PDO::FETCH_ASSOC);
}
  • Вопрос задан
  • 170 просмотров
Подписаться 3 Простой Комментировать
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Потому что не выключен режим эмуляции.

Только фактически всё наоборот: при включенном режиме эмуляции PDO как раз таки подставляет данные в запрос, и в LIMIT будет ошибка. А при выключенном данные в запрос не подставляются, и следовательно никакой ошибки не будет.

Судя по тому, что в вопросе нет сообщения об ошибке, при соединении вообще не указывается ни один нужный параметр. Как правильно соединяться с PDO
При указанных настройках запрос с лимитом будет работать.

Идея с функцией query() отличная, только она не должна возвращать fetchAll(). Это все равно что добровольно отказаться от половины функциональности PDO!
Функция должна возвращать стейтмент. Тогда ее можно будет использовать для любых запросов ,и получать данные в любых из дюжины форматов, поддерживаемых PDO, а не только в виде тупого массива.

Соответственно, функция должна делать return $query; а код будет таким
$sql = 'SELECT * FROM vocabulary ORDER BY word_date DESC LIMIT :startLimit , :countLimit';
$params = ['startLimit' => $_POST['slimit'], 'countLimit' => $_POST['limit']];
$lines = $db->query($sql, $params)->fetchAll();
var_dump($lines);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
sHinE
@sHinE
веб-разработчик, php/js/mysql и сопутствующее
Насколько помню есть замута с ипользованием плейсхолдеров в лимите, в доктрине во всяком случае.
Попробуйте конкретно с лимитом вот так:
$st->bindValue(":limit", $limit, ParameterType::INTEGER);
Ответ написан
jasonOk
@jasonOk
Легче болтать, чем код писать
Заменяет:
$sql = 'SELECT * FROM vocabulary ORDER BY word_date DESC LIMIT ?, ?';
$lines = $db->query($sql, [$_POST['slimit'], $_POST['limit']]);

public function query($sql, $params = false) {
  $query = $this->db->prepare($sql);
  if ( $params ) {
    $query->execute($params);
  }else {
    $query->execute();
  }
  return $query->fetchAll(\PDO::FETCH_ASSOC);
}
Ответ написан
Комментировать
@procode
Разработчик
Помню была у меня такая же фигня давно как-то))) лень разбираться в конкретике кода, но обратите внимание на тип данных и/или кавычки, вроде проблема была с этим связана.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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