PDO et syntaxe

Eléphant du PHP | 216 Messages

06 mars 2015, 11:46

Ca devrait être bon là

Code : Tout sélectionner

$sqla = $db->query("SELECT cont_".$db->quote($lang)." FROM flatforswap_continent ORDER BY cont_".$db->quote($lang)." ASC"); while($dataa = $sqla->fetch()) { if ($continent == $dataa['cont_'.$lang.'']) { echo '<option value="'.$dataa['cont_'.$lang.''].'" selected="selected">'.$dataa['cont_'.$lang.''].'</option>'; } if ($continent != $dataa['cont_'.$lang.'']) { echo '<option value="'.$dataa['cont_'.$lang.''].'">'.$dataa['cont_'.$lang.''].'</option>'; } }

ViPHP
AB
ViPHP | 5818 Messages

06 mars 2015, 19:32

Le problème est que quote() est prévue pour protéger les valeurs des champs, non pas les valeurs des noms des champs.
Et donc cette fonction rajoute des quotes en début et en fin de chaine. Concrètement si lang = fr, alors 'cont_'.$db->quote($lang) va retourner cont_'fr'.
Dans ce cas particulier, tu pourrais t'en tirer en utilisant la fonction trim :
$champ = 'cont_'.trim($db->quote($lang),"'");
Pour la protection des noms des champs il faut utiliser les quotes obliques. Tu pourrais donc faire
$champ = 'cont_'.trim($db->quote($lang),"'");
$query = "SELECT `".$champ."` FROM flatforswap_continent ORDER BY `".$champ."` ASC";
$sqla = $db->query($query);
Peut-être que les quotes obliques suffiraient à elles seules pour la protection du nom des champs. Comme je n'ai pas vraiment cherché de réponse (car comme déjà dit quand j'ai des champs dynamiques, je teste la validité de ces champs juste avant de faire la requête) j'adopterais plutôt la syntaxe ci-dessus car cette double protection ne devrait pas poser de problème.

Eléphant du PHP | 216 Messages

09 mars 2015, 14:47

OK.
C'est noté.

Merci.