我是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]:无效的参数数:绑定变量的数量与令牌数量不匹配
当我删除like子句和$searchterm参数时,它会正确返回结果。我认为“-- like'%?%'--”可能不是在双引号下创建此查询的合法方式,因此我尝试了转义',但没有成功。我寻找解决方案,并发现有人将'% 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]%"));
?>
我尝试了这个方法,虽然不再收到警告,但是没有任何结果。但是当我直接执行查询时,会得到几个结果。有什么想法吗?