2011-09-20 4 views
0

Il semble être un bug ou problème lorsque j'utilise PHP PDO fetchOject avec la requête ci-dessous,Problème avec PHP PDO fetchOject

Requête:

SELECT 
    p.*, 
    t.* 

FROM root_pages AS p 

LEFT JOIN root_templates AS t 
ON p.tmp_id = t.tmp_id 

WHERE p.pg_url = ? 
AND ? IS NOT NULL 

OR p.pg_url = ? 
AND p.pg_hide != ? 

appelé d'une classe PHP PDO db,

$page = $this->database->fetch_object($sql,array(
      $pg_url, 
      NULL, 
      $pg_url, 
      1 
     )); 

résultat:

SQLSTATE [HY 093]: numéro de paramètre non valide: nombre de variables liées ne correspond pas à nombre de jetons

méthode PHP PDO FetchOject de la classe PDO db,

# return the current row of a result set as an object 
    public function fetch_object($query, $params = array()) 
    { 
     try 
     { 
      # prepare the query 
      $stmt = $this->connection->prepare($query); 

      # if $params is not an array, let's make it array with one value of former $params 
      if (!is_array($params)) $params = array($params); 

      # execute the query 
      $stmt->execute($params); 

      # return the result 
      return $stmt->fetchObject(); 
      //return $stmt->fetch(PDO::FETCH_OBJ); 
     } 
     catch (PDOException $e) 
     { 
      # call the get_error function 
      $this->get_error($e); 
     } 
    } 

Il ne sera bien si j'appelle la méthode comme celui-ci,

$page = $this->database->fetch_object($sql,array(
      $pg_url, 
      1, 
      $pg_url, 
      1 
     )); 

Mais je peux obtenir le résultat sans erreur lorsque je teste une de la requête ci-dessous avec phpMyAdmin,

SELECT 
    p.*, 
    t.* 

FROM root_pages AS p 

LEFT JOIN root_templates AS t 
ON p.tmp_id = t.tmp_id 

WHERE p.pg_url = 'exhibition sample 6' 
AND '1' IS NOT NULL 

OR p.pg_url = 'exhibition sample 6' 
AND p.pg_hide != '1' 

ou

SELECT 
    p.*, 
    t.* 

FROM root_pages AS p 

LEFT JOIN root_templates AS t 
ON p.tmp_id = t.tmp_id 

WHERE p.pg_url = 'exhibition sample 6' 
AND NULL IS NOT NULL 

OR p.pg_url = 'exhibition sample 6' 
AND p.pg_hide != '1' 

Toutes les idées que j'ai manqué lors de l'utilisation fetchOject?

EDIT:

$sql =" 
SELECT 
    p.*, 
    t.* 

FROM root_pages AS p 

LEFT JOIN root_templates AS t 
ON p.tmp_id = t.tmp_id 


WHERE p.pg_url = 'exhibition sample 6' 
AND ? IS NOT NULL 

OR p.pg_url = 'exhibition sample 6' 
AND p.pg_hide != '1' 
"; 

Aucune erreur avec

$item = $connection->fetch_assoc($sql,1); 

ou

$item = $connection->fetch_assoc($sql,NULL); 

la méthode fetch_assoc,

# fetch a single row of result as an array (= one dimensional array) 
public function fetch_assoc($query, $params = array()) 
{ 
    try 
    { 
     # prepare the query 
     $stmt = $this->connection->prepare($query); 

     # if $params is not an array, let's make it array with one value of former $params 
     if (!is_array($params)) $params = array($params); 

     # execute the query 
     $stmt->execute($params); 

     # return the result 
     return $stmt->fetch(); 
    } 
    catch (PDOException $e) 
    { 
     # call the get_error function 
     $this->get_error($e); 
    } 


} 

Répondre

0

Ce que vous essayez de faire (passer en null en tant que paramètre à execute) n'est pas possible. Comme les États documentation:

input_parameters

un tableau de valeurs avec autant d'éléments il y a forcément des paramètres dans l'instruction SQL en cours d'exécution. Toutes les valeurs sont traitées comme PDO :: PARAM_STR.

Si vous voulez passer dans un null, vous devez lier les paramètres avec

$stmt->bindValue(1, null, PDO::PARAM_NULL); 

ou utilisez la syntaxe équivalente pour les paramètres nommés.

+0

merci Jon, s'il vous plaît vérifier ma modification ci-dessus. Je peux passer 'null' avec' fetch' sans lier les données. comment venir? – laukok

+0

J'ai trouvé l'erreur dans ma classe. rien de mal à passer null dans fetchObject. Merci pour l'aide. – laukok