JeuWeb - Crée ton jeu par navigateur
Bonnes pratiques du SQL - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Bonnes pratiques du SQL (/showthread.php?tid=1304)

Pages : 1 2


Bonnes pratiques du SQL - Kevin - 19-06-2007

Aide pour le tutoriel :
Bonnes pratiques du SQL

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.


RE: Bonnes pratiques du SQL - Mysterarts - 19-06-2007

Je voulais juste dire que c'était une très bonne mise au point necessaire !!
Je me rassure en voyant que je fais déja une bonne partie des choses indiquées dans ce tuto, et que j'ai encore des choses à apprendre et tant mieux ^^
Le coup des mots réservés, je m'en souviendrait : j'avais mis le mot "asc" sans savoir qu'il été réservé, résultat, j'ai passé 4 jours à chercher une solution ^^

Mysterarts


RE: Bonnes pratiques du SQL - Loetheri - 19-06-2007

Code PHP :
<?php 
// 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;
}

Ce passage aurait pu être plus simple à mes yeux ^^
Code PHP :
<?php 
// exécution de la requête
// test de la valeur de retour
if( !($resultat= mysql_query($query)) ) {
echo
"erreur dans la requete : " . $query;
exit;
}
De toute façon, en règle général, une requête n'est pas sensé plantée :p


RE: Bonnes pratiques du SQL - naholyr - 19-06-2007

Même s'il est vrai qu'en pratique on fera plutôt comme ça, dans le cadre d'un tutorial, la syntaxe de pascaltje a l'avantage d'être plus «décortiquée» et donc plus pédagogique Wink


RE: Bonnes pratiques du SQL - pascal - 19-06-2007

oui, j'essaie de faire concret Smile

j'ai volontairement éludé certains points, la doc officielle en lien permet d'approfondir.

si on m'envoie ou si je trouve de nouveaux éléments, je compléterai.

A+

Pascal


RE: Bonnes pratiques du SQL - pascal - 28-06-2007

mise à jour du tutorial : ajout de la section récupérer les données


RE: Bonnes pratiques du SQL - naholyr - 28-06-2007

Il faudra par contre je pense mettre un gros paragraphe sur la sécurité, en expliquant par exemple combien ce type de requête peut-être une faille béante :
Code PHP :
<?php 
$query
= sprintf('SELECT nom, xp FROM joueur WHERE nom = "%s"', $_POST['nom'] );
avec un joli
Code :
"; DELETE FROM joueur #
dans le formulaire, ça fait mal.

Eventuellement on pourrait ajouter un paragraphe sur les "placeholders" dans les couches d'abstraction, qui permettent de simplifier tout ça.

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) :
Code PHP :
<?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);
}
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.

Résultat :
Code PHP :
<?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);
donne
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() Wink

[...]



RE: Bonnes pratiques du SQL - pascal - 28-06-2007

dans ma ToDoList, il y a :
_ vendre des trucs sur ebay
_ prendre un RDV chez le kiné
_ demander à naholyr si je peux reprendre son post sur les PlaceHolders & la sécurité
_ couper les pieds & repeindre la table de nuit
_ ...

je me demande si il faut parler d'une classe d'abstraction SQL ou pas pour la suite, ou séparer tout ça.

A+

Pascal


RE: Bonnes pratiques du SQL - naholyr - 28-06-2007

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" Wink
Par contre l'injection SQL a beau être compliquée c'est trop important pour être laissé de côté à mon avis.

P.S: Tout ce qui est publié est - sans avis contraire - du domaine public et seulement protégé par le droit d'auteur. Donc tu n'as pas à me demander mon avis pour reprendre le code tant que tu cites l'auteur original Smile En l'occurrence (vu le côté révolutionnaire de la production :lol: ) j'abandonne évidemment toute propriété et tu as donc même le droit de ne pas me citer.


RE: Bonnes pratiques du SQL - Harparine - 28-06-2007

Merci du tuto, je viens de le lire et c'est effectivement très utile aux néophytes.

+1 pour un futur paragraphe sur la sécurité Smile