2012-06-24 2 views
3

Donc j'essaie de construire et de préparer en utilisant PDO, une requête mysql dynamiquement. Voici mes informations de code et de débogage.PHP ne parvient pas à créer une requête PDO dynamiquement.

$allowed_filters = array('hotels.star_rating', 'countries.id'); 

$where = 'WHERE 1 '; 
if (!empty($data['filters'])){ 
    $where = 'WHERE'; 
    foreach ($data['filters'] as $field => $value){ 
     if (in_array($field, $allowed_filters)){ 
      $where .= " $field = :$field &&"; 
     } 
     else unset($data['filters'][$field]); 
    } 

    $where = rtrim($where, '&&'); 
    $where = ($where == 'WHERE')? 'WHERE 1 ' : $where; 
} 

$st = $this->db->prepare(" 
    SELECT 
     hotels.code, 
     hotels.name as name, 
     hotels.star_rating, 
     hotels.description, 
     hotels.cover_image, 
     countries.name as country, 
     cities.name as city 
    FROM 
     hotels JOIN cities ON cities.id = hotels.city_id 
     join countries on countries.id = cities.country_id 
    $where 
"); 

$st->execute($data['filters']); 
var_dump($st->fetch()); 

juste avant la ligne de st- $> execute ($ data [ 'filtres']) i jetai $ st et $ data [ 'filtres']. et les valeurs étaient les suivantes.

Valeur $ st

PDOStatement Object 
(
    [queryString] => 
     SELECT 
      hotels.code, 
      hotels.name as name, 
      hotels.star_rating, 
      hotels.description, 
      hotels.cover_image, 
      countries.name as country, 
      cities.name as city 
     FROM 
      hotels JOIN cities ON cities.id = hotels.city_id 
      join countries on countries.id = cities.country_id 
     WHERE 
      hotels.star_rating = :hotels.star_rating && 
      countries.id = :countries.id 
) 

Valeur pour $ data [ 'filtres']

Array 
(
    [hotels.star_rating] => 4 stars 
    [countries.id] => 5 
) 

AOP lance une exception et échoue avec l'erreur suivante.

SQLSTATE [HY093]: numéro de paramètre non valide: paramètre n'a pas été défini »

aide?

Répondre

1

Vous avez oublié le côlon : dans les clés de $data['filters']. Il devrait être:

Array 
(
    [:hotels.star_rating] => 4 stars 
    [:countries.id] => 5 
) 
+0

Vrai que. Pourriez-vous expliquer pourquoi, parfois, cela fonctionne sans le colon? par exemple, cela fonctionne bien. $ st = $ dbh-> prepare ('SELECT * FROM hôtels où id =: id'); $ st-> execute (array ('id' => 1)); var_dump ($ st-> fetch()); – shxfee

Questions connexes