-1

当使用 2 个或更多单词时,此搜索方法可以正常工作。但如果只有一个词,它会给出错误:

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

2

这条线呢?您还必须在此处绑定?值:

$where_string = implode(" OR ", array_fill(0,$wordCount, "`event_name` REGEXP ?"));

正如这里所说,你没有?WHERE创作中绑定。你也必须绑定那些。也将 $x=0 上移!!

...此外,您不会像处理其他变量那样将其作为参数/绑定提供(好吧,这里没有用户输入,但无论如何)。

于 2013-09-27T15:35:17.833 回答
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);

于 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_values重新索引数组:

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

另一种是使用你的$x变量,而不是$indexin 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);
于 2013-09-27T15:27:25.083 回答