IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Vérification de la non présence d'une valeur [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 306
    Points : 106
    Points
    106
    Par défaut Vérification de la non présence d'une valeur
    Bonjour,

    J'essaye de créer une requete interrogeant la base de données en vue de verifier que la valeur saisie dans le formulaire n'est pas déjà présente dans la base de données je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    //$nom_hotel = Valeur saisie dans le formulaire
     
    	include("../include/connex.inc.php");
     
    //requete
    		$sql_selection = "SELECT nom_hotel FROM hotel";
    		$stmt = $dbh->query($sql_selection);
     
     
     
    		while($row = $stmt->fetch(PDO::FETCH_NUM))
    			{
    			//Si valeur déjà présente
    			if($row[0] == $nom_hotel)
    				{
    				print($nom_hotel ." -- ");
    				print($row['nom_hotel']);
    				print("EXISTANT !");
    				break;
    				}
    //sinon
     
    else
    				{
    				print($nom_hotel ." -- ");
    				print($row['nom_hotel']);
    				print("A ENREGISTRER !");
    				break;
    				}
    Mon problème est que la boucle s'arrête à la première valeur contenue dans le tableau et ne fait pas le tour pour comparer chaque valeur une par une.
    J'ai donc toujours "A enregistrer" qui s'affiche même si je saisie une valeur déjà présente dans le tableau $row renvoyé par la base de données.

    Quel est le problème ?
    Merci d'avance pour vos lumières

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Enleve tes deux "break"

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 306
    Points : 106
    Points
    106
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Enleve tes deux "break"
    Salut,

    Toujours pareil sauf que cette fois ci ca m'affiche "A enregistrer" autant que fois que le nombre d'enregistrement déjà présents dans le tableau (sauf une fois ou ca affiche existant car la veleur est identique).

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 228
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 228
    Points : 8 487
    Points
    8 487
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par popy67 Voir le message
    Toujours pareil sauf que cette fois ci ca m'affiche "A enregistrer" autant que fois que le nombre d'enregistrement déjà présents dans le tableau (sauf une fois ou ca affiche existant car la veleur est identique).
    Me semble que c'est bien ce que tu demandes de faire à ton script non ? Si tu veux juste afficher EXISTANT et pas A ENREGISTRER alors supprime le else et tout ce qu'il contient.

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 306
    Points : 106
    Points
    106
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Me semble que c'est bien ce que tu demandes de faire à ton script non ? Si tu veux juste afficher EXISTANT et pas A ENREGISTRER alors supprime le else et tout ce qu'il contient.
    Je veux faire la chose suivante :

    Si par exemple dans mon formulaire je marque "dodo" et que mon tableau $row contient deja la valeur "dodo" j'affiche une seule fois existant; si mon tableau ne contient pas "dodo" j'affiche une seule fois "a enregistrer".

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Points : 18
    Points
    18
    Par défaut
    Qu'est ce que tu souhaites faire exactement ?

    - Simplement vérifier l'absence du nom d'un hôtel en table ?
    => pourquoi n'utilises tu pas de clause WHERE ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $sql_selection = "SELECT count(nom_hotel) FROM hotel WHERE nom_hotel LIKE '%$nom_hotel%' ";

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 306
    Points : 106
    Points
    106
    Par défaut
    Citation Envoyé par bacchus41 Voir le message
    Qu'est ce que tu souhaites faire exactement ?

    - Simplement vérifier l'absence du nom d'un hôtel en table ?
    => pourquoi n'utilises tu pas de clause WHERE ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $sql_selection = "SELECT count(nom_hotel) FROM hotel WHERE nom_hotel LIKE '%$nom_hotel%' ";
    Ah ouais, en effet ^^ je n'avais pas pensé à WHERE
    Comme tu me l'as dit et avec le code suivant ca marche très bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    $sql_selection = "SELECT count(nom_hotel) FROM hotel WHERE nom_hotel LIKE '%$nom_hotel%'";
    		$stmt = $dbh->query($sql_selection);
     
    		//////////////////////////////////////////////////////////////////////////////
    		while($row = $stmt->fetch(PDO::FETCH_NUM))
    			{
    			if($row[0] == 1)
    				{
    				print($nom_hotel ." -- ");
    				print($row['nom_hotel']);
    				print("EXISTANT !");
     
    				}
    			else
    				{
    				print($nom_hotel ." -- ");
    				print($row['nom_hotel']);
    				print("A ENREGISTRER !");
     
    				}
    		}
    Quelques minutes avant de revenir sur le forum j'avais aussi trouvé la solution du isset qui elle aussi fonctionne bien et avec laquelle je peux encore ajouter d'autres valeurs à vérifier; comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    $sql_selection = "SELECT nom_hotel FROM hotel";
    		$stmt = $dbh->query($sql_selection);
     
    		//////////////////////////////////////////////////////////////////////////////
    		while($row = $stmt->fetch(PDO::FETCH_NUM))
    			{
    			if(isset($row[0]))
    				{
    				print($nom_hotel ." -- ");
    				print($row['nom_hotel']);
    				print("EXISTANT !");
     
    				}
    			else
    				{
    				print($nom_hotel ." -- ");
    				print($row['nom_hotel']);
    				print("A ENREGISTRER !");
     
    				}
    		}
    Merci beaucoup pour votre aide à tous

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Points : 18
    Points
    18
    Par défaut
    OK,

    La version avec le WHERE est plus performante, après il y a des petites choses à vérifier.
    En règle générale, fais le max de traitement en SQL : le moteur MySQL est là pour ça et est optimisé pour.

    1. Dans la clause j'ai utilisé LIKE '%mot%', donc ca te retournera tous les hotels dans le nom contient le mot 'mot'.

    2.
    Selon la définition de la table, tu peux avoir plusieurs hotel répondant à ce critère il faudrait donc modifier ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    		while($row = $stmt->fetch(PDO::FETCH_NUM))
    			{
    			if($row[0] >= 1)
    				{
    				print($nom_hotel ." -- ");
    				print($row['nom_hotel']);
    				print("EXISTANT !");
    3.
    Si tu veux que le nom soit unique, ajoute un INDEX UNIQUE sur la colonne nom_hotel (inutile s'il d'agit de la clé primaire).

    4.
    Il faut éviter d'intégrer directement une donnée venant d'un formulaire dans une requête, l'utilisateur pourrait y insérer du code SQL.

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 306
    Points : 106
    Points
    106
    Par défaut
    Citation Envoyé par bacchus41 Voir le message
    OK,

    La version avec le WHERE est plus performante, après il y a des petites choses à vérifier.
    En règle générale, fais le max de traitement en SQL : le moteur MySQL est là pour ça et est optimisé pour.

    1. Dans la clause j'ai utilisé LIKE '%mot%', donc ca te retournera tous les hotels dans le nom contient le mot 'mot'.

    2.
    Selon la définition de la table, tu peux avoir plusieurs hotel répondant à ce critère il faudrait donc modifier ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    		while($row = $stmt->fetch(PDO::FETCH_NUM))
    			{
    			if($row[0] >= 1)
    				{
    				print($nom_hotel ." -- ");
    				print($row['nom_hotel']);
    				print("EXISTANT !");
    3.
    Si tu veux que le nom soit unique, ajoute un INDEX UNIQUE sur la colonne nom_hotel (inutile s'il d'agit de la clé primaire).

    4.
    Il faut éviter d'intégrer directement une donnée venant d'un formulaire dans une requête, l'utilisateur pourrait y insérer du code SQL.
    Ok ok merci pour tous ces precieux conseils

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tableaux] Tester la présence d'une valeur
    Par emmma dans le forum Langage
    Réponses: 6
    Dernier message: 20/06/2007, 11h50
  2. [XSLT] Tester la non présence d'une valeur dans un fichier
    Par arnauann dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 23/01/2007, 15h29
  3. [Cookies] Non récuperation d'une valeur de session
    Par nicko5959 dans le forum Langage
    Réponses: 3
    Dernier message: 29/12/2006, 17h08
  4. comment vérifier la présence d'une valeur ds une chaîne ?
    Par lidouka dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/03/2006, 07h01
  5. Verification de présence d'une valeur [PHP-MySQL]
    Par 10-nice dans le forum Requêtes
    Réponses: 3
    Dernier message: 09/03/2006, 10h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo