4 fonctions php pour effectuer des requêtes SQL

Je vais essayer de donner régulièrement des astuces de programmation php/sql sur ce blog. Ainsi, je vais m'efforcer de publier les fonctions php que j'utilise pour me faciliter le développement, des astuces d'optimisation, des méthodes de développement, etc.

Pour inaugurer cette partie, je vous fournis 4 fonctions (+ 2 variantes) bien utiles pour faire des traitements SQL de base à savoir : SELECT, INSERT, UPDATE et DELETE.

Ces fonctions sont finalement assez simples, mais ça fait gagner du temps. De plus, ce genre de fonction permet d'opérer des changements sur toutes les requêtes identiques très simplement (ex : en cas de changement de système de base de données).

Insérer un enregistrement :

function inserer_sql($table,$champs,$donnees)
{
$sql = "INSERT INTO $table ($champs) ";
$sql .= "VALUES ($donnees)";

if(mysql_query($sql))
{
return true;
}
else
{
return false;
}
}

Et pour l'utiliser, c'est tout aussi simple. Par exemple :

if(inserer_sql("utilisateurs","email,nom,prenom",
"'$_POST[email]','$_POST[nom]','$_POST[prenom]'"))
echo"L'ajout a été effectué avec succès";
else echo"L'ajout a échoué";

Ensuite, pour gagner du temps j'utilise une autre fonction qui n'a comme arguments que le nom de la table et la liste des champs à ajouter (sous forme de tableau). Cela suppose bien sur une correspondance des champs du formulaire (données POST) et des champs de la table :

function inserer_sql_array($table,$array)
{
$req="";
$i=1;
foreach($array as $k)
{

if($i!='1') { $req.=", "; $req2.=", "; }

$req.="$k";
$req2.="'$_POST[$k]'";
$i++;
}

return inserer_sql($table,$req,$req2);
}

Il suffit de l'utiliser comme ceci :

if(inserer_sql_array("utilisateurs",array("email,nom,prenom"))
echo"L'ajout a été effectué avec succès";
else echo"L'ajout a échoué";

Modification de données :

Sur le même principe que pour l'ajout j'ai cette fonction :

function maj_sql($table,$action,$where)
{
if($where=='') { $where=1; }

$sql = "UPDATE $table SET $action ";
$sql .= "WHERE $where";

if(mysql_query($sql))
{
return true;
}
else
{
return false;
}
}

Dans cette fonction, il est permis de modifier tous les enregistrements d'une table (en laissant l'argument $where à vide). Mais, par mesure de sécurité, on peut désactiver cela en testant la variable $where au début et en renvoyant false si elle est vide.

Pour utiliser cette fonction, il suffit de tester que la fonction renvoie bien true.

La variante de cette fonction qui génère la requête à partir d'un tableau array() :

function maj_sql_array($table,$array,$where)
{
$req="";
$i=1;
foreach($array as $k)
{
if($i!='1') $req.=", ";

$req.="$k='$_POST[$k]'";
$i++;
}

maj_sql($table,$req,$where);
}

Suppression de données :

Cette fonction permet de supprimer un ou plusieurs enregistrements dans une table en précisant uniquement la table et la condition à remplir. Cependant, par mesure de sécurité, il est impossible de ne pas préciser de condition (cela supprimerait tous les enregistrements de la table) :

function sup_sql($table,$where)
{

if($where=='') {
return false;
}
else
{
$sql = "DELETE FROM $table ";
$sql .= "WHERE $where";

if(mysql_query($sql))
{
return true;
}
else
{
return false;
}
}
}

Lire une ligne d'une table :

Enfin, la dernière fonction permet d'extraire les données d'un enregistrement d'une table. C'est bien sûr en fait un simple SELECT mais comme pour les autres fonctions, cela permet de gagner du temps.

function requete_sql($table,$champs,$where)
{
// si $where est vide on lui attribue une valeur par défaut
if($where=='') { $where=1; }

// en cas de jointure on utilise le nom de la première table pour le tri par ID.
$tab=explode(",",$table);

$sql = "select $champs from $table where $where ORDER by $tab[0].id DESC LIMIT 1";
$p = mysql_query($sql)OR DIE("Erreur sur la requete SELECT $champs FROM $table WHERE $where");
return mysql_fetch_array($p);
}

Le résultat de cette fonction est un tableau contenant les données précisées dans l'argument $champs. Exemple :

$requete=requete_sql("utilisateurs","nom,prenom,email","id='$_GET[user]'");
echo"Bonjour ".$requete[prenom]." !";

En bonus, voici la fonction qui permet de compter le nombre d'enregistrements dans une table pour une condition précise. Cette fonction effectue un mysql_numrows sur une requête SELECT. Les puristes préféreraient sans doûte un SELECT count(id), cependant, il me semble que ma méthode est moins lourde :

function compter_sql($table,$where)
{
if($where=='') { $where=1; }
$sql = "select id from $table where $where";
$p = mysql_query($sql)OR DIE("Erreur sur la requete SELECT id FROM $table WHERE $where");
return mysql_numrows($p);
}

Cette fonction suppose que vous avez une colonne id dans votre table puisque le SELECT est effectué dessus. Pour l'utiliser, rien de plus simple :

$nb_utilisateurs_hommes = compter_sql("utilisateurs","sexe='H'");

Conclusion :

Ces petites fonctions ne sont pas révolutionnaires en soit puisqu'elles reprennent les principes de base de SQL. Cependant, et ce n'est pas négligeable, elles permettent réellement de gagner du temps car elles sont plus rapides à écrire et plus faciles à retenir (je retiens mieux des noms de fonction en français qu'en anglais).

Bien sûr, elles ne sont pas parfaites, il faudrait protéger les données à insérer ou à modifier par des htmlspecialchars() et addslashes(). Mais pour ça, c'est à vous de jouer, je ne vais pas vous prémacher tout le travail non plus !

Commentaires

  • Shine-neko
    • 1. Shine-neko Le Ven 20 Jan 2012
    C'est surtout de mauvais pratique à ne plus enseigner de façon générale.
  • Boggy62
    • 2. Boggy62 Le Ven 10 Juin 2011
    @Sarah,
    ce sont des fonctions que tu mets dans ton code source.
    Elles te facilite l'ecriture du code et le rend un peu plus clair.
    Pour l' "utilisateur" rien ne change, les requetes sont faites de la meme facon et les pages Web (générées par PHP) restent les memes.
  • sarah
    • 3. sarah Le Mer 14 Juil 2010
    bonjour,
    c'est interessant , mais je veux bien savoir est-ce que ces 4 fonctions , sont utilisables pour l'interface finale que l'utilisateur peut voir, c'est à dire, pour que n'importe quel utilisateur peut aprés ajouter, modifier ou supprimer des données par l'interface web ? ou seulement pour que l'administrateur peut modifier le code??

    merci
    sarah
  • Sébastien
    • 4. Sébastien Le Ven 25 Juil 2008

    Très interessant ton article, je vais le mettre dans mes favoris et tester tes fonctions dans mes prochains développement je pense ;)

    Sébastien

Ajouter un commentaire