Fonctions de mise à jour SQL
Dans la lignée des fonctions de manipulation SQL que j'avais publiées il y a un moment, voici une série de fonctions permettant la mise à jour de données dans une base de données SQL : ajout, mise à jour, suppression.
sql_insert
/** * Créé la requete d'insertion */ function sql_insert( $table, $record ) { $fields = join(', ', array_keys($record)); $values = join(', ', array_map('sql_add_quotes', array_values($record))); return 'insert into '.$table.' ('.$fields.') values ('.$values.');'; } // end of 'sql_insert()'
sql_update
/** * Créé la requete de modification */ function sql_update( $table, $record, $key ) { $fields = array_keys($record); $values = array_map('sql_add_quotes', array_values($record)); for ( $i = 0, $count = count($record), $updates = array(); $i < $count; $i++ ) { if ( $key == $fields[$i] ) continue; $updates[] = $fields[$i].' = '.$values[$i]; } return 'update '.$table.' set '.join(', ', $updates).' where '.$key.' = \''.$record[$key].'\';'; } // end of 'sql_update()'
sql_delete
/** * Créé la requete de suppression */ function sql_delete( $table, $record, $key ) { return 'delete from '.$table.' where '.$key.' = \''.$record[$key].'\';'; } // end of 'sql_delete()'
sql_add_quotes
/** * Entoure une valeur par des guillemets simples */ function sql_add_quotes( $element ) { return "'".( ( get_magic_quotes_gpc() == 0 ) ? addslashes($element) : $element )."'"; } // end of 'sql_add_quotes()'
Exemple
L'exemple le plus parlant pourrait être la mise à jour de données via un formulaire ; avec un formulaire dont les champs sont nommés de manière intelligente, on peut ainsi enregistrer les données en un minimum de code.
Soit le formulaire suivant (mise à jour d'une fiche contact) :
<form action="#" method="post"> <input type="hidden" name="data[id]" value="1" /> <input type="text" name="data[nom]" value="Duret" /> <input type="text" name="data[prenom]" value="David" /> <input type="text" name="data[email]" value="david@example.com" /> <input type="submit" value="Enregistrer les modifications" /> </form>
Dans le fichier de traitement, on peut écrire de manière très simple le code suivant :
// Récupération des données en provenance du formulaire $action = $_POST['action']; $data = $_POST['data']; // Mise à jour des données dans la table "contacts" $sql = sql_update('contacts', $data, 'id');
Il n'y a plus qu'à exécuter la requête pour l'enregistrement (fonction native du SGBDR que vous utilisez, utilisation d'une couche d'abstraction, vous avez le choix).
On peut même pousser la simplification à l'extrême en passant l'action à effectuer dans un champ caché du formulaire du type <input type="hidden" name="action" value="update" />
et à faire la chose suivante :
$action = $_POST['action']; $data = $_POST['data']; $funcName = 'sql_'.$action; $sql = $funcName('contacts', $data, 'id');
Remarque : dans tous les cas, il ne faut pas oublier de vérifier la validité des données insérées avant pour éviter un éventuel piratage mais ça il s'agit d'un autre sujet.
Commentaires
-
weboide a écrit le 12/02/2007 :
[David Duret : reçu par email] Je voulais juste dire qu'il faudrait préciser que pour la fonction sql_add_quotes(), il serait plus judiciable d'utiliser les fonctions xxxxx_real_escape_string en rapport avec la base de données. add_slash laisse encore des failles pour ce genre d'utilisation.
-
David Duret a écrit le 12/02/2007 :
Merci pour cette précision. J'ai n'ai pas encore pris le temps de me pencher
desssus mais en effet, il est mieux de passer par des fonctions
xxxxx_real_escape_string(). Le truc est que la fonction
sql_add_quotes() est juste là pour échaper les quotes et ne sert pas
au nettoyage des chaines reçues de l'utilisateur, il faut le faire
d'une autre manière avant l'insertion dans la base (chacun ayant peut-être ses propres fonctions de "nettoyage").
Ajouter un commentaire
Il n'est plus possible de réagir à cette entrée directement mais si vous pensez que votre intervention peut être intéressante, envoyez-moi votre commentaire, je l'ajouterai ici en votre nom.