SQLSTATE [HY093]:参数号无效:绑定变量数与令牌数不匹配

时间:2013-09-27 14:49:15

标签: php mysql pdo

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

3 个答案:

答案 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);