使用2个或更多单词时,此搜索方法正常。但如果只有一个单词就会出错:
SQLSTATE [HY093]:参数号无效:绑定变量数 与。中的令牌数量不匹配。
var_dump
的{p> $stmt
给出了:
object(PDOStatement)#5 (1) {
["queryString"]=> string(117) "SELECT event_id, event_name FROM adrenaline_junkies_uk_events WHERE (`event_name` REGEXP ?) AND event_id <> ? LIMIT 3"
}
绑定变量似乎相加。我在这里缺少什么?
继承人的方法:
public function getSimilarEvents($event_id, $nameArray) {
$uniqueWords = array();
// list of common words we dont want to search by
$commonWords = array('a','able','you\'ve','z','zero');
// Build array of words that dont match common words
var_dump($uniqueWords = array_diff($nameArray, $commonWords));
// Count how many words there are
$wordCount = count($uniqueWords);
// create where string to add to query
$where_string = implode(" OR ", array_fill(0,$wordCount, "`event_name` REGEXP ?"));
// build start of mysql query
$query = "SELECT event_id, event_name FROM adrenaline_junkies_uk_events WHERE ($where_string) AND event_id <> ? LIMIT 3";
$stmt = $this->dbh->prepare($query);
$x = 0;
foreach($uniqueWords AS $index => $word){
$stmt->bindValue($index+1, "[[:<:]]".$word."[[:>:]]", PDO::PARAM_STR);
$x++;
}
$stmt->bindValue($x+1, $event_id, PDO::PARAM_INT);
$stmt->execute();
var_dump($stmt);
if($stmt->rowCount() > 0){
return $stmt->fetchAll();
}else{
return $stmt->rowCount();
}
}
答案 0 :(得分:2)
这条线怎么样?您还必须在此处绑定?
值:
$where_string = implode(" OR ", array_fill(0,$wordCount, "`event_name` REGEXP ?"));
AS在此处说,您不会在?
创建中绑定WHERE
。你也必须绑定它们。同时移动$ x = 0 !!
...另外,你不提供它作为参数/绑定,就像你使用其他变量一样(好的,这里没有用户输入,但无论如何)。
答案 1 :(得分:1)
不要依赖$index
(在foreach中)的价值,你应该更好地使用它:
$x = 0;
foreach($uniqueWords AS $index => $word){
$x++;
$stmt->bindValue($x, "[[:<:]]".$word."[[:>:]]", PDO::PARAM_STR);
}
另外请确保您在此处放置一个数组,即使它只有一个值$nameArray = array(7)
:
getSimilarEvents($ event_id,$ nameArray);
答案 2 :(得分:1)
问题是array_diff
。
假设你有:
$a = array(1,2,3);
$b = array(1,4,3);
当你array_diff($a, $b);
时,你得到:
array(1) {
[1]=>
int(2)
}
这是你的问题。当您执行foreach
时,$index
的价值将不会达到预期目标。
这里有一些解决方案。一种是使用array_values
重新索引数组:
$uniqueWords = array_values(array_diff($nameArray, $commonWords));
另一种方法是使用$x
变量,而不是$index
中的bindValue
:
$x = 0;
foreach($uniqueWords AS $word){
$stmt->bindValue($x+1, "[[:<:]]".$word."[[:>:]]", PDO::PARAM_STR);
$x++;
}
$stmt->bindValue($x+1, $event_id, PDO::PARAM_INT);