2013-09-27 230 views
-1

使用2個或更多字時,此搜索方法正常工作。但是,如果只有一個字有它給人的錯誤:SQLSTATE [HY093]:無效的參數編號:綁定變量的數量與標記數量不匹配

SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in.

$stmtvar_dump給出:

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

在編寫自己的搜索之前通過互聯網學習搜索怎麼辦?或者,至少通過引擎向您列出的類似問題改進瀏覽技巧? –

+0

我的問題無效嗎? – crm

+0

你不要在任何地方聲明'$ x'。 –

回答

2

那這行?你必須在這裏也結合了?值:

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

這裏說,你不要在WHERE創建綁定?。你也必須綁定這些。同時移動$ x = 0!另外,你不提供它作爲參數/綁定,就像你對其他變量做的那樣(好吧,這裏沒有用戶輸入,但無論如何)。

+0

這條線很好。 ['REGEXP'](http://dev.mysql.com/doc/refman/5.1/en/regexp.html#operator_regexp)是一個有效的MySQL操作符。 '$ where_string'被添加到'$ query'。 '$ wordCount'是'$ uniqueWords'的長度,他正在循環。 –

+0

這個答案是質量差的直接後果。答案不是在黑暗中捅破,而只是投票結束這個問題。 –

+0

就像這裏所說的,你不會在'WHERE'創建中綁定'?'。你也必須綁定這些。同時移動$ x = 0! – djot

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

+0

謝謝,但這並不能解決我得到的警告錯誤。 – crm

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變量,而不是在$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); 
+0

謝謝@Rocket,但我嘗試過,但是你的簽名並沒有解決警告錯誤。 – crm

相關問題