我正在使用php mysql-pdo和symfony
问题是:我有如下所述的查询
WHERE STATUS IN (:STATUS)
状态值为A','B
。
当我把它绑定为sting它的转义如下
WHERE STATUS IN ('A\',\'B')
因此产出错误。
请求帮助答案 0 :(得分:1)
预备语句只能代表完整数据文字。不是文字的一部分,也不是复杂的表达,也不是标识符。但只是字符串或数字。因此,您的查询不起作用,因为您实际绑定复杂表达式,而不是因为引号
必须创建一个包含表示每个数组成员的占位符的查询,然后绑定此数组值以供执行:
$ids = array(1,2,3);
$stm = $pdo->prepare("SELECT * FROM t WHERE id IN (?,?,?)");
$stm->execute($ids);
为了使这个查询更灵活,最好用动态创建一个字符串:
$ids = array(1,2,3);
$in = str_repeat('?,', count($arr) - 1) . '?';
$sql = "SELECT * FROM table WHERE column IN ($in)";
$stm = $db->prepare($sql);
$stm->execute($ids);
$data = $stm->fetchAll();
当然,如果我们要绑定其他变量,我们需要将它们添加到values数组中:
$ids = array(1,2,3);
$in = str_repeat('?,', count($arr) - 1) . '?';
$sql = "SELECT * FROM table WHERE column IN ($in) AND category=?";
$stm = $db->prepare($sql);
$ids[] = $category; //adding another member to array
$stm->execute($ids);
$data = $stm->fetchAll();
代码变得非常臃肿但是所有PDO都可以提供处理这种复杂案例的代码。作为进一步的改进,可以发明它们自己的占位符来支持这种复杂的数据类型。