2013-04-08 8 views
10

mi sono imbattuto in questo avvertimento non ho visto prima:PDO: numero di parametro non valido: parametri denominati e posizionali misti

Attenzione: PDOStatement :: execute() [pdostatement.execute]: SQLSTATE [HY093 ]: numero di parametro non valido: miscelato denominata e parametri posizionali in ...

Facendo riferimento alla seguente query PDO (semplificato hanno la funzione di facilitare la lettura):

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

La funzione e la query PDO funzionano correttamente senza le variabili di offset e limite incluse nella query. Quindi cosa potrebbe causare questo avviso?

Grazie

+1

Non sarebbe il fatto che si sta mescolando parametri denominati (': offset',': limit') con parametri posizionali (' LIKE? ') Come afferma l'avvertimento? – Wiseguy

+0

@Wiseguy, grazie, so anche cosa hanno chiamato ora: p – crm

+1

@MarcB Forse mi manca qualcosa, ma dove vedi un foro di iniezione sql? – jeroen

risposta

8

Change

LIMIT :offset, :limit 

a

LIMIT ?, ? 

e

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

a:

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

nel vostro where_string si utilizza ? che è un parametro posizionale e nel tuo limite e l'offset si utilizza : che è un parametro denominato che sta causando l'avvertimento non mescolare li

+0

Grazie, sai come usare un parametro con nome in where_String invece di quello posizionale o viceversa? – crm

+0

@crm O sostituire le istanze '?' Con parametri denominati come ': pattern1',': pattern2', o i parametri denominati con '?', E avranno indici di conteggio + 1 e conteggio + 2, dove contare è il numero di modelli da controllare. – IMSoP

+0

risposto da mekegi @mekegi grazie – Miguelo