PDO 和 SQL IN 语句 [重复]
Posted
技术标签:
【中文标题】PDO 和 SQL IN 语句 [重复]【英文标题】:PDO and SQL IN statements [duplicate] 【发布时间】:2011-02-10 11:55:41 【问题描述】:我正在使用 PDO 进行类似这样的搜索
$states = "'SC','SD'";
$sql = "select * from mytable where states in (:states)";
$params = array(':states'=>$states);
我使用我的功能
$result = $this->selectArrayAssoc($sql, $params);
我的 selectArrayAssoc 函数如下
public function selectArrayAssoc($sql, $params = array())
try
$sth = $this->db->prepare($sql);
$sth->execute($params);
$result = $sth->setFetchMode(PDO::FETCH_ASSOC);
return $sth->fetchAll();
catch(PDOException $e)
print $e->getMessage();
//Log this to a file later when in production
exit;
它不带引号的变量,我认为是抑制,在这种情况下如何处理。
【问题讨论】:
见***.com/questions/920353/… 【参考方案1】:当使用准备好的语句占位符(参数绑定)时,占位符的每次出现都恰好包含一个变量。
你试图通过几个。发生的事情基本上是您的参数被转义:您的 :states 被替换为 '''SC'',''SD''' 或 '\' SC\',\'SD\'' 在内部,而不仅仅是你想要的原始 'SC','SD'。
【讨论】:
那么我如何在这里准确地传递我的值,我从一个数组中将它内爆并像这样('sc','sd')在这里得到它们。我尝试了各种引用方法,似乎一切都失败了。 你不想引用它们。给定$states = "'SC','SD'";
和$sql = "select * from mytable where states in (:states)";
,你会想要$sql = "select * from mytable where states in ('SC','SD')";
。看看 Tom Haigh 链接到您的问题。
从其他问题之一得到答案,谢谢 Pinkgothic
这不是真正的准备好的语句所做的,它们并没有真正替换或添加引号,而是将它们视为 参数,它们被“注入”到准备好的在服务器(mysql)端查询。
是的,你是对的;我只是发现用这些术语更容易理解。 :)【参考方案2】:
pinkgothic 是绝对正确的。但我认为你遇到了问题,你有一个“状态”数组并且想要使用这个数组。您必须为查询中的每个值准备占位符。
$states = array('SC','SD');
$phArray = array();
$valArray = array();
foreach($ids AS $key=>$value)
array_push($phArray, ':PH' . $key);
$valArray[':PH' . $key] = $value;
$sql = 'select * from mytable where states in (' . implode(',', $phArray) . ')';
$params = array($valArray);
$result = $this->selectArrayAssoc($sql, $params);
【讨论】:
以上是关于PDO 和 SQL IN 语句 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
带有命名占位符的 PDO 准备好的语句 IN 子句无法按预期工作 [重复]
用于“IN”语句的变量/字符串的 PHP PDO bindParam...? [复制]