Это мое подготовленное заявление.
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);