2013-04-08 31 views
10

Tôi đã đi qua cảnh báo này tôi đã không nhìn thấy trước đây:PDO: số tham số không hợp lệ: trộn được đặt tên và vị trí các thông số

Cảnh báo: PDOStatement :: thực hiện() [pdostatement.execute]: SQLSTATE [HY093 ]: số tham số không hợp lệ: trộn tên và các thông số vị trí trong ...

Đề cập đến các truy vấn PDO sau (đã đơn giản hóa các chức năng cho dễ đọc):

$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; 
    } 

Truy vấn chức năng và PDO hoạt động tốt mà không có các biến bù trừ và giới hạn được bao gồm trong truy vấn. Vậy điều gì có thể gây ra cảnh báo này?

Cảm ơn

+1

Nó sẽ không thể thực tế là bạn đang trộn tên thông số (': offset',': limit') với các thông số vị trí (' LIKE? ') Là trạng thái cảnh báo? – Wiseguy

+0

@Wiseguy cảm ơn, tôi biết những gì họ gọi là bây giờ quá: p – crm

+1

@ MarcB Có lẽ tôi đang thiếu một cái gì đó, nhưng nơi nào bạn nhìn thấy một lỗ phun sql? – jeroen

Trả lời

8

Thay đổi

LIMIT :offset, :limit 

để

LIMIT ?, ? 

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

tới:

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

trong where_string của bạn, bạn sử dụng ? đó là một tham số vị trí và giới hạn của bạn và bù đắp bạn sử dụng : đó là một tham số có tên đó gây ra những cảnh báo không pha trộn chúng

+0

Cảm ơn, bạn có biết làm thế nào tôi có thể sử dụng một tham số được đặt tên trong where_String thay vì một vị trí hoặc ngược lại? – crm

+0

@crm Hoặc thay thế các trường hợp '?' Bằng các tham số có tên như ': pattern1',': pattern2' hoặc tham số có tên là '?' Và chúng sẽ có chỉ số đếm + 1 và đếm + 2, trong đó đếm là số mẫu đang được kiểm tra. – IMSoP

+0

trả lời bởi mekegi @mekegi thanks – Miguelo

Các vấn đề liên quan