【发布时间】:2011-04-23 00:37:30
【问题描述】:
我是 PHP 新手,正在尝试学习使用 PDO 连接到测试 MySQL 数据库。我有以下内容:
try {
$db = new PDO('mysql:dbname=MYDBNAME;host=MYHOST', 'USERNAME', 'PASSWORD');
$query = "select * from books where ? like '%?%'";
$stmt = $db->prepare($query);
$stmt->execute(array($searchtype, $searchterm));
} catch(PDOException $e) {
echo 'PDOException: ' . $e->getMessage();
}
当我尝试它时,我收到以下警告: 警告:PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
当我删除 like 子句和 $searchterm 参数时,它会正确返回结果。我想——比如'%?%'——可能不是在双引号下创建这个查询的合法方式,所以我尝试转义',但没有用。我四处寻找解决方案,发现有人将 '% and %' 移到 $searchterm 所在的位置:
$query = "select * from books where ? like ?";
...
$stmt->execute(array($searchtype, '\'%'.$searchterm.'%\''));
我得到了同样的结果。
任何帮助表示赞赏。谢谢!
/ 更新 ****/ 我在http://us3.php.net/manual/en/pdo.prepared-statements.php的示例12中找到了
示例 #12 无效使用占位符
<?php
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE '%?%'");
$stmt->execute(array($_GET['name']));
// Below is What they suggest is the correct way.
// placeholder must be used in the place of the whole value
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE ?");
$stmt->execute(array("%$_GET[name]%"));
?>
我试过这个,即使我不再收到警告,我也没有得到任何结果。但是,当我直接执行查询时,我会得到几个结果。有什么想法吗?
【问题讨论】:
-
我遇到了同样的问题,就像你一样,我认为 '%' 是查询结构的一部分而不是值;)
标签: php sql pdo prepared-statement