2013-09-27 3 views
-1

의 토큰 수와 일치하지 않습니다. 둘 이상의 단어를 사용할 때이 검색 방법이 올바르게 작동합니다. 단 하나 개의 단어가있는 경우 그러나 그것은 오류를 제공합니다 $stmtSQLSTATE [HY093] : 잘못된 매개 변수 번호 : 바운드 변수의 수가

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

var_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" 
} 

바운드 변수를 추가 할 것으로 보인다. 내가 여기서 무엇을 놓치고 있니?

을 heres 방법 :

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

하나는 배열을 인덱스를 다시 array_values을 사용하는 것입니다? 또한 여기에 ? 값을 바인드 할 필요가 :

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

AS 여기 말했다, 당신은 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

은 (foreach 문에서) $index의 값에 의존하지하려면, 당신은 더 나은이 함께 가야한다 :

또한
$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 값은 예상 한 값이되지 않습니다.

여기에 몇 가지 해결책이 있습니다. bindValue에서

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

또 다른 당신의 $x 변수를 사용하는 대신 $index : 어떤이 라인에 대한

$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하지만 당신의 siggestions했지만 경고 오류를 해결하지 않습니다. – crm

관련 문제