【问题标题】:array is converted as string in PDO数组在 PDO 中被转换为字符串
【发布时间】:2015-05-12 08:34:29
【问题描述】:

以下是我的查询:

$key = array(1,2);
$in = join(',', array_fill(0, count($key), '?'));
$statement = $pdo->prepare("SELECT * FROM posts WHERE posts.subid IN (".$in.") AND posts.pricing=?  AND posts.Poscode=? ORDER BY posts.Poscode DESC LIMIT 60");
$result = array_merge($key, array($rate,$postcode));
$statement->execute($result);

当我将 $key = array(1,2); 替换为 $key = array($key); 时,查询只获取第一个 ID 的数据,我假设它将数组转换为字符串。

$key 也将值 1,2 保存在如下所示的数组中:

$a=$data['sub'];

$key0=array();
foreach($a as $v=>$k) 
  {

    $key0[]=$v;

  }

 $key2=implode(',',$key0);
 $key = array($key2);

如何让 PDO 理解 $key 保存的是数组值而不是字符串?

【问题讨论】:

  • 不应该 $in 应该在 IN 子句中,而不是那个未定义的 $key2
  • @Ghost,抱歉错字,现已更正但同样的问题

标签: php mysql arrays pdo


【解决方案1】:

我总是使用命名占位符来解决这个问题。我个人不喜欢? 的东西。您需要为 in 的每个值添加一个占位符。

查看示例代码:

$key = array(1,2);
$pricing = "somePricing";
$postcode = "somePostcode";


$bindings = array();
$bindings[] = array(":pricing", $pricing, PDO::PARAM_STR);
$bindings[] = array(":postcode", $postcode, PDO::PARAM_STR);

$key_placeholders = array();
foreach($key as $k => $v) {
    $placeholder = ":subid".$k;
    $bindings[] = array($placeholder, $v, PDO::PARAM_INT);
    $key_placeholders[] = $placeholder;
}

$sql = "SELECT * FROM posts "
        . "WHERE posts.subid IN (". implode(",",$key_placeholders).") "
        . "AND posts.pricing=:pricing  "
        . "AND posts.Poscode=:postcode "
        . "ORDER BY posts.Poscode "
        . "DESC LIMIT 60";

$statement = $pdo->prepare($sql);
foreach($bindings as $b) {
    $statement->bindValue($b[0],$b[1],$b[2]);
}
$statement->execute();

【讨论】:

  • 我认为这部分是导致问题的原因:$a=$data['sub']; $key0=数组(); foreach($a as $v=>$k) { $key0[]=$v; } $key2=implode(',',$key0); $key = 数组($key2);因为我用 $key=array(1,2); 试过你的代码它可以工作,但是当替换为 $key=array($key2);它没有
  • 是的,你是对的,如果你用? 来做,那么每个值都需要一个?IN (?,?,?),这就是为什么你需要传递值而不是内爆字符串,但每个都作为值数组中的一个项目:array(1,2,3).
  • 我刚刚注意到 implode 是将它们转换为字符串的那个..但是我如何在上面的代码中使用我的数组值?
  • 您需要使用未内爆的$key0 而不是内爆的$key2
  • 我在错误中做了数组到字符串的转换
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-27
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-11
相关资源
最近更新 更多