Bonjour,

J'ai besoin d'un petit coup de main... je galère depuis 4 jours avec un petit bout de script. En général je trouve tout seul mais là je n'ai plus trop de cheveux à arracher !

J'essaie de faire une requête préparée en envoyant ma requête ($sql) et mes valeurs dans un tableau ($args)

$sql = 'SELECT :champs FROM :table WHERE id=:id' ;
    $args = array ( 'champs' => $champs, 'table' => $this -> table, 'id' => $this -> id ) ;
    echo '<pre>' ; var_dump ( $args ) ; echo '</pre>' ; 
    $result = MyPDO::getInstance () -> query ( $sql , $args ) ;

La requête passe par un singleton qui est sensé préparer exécuter la requête et renvoyer le résultat.

public function query ( $query , $args ) {

         try {
            $req = $this -> PDOInstance -> prepare ( $query ) ;
            $req -> execute ( $args ) ;
            return $req ;
         }
         catch ( PDOException $e ) {
            die ('Exception rencontrée lors de la requête : <br /> <pre>' . $e -> getMessage() . '</pre>' ) ;
         }

Mais je rencontre l'erreur suivante (et le tableau passé en argument) :

array(3) {
"champs"]=>
string(1) "*"
"table"]=>
string(5) "blogs"
"id"]=>
int(1)
}
Exception rencontrée lors de la requête :
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''blogs' WHERE id='1'' at line 1

Les arguments envoyés me semblent corrects mais tout me porte à croire que cela vient de là quand même. Par exemple, si le seul argument envoyé est 'id => $this -> id cela fonctionne.

Qu'en pensez-vous ?
Un grand merci par avance pour votre aide !!

3 réponses


nOurs88
Réponse acceptée
$sql = 'SELECT :champs FROM :table WHERE id=:id' ;

L'erreur se situe au niveau de :champs et :table, les variables fonctionnent uniquement pour les conditions après le WHERE.

Pourrais tu tester ce code :

$sql = 'SELECT * FROM blogs WHERE id=:id' ;

En gardant seulement le :id en faite.

Cela fonctionne ?

MartinT
Auteur

Oui en effet cela fonctionne si seul le :id varie et je ne comprenais pas pourquoi. Le code d'erreur est vraiment sibyllin !
Entre temps j'avais décidé d'abandonner de tenter de préparer les requêtes pour pouvoir avancer.

Un grand merci à toi pour cette explication !

De rien :)