2 つ以上の単語を使用する場合、この検索方法はうまく機能します。ただし、単語が 1 つしかない場合は、エラーが発生します。
SQLSTATE[HY093]: 無効なパラメーター番号: バインドされた変数の数がトークンの数と一致しません。
var_dump
の$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();
}
}