如何在 PDO 中为准备好的查询绑定参数?
Posted
技术标签:
【中文标题】如何在 PDO 中为准备好的查询绑定参数?【英文标题】:How bind parameters for a prepared query in PDO? 【发布时间】:2015-08-21 17:47:53 【问题描述】:MS Access 中有一个数据库,是否准备(存储)了名称为 testQuery:
PARAMETERS tour Number;
SELECT * FROM Tours WHERE ID = tour;
我正在尝试在 php 中运行一个查询并传递如下参数:
// ..connect
$tour = 1;
$sth = $db->prepare("select * from testQuery");
$sth->bindParam(':tour', $tour, PDO::PARAM_INT);
$sth->execute();
我得到错误:
SQLSTATE[07002]: COUNT field incorrect: -3010 [Microsoft][Driver ODBC Microsoft Access]
Too few parameters. Required 1. (SQLExecute [-3010] at ext \ pdo_odbc \ odbc_stmt.c: 254)
如何将参数传递给准备好的语句?有人怀疑准备好的查询不是由“select”命令引起的,还有其他原因。
【问题讨论】:
我没有遵循这个 100%(而且我实际上从未使用过 MS Access),但你是说 testQuery 是一个存储过程,你试图用参数调用它?如果 testQuery 是一张表格,@chris85 下面的答案很好,但从你的帖子来看,我想也许它不是一张桌子(图尔是一张桌子)。 是的,testQuery - 保存的查询(不是过程),我想用参数调用它 抱歉不能真正帮助 MS Access 的东西,但从您的错误消息来看,这可能很有用:php.net/manual/en/function.odbc-execute.php(有一个用户评论“快速说明,希望我的痛苦将拯救其他人:Microsoft Access ODBC 驱动程序不支持参数化查询。但这是 12 年前的事情,所以可能已经改变了!) 【参考方案1】:在您当前的示例中,不需要任何参数。您需要在查询中传递where
子句。您只需在用户输入的位置使用占位符。比如
$tour = 1;
$sth = $db->prepare("select * from testQuery WHERE ID = :tour");
$sth->bindParam(':tour', $tour, PDO::PARAM_INT);
$sth->execute();
另一种方法是
$tour = 1;
$sth = $db->prepare("select * from testQuery WHERE ID = ?");
$sth->execute(array($tour));
您可以在手册页上查看更多示例,http://php.net/manual/en/pdo.prepare.php。
【讨论】:
这不起作用。 testQuery - 准备(存储)对数据库 MS Access 的请求。当你直接运行它进入数据库时会出现一个带有请求参数“tour”的窗口。 在您当前的示例中,没有对:tour
的引用,因此它没有理由被绑定。我不熟悉 ms-access 如何执行存储过程。也许这个线程对于执行参数化的存储过程很有用,***.com/questions/31575135/…
@vista1x 运气好吗?
不,它不起作用。似乎并非所有 ODBC 驱动程序都支持此类操作。感谢您的帮助!以上是关于如何在 PDO 中为准备好的查询绑定参数?的主要内容,如果未能解决你的问题,请参考以下文章
将空字符串绑定到 pdo 准备好的查询时 HY104 Sql server 错误