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
oui, j'essaie de faire concret
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
mise à jour du tutorial : ajout de la section récupérer les données
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.Code :
SELECT * FROM elves WHERE id=3 OR nom="Toto\"; # DELETE FROM maTable" OR classe IN ("6eA","6eB","6eC")
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
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"
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
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.
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é