如果我尝试使用search('samsung'),则以下准备好的语句不会返回任何结果。
public function search($searchFor) {
try{
//connect to db
$pdo = $this->_db->connect();
//set up SQL and bind parameters
$sql = "select * from item where itemName like '%:searchfor%' or description like '%:searchfor%'";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':searchfor', $searchFor, PDO::PARAM_STR);
//execute SQL
$rows = $this->_db->executeSQL($stmt);
return $rows;
}
catch (PDOException $e)
{
throw $e;
}
}
$ rows返回一个空数组。但是,如果我尝试
select * from item where itemName like '%samsung%' or description like '%samsung%;
它返回匹配的项目并按预期工作。
我发现了
$sql = "select * from item where itemName like :searchfor or description like :searchfor";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(":searchfor", "%$searchFor%");
有效。我不得不使用bindValue代替。这是完全不同的问题,因为SQL是正确的,但是我使用bindParam而不是bindValue(这是正确的方法),因此不是重复的。
答案 0 :(得分:1)
您是否尝试在整个语句中使用占位符?
$sql = "select * from item where itemName like :searchfor or description like :searchfor";
$stmt = $pdo->prepare($sql);
$search_string = "'%" . $searchFor . "'%";
$stmt->bindParam(':searchfor', $search_string, PDO::PARAM_STR);
可选地不带命名参数:
$sql = "select * from item where itemName like ? or description like ?";
$stmt = $pdo->prepare($sql);
$search_string = "'%" . $searchFor . "'%";
$stmt->bindParam('ss', $search_string, $search_string);
据我所记得的手册,就像需要将整个字符串都放在变量中,而不仅仅是要照顾的内容。
八月
答案 1 :(得分:0)
准备好的语句的占位符告诉php将传递到占位符的特定值视为字符串。代替这个:
$sql = "select * from item where itemName like '%:searchfor%' or
description like '%:searchfor%'";
执行以下操作:
$sql = "select * from item where itemName like :searchfor or
description like :searchfor";
然后将整个值绑定到占位符:
$stmt->bindParam(':searchfor', '%yourkeyword%', PDO::PARAM_STR);