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 :

Eviter doublon lors enregistrement dans mysql


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Par défaut Eviter doublon lors enregistrement dans mysql
    Bonsoir,

    J'aimerai savoir s'il est possible d'interdire un enregistrement dans une base de données avec un retour message " ce nom et prénom sont déjà existants dans la base de données".

    Les contrôles se feraient sur le nom et le prénom (voire date de naissance).

    j'ai cherché sur les forums et souvent constaté qu'on proposait d'utiliser "UNIQUE" mais si je comprends bien je ne pourrai pas enregistrer deux personnes avec le même nom (homonyme).

    je pense que cela se fera en php pour interroger la bdd et avant de soumettre mon formulaire.

    Avez-vous des pistes ou codes sur lesquelles je peux orienter mes recherches.

    Merci d'avance

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour,

    1- Tu peux faire une requête select pour voir s'il existe déjà en base et d'afficher le message d'erreur, sinon tu fais l'insert. Dans ce cas tu devras faire deux requêtes (vérification et insertion)
    2- Tu peux faire en une seule requête et selon le nombre de ligne inséré (1 ou 0), tu sauras si ça a existé déjà en base
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO personne (nom, prenom, date_naissance) 
    SELECT :nom, :prenom, :dateNaissance FROM DUAL
    WHERE NOT EXISTS (SELECT 1 FROM personne   WHERE nom=:nom AND prenom=:prenom and date_naissance=:dateNaissance)

    A+.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par bricoreur Voir le message
    ... d'interdire un enregistrement ... (si) nom et prénom sont déjà existants...
    ...
    ... je ne pourrai pas enregistrer deux personnes avec le même nom (homonyme)...
    C'est contradictoire !
    Tu veux l'interdire.... mais pouvoir quand même le faire !

    On ne peut pas empêcher 2 personnes d'avoir les même nom et prénom.
    On l'a vu aux J.O. avec Frédéric François ! (j'avais aussi un copain au collège qui s'appelait comme ça !)

    La date de naissance peut être un critère, mais à quoi bon ??

    Ce n'est pas pour rien qu'on utilise un champ id auto-incrementé (UNIQUE),
    ou un login * et mot de passe pour identifier un membre/client de façon certaine.

    * souvent, c'est l'email

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    J'ai lu une fois d'un parent qui ne pouvait inscrire ses deux jumeaux au centre de loisirs, car le programme utilisait nom de famille + date de naissance comme clé d'unicité

    En fait, l'homonymie peut être plus poussée. Une petite recherche internet m'a permis de trouver le témoignage d'une brave dame qui a une homonyme parfaite : nom, prénom, date ET lieu de naissance, et qui se déplace avec son acte de naissance et celui de son homonyme pour trouver qu'elle n'est pas l'autre

    Bref, on applique la Loi de Murphy : si ça peut arriver, ça arrivera.

    @jreaux : Cela dit, il peut avoir une raison valide de tester sans interdire. Par exemple, si il ya un identifiant généré de la forme <prénom.nom> et qu'il faut vérifier si il n'existe pas déjà, pour pouvoir créer <prénom.nom2> à la place.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  5. #5
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Il te faut définir une contrainte d'unicité dans ta base.
    Tu procèdes ainsi dans ton PHPmyadmin.

    Créer un index sur 3 champs, puis sélectionner nom,prenom,naissance, puis mettre l'index à "unique" et le nommer "unicite". Et le tour est joué.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Celira Voir le message
    @jreaux : Cela dit, il peut avoir une raison valide de tester sans interdire....
    Citation Envoyé par bricoreur Voir le message
    ...J'aimerai savoir s'il est possible d'interdire...

  7. #7
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Par défaut
    Bonjour,

    effectivement je veux pouvoir informer (alert ?) l'utilisateur qu'un même nom + prénom existent déjà dans la bdd.
    => il est possible qu'il y ait un homonyme + exceptionnellement un prénom commun

    en revanche, les probabilités qu'il y ait nom + prénom + date de naissance identiques dans une même région (et pratiquant le même sport) sont, avec tout le respect que j'ai pour M. Murphy, quasiment nul.
    => donc interdire la saisie

    Enfin, 100% des gagnants ont tenté leur chance au loto, la loi de Murphy est donc vérifée. Murphy trop fort


    Plus sérieusement, je vais continuer à comprendre comment faire, si vous avez un peu plus d'explications ?



    Code html : 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
     
     
    <body>
     
     
    <form action="f_saisie_post.php" method="POST">
     
    <p> NOM : <input type="text" name="nomF" id="nomF"></p>
    <p> PRENOM : <input type="text" name="prenomF" id="prenomF"></p>
    <p> DATE : <input type="date" name="dateN" id="dateN"></p>
     
    <p> <input type="submit" value="envoyer"></p>
     
    </form>
     
    </body>


    php
    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
     
    <?php
     
    try
    {
    	$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
    }
    catch(Exception $e)
    {
            die('Erreur : '.$e->getMessage());
    }
     
    ?>
     
     
     
    <?php
     
    $nom = $_POST['nomF'];
    $prenom = $_POST['prenomF'];
    $date = $_POST['dateN'];
     
    $req = $bdd->prepare('INSERT INTO t_doublon(nomF, prenomF, dateN) VALUES (:nomF, :prenomF, :dateN)');
     
    $req->execute(array(
    'nomF' => $nom,
    'prenomF' => $prenom, 
    'dateN' => $date
    ));	
     
     
    ?>

    j'y retourne

  8. #8
    Invité
    Invité(e)
    Par défaut
    andry.aime t'a déjà montré une façon de faire.

    Peux-tu répondre à cette question :
    • une fois la personne inscrite, il se passe quoi ?

    Plus concrètement :
    • il a un compte perso ?
    • il peut se connecter à un espace privé via un login et mot de passe ?
    • ...

    ou RIEN de tout ça ? (il est juste enregistré en BDD, pour "mémoire")

  9. #9
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Citation Envoyé par bricoreur Voir le message
    les probabilités qu'il y ait nom + prénom + date de naissance identiques dans une même région (et pratiquant le même sport) sont, avec tout le respect que j'ai pour M. Murphy, quasiment nul.
    => donc interdire la saisie
    C'est sûr que si on parle des amateurs de course à cloche-pied nocturne dans le Cantal, c'est pas la même chose que si on parle du registre de la Banque de France.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  10. #10
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Par défaut
    Ben justement, je suis en charge des potentiels de course à cloche-pied nocturne dans le Cantal, la Creuse, la Lozère, l'Ariège (est-ce mauvais signe ).... à terme mes collaborateurs auront un compte utilisateur pour enregistrer ces potentiels dans la base de données.

    je n'aimerai pas que ces derniers enregistrent plusieurs fois le même athlète sachant que le suivi peut se faire sur plusieurs années, ou qu'il peut y avoir des homonymes (même nom), des jumeaux (nom + même date de naissance).

    Donc j'envisageai 3 niveaux de contrôle :

    Si même "nom + prénom + date de naissance" déjà présents dans la base de données => interdire l'enregistrement + message d'alerte.

    j'abandonne l'idée de prévenir en instantanée car il me faudra de toute façon questionnée la base de donnée. Désolé mais j'avais réussi à le faire en VBA / ACCESS mais sur une base interne forcément.

    je vais tenter de mettre en oeuvre le code proposait mais je débute en php / SQL voilà

    merci pour vos retours respectifs

  11. #11
    Invité
    Invité(e)
    Par défaut
    Ma question (à laquelle tu n'as pas répondue) n'était pas anodine.

    OUI, il faut vérifier en BD si les (nom-prénom-date de naissance) ne sont pas DEJA présents.

    Auquel cas :
    1- c'est inutile de rentrer toutes les "autres données" (puisque déjà enregistrées)
    2- Il faut proposer :
    • soit de prendre celui qui est enregistré (checkbox : "sélectionner cette personne", en affichant ses caractéristiques "particulières")
    • soit d'en enregistrer un nouveau (remplir tout le formulaire)

    Mais il faut au moins un critère UNIQUE (numéro de licence ? autre ?)

    Bref, La question est :
    • Comment identifier de manière formelle et unique une personne déjà enregistrée ?


    Tu as bien compris que nom-prénom-date de naissance ne suffisent pas...

    ...prévenir en instantanée...
    Généralement, "en direct", on fait ça via AJAX : on interroge la bbd, et on met un avertissement.
    Notamment pour un login : "ce login existe déjà : choisissez-en un autre"


    Mais tu comprends qu'interdire d'inscrire une personne est très frustrant ?

    J'ai l'exemple d'un site où les membres peuvent s'inscrire eux-même sur le site.
    Mais l'Administrateur peut AUSSI les inscrire via le Panel Admin.
    J'ai fait en sorte que, dans le Panel Admin, l’administrateur puisse FUSIONNER les comptes en cas de "doublon".
    Dernière modification par Invité ; 22/03/2018 à 20h17.

  12. #12
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    andry.aime t'a déjà montré une façon de faire.

    Peux-tu répondre à cette question :
    • une fois la personne inscrite, il se passe quoi ?

    Plus concrètement :
    • il a un compte perso ?
    • il peut se connecter à un espace privé via un login et mot de passe ?
    • ...

    ou RIEN de tout ça ? (il est juste enregistré en BDD, pour "mémoire")
    En réponse à la question : il se passe quoi ?

    => le but de cette BDD est d'enregistrer des informations diverses sur des athlètes pour en faire des fiches de présentation, des listings suite à un formulaire de recherches multicritères, des convocations ou des mails

    Donc à mon niveau, même si cela ne semble pas suffire, les probabilités d'avoir 2 athlètes pratiquant le même sport, avec le même nom, le même prénom, et la même date de naissance sont 99.999% nulles.
    Et si toutefois cela devait arriver, j'aurai un doublon dans ma base qui pourra être rapidement supprimé.

    j'ai réussi après étude du code fourni par andry.aime à empêcher l'enregistrement d'un athlète qui était un doublon.

    Sur vos conseils, il me faut maintenant réussir à renvoyer "un message d'alerte" en direct après le renseignement de ces 3 champs avec AJAX si doublon afin que mes collaborateurs ne remplissent pas tous les champs. Mais je n'y connais rien. Avez-vous des pistes de travail ?

    En revanche, je mets modestement mon code si cela peut servir à quelqu'un de novice en attendant de faire mieux.

    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
     
     
    <?php
     
    $nom = $_POST['nomF'];
    $prenom = $_POST['prenomF'];
    $date = $_POST['dateN'];
    $ville = $_POST['villeN'];
     
    $req = $bdd->prepare('INSERT INTO t_doublon(nomF, prenomF, dateN, villeN) SELECT :nomF, :prenomF, :dateN, :villeN FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM t_doublon WHERE nomF=:nomF AND prenomF=:prenomF and dateN=:dateN)');
     
    $req->execute(array(
    'nomF' => $nom,
    'prenomF' => $prenom, 
    'dateN' => $date,
    'villeN' => $ville
    ));	
     
    ?>

  13. #13
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour,

    Ajax, c'est du javascript donc l'utilisateur peut bidouiller le code, il te faut alors un double check. Avec ton code, pour savoir si l'insertion est faite ou non, tu dois refaire une vérification:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $req = $bdd->prepare('INSERT INTO t_doublon(nomF, prenomF, dateN, villeN) SELECT :nomF, :prenomF, :dateN, :villeN FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM t_doublon WHERE nomF=:nomF AND prenomF=:prenomF and dateN=:dateN)');
     
    $req->execute(array(
    'nomF' => $nom,
    'prenomF' => $prenom, 
    'dateN' => $date,
    'villeN' => $ville
    ));	
    if($req->rowCount() == 0){
    echo "Doublon --> pas d'insertion";
    }else {
    echo "Inscription effectué";
    }
    Pour ce qui est d'AJAX, il y a des tutoriels ici : https://ajax.developpez.com/cours/

    A+.

  14. #14
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Par défaut
    Merci pour votre retour,

    je vais m'y plonger tout de suite et tenter de sortir mon code....

  15. #15
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Par défaut
    Re,

    pas facile mais j'avance.....

    j'ai commencé à lire plusieurs tutos pour comprendre le principe général d'AJAX et je pense avoir assez bien compris son utilité.

    je travaille sur le tuto de Matthieu Deloison :

    j'ai créé :

    - mon fichier HTML
    - mon fichier php
    - ma table renseignée

    j'ai réussi à me connecter avec mysqli-connect (d'hbitude avec new PDO)

    1; j'avais un message d'erreur avec le fichier HTML qui concernait la ligne eval(xhr_objetct.responseText); qui m'affichait un message : uncaught .....unexpected...

    je ne sais pas trop ce que j'ai fait, mais le message a disparu


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    xhr_object.onreadystatechange = function()
                {
                    if(xhr_object.readyState == 4)
                    eval(xhr_object.responseText);       // => XMLHttpRequest.responseText
     
     
                xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                var data = "family="+escape(l1.options[index].value)+"&form="+f.name+"&select=list2";
                xhr_object.send(data);
              }
            }

    2. Par contre, lorsque je teste le fichier php, il m'affiche les erreurs suivantes. Je comprends peut être que $_POST['family'] et form et select ne sont pas définis mais je ne sais pas quoi faire...je suis bloqué

    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
     
     
    ! ) Notice: Undefined index: family in C:\wamp64\www\test\AJAX 2\30-ajax.php on line 28
    Call Stack
    #	Time	Memory	Function	Location 
    1	0.0014	242512	{main}( )	...\30-ajax.php:0
     
    s_sqlSelect : SELECT `espece` FROM `animals` WHERE `famille` = '' ORDER BY `espece`var o = null;
     
     
    ( ! ) Notice: Undefined index: form in C:\wamp64\www\test\AJAX 2\30-ajax.php on line 37
    Call Stack
    #	Time	Memory	Function	Location
    1	0.0014	242512	{main}( )	...\30-ajax.php:0
     
    ( ! ) Notice: Undefined index: select in C:\wamp64\www\test\AJAX 2\30-ajax.php on line 37
    Call Stack
    #	Time	Memory	Function	Location
    1	0.0014	242512	{main}( )	...\30-ajax.php:0
    var s = document.forms[""].elements[""];s.options.length = 0;

    voici le code proposait : (en revanche la connexion est bien établie avec mysql)

    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
     
     
    $s_sqlSelect  = "SELECT `espece` FROM `animals` WHERE `famille` = '".$_POST["family"]."'";
    $s_sqlSelect .= " ORDER BY `espece`";
    $oResult = mysqli_query($oConnect,$s_sqlSelect);
     
     
    echo "s_sqlSelect : ".$s_sqlSelect;
     
     
    echo 'var o = null;';
    echo 'var s = document.forms["'.$_POST["form"].'"].elements["'.$_POST["select"].'"];';
    echo 's.options.length = 0;';
     
    // si la requête a réussi ?
    if ($oResult)
      while( $oSqlObject = mysqli_fetch_object($oResult) )
        echo 's.options[s.options.length] = new Option("'.$oSqlObject->espece.'");';
     
    // Déconnexion. 
    $bClose = mysqli_close($oConnect);
    je vais continuer à lire les tutos en attendant

    merci

  16. #16
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    J'ai une autre piste :

    1- tu peux proposer une liste déroulante des athlètes présents en BDD.

    2- si l'athlète n'y est pas, alors seulement proposer le formulaire complet.

  17. #17
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour,

    Ton code JS est vraiment n'importe quoi, ça doit ressembler à quelque chose comme ça:
    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    xhr_object.onreadystatechange = function(){
    	if(xhr_object.readyState == 4 && xhr.status == 200){
    		eval(xhr_object.responseText);
    	}
    }
    xhr_object.open("POST","lefichier.php",true);
    var data = "family="+encodeURI(l1.options[index].value)+"&form="+f.name+"&select=list2"; // utilise encodeURI à la place de escape
    xhr_object.send(data);
    Et puis on ne sait pas d'où viennent ces variables. Il faut le code html généré de la page, le code JS complet de la fonction AJAX et le code de la page PHP appelé.

    A+.

  18. #18
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Par défaut
    Bonsoir Andry.aime,

    Je tente depuis de très nombreuses heures de comprendre l'AJAX mais pas facile pour un novice...même si je commence à un peu mieux comprendre..j'ai repris le tuto "Web 2.0, allez plus loin avec AJAX et XMLHttpRequest"

    avec lequel j'ai adapté un peu mon code de connexion.

    Je pensais avoir bien suivi les instructions (création BDD, connexion, les fichiers....) mais je bloque.

    Lorsque je veux sélectionner un auteur, il m'apparaît dans ma liste "$row["nom"]...vous me direz avant il ne m'apparaissait rien du tout ??

    j'ai donc repris les code de SIDDH (l'auteur)

    auteurs.php => HTML ???
    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
    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
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    
    <html>
    	<head>
    		<title>Tutoriel Ajax (XHTML + JavaScript + XML)</title>
    		<script type='text/javascript'>
     
    			function getXhr()
    			{
                            var xhr = null; 
    
    				if(window.XMLHttpRequest)        // Firefox et autres
    				   xhr = new XMLHttpRequest(); 
    
    				else if(window.ActiveXObject)   // Internet Explorer 
    				{ 
    				   try 
    				   	{
    			                xhr = new ActiveXObject("Msxml2.XMLHTTP");
    			        	} 
    			        catch (e) 
    			            {
    			                xhr = new ActiveXObject("Microsoft.XMLHTTP");
    			            }
    				}
    				
    				else                           // XMLHttpRequest non supporté par le navigateur 
    				{ 
    				   alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
    				   xhr = false; 
    				} 
                   	
                   	return xhr;
    			}
     
    			
    			// Méthode qui sera appelée sur le click du bouton
    			
    			function go()
    			{
    					var xhr = getXhr();
    
    
    					// On défini ce qu'on va faire quand on aura la réponse
    					xhr.onreadystatechange = function()
    
    					{
    						// On ne fait quelque chose que si on a tout reçu et que le serveur est ok
    						if(xhr.readyState == 4 && xhr.status == 200)
    
    						{
    							leselect = xhr.responseText;
    
    							// On se sert de innerHTML pour rajouter les options a la liste
    							document.getElementById('livre').innerHTML = leselect;
    						}
    					}
    	 
    
    					// Ici on va voir comment faire du post
    					xhr.open("POST","ajaxLivre.php",true);
    
    
    					// ne pas oublier ça pour le post
    					xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    
    
    					// ne pas oublier de poster les arguments
    					// ici, l'id de l'auteur
    					sel = document.getElementById('auteur');
    
    					idauteur = sel.options[sel.selectedIndex].value;
    
    					xhr.send("idAuteur="+idauteur);
    			}
    
    		</script>
    
    	</head>
    
    
    
    
    
    	<body>
    		<form>
    
    			<fieldset style="width: 500px">
    
    				<legend>Liste liées</legend>
    				<label>Auteurs</label>
    
    				<select name='auteur' id='auteur' onchange='go()'>
    
    					<option value='-1'>Aucun</option>                    // je ne comprends pas les balises <?    ?>
    
    						<?
    							try
    							{
    								$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
    							}
    							catch(Exception $e)
    							{
    							        die('Erreur : '.$e->getMessage());
    							}
    
    
    
    
    
    							$res = mysql_query("SELECT * FROM auteur ORDER BY nom");
    							while($row = mysql_fetch_assoc($res))
    							{
    								echo " <option value='".$row["id"]."'>".$row["nom"]." </option>";
    							}
    							
    						?>
    
    				</select>
    
    				<label>Livres</label>
    				<div id='livre' style='display:inline'>
    
    				<select name='livre'>
    					<option value='-1'>Choisir un auteur</option>
    				</select>
    
    				</div>
    
    			</fieldset>
    
    		</form>
    	</body>
    
    </html>

    ajaxLivre.php
    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
     
    <?php
     
    	echo "<select name='livre'>";
     
    	if(isset($_POST["idAuteur"]))
    	{
    			try
    			{
    				$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
    			}
    			catch(Exception $e)
    			{
    			        die('Erreur : '.$e->getMessage());
    			}
     
     
     
    		$res = mysql_query("SELECT id,titre FROM livre WHERE idAuteur=".$_POST["idAuteur"]." ORDER BY titre");
     
    		while($row = mysql_fetch_assoc($res))
    		{
    			echo "<option value='".$row["id"]."'>".$row["titre"]."</option>";
    		}
    	}
     
     
    	echo "</select>";
     
     
    ?>

    je vous laisse le code SQL toutefois :
    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
     
     
    CREATE TABLE `auteur` (
      `id` tinyint(4) NOT NULL auto_increment,
      `nom` varchar(50) NOT NULL,
      PRIMARY KEY  (`id`)
    );
     
    insert into `auteur` values 
    (1,'Clive Cussler'),
    (2,'Harlan Coben'),
    (3,'Franck Herbert'),
    (4,'Pierre Bordages');
     
    CREATE TABLE `livre` (
      `id` tinyint(4) NOT NULL auto_increment,
      `titre` varchar(50) NOT NULL,
      `idAuteur` tinyint(4) default NULL,
      PRIMARY KEY  (`id`)
    ) ;
     
    insert into `livre` values 
    (1,'Odyssee',1),
    (2,'Sahara',1),
    (3,'Dragon',1),
    (4,'Une chance de trop',2),
    (5,'Ne le dis a personne',2),
    (6,'Disparu à jamais',2),
    (7,'Dune',3),
    (8,'La barriere de santaroga',3),
    (9,'Les guerriers du silence',4),
    (10,'La citadelle hyponeros',4),
    (11,'Terra mater',4);
    je vais continuer à chercher mais je ne vous cache pas qu'un coup de main serait très appréciable

    merci

  19. #19
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour,
    Code php : 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
    try
    							{
    								$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
    							}
    							catch(Exception $e)
    							{
    							        die('Erreur : '.$e->getMessage());
    							}
     
     
     
     
     
    							$res = mysql_query("SELECT * FROM auteur ORDER BY nom");
    							while($row = mysql_fetch_assoc($res))
    							{
    								echo " <option value='".$row["id"]."'>".$row["nom"]." </option>";
    							}
    Tu dois utiliser PDO, là tu as des fonctions mysql_ qui n'est même pas connecté à ta base, et encore plus qui est obsolète depuis la version 5.5 et supprimé à partir de la version 7.0.

    A+.

  20. #20
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1- Apprends d'abord à maîtriser PHP et les requêtes PDO, avec des exercices simples.

    2- Tu pourras t'attaquer à JavaScript/Ajax APRES.

    3- et intéresse-toi à cette piste :
    Citation Envoyé par jreaux62 Voir le message
    J'ai une autre piste :
    1- tu peux proposer d'abord une liste déroulante des athlètes présents en BDD.
    2- si l'athlète n'y est pas, alors seulement proposer le formulaire complet (via un bouton "Ajouter un athlète", par exemple, qui ouvre/affiche les champs à remplir.
    Dernière modification par Invité ; 26/03/2018 à 12h04.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Formulaire ajout enregistrement dans MySQL
    Par dahu17 dans le forum Langage
    Réponses: 2
    Dernier message: 05/02/2008, 13h07
  2. Enregistrer dans Mysql multiples cases a cocher
    Par didiweby dans le forum Langage
    Réponses: 2
    Dernier message: 05/01/2008, 17h42
  3. Détection d'enregistrement dans MySQL
    Par fabou3377 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 22/11/2006, 18h33
  4. Réponses: 10
    Dernier message: 21/06/2006, 14h50
  5. [Efficacite/Redondance] Millions d'enregistrement dans MySQL
    Par nico33307 dans le forum Requêtes
    Réponses: 4
    Dernier message: 25/07/2005, 21h21

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