-1

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();
            }
        }
4

3 に答える 3

1

(foreach で)の値に依存しないようにするには、次の$indexようにすることをお勧めします。

 $x = 0;
 foreach($uniqueWords AS $index => $word){
   $x++;
   $stmt->bindValue($x, "[[:<:]]".$word."[[:>:]]", PDO::PARAM_STR);
 }

また、値が 1 つだけであっても、ここに配列を配置するようにしてください$nameArray = array(7)

getSimilarEvents($event_id, $nameArray);

于 2013-09-27T15:27:10.277 に答える
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_values1 つは、配列のインデックスを再作成するために使用する方法です。

$uniqueWords = array_values(array_diff($nameArray, $commonWords));

もう 1 つは、 in$xの代わりに変数を使用することです。$indexbindValue

$x = 0;
foreach($uniqueWords AS $word){
    $stmt->bindValue($x+1, "[[:<:]]".$word."[[:>:]]", PDO::PARAM_STR);
    $x++;
}
$stmt->bindValue($x+1, $event_id, PDO::PARAM_INT);
于 2013-09-27T15:27:25.083 に答える