用引号绑定斜线的问题

时间:2013-07-24 05:40:03

标签: php pdo

我正在使用php mysql-pdo和symfony

问题是:我有如下所述的查询

  WHERE STATUS IN (:STATUS)

状态值为A','B

当我把它绑定为sting它的转义如下

  WHERE STATUS IN ('A\',\'B')

因此产出错误。

请求帮助

1 个答案:

答案 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都可以提供处理这种复杂案例的代码。作为进一步的改进,可以发明它们自己的占位符来支持这种复杂的数据类型。