PHP PDO绑定IN/NOT IN语句中Array变量

最近项目中使用的框架,封装了IN方法,但是没有封装NOT IN 。 使用NOT IN 只能用原生的PDO语法,想当然的写出来,结果就是BUG。

tips: 表结构

id
1
2
3
4

刚开始的代码如下:



try {

$dns = "mysql:host=***;dbname=*";

$pdo = new PDO($dns, "root", "root");

$ids = [1,2,3];
$ids = implode($ids, ',');
$sql = $pdo->prepare("select * from goods where id in (:ids)");
$sql->bindParam(':ids',$ids);
$sql->execute();

var_dump($sql->fetchAll(PDO::FETCH_ASSOC));

} catch (PDOException $e) {

	echo $e;
}

查询结果:array(1) { [0]=> array(1) { [“id”]=> string(1) “1” } } , 很显然不对啊。主要原因是ids绑定的值’123’。这个是PDO解析的时候,只取了第一个值。

知道问题点,解决办法主要介绍两种。一种是适合参数少,就直接分开绑定



try {

$dns = "mysql:host=***;dbname=*";

$pdo = new PDO($dns, "root", "root");

$sql = $pdo->prepare("select * from goods where id in (:id_1, :id_2, :id_3)");
$sql->bindValue(':id_1',1);
$sql->bindValue(':id_2',2);
$sql->bindValue(':id_3',3);
$sql->execute();

var_dump($sql->fetchAll(PDO::FETCH_ASSOC));

} catch (PDOException $e) {

	echo $e;
}

第二种办法适合参数比较多, 批量拼接字符串

try {

$dns = "mysql:host=***;dbname=*";

$pdo = new PDO($dns, "root", "root");
$ids = [1,2,3];
$sql = $pdo->prepare("select * from goods where id in (".str_repeat('?,', count($ids) - 1). "?)");
$sql->execute($ids);

var_dump($sql->fetchAll(PDO::FETCH_ASSOC));

} catch (PDOException $e) {

	echo $e;
}

基本原理多差不多。

参考资料:

  1. https://blog.csdn.net/github_35780607/article/details/79541012
  2. https://blog.csdn.net/Drug_/article/details/79867110

你可能感兴趣的:(php)