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 子句无法按预期工作 [重复]

如何查看准备好的 PDO SQL 语句 [重复]

用于“IN”语句的变量/字符串的 PHP PDO bindParam...? [复制]

在查询中使用 PDO 准备好的语句和 LIMIT 时出错 [重复]

PHP PDO准备语句给出“无效语法”错误[重复]

PDO 准备语句限制不起作用 [重复]