éviter les doublons dans une BDD
Bonjour,
Je suis en train de développer une galerie photos, et en ce moment je suis en train de mettre en place un système d'album photos. Je sais gérer la création et la suppression d'un album, par contre ce qui me pose problème c'est lors de la création, vérifier que le nom que l'on souhaite attribuer au nouvel album n'est pas déjà existant dans la BDD.
Voici le code que j'ai écrit :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="fr" xml:lang="fr" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?php
$serveur='localhost';
$user='root';
$motdepasse='';
$bdd='BDDPhotos';
$connect= mysql_connect($serveur,$user,$motdepasse) or die ("Impossible de se connecter: ");
mysql_select_db($bdd);
$RubriqueName = $_POST['frm_rub_name'];
$RubriqueDesc = $_POST['frm_textarea_desc'];
$Date = date("Y-m-d");
$Time = date("H:i:s");
?>
<form action="BDDPhotos_admin_add_rub.php" enctype="multipart/form-data" method="post">
Nom:<br/>
<input type="text" name="frm_rub_name" size="50" value="<?php if(isset($_POST['frm_rub_name'])) { echo $_POST['frm_rub_name']; } ?>"/>
<br/><br/>
Description:<br/>
<textarea name="frm_textarea_desc" rows="5" cols="40" value="<?php if(isset($_POST['frm_textarea_desc'])) { echo $_POST['frm_textarea_desc']; } ?>"></textarea>
<br/><br/>
<input type="submit" value="Ajouter rubrique" />
</form>
<?php
if(empty($_POST['frm_rub_name']) AND empty($_POST['frm_textarea_desc']) )
{
}
elseif (empty($_POST['frm_rub_name']))
{
echo'veuillez saisir le nom de lalbum';
}
elseif (empty($_POST['frm_textarea_desc']))
{
echo'veuillez saisir le descriptif de lalbum';
}
else
{
$RubriqueName = mysql_real_escape_string(stripslashes($_POST['frm_rub_name']));
$RubriqueDesc = mysql_real_escape_string(stripslashes($_POST['frm_textarea_desc']));
$query = mysql_query("INSERT INTO rubrique VALUES('RubriqueId','$RubriqueName','$RubriqueDesc','$Date','$Time')")or die(mysql_error());
//$requete = "SELECT * FROM rubrique WHERE RubriqueName = '". $RubriqueName ."'";
//$resultat = mysql_query($requete);
//$compteur = mysql_num_rows($resultat);
//if($compteur > 0){
//echo $RubriqueName .' existe déjà.';}
// $i = 0;
//$nombrealbum = mysql_result(mysql_query("SELECT COUNT(*) FROM rubrique WHERE RubriqueName = '".$_POST['frm_rub_name']."'"), 0);
//if($nombrealbum != 0)
//{
//$pseudo_erreur1 = "Votre pseudo est déjà utilisé par un concurrent.";
//$i++;
}
if($query) {
echo 'le tuto a été ajouté avec succés';
unset($_POST);
mkdir("../photos/$RubriqueName",true);
}
else echo 'Problème lors de lajout ';
}
?>
</body> |
S'agit il de la bonne démarche ?
Merci pour vos conseils.
Quelques trucs en vrac pour plus tard
-on sépare le traitement ( code ) de l'affichage ( HTML ) pour des raisons de maintenance ( à la relecture dans 6 mois )
-Ta connexion à ta base de données, tu vas t'en resservir dans d'autres pages, pour des raisons de maintenance( éviter le copier coller )
il vaut mieux l'inclure, on regroupe(factorise) le code
-si une condition ne contient aucune instruction, c'est qu'elle ne sert à rien il faut l'enlever et repenser les conditions
-la fonction die( alias de exit) arrête le programme, son utilisation est à proscrire
-ce formualire et ses traitements, ils sont presque les même pour la création, la mise à jour
il pourrait être bien de ne pas copier coller pour des raisons de maintenance
on mets à jour si un id d'album est fournie par l'utilisateur ou on crée s'il n'est pas fournie, cas que je n'ai pas traité ici
#fichier connexion.php#
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
<?php
$serveur='localhost';
$user='root';
$motdepasse='';
$bdd='BDDPhotos';
#NON, die arrête le programme, ce n'est pas la bonne façcon de faire
#une redirection vers une page d'erreur derait plus adaptée, attention une redirection ne marche que si aucun contenu n'a été envoyé
#en production il faudrait interdire l'affichage d'erreur avec ini_set('display_errors', 0) ;
$connect= mysql_connect($serveur,$user,$motdepasse) or header('Location:maintenance.php') ;
mysql_select_db($bdd);
?> |
#ficher formulaire.php#
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
|
include_once('connexion.php') ;
#tu déclares des variables dont tu ne te sers jamais, si on les déclare c'est qu'on pense que c'est utile, donc on s'en sert
$RubriqueName = '' ;
$RubriqueDesc = '' ;
$MessageErreur = '' ;
#on va éviter de hard-coderles textes de manière disséminée dans le code pour des raisons de maintenance
define('ERREUR_NOM_ALBUM_DOUBLON','Ce nom existe déjà. Veuillez renommer votre album.') ;
define('ERREUR_NOM_ALBUM_VIDE','veuillez saisir le nom de lalbum') ;
define('ERREUR_DESC_ALBUM_VIDE','veuillez saisir le descriptif de l\'album') ;
# on traite les données venant de l'extérieur et on contrôle que les données sont conformes à nos attentes
# si la valeur a été fournies et qu'elle n'est pas vide
if( isset( $_POST['frm_rub_name'] ) && $_POST['frm_rub_name'] )
{
#stripslashes ne sert que si la directive magic_quotes_gpc est activée
if( get_magic_quotes_gpc() )
$_POST['frm_rub_name'] = stripslashes(($_POST['frm_rub_name']);
#1 la donnée est sécurisée
#l'échappement pour éviter les injections sur la lib mysql était important, la démarche était bonne, il faut conserver cette ligne
$RubriqueName = mysql_real_escape_string( $_POST['frm_rub_name'] ) ;
#2 la donnée est vérifiée, ce nom existe-il déjà ?
#on utilise la substitution dans les chaines entre guillemets, pas besoin de concaténer
$requete = "SELECT * FROM rubrique WHERE RubriqueName = '$RubriqueName'" ;
$resultat = mysql_query($requete) ;
$compteur = mysql_num_rows($resultat);
if($compteur > 0)
{
$MessageErreur = ERREUR_NOM_ALBUM_DOUBLON ;
}
}
else
{
$MessageErreur = ERREUR_NOM_ALBUM_VIDE ;
}
#on remarquera ici que le traitement est le même que au-dessus, on pourrait en faire une fonction pour faciliter la maintenance
if( isset( $_POST['frm_textarea_desc']) && $_POST['frm_textarea_desc'] )
{
#stripslashes ne sert que si la directive magic_quotes_gpc est activée
if( get_magic_quotes_gpc() )
$_POST['frm_textarea_desc'] = stripslashes(($_POST['frm_textarea_desc']);
$RubriqueDesc = mysql_real_escape_string( $_POST['frm_textarea_desc'] ) ;
}
else
{
$MessageErreur = ERREUR_DESC_ALBUM_VIDE ;
}
#si tout s'est bien passé et que les données ont été contrôlées, par extension s'il n'y a pas de message d'erreur
#on va insérer dans la base
if( ! $MessageErreur )
{
$Date = date("Y-m-d");
$Time = date("H:i:s");
#il pourrait être mieux préciser les champs de la table pour des raisons de maintenance
$queryResult = mysql_query("INSERT INTO(rubName, rubDesc, rubDate, rubTime) rubrique VALUES('$RubriqueName','$RubriqueDesc','$Date','$Time')") ;
if( ! $queryResult )
{
$MessageErreur = 'Une erreur est survenue, veuillez réessayer plus tard.'
}
else
{
mkdir("../photos/$RubriqueName",true);
#la rubrique a été ajoutée avec succès peut être remplacé par une redirection vers une page utile
header('Location:gestionRubrique.php') ;
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="fr" xml:lang="fr" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?php
#une conversion implicite de type est faite par PHP, si la chaine est vide ou contient 0 la condition est fausse, sinon elle est vraie
if( $MessageErreur )
{ ?>
<div id="messageErreur"><?php echo $MessageErreur ; ?></div>
<?php
}
?>
<form action="BDDPhotos_admin_add_rub.php" enctype="multipart/form-data" method="post">
Nom:<br/>
<input type="text" name="frm_rub_name" size="50" value="<?php
#tu remarqueras que la condition est maintenant dans le traitement(en haut du script) et non quel part dans le HTML
#cela va simplifier la maintenance
#idem pour la variable $RubriqueDesc
echo $RubriqueName
?>"/>
<br/><br/>
Description:<br/>
<textarea name="frm_textarea_desc" rows="5" cols="40" value="<?php echo $RubriqueDesc ?>"></textarea>
<br/><br/>
<input type="submit" value="Ajouter rubrique" />
</form> |
En espérant que cela te serve pour tes futurs codes.
Xavier