@khodos_dmitry

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

Так работает:
$sql = "SELECT * FROM `cpl_names` WHERE `type` = 'length' AND `id` IN ('meter', 'kilometer')";
$result = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);

А так нет:
$in_arr = ['meter', 'kilometer'];
$count_arr = count($in_arr);
$in_questions = str_repeat('?,', $count_arr - 1) . '?';
$sql = "SELECT * FROM `cpl_names` WHERE `type` = 'length' AND `id` IN ($in_questions)";
echo $sql;  // SELECT * FROM `cpl_names` WHERE `type` = 'length' AND `id` IN (?,?)
$stm = $pdo->prepare($sql);
$result = $stm->execute($in_arr)->fetchAll(PDO::FETCH_ASSOC);

Ошибка: Fatal error: Uncaught Error: Call to a member function fetchAll() on bool
PDO вроде включен:
5fd2546a2d13a194970662.png
Но запросы с prepare не работают никогда. Что это может быть?
  • Вопрос задан
  • 352 просмотра
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
потому что execute() возвращает не то что ты думаешь, а тыкву.
о чем тебе недвусмысленно текст ошибки и сообщает

"без prepare возвращает" потому что query() возвращает объект класса PDOStatement, в котором есть метод fetchAll.
а execute - это УЖЕ метод объекта $stmt класса PDOStatement, который возвращает БУЛЕВО значение
и fetchAll надо вызывать из того же объекта, то есть из $stmt, а не из результата execute

чтобы решить данную проблему и заодно избавиться от лишнего вызова execute() применим немого магии
class MyPDO extends PDO
{
    public function preparedQuery($sql, $args = NULL)
    {
        if (!$args)
        {
             return $this->query($sql);
        }
        $stmt = $this->prepare($sql);
        $stmt->execute($args);
        return $stmt;
    }
}

и дальше уже создав экземпляр этого класса обычным порядком,
$in_arr = ['meter', 'kilometer'];
$count_arr = count($in_arr);
$in_questions = str_repeat('?,', $count_arr - 1) . '?';
$sql = "SELECT * FROM `cpl_names` WHERE `type` = 'length' AND `id` IN ($in_questions)";
$result = $mypdo->preparedQuery($sql, $in_arr)->fetchAll();
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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