2013-04-08 7 views
10

mam natknąć tego ostrzeżenia nie widziałem przed:PDO: nieprawidłowy numer parametru: mieszany i nazwane parametry pozycyjne

Warning: PDOStatement :: execute() [pdostatement.execute]: SQLSTATE [HY093 ] Nieprawidłowa liczba parametrów: mieszane nazwane i parametry pozycyjnego ...

odniesienie się do następującego zapytania PDO (uprościły funkcję ułatwić czytanie)

$offset = 0; 
$limit = 12; 
function retrieve_search_posts($searchfield, $offset, $limit){ 


     $where = array(); 

     $words = preg_split('/[\s]+/',$searchfield); 

     array_unshift($words, ''); 
     unset($words[0]); 

     $where_string = implode(" OR ", array_fill(0,count($words), "`post_title` LIKE ?")); 

     $query = " 
           SELECT p.post_id, post_year, post_desc, post_title, post_date, img_file_name, p.cat_id 
           FROM mjbox_posts p 
           JOIN mjbox_images i 
           ON  i.post_id = p.post_id 
             AND i.cat_id = p.cat_id 
             AND i.img_is_thumb = 1 
             AND post_active = 1 
           WHERE $where_string 
           ORDER BY post_date 
           LIMIT :offset, :limit 
           DESC"; 
     $stmt = $dbh->prepare($query); 

     foreach($words AS $index => $word){ 
      $stmt->bindValue($index, "%".$word."%", PDO::PARAM_STR); 
     } 
     $stmt->bindParam(':offset', $offset, PDO::PARAM_INT); 
     $stmt->bindParam(':limit', $limit, PDO::PARAM_INT); 
     $stmt->execute(); 

     $searcharray = $stmt->fetchAll(PDO::FETCH_ASSOC); 

     return $searcharray; 
    } 

Funkcja i zapytanie PDO działa dobrze bez zmiennych odsyłania i limitu uwzględnionych w zapytaniu. Co może być przyczyną tego ostrzeżenia?

Dzięki

+1

nie byłoby to, że jesteś mieszanie nazwanych parametrów (': offset'': limit') z parametrów pozycyjnych (' LIKE? ') Jak ostrzega? – Wiseguy

+0

@Wiseguy dziękuję, wiem, co oni również nazywają: p – crm

+1

@MarcB Może brakuje mi czegoś, ale gdzie widzisz otwór wtryskowy sql? – jeroen

Odpowiedz

8

Zmień

LIMIT :offset, :limit 

do

LIMIT ?, ? 

i

$stmt->bindParam(':offset', $offset, PDO::PARAM_INT); 
$stmt->bindParam(':limit', $limit, PDO::PARAM_INT); 

do:

$stmt->bindValue($index+1, $offset, PDO::PARAM_INT); 
$stmt->bindValue($index+2, $limit, PDO::PARAM_INT); 
9

w swojej where_string użyć ? który jest parametr pozycyjny oraz w granicach i przesunięcia użyć : który jest nazwany parametr, który jest przyczyną ostrzeżenia ich nie mieszać

+0

Dzięki, czy wiesz, w jaki sposób można użyć parametru o nazwie w where_String zamiast w pozycji pozycyjnej lub odwrotnie? – crm

+0

@crm Zamień instancje '?' Na nazwane parametry, takie jak ': pattern1',': pattern2', lub nazwane parametry z '?', I będą miały indeksy zliczania + 1 i liczby + 2, gdzie liczba to liczba sprawdzanych wzorców. – IMSoP

+0

odpowiedział mekegi @mekegi thanks – Miguelo