【问题标题】:PDO and SQL IN statements [duplicate]PDO 和 SQL IN 语句 [重复]
【发布时间】: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;
  }
}

它不带引号的变量,我认为是抑制,在这种情况下如何处理。

【问题讨论】:

标签: php sql mysql pdo


【解决方案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);

【讨论】:

    猜你喜欢
    • 2015-09-07
    • 2010-12-07
    • 1970-01-01
    • 2014-03-12
    • 2017-08-10
    • 1970-01-01
    • 2017-01-05
    • 2012-10-02
    • 1970-01-01
    相关资源
    最近更新 更多