[RESOLU] Comparaison entre variable et bdd fonctionne bizarement

Carpediem
Invité n'ayant pas de compte PHPfrance

19 déc. 2013, 12:46

Bonjour à toute et à tous

Je suis actuellement sur la création de l'espace admin de mon site afin de pouvoir tout gérer depuis celui-ci (Galerie photo, création de sous dossier, gestion de mes rendez-vous.....etc) seulement j'ai un souci un tantinet curieux lorsque qu'il sagit de créer et ajouter des dossiers dans ma bdd. Je m'explique :

Mon formulaire de dépôt pour la galerie se compose ainsi :

- 1 formulaire d'upload d'images => aucun souci
- 1 formulaire de création de dossier et ajout de ce nom de dossier en bdd => problème
- 1 formulaire de suppression de dossier avec un select généré dynamiquement via la bdd quand on crée un dossier.

Voici le page avec les formulaires :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     <meta http-equiv="Content-Language" content="fr" />
     <meta http-equiv="Content-Script-Type" content="text/javascript" />
     <link href="index.css" rel="stylesheet" type="text/css" />
     <link href="depot_gallerie.css" rel="stylesheet" type="text/css" />                 
</head>
<body>

<p class="logo"><a href="index.php"><img src="logo_temp.png" alt="Logo Prestat'Hair"/></a></p>

<div id="gallerie">

<h1>Formulaire de dépôt d'images dans la gallerie...</h1>

<form action="recu_depot_gallerie.php" method="post" enctype="multipart/form-data">
<p><i>Complétez le formulaire. Les champs marqué par </i><em>*</em> sont <em>obligatoires</em></p>
<input type="hidden" name="legende1" id="legende1"/>
<input type="hidden" name="legende2" value="qk4e5fg6t9yu1" id="legende2"/> 

<p>
<fieldset>
    <legend>Paramètre de l'image</legend>
    
     <label for="title">Balise title :<em>*</em></label> <input type="text" name="title" maxlength="150" id="title" required = "required"/><br/>
     <label for="alt">Balise alt :<em>*</em></label> <input type="text" name="alt" maxlength="150" "id="alt" required = "required"/><br/>
     <label for="destination">Destination :<em>*</em></label> <input type="text" name="destination" maxlength="150" "id="destination" required = "required"/><br/>
     
</fieldset>

<fieldset>

    <legend>Image (format 230x173 px)</legend>
    
    <label for="avatar">Uploader L'image :<em>*</em></label> <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
<input type="file" name="avatar" id="avatar">  
     
</fieldset>

     <p><input type="submit" value="Déposer l'image" name="envoyer"></p>
</p>
</form>






<h1>Créer un dossier dans la gallerie...</h1>
<form action="creation_dossier.php" method="post" enctype="multipart/form-data">
  
<label for="nom_dossier">Nom du dossier :</label> <input type="text" name="nom_dossier" required="required" maxlength="30" id="nom_dossier"/><br/>
<input type="hidden" name="legende1" id="legende1"/>
<input type="hidden" name="legende2" value="qk4e5fg6t9yu1" id="legende2"/>

<p><input type="submit" value="Création" name="envoyer"></p>
</form>





<h1>Supprimer un dossier dans la gallerie...</h1>
<form action="supprimer_dossier.php" method="post" enctype="multipart/form-data">

<label for="supprimer_dossier">Nom du dossier :</label> 
<select name="supprimer_dossier" id="supprimer_dossier" required="required">
<?php 
try
{
    $bdd = new PDO('mysql:host=localhost;dbname=coiffure', 'root', '');
    $bdd->query("SET NAMES UTF8"); 
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}


$reponse = $bdd->query('SELECT nom_dossier FROM dossier_gallerie');
 

while ($donnees = $reponse->fetch())
{
?>
  
        <option value="<?php echo $donnees ['nom_dossier']?>"><?php echo $donnees ['nom_dossier']?></option>
        
  <?php }?>
  </select>
  
<input type="hidden" name="legende1" id="legende1"/>
<input type="hidden" name="legende2" value="qk4e5fg6t9yu1" id="legende2"/>
  
<p><input type="submit" value="Suppression" name="envoyer"></p>
 </form>



</div>


</body>
</html>

Le problème se situe au moment ou je crée un dossier :

- Je rentre un nom de dossier dans la boite et je valise mon formulaire
- Si il n'existe pas dans la bdd ni sous forme de dossier, tout se crée et mes messages de confirmation s'affiche
- Je réitère une seconde fois avec le même nom de dossier et la il me recrée une ligne en bdd avec le même nom mais pas de nouveau dossier par contre
- Je test une troisième fois et la ça me mets le bon message soit : le dossier existe déjà dans la bdd
- J'essaye avec un autre nom de dossier et la rien a faire, je peux le créer en bdd autant de fois que je le souhaite

Voici le code de réception du formulaire de création :
<?php

$dossier=trim(stripslashes($_POST["nom_dossier"]));

try
{
    $bdd = new PDO('mysql:host=localhost;dbname=coiffure', 'root', '');
    $bdd->query("SET NAMES UTF8"); 
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}

        $res = $bdd->query('SELECT nom_dossier FROM dossier_gallerie');
        $requete = $res->fetch(PDO::FETCH_ASSOC);
        $return = $res->fetch();

if($return['nom_dossier'] == $dossier)
    {
        echo "<h4>Le nom de dossier existe déjà dans la base de donnée. Retour à la page <a href=\"depot_gallerie.php\">Dépôt Gallerie</a></h4>";
    }
elseif($return['nom_dossier'] != $dossier)  
    {
        try
{
    $bdd = new PDO('mysql:host=localhost;dbname=coiffure', 'root', '');
    $bdd->query("SET NAMES UTF8"); 
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}
$req = $bdd->prepare ('INSERT INTO dossier_gallerie(ID, nom_dossier) 
                              VALUES(:ID, :nom_dossier)');
$req->execute(array(
    'ID' => NULL,
    'nom_dossier'=>$_POST['nom_dossier']));

{    
echo "<h4>Le nom de dossier a été ajouté à la base de donnée. Retour à la page <a href=\"depot_gallerie.php\">Dépôt Gallerie</a></h4>";
}     
    }

if (isset($_POST["envoyer"])){
	// On initialise notre etat à erreur, il sera changé à "ok" si la vérification du formulaire est un succès, sinon il reste à erreur
	$etat = "erreur"; 

	if (isset($_POST["nom_dossier"])) $_POST["nom_dossier"]=trim(stripslashes($_POST["nom_dossier"]));
  

  if (empty($_POST["nom_dossier"])) { 
		$erreur="Erreur dans la transmission du formulaire..."; 
	}
  elseif (!empty($_POST["legende1"])) { 
		$erreur="Erreur dans la transmission du formulaire..."; 
	}
	// Si tous les champs sont valides, on change l'état à ok
	else { 
		$etat="ok";
    }
}

if ($etat=="ok"){ 
	// Cas où le formulaire a été soumis mais il y a des erreurs

if(is_dir("../images/uploads/gallerie/$dossier"))
{
   echo "Le dossier existe déjà";  
}
   
else
{
   mkdir("../images/uploads/gallerie/$dossier");
   echo "Le dossier a été crée";
}
              }
              
elseif ($etat=="erreur"){ 

		echo "<h4>$erreur</h4>Retour à la page <a href=\"depot_gallerie.php\">Dépôt Gallerie</a>"; 
	}
  
else {
     echo "<h4>Erreur dans la transmission du formulaire.Retour à la page <a href=\"index.php\">Accueil</a></h4>";
}

?>
Ne faites pas trop attention à la façon d'on je présente le code, j'ai essayé plein de solution donc c'est un peu bordélique =).

Merci à ceux qui pourront m'aider

Cordialement

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

19 déc. 2013, 15:13

salut

l'erreur est la
$res = $bdd->query('SELECT nom_dossier FROM dossier_gallerie');
$requete = $res->fetch(PDO::FETCH_ASSOC);
$return = $res->fetch();

if($return['nom_dossier'] == $dossier)
{
echo "<h4>Le nom de dossier existe déjà dans la base de donnée. Retour à la page <a href=\"depot_gallerie.php\">Dépôt Gallerie</a></h4>";
}

tu ne peux pas prédire l'ordre de retour de ton select donc en premier tuple c'est p'tet le bon ou pas.

il te faut réduire la sélection avec ce que tu as dans le formulaire.
de plus on ne récupère pas toute une table pour savoir si une info est dedans on utilise la fonction SQL count

exemple
<?php
sql = 'SELECT count(1) as nbdossier FROM dossier_gallerie where lower(nom_dossier) like \'%'.strtolower(trim($bdd->quote($_POST['nom_dossier']))).'%\'';
ensuite si nbdossier est différent de (ou supérieur à) zéro c'est qu'il est déja dans la base.

une autre solution est d'ajoute une clef unique sur la colonne nom_dossier et d'insérer systématiquement.
s'il y a une erreur de retournée (une erreur duplicate key) c'est qu'il existe déjà.
Perso je préfère la 1ère solution même avec une requête de plus ;)


@+
Il en faut peu pour être heureux ......

Carpediem
Invité n'ayant pas de compte PHPfrance

19 déc. 2013, 16:34

Bonjour,

Merci beaucoup pour votre réponse, je crois que j'ai compris le principe. Je me penche sur votre solution dans la soirée ou demain et je viendrais poster le code si tout va bien. Merci encore.

Cordialement

Morgane

Carpediem
Invité n'ayant pas de compte PHPfrance

23 déc. 2013, 13:44

Bonjour à tous,

Je n'arrive vraiment pas a utiliser le count et a le comparer avec ma variable, j'ai passé la requete en prepare vu que je veux réaliser une comparaison avec une variable. Si j'ai bien compris, si la requête trouve mon dossier dans la bdd alors nbdossier=1 et si il n'en trouve pas nbdossier=0. Si c'est bien ça, j'aimerais savoir ce qui cloche dans mon code. Ou alors j'ai vraiment rien compris =)

Merci d'avance

Morgane
<?php

$legende2=trim(stripslashes($_POST["legende2"]));
// Si le formulaire a été soumis
if (isset($_POST["envoyer"])){

    if ($legende2="qk4e5fg6t9yu1"); { 
	// On initialise notre etat à erreur, il sera changé à "ok" si la vérification du formulaire est un succès, sinon il reste à erreur
	$etat = "erreur";
  
 try
{
    $bdd = new PDO('mysql:host=localhost;dbname=coiffure', 'root', '');
    $bdd->query("SET NAMES UTF8"); 
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}

        $res = $bdd->prepare ('SELECT count(1) as nbdossier FROM dossier_gallerie where lower(nom_dossier) like \'%'.strtolower(trim($bdd->quote($_POST['nom_dossier']))).'%\'');
        $requete = $res->fetch(PDO::FETCH_ASSOC);
        $return = $res->fetch(); 

	if (isset($_POST["nom_dossier"])) $_POST["nom_dossier"]=trim(strip_tags($_POST["nom_dossier"]));
  if (isset($_POST["repertoire_creation"])) $_POST["repertoire_creation"]=trim(strip_tags($_POST["repertoire_creation"]));
  
  $dossier=trim(strip_tags($_POST["nom_dossier"]));
  $repertoire=trim(strip_tags($_POST["repertoire_creation"]));

  if (empty($_POST["nom_dossier"])) { 
		$erreur="Vous n'avez pas rentré de nom de dossier..."; 
	}
  elseif (empty($_POST["repertoire_creation"])) { 
		$erreur="Vous n'avez pas sélectionner de répertoire de destination..."; 
	}
  elseif (!empty($_POST["legende1"])) { 
		$erreur="Une erreur avec un champ de type text est survenue..."; 
	}
	// Si tous les champs sont valides, on change l'état à ok
	else { 
		$etat="ok";
    }
}

if ($etat=="ok"){ 
	// Cas où le formulaire a été soumis mais il y a des erreurs
if($return['nbdossier'] != 0)
    {
        echo "<h4>Le nom de dossier existe déjà dans la base de donnée.<br/><br/> Retour à la page <a href=\"depot_gallerie.php\">Dépôt Gallerie</a></h4>";
    }
elseif($return['nbdossier'] == 0)  
    {
        try
{
    $bdd = new PDO('mysql:host=localhost;dbname=coiffure', 'root', '');
    $bdd->query("SET NAMES UTF8"); 
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}
$req = $bdd->prepare ('INSERT INTO dossier_gallerie(ID, nom_dossier) 
                              VALUES(:ID, :nom_dossier)');
$req->execute(array(
    'ID' => NULL,
    'nom_dossier'=>$dossier));

{    
echo "<h4>Le nom de dossier a été ajouté à la base de donnée.<br/><br/> Retour à la page <a href=\"depot_gallerie.php\">Dépôt Gallerie</a></h4>";
}     
    }

              }
              
elseif ($etat=="erreur"){ 

		echo "<h4>$erreur</h4>Retour à la page <a href=\"depot_gallerie.php\">Dépôt Gallerie</a>"; 
	}
  
else {
     echo "<h4>Erreur dans la transmission du formulaire.Retour à la page <a href=\"index.php\">Accueil</a></h4>";
}

if(is_dir("$repertoire/$dossier"))
{
   echo "Le dossier existe déjà";  
}
   
else
{
   mkdir("$repertoire/$dossier");
   echo "Le dossier a été crée";
}}

?>