У меня есть функция 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);
}
Это работает только с отдельными параметрами (см. Мой предыдущий вопрос)
Поэтому я пробовал модифицировать foreach в функции
foreach ($params as $key => $value) {
$statement->bindParam($key, $value);
}
Я запускаю запрос как
$variation = $query->run(
"SELECT url, title, sale_price
FROM product
where category_id = :category
and url != :url",
[ ":category" => $data[0]->category_id, ":url" => $filePathArray[1] ]
);
Он возвращает пустой набор.
Эта функция не требуется. Вы можете передать массив параметров непосредственно в $statement->execute()
как описано в документации для PDOStatement :: execute().
Это так же безопасно, как и с помощью bindParam()
, он одинаково защищает от SQL-инъекции.
Единственный недостаток заключается в том, что вы не можете указать тип каждого параметра, но в большинстве случаев это не обязательно, и в этом примере вы его не использовали, так что вы ничего не потеряете.
$statement->execute()
?bindParam()
вы можете указать тип (int, string) и т. д., который является третьим параметром.