PDO – запрос не дает результатов

Это мое подготовленное заявление.

SELECT `id`, `title`, `image`, `discount`, `price`, `new_price`, `img_url` FROM `deals` WHERE `active`="1" AND `category`=:ctid AND `img_url`!="" AND `Brands`=:p1 ORDER BY `order`, `id` ASC LIMIT 0, 12; 

Это массив, который я использую в bindParam .

 Array ( [:ctid] => 1 [:p1] => Apple ) 

Вот код PHP:

 $sql = 'SELECT `id`, `title`, `image`, `discount`, `price`, `new_price`, `img_url` FROM `deals` WHERE `active`="1" AND `category`=:ctid AND `img_url`!="" AND `Brands`=:p1 ORDER BY `order`, `id` ASC LIMIT 0, 12;'; $sql = $link->prepare( $sql ); $binders = array( ':ctid' => 1, ':p1' => 'Apple' ); foreach( $binders as $key => $value ) { $sql->bindParam( $key, $value ); } $sql->execute(); $sql->setFetchMode( PDO::FETCH_ASSOC ); $result = $sql->fetchAll(); 

Это не дает результата.

Но, если я делаю прямой запрос, я получаю результаты от db. Что может быть неправильным в вышеуказанном запросе.

Любая помощь приветствуется.

Проблема здесь в том, что вы связываете параметры с bindParam , который использует привязку по ссылке. В вашем случае вместо этого следует использовать bindValue :

 foreach( $binders as $key => $value ) { $sql->bindValue( $key, $value ); } 

Или вы можете передать массив непосредственно в метод execute() :

 $sql->execute( $binders ); 

Как описано в руководстве:

the variable is bound as a reference and will only be evaluated at the time that PDOStatement::execute() is called.

Поэтому, когда ваш цикл foreach заканчивается, $value имеет значение последнего элемента массива Apple . Поэтому при execute :ctid оба значения :ctid и :p1 становятся равными Apple . Наверняка, это не то, что вы хотите)

Попробуйте это связать значение

 $sql = 'SELECT `id`, `title`, `image`, `discount`, `price`, `new_price`, `img_url` FROM `deals` WHERE `active`="1" AND `category`=:ctid AND `img_url`!="" AND `Brands`=:p1 ORDER BY `order`, `id` ASC LIMIT 0, 12;'; $link->prepare($sql); $link->execute([ ':ctid' => 1, ':p1' => 'Apple' ]); $result = $link->fetchAll(PDO::FETCH_ASSOC);