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 :

Verification doublon avant creation enregistrement [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 227
    Par défaut Verification doublon avant creation enregistrement
    Bonjour à tous,

    J'ai récupéré des bouts de codes à droite et à gauche pour faire ce joli bidouillage ci dessous...
    Il consiste à vérifier que lors de la création d'un nouvel enregistrement, le nom de société n'est pas déjà dans la base.
    Pouvez-vous me dire si cela vous parait correct et s'il n'y a pas de risque à l'utiliser.
    J'ai par exemple modifié l'ouverture de base en la plaçant entre des balises ayant entendu dire que c'était à risque de les laisser avec les lignes de codes.

    Merci pour vos regards critiques et à venir.
    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
    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
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
     
      <title></title>
    </head>
     
    <body>
     
     
     
    <?php
    echo $_POST['nom']; 
    $nom=$_POST['nom'];
    echo '<br>';
    echo $_POST['url']; 
    $url=$_POST['url'];
    echo '<br>';
    echo $_POST['telephone'];
    $telephone=$_POST['telephone'];
    echo '<br>';
    echo $_POST['ville']; 
    $ville=$_POST['ville'];
    echo '<br>';
    echo $_POST['categorie1']; 
    $categorie1=$_POST['categorie1'];
    echo '<br>';
    echo $_POST['logo']; 
    $logo=$_POST['logo'];
    echo '<br>';
    echo $_POST['debut_contrat']; 
    $debut_contrat=$_POST['debut_contrat'];
    echo '<br>';
    echo $_POST['fin_contrat']; 
    $fin_contrat=$_POST['fin_contrat'];
    echo '<br>';
    ?>
     
     
     
    	<?php
     
     
    // Connexion au serveur
    $connect = mysql_connect('mysql5-9','xxxx','xxxx') or die ("Erreur de connexion");
    mysql_select_db('xxx',$connect) or die ("Erreur de connexion base");
    ?>
     
    <?php
     
    // Creation et envoi de la requete
    $query = "SELECT nom FROM base WHERE nom='$nom'";
     
    $result = mysql_query($query);
     
    // Recuperation des resultats
    if (!mysql_fetch_row($result)) {
    $sql = "INSERT INTO `xxx`.`base` (`nom` ,`url` ,`telephone` ,`ville` ,`categorie1` ,`logo` ,`debut_contrat`, `fin_contrat`)VALUES ('".$nom."', '".$url."', '.$telephone', '".$ville."', '".$categorie1."', '".$logo."', '".$debut_contrat."', '".$fin_contrat."')";
     
       //exécution de la requête SQL:
      $requete = mysql_query($sql, $connect) or die( mysql_error() ) ;
    }
     
    else {
     
     
    		echo $nom ;
    		echo ' existe';
     
     
    }
    ?>
    <?php
    // Deconnexion de la base de donnees
    mysql_close();
     
    ?>
    </body>
    </html>

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 138
    Par défaut
    Salut,

    Bon pour regarder si ton un champ possède déjà une valeur, tu fais ca.
    (Désolé, si ca ne colle pas exactement à ton code).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $sql="SELECT COUNT('monChamp') FROM maTable WHERE monChamp = '".$valeurDuChamp."'";
    $res=mysql_query($sql);
    $nb=mysql_num_rows($res);
     
    if($nb<1){
      echo "alors pas de doublon";
    }
    else{
      echo "Doublon";
    }

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 227
    Par défaut
    Ca fonctionne.
    Merci!

    Pour le reste, pas de risque possible?
    Vous confirmez la necessité d'ouvrir la base en dehors du code php?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 227
    Par défaut
    Bon, j'ai été un peu vite en besogne...
    En fait ça ne passe pas.
    J'ai du merdouiller quelque part.

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    // Creation et envoi de la requete
    $query = "SELECT COUNT('nom') FROM base WHERE nom = '".$nom."'";
     
    $result = mysql_query($query);
    $nb=mysql_num_rows($result);
    echo $result;
    // Recuperation des resultats
    if($nb<1) {
    $sql = "INSERT INTO `connexionbase`.`base` (`id`, `nom` ,`url` ,`categorie1` ,`contact` ,`telephone` ,`ville` ,`adresse1` ,`adresse2` ,`codepostal` ,`logo` , `debut_contrat`, `fin_contrat` ,`commentaires` )VALUES (NULL, '".$nom."', '".$url."', '".$categorie1."', '".$ville."', '".$categorie1."', '".$contact."', '".$telephone."', '".$ville."', '".$adresse1."', '".$adresse2."', '".$codepostal."', '".$logo."', '".$debut_contrat."', '".$fin_contrat."', '".$commentaires."')";
     
       //exécution de la requête SQL:
      $requete = mysql_query($sql, $connect) or die( mysql_error() ) ;
      echo $_POST['nom']; 
    echo '<br>';
    echo $_POST['url']; 
    echo '<br>';
    echo $_POST['telephone'];
    echo '<br>';
    echo $_POST['ville']; 
    echo '<br>';
    echo $_POST['categorie1']; 
    echo '<br>';
    echo $_POST['logo']; 
    echo '<br>';
    echo $_POST['debut_contrat']; 
    echo '<br>';
    echo $_POST['fin_contrat']; 
    echo 'Ces informations ont été rentrées dans la base';
    }
     
    else {
     
    echo 'L\'enregistrement "';
    		echo $nom ;
    		echo '" existe.';
     
     
    }
    ?>
    Il me dit que l'enregistrement existe et l'echo de $result me renvoit:

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 138
    Par défaut
    Salut,

    C'est tout a fait normal que ton echo te renvoi une valeur inexploitable... c'est pour ca qu'il y a des fonction php comme mysql_fetch_assoc(), mysql_fetch_array()... etc...

    De plus ton echo doit porter sur le résultat, et non pas la requête !

    Poste moi le rapport de 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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    <?php
     
    // ICI TU METS TON SCRIPT DE CONNEXION A LA BDD 
     
    $nom=$_POST['nom'];
    $url=$_POST['url'];
    $telephone=$_POST['telephone'];
    $ville=$_POST['ville'];
    $categorie1=$_POST['categorie1'];
    $logo=$_POST['logo'];
    $debut_contrat=$_POST['debut_contrat'];
    $fin_contrat=$_POST['fin_contrat'];
     
    // Creation et envoi de la requete
    $query = "SELECT COUNT('nom') FROM base WHERE nom = '".$nom."'";
     
    $result = mysql_query($query);
    $nb=mysql_num_rows($result);
    echo $nb;
    // Recuperation des resultats
    if($nb<1) {
     
    	// Ici ton connexion.base ne doit pas être bon, j'ai remplacé par base comme au dessus.   Mets juste le nom de ta table.  De plus les backquote ne sont pas obligatoires dans les requêtes.
    	$sql = "INSERT INTO`base` (`id`, `nom` ,`url` ,`categorie1` ,`contact` ,`telephone` ,`ville` ,`adresse1` ,`adresse2` ,`codepostal` ,`logo` , `debut_contrat`, `fin_contrat` ,`commentaires` )VALUES (NULL, '".$nom."', '".$url."', '".$categorie1."', '".$ville."', '".$categorie1."', '".$contact."', '".$telephone."', '".$ville."', '".$adresse1."', '".$adresse2."', '".$codepostal."', '".$logo."', '".$debut_contrat."', '".$fin_contrat."', '".$commentaires."')";
     
    	//exécution de la requête SQL:
    	if($requete = mysql_query($sql) or die( mysql_error() )){
    		echo "requête d'insertion OK";
    	}
     
    }
     
    else {
     
    echo 'L\'enregistrement "';
    		echo $nom ;
    		echo '" existe.';
     
     
    }
    ?>
    Et le rapport d'erreur aussi s'il y en a un.

    Cordialement,

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 227
    Par défaut
    salut Evilam,

    la variable $nb renvoit 1
    (je n'ai que 2 enregistrements dans la base donc pas de doute possible, mes tests de saisie sont différents du contenu)


    EDIT
    J'ai modifié ma base, je te poste l image au cas où j'aurais fait une erreur.
    Ce qui est possible, je n'ai aucune prétention en info, je débute en sql!



    RE EDIT:
    C 'est normal qu'il n'y ait plus la variable $connect dans le nouveau code que tu me proposes?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $requete = mysql_query($sql, $connect)=>$requete = mysql_query($sq)
    RERE:
    J'ai lancé la commande sous phpmyadmin et cela renvoit bien 0...

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 227
    Par défaut
    Un post évoque le fait que certaines commandes sont à rajouter pour ne pas avoir ce message d erreur:

    Tu a oublié de parcourir ta requête
    Pour cela tu as 3 fonctions à ta disposition, mysql_fetch_array, mysql_fetch_row, mysql_fetch_object.
    J'ai essayé sans succès de les intégrer.

    EDIT:

    J'ai remis, pour les tester, les premières lignes de code que je présentais et qui fonctionnait.
    Ce n'est plus le cas depuis que j'ai recréé ma base.
    J'y rajouté l'ID que j'avais oublié
    J'ai l'intuition que mon problème pourrait venir de ça...

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 138
    Par défaut
    Salut,

    la variable $nb renvoit 1
    Donc c'est que ca fonctionne, il détecte bien qu'il y a déjà eu un enregistrement avec le même nom.

    C 'est normal qu'il n'y ait plus la variable $connect dans le nouveau code que tu me proposes?
    Pour ma part je me connecte avant de faire mes applications sur la bdd.

    mes tests de saisie sont différents du contenu
    Un exemple ? Car la je ne "peux" plus voir aucune erreur... sinon as tu un lien?

    Je suis connecté toute la soirée, donc hésite pas à répondre ce soir ! ^^

    EDIT : affiche moi le "contenu" de ta bdd aussi stp.

    Cordialement,

  9. #9
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2007
    Messages : 282
    Par défaut
    une fois que tu as trouvé la bonne requete, tu pourrais utiliser une méthode ajax pour verifier avec de valider ton formulaire.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 227
    Par défaut
    Citation Envoyé par lemirandais Voir le message
    une fois que tu as trouvé la bonne requete, tu pourrais utiliser une méthode ajax pour verifier avec de valider ton formulaire.
    Bonjour,
    C'est à dire?

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 138
    Par défaut
    Salut,

    Je pense que lemirandais a complètement craqué avec son poste qui est d'ailleurs un peu hors sujet.

    J'essaie de prendre le temps vendredi de faire une copie de ta base et de faire les tests en local.

    Pour m'éviter d'ailleurs cette peine, si tu peux exporter ta bdd et mettre le code dans ce topic ca serait sympa ^^"!

    Je devrai te trouver la solution ce WE au pire des cas.

    Cordialement,

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 227
    Par défaut
    Salut Evilam,

    Donc c'est que ca fonctionne, il détecte bien qu'il y a déjà eu un enregistrement avec le même nom.
    Justement, mon problème est qu'il me dit que l'enregistrement existe alors que ce n'est pas le cas.
    Quand je lance la commande sous phpmyadmin en remplaçant la variable par un autre nom (non présent dans la base), il me revoit bien 0.

    Ma base:



    un lien vers quel paget 'interesse?

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 227
    Par défaut
    Zut, je ne vois pas ma réponse, je recommence!

    Merci donc, pour le code et les conseils.
    Je ne suis pas informaticien, ca me parait une montagne de réaliser mon projet.
    Css, Html, Php, Sql... Ouf....!!!
    C'est du lourd.
    Je ne sais pas trop dans quoi je me suis lancé.
    Un de mes problèmes et que je copie des lignes de codes et que je suis déjà bien content quand cela fonctionne.
    Pour autant, cela ne me dit pas si c'est sécure ou très orthodoxe.

    Ton code fonctionne parfaitement.
    J'avais mis en forme le formulaire et avais intégré un javascript calendrier pour la saisie des dates.
    Pour l'instant, l'ajout de ce code plante le script mais j'y travaille.

    Petite question, cela ne te semble pas nécessaire de mettre entre balise php différente le code et l'ouverture de la base comme j'avais pu le lire ailleurs?

    En tout cas, mon problème tel qu'il était annoncé est donc maintenant réglé, je t'en remercie sincèrement et cloture le post.


    [EDIT]
    Pourrais tu me donner ton avis sur le profil de ma base?
    Cela te parait il correct?
    (tu as l'images plus haut)

  14. #14
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 138
    Par défaut
    Salut,

    Donc désolé si mes réponses te parraissent "méchantes" mais la franchise est quelque chose de très naturel chez moi ^^".

    Petite question, cela ne te semble pas nécessaire de mettre entre balise php différente le code et l'ouverture de la base comme j'avais pu le lire ailleurs?
    Je n'ai jamais lu ca, pourtant j'ai quelque bouquin de PHP, de plus je n'ai jamais vu ca sur le web et mes proffs de PHP ne l'ont jamais évoqué.
    Donc en ce qui me concerne, je trouve ca inutile, car on rajoute du code pour rien. Si tu veux signaler des choses, ca ne sert a rien de faire des "choses codées" dans ton code, les // sont la pour le faire.

    Pourrais tu me donner ton avis sur le profil de ma base?
    Cela te parait il correct?
    Ta base de donnée est l'exemple même de ce qu'il ne faut pas faire. Tu devrais aller voir ce que sont les modèles conceptuel de données, les modèles relationnel de données et les modèles logique de données. Ca t'apprendra à créer correctement ta base de donnée, car une base ne se fait pas au "feeling", il y a de nombreuses règles à suivre.

    J'ai joint ici un fichier d'un dossier que j'ai rendu dans le cadre de mes études, il devrait certainement t'aider dans la façon d'apréhender les bases de données et leur conceptions.

    Cordialement,
    Images attachées Images attachées

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 227
    Par défaut
    Bonjour Evilam,

    Et désolé pour la réponse tardive.
    Je croyais avoir répondu.
    Concernant ton mémoire, je te remercie pour le lien, je le garde sous la main pour la construction de mes projets, pour l'instant, c'est encore technique pour moi.
    Mais je vais approfondir sur la base de ton travail.

    Concernant mon projet actuel...
    Je n'y connais rien en base de données.
    Devant m'y mettre, j'ai choisi de ne faire qu'une table pour ne pas avoir à gérer les relations entre tables car cela me parait être du chinois.

    Pour l'instant cela fonctionne et au vu des difficultés techniques que je rencontre lors de la mise en place de mon projet, je suis frileux à l'idée de me lancer dans les tables relationnelles.
    Je comprends que ma construction puisse ne pas être orthodoxe mais est-ce malgré tout jouable ou dois-je tout changer?
    Je te redonne sa construction ci dessous.
    Tes critiques et conseils sont évidemment bien venu.
    Ta franchise aussi bien sur!



    EDIT:
    J'ai ouvert un post sur ce sujet, je clos donc celui-ci.
    Merci

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

Discussions similaires

  1. [MySQL] Verification doublon avant validation du formulaire
    Par aikiox dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 04/03/2011, 16h57
  2. Verification de doublon avant UPDATE
    Par bmad1 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/10/2007, 16h58
  3. Doublons : supprimer 1er enregistrement
    Par toto10 dans le forum Access
    Réponses: 3
    Dernier message: 27/07/2006, 12h04
  4. [VB6] Allez en avant dernier enregistrement d'une table acce
    Par bb62 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 10/02/2006, 15h42
  5. [MySQL] Vérification de doublons avant insertion
    Par Nicos77 dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 09/12/2005, 13h37

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