06-19-2007, 03:47 PM
Toutes les demandes d'aide pour ce tutoriel doivent être faite à la suite de ce message.
Merci de ne pas aller créer un nouveau sujet dans la section demande d'aide : le message sera mis à la corbeille.
// exécution de la requête
$resultat = mysql_query($query);
// test de la valeur de retour
if( $resultat === FALSE )
{
echo "erreur dans la requete : " . $query;
exit;
}
// exécution de la requête
// test de la valeur de retour
if( !($resultat= mysql_query($query)) ) {
echo "erreur dans la requete : " . $query;
exit;
}
$query = sprintf('SELECT nom, xp FROM joueur WHERE nom = "%s"', $_POST['nom'] );
"; DELETE FROM joueur #naholyr sur phpfrance a écrit :[...]
Pour se faire un constructeur de requêtes maison, c'est assez simple avec sprintf et %s (l'utilisation du point d'interogation pose quelques soucis qu'on aura ici la flemme de résoudre, avec sprintf c'est facile et on a l'habitude, pour afficher un '%' il faut mettre '%%', classique) :C'est un bon exercice de faire ça une fois dans sa vie, ne serait-ce que pour l'apprivoisement de call_user_func_array(), func_get_args() et autres fonctions qu'on utilise rarement.Code PHP :
function construitRequete($requete) {
$args = func_get_args();
array_shift($args);
foreach ($args as &$arg) {
switch (gettype($arg)) {
case 'string':
$arg = '"' . mysql_real_escape_string($arg) . '"';
break;
case 'bool':
case 'boolean':
$arg = $arg ? 1 : 0;
break;
case 'array':
foreach ($arg as &$element) {
$element = construitRequete('%s', $element);
}
$arg = implode(',',$arg);
break;
}
}
array_unshift($args, $requete);
return call_user_func_array('sprintf', $args);
}
Résultat :donneCode PHP :
$nom = 'Toto"; # DELETE FROM maTable'; // Tentative de hack
$id = 3; // un entier
$classes = array('6eA','6eB','6eC'); // un tableau
echo construitRequete('SELECT * FROM elves WHERE id=%s OR nom=%s OR classe IN (%s)', $id, $nom, $classes);Code :
SELECT * FROM elves WHERE id=3 OR nom="Toto\"; # DELETE FROM maTable" OR classe IN ("6eA","6eB","6eC")
Et ça devient tout de suite beaucoup plus simple de construire des requêtes sécurisées, sans avoir bourrer son code d'appels à mysql_real_escape_string()
[...]
pascaltje a écrit :je me demande si il faut parler d'une classe d'abstraction SQL ou pas pour la suite, ou séparer tout ça.J'avoue ne pas savoir non plus, je pense que les placeholders et les couches d'abstraction ce serait peut-être pour le "volume 2"