У меня есть функция PDO, которая выполняет запрос Mysql. Он корректно работает для всех запросов.
public function run($sql, array $params = NULL) {
$statement = $this->pdo->prepare($sql);
if (!is_null($params)) {
foreach ($params as $key) {
$statement->bindParam(":n", $key);
}
}
$statement->execute();
return $statement->fetchAll(PDO::FETCH_CLASS);
}
Однако, когда я запускаю запрос ниже, он возвращает пустой набор
$variation = $query->run(
"SELECT url, title, sale_price
FROM product
where category_id = :n
and url != :n",
[ $data[0]->category_id, $filePathArray[1] ]
);
Его работы, когда я запускаю запрос вручную в mysql-клиенте.
Я пробовал тип, набрасывающий идентификатор категории, но не радость:
(int)$data[0]->category_id
(поскольку он передавал строку, а не Integer)
Вот параметр var_dump из $ params из функции run
array(2) {
[0]=> int(1)
[1]=> string(21) "light-resistance-band"
}
Вам нужно добавить другой именованный держатель места для привязки соответствующих значений (не идентичных)
$variation = $query->run(
"SELECT url, title, sale_price
FROM product
where category_id = :n
and url != :n1",
[ ':n'=>$data[0]->category_id, ':n1'=>$filePathArray[1] ]
);
Вы можете скомпоновать свою функцию, проверяя тип $key
и bindParam следующим образом:
public function run($sql, array $params = NULL) {
$statement = $this->pdo->prepare($sql);
if (!is_null($params)) {
foreach ($params as $key=>$value) {
$statement->bindParam(":".$key, $value);
}
}
$statement->execute();
return $statement->fetchAll(PDO::FETCH_CLASS);
}
:n
используемым дважды, и вы связываете два разных значения с:n
. Как это должно работать?