【问题标题】:Pass multiple parameters in PDO在 PDO 中传递多个参数
【发布时间】:2015-06-07 18:11:26
【问题描述】:

我的 PHP 看起来像这样:

$diagSel = $_POST['diagSel'];
$search_crit = $_POST['criteria']; //this is an entry like "85054,85206" (no quotes)
$sql1 = "SELECT * FROM `myTable` where`Diagnosis` = :diagnosis and `zip_code` in (:placeHolder) group by `Provider Number`";
$stmt = $dbh->prepare($sql1);
$stmt->bindParam(':diagnosis', $diagSel, PDO::PARAM_STR);
$stmt->bindParam(':placeHolder', $search_crit, PDO::PARAM_STR);
$stmt->execute();
$result1 = $stmt->fetchAll(PDO::FETCH_ASSOC);
header('Content-type: application/json');
echo json_encode($result1);

这就是问题所在...如果用户输入了多个以逗号分隔的邮政编码(以criteria 传递),则ECHOs 什么也没有。如果他们输入一个邮政编码,它会返回我所期望的。

有没有办法使用准备好的语句通过 PDO 传递逗号分隔值,例如 85054,85​​206?

谢谢。

【问题讨论】:

  • 使用支持数组绑定的 ORM 或 PDO 包装器(Aura.SQL 支持,其他允许 Perl 样式的 ?? 列表占位符)。或者:使用 FIND_IN_SET() 作为 CSV 列表。
  • 以前没怎么用过??方法……你能举个例子吗?
  • 这不是 PDO 的事情。这需要一个允许此类占位符的抽象库。否则,您将不得不求助于hodgepodge join()/etc. workarounds

标签: php mysql pdo


【解决方案1】:

不是,我推荐这样的:

$diagSel     = $_POST['diagSel'];
$search_crit = $_POST['criteria'];
$list        = explode(',', $search_crit);
array_map(array($dbh, 'quote'), $list);

$sql1 = sprintf('
  SELECT *
  FROM `myTable`
  WHERE `Diagnosis` = :diagnosis
  AND `zip_code` IN (%s)
  GROUP BY `Provider Number`', implode(',', $list));

$stmt = $dbh->prepare($sql1);
$stmt->bindParam(':diagnosis', $diagSel, PDO::PARAM_STR);
$stmt->execute();

$result1 = $stmt->fetchAll(PDO::FETCH_ASSOC);
header('Content-type: application/json');
echo json_encode($result1);

【讨论】:

  • 谢谢。这条线有什么遗漏吗? array_map([$dbh, 'quote'], $list); 出现错误:Call to undefined function sprtinf()
  • 其实......错过了一件事......现在得到这个错误:syntax error, unexpected '[', expecting ')' 这是指array_map 行。
  • 抱歉第一个是错字,第二个我相信你有一个旧版本的 PHP(5.4 之前)。立即尝试!
  • 我以为我使用的是 PHP 5.4,但也许不是。我尝试了上述方法,现在收到此错误:“未捕获的异常 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number'”指的是execute
  • 没关系...错过了查询中的(%s)。它工作得很好!感谢您的帮助。
【解决方案2】:

如果要向 SQL 查询添加多个值,则不能使用两次 bindpram 在 exec 命令中有一个数组以添加所有变量

【讨论】:

  • 好的...对另一种方法有什么建议吗?
  • $shtm->execute(array( ':diagnosis' => $diagSel, ':placeHolder' => $search_crit ));
  • 谢谢...这让我回到了开始的地方。如果我通过一个邮政编码,它工作正常。如果我通过多个,它不起作用(ECHOs 没有)
  • 使用while循环返回所有结果
  • 抱歉...这里有点 PHP 菜鸟...你能指出我正确的方向吗?
猜你喜欢
  • 2012-05-20
  • 2012-07-30
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多