Неверный оператор sql: количество связанных переменных не соответствует количеству токенов - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть этот код:

$connection = new DBConnection();
$searchDeals = false;
try {
    $sql = 'SELECT d.`id`, d.`title`, d.`user_id`, d.`deal_price`, d.`original_price`, d.`host_link`, d.`coupon_code`, d.`description`,
                    d.`start_date`, d.`expire_date`, d.`votes_counter`, d.`created_at`,
                    u.`username`
            FROM `deals` AS d
            WHERE d.`title` LIKE :search_input
            JOIN `users` AS u
            ON d.user_id = u.id
            LIMIT :max_deals
            OFFSET :pageOffset';
    $stmt = $connection->dbh->prepare($sql);
    $stmt->bindParam(':max_deals', $maxDealsInPage, PDO::PARAM_INT);
    $stmt->bindParam(':pageOffset', $pageOffset, PDO::PARAM_INT);
    $stmt->execute(array(
        'search_input' => '%' . $_GET['q'] . '%' --- HIGHLIGHTED LINE ---
    ));
    $searchDeals = $stmt->fetchAll(PDO::FETCH_ASSOC);    
} catch(PDOException $e) {}
$connection->disconnect();

Я получаю это сообщение об ошибке:

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens ON LINE (---HIGHLIGHTED LINE IN MY CODE---)

Я не могу понять почему .. потому что я поставляю все необходимые токены ...

1 Ответ

1 голос
/ 05 февраля 2020

Нельзя смешивать привязку параметров. Я цитирую официальную документацию :

Выполнить подготовленное заявление. Если подготовленный оператор содержал маркеры параметров, то для привязки переменных или значений (соответственно) к маркерам параметров необходимо вызывать:

PDOStatement::bindParam() and/or PDOStatement::bindValue()

.

ИЛИ

необходимо передать массив значений параметров только для ввода

Так что просто используйте bindParam() для всех трех параметров или предоставьте их все через execute()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...