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 :

formulaire de recherche et base de données


Sujet :

PHP & Base de données

  1. #1
    Membre averti Avatar de Casey_Garraty
    Femme Profil pro
    En formation développeur web
    Inscrit en
    Janvier 2020
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : En formation développeur web

    Informations forums :
    Inscription : Janvier 2020
    Messages : 22
    Par défaut formulaire de recherche et base de données
    Bonjour a tous je débute en PHP et je dois avouer que j'ai un peu de mal... J'ai un exercice a faire mais je ne sais pas comment m'y prendre, donc si l'un ou l'une d'entre-vous a un peu de temps a m'accorder...

    "Exercice
    Développez un script qui permet, à l’aide d’un formulaire simple, la recherche d’une ville précédemment enregistrée
    dans une table (villes) en base de données (php_intermediaire_1) — vous pouvez vous inspirer du code
    et des données élaborés dans le cours pour vous aider.
    Les recherches effectuées par l’utilisateur seront enregistrées au fur et à mesure dans une table dédiée (search).
    Vous n’enregistrerez que les recherches ayant donné un résultat.
    Vous afficherez ensuite en front-office, uniquement pour cet internaute, la liste des recherches déjà effectuées
    par cet utilisateur, sous forme de liens.
    Exemple : si un utilisateur a recherché « Paris », « Rome » et « Ber » alors nous afficherons uniquement les
    recherches Paris et Rome."

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 701
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 701
    Par défaut
    montrez nous le code que vous avez déjà essayé même s'il ne fonctionne pas.

  3. #3
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    l'énoncé comporte 3 parties ; autant d'abord se concentrer sur la première.
    Il y est dit qu'on peut s'inspirer du code et des données élaborés dans le cours.
    Peut-on connaître ce code ?

  4. #4
    Membre averti Avatar de Casey_Garraty
    Femme Profil pro
    En formation développeur web
    Inscrit en
    Janvier 2020
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : En formation développeur web

    Informations forums :
    Inscription : Janvier 2020
    Messages : 22
    Par défaut
    index :

    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
    17
    18
    19
    20
    21
    22
    <?php require('inc_connection.php'); ?>
    <!DOCTYPE html>
    <html>
        <head>
            <tittle>Acceuil</tittle>
            <link rel="stylesheet" type="text/css"  href="style.css"/>
        </head>
     
        <body>
     
            <div>
     
                <h1>Acceuil</h1>
     
                <p>Bienvenue sur le mini site consacré aux villes. <br>
                Utilisez le menu de navigation pour consulter les pages du site. <br>
                Bonne visite !</p>
     
            </div>
     
            <?php require('inc_menu.php') ?>
            <?php require('inc_footer.php') ?>

    villes :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <?php require('inc_connection.php'); ?>
    <!DOCTYPE html>
    <html>
        <head>
        <?php
            $id= $_GET['id'];
            $result = $mysqli->query('SELECT ville_id, ville_nom, ville_texte FROM villes Where ville_id='.$id);
     
            $row = $result->fetch_array();
     
            $nom= $row['ville_nom'];
            $texte = $row['ville_texte'];
            
            ?>
     
     
            <title><?php echo $nom?></title>
            <link rel="stylesheet" type="text/css"  href="style.css"/>
        </head>
     
        <body>
            <div>
                <h1><?php echo $nom ?></h1>
                <p><?php echo $text ?></p>
            </div>
     
            <?php require('inc_menu.php') ?>
            <?php require('inc_footer.php') ?>



    search :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    <?php
      //traitement de la requête et récupération des variables
      if(isset($_GET['submit_form']))
      {
        $ville_nom = $_GET['ville_nom'];
        //requête
        if(empty($ville_nom))
        {
          $message ='<p class="error">Vous devez saisir le nom d\'une ville.</p>';
        }
        else
        {
          //recherche de la ville avec LIKE
            $result = $mysqli->query('SELECT ville_nom FROM user_search INNER JOIN villes WHERE user_search.ville_id = villes.ville_id LIKE "%'.$ville_nom.'%"');
            $row = $result->fetch_array();
            //$row[0] contient la valeur retournée par le count() de Mysql
              if($row[0] > 0)
              {
                $message = '<p class="error">Un résultat.</p>';
              }
              else
              {
                $message = '<p class="error">Aucun résultat.</p>';
              }
        }
      }
    ?>
    <p>bonjour <?php echo $user_nom; ?>, <br><br> faites votre recherche.</p>
     
    <div>
    <hr/><?php if(isset($message)) echo $message ?><hr/>
     
    </div>
     
    <div>
      <form method="get">
      	<input type="search" name="ville_nom" />
        <input type="submit" name ="submit_form" value="Rechercher" />
        </form>
    </div>

    je ne vous ai pas mis les fichiers en incrémentation qui n'ont pas grand intérêt.




    Nom : Capture d’écran (20).png
Affichages : 3274
Taille : 442,1 Ko

  5. #5
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    Bonsoir,

    pourrais-tu donner la totalité des fichiers afin qu'on puisse exécuter l'application. Si plus simple, tu peux mettre en pièce jointe un zip qui les contient tous.

  6. #6
    Membre averti Avatar de Casey_Garraty
    Femme Profil pro
    En formation développeur web
    Inscrit en
    Janvier 2020
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : En formation développeur web

    Informations forums :
    Inscription : Janvier 2020
    Messages : 22
    Par défaut
    Nouveau dossier compressé.zip


    Merci pour ton aide !

  7. #7
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    J'ai regardé ton code ; pour l'exécuter, j'aurais besoin de la bdd projet_villes_site. Pourrais-tu me donner un export de cette bdd (fichier SQL) ? (pas dispo jusque milieu de l'après-midi)

  8. #8
    Membre averti Avatar de Casey_Garraty
    Femme Profil pro
    En formation développeur web
    Inscrit en
    Janvier 2020
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : En formation développeur web

    Informations forums :
    Inscription : Janvier 2020
    Messages : 22
    Par défaut
    projet_villes_site.sql

    Super ! C'est vraiment gentil de ta part

  9. #9
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    j'ai un peu avancé. Pas simple pour moi, vu que je ne connais pas mysqli (passé directement des fonctions mysql_xxx à PDO). Néanmoins, j'ai fini par réussir à me connecter à ta base.
    Le problème sur lequel je tombe se passe dans search.php : tu accèdes à la table user_search ('SELECT ville_nom FROM user_search INNER JOIN villes WHERE user_search.ville_id = villes.ville_id LIKE "%'.$ville_nom.'%"'). Or, je n'ai pas cette table ; que la table villes. Merci de me la communiquer (export de cette table).

  10. #10
    Membre averti Avatar de Casey_Garraty
    Femme Profil pro
    En formation développeur web
    Inscrit en
    Janvier 2020
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : En formation développeur web

    Informations forums :
    Inscription : Janvier 2020
    Messages : 22
    Par défaut
    user.sql
    search.sql

    Ah effectivement si je ne fournis pas tout ca va être compliqué !

    il y a aussi la table search mais je ne sais pas trop quoi mettre dedans.. j'ai d'autre instructions pour l'exercice qui sont peut être plus clairs que sur mon premier post :


    Conseils et instructions
    1. Commencez par créer votre modèle de données.
    Vous aurez besoin de trois tables :
    –– users (qui référencera nos utilisateurs) ;
    –– villes (qui référencera nos villes) ;
    –– search (qui référencera les villes recherchées par nos utilisateurs).
    Les structures et données des tables users et villes peuvent être récupérées du cours.
    Les recherches (les villes recherchées par nos utilisateurs) seront stockées dans une table search aux champs
    suivants :
    –– search_id (INT) : clef primaire unique auto-incrémentée d’une recherche ;
    –– user_id (INT) : identifiant d’un utilisateur référencé en table users ;
    –– ville_id (INT) : identifiant d’une ville référencée en table villes.


    2. Créez un script de connexion permettant l’authentification d’un utilisateur par mot de passe. (cf. la leçon
    « Les sessions » et l’exemple du script login.php).


    3. Créez un script de recherche permettant :
    –– d’afficher un formulaire de recherche où l’utilisateur entre une ville ;
    –– de retrouver et d’afficher les détails d’une ville (si elle existe) lorsque l’utilisateur clique sur un lien ;
    –– de stocker dans la table search les villes recherchées par l’utilisateur.


    4. Améliorez votre script pour afficher au-dessus ou en dessous de votre formulaire de recherche les recherches
    déjà effectuées par l’utilisateur.
    –– Retrouvez ces recherches à l’aide de la jointure (JOIN) des tables search et villes.
    –– Les urls doivent avoir en paramètre le numéro de la ville (ville_id) afin de pouvoir afficher les détails concernant
    cette ville.

  11. #11
    Membre très actif
    Homme Profil pro
    Déveleoppeur Web/Mobile
    Inscrit en
    Avril 2013
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Déveleoppeur Web/Mobile
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 330
    Par défaut
    Je vois une erreur de syntaxe dans la requête

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    $result = $mysqli->query('SELECT ville_nom FROM user_search INNER JOIN villes WHERE user_search.ville_id = villes.ville_id LIKE "%'.$ville_nom.'%"');

    Le mieux à faire dans ce cas est d'utiliser la fonction mysqli_error pour afficher les erreurs sql

  12. #12
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    En effet, y en a même plusieurs, sans compter que la table user_search n'existe pas...

  13. #13
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 654
    Billets dans le blog
    10
    Par défaut
    La syntaxe de la jointure est erronée, il manque l'opérateur ON pour préciser les critères de jointure.

    Exemple :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ...
    FROM  user_search   as TUS
    INNER JOIN villes   as TVI
       ON TVI.ville_id = TUS.ville_id 
    WHERE...

    L'utilisation d'alias est pratique quand on a plusieurs table, elle évite de devoir nommer chaque table in extenso
    Ci dessus les alias sont TUS pour "user_search" et TVI pour "villes"

  14. #14
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    Bonsoir,

    _Rpass_ et escartefigue ont raison pour leurs remarques mais ayant un peu regardé le besoin (tel que décrit au post #10) ainsi que le code que tu m'as transmis, je doute fort de l'utilité d'une telle requête (même corrigée). Par contre, il manque des pans entiers ; par exemple, le point 2 du post #10 n'est pas du tout traité dans ton code. C'est la raison pour laquelle la variable $user_nom est undefined (cf une erreur montrée au post #4). J'ai eu peu de temps pour y travailler et dans les 3 jours qui viennent, je ne pourrai presque rien faire. Par contre, même si je suis loin d'être un expert du PHP, c'est bien dans mes cordes. Je sais pertinemment ce qu'il faudrait faire. Étant donné ce manque de dispo dans les jours qui viennent, quelle est l'échéance ? Je pourrai au moins voir la réponse sur mon téléphone, si plus chez moi.

  15. #15
    Membre averti Avatar de Casey_Garraty
    Femme Profil pro
    En formation développeur web
    Inscrit en
    Janvier 2020
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : En formation développeur web

    Informations forums :
    Inscription : Janvier 2020
    Messages : 22
    Par défaut
    Vu vos réponses je me suis bien emmêlée les pinceaux…

    c'est pour dans 2 semaines donc rien de bien urgent. Je n'ai pas pu bosser dessus ces derniers jours, j'ai une bronchite qui me met KO, d'où mon manque de réponses ici.

  16. #16
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    Bonsoir,

    je ne t'ai pas oubliée mais je rencontre quelques difficultés d'où le temps que je mets. Je reviendrai vers toi quand ça tournera. Je corrige à peu près tout et j'essaye de mettre des commentaires. Quand ça sera au point, le plus simple sera de te transmettre ma version en .zip
    Bonne nuit

  17. #17
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 654
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Citation Envoyé par Casey_Garraty Voir le message
    Conseils et instructions
    1. Commencez par créer votre modèle de données.
    Vous aurez besoin de trois tables :
    –– users (qui référencera nos utilisateurs) ;
    –– villes (qui référencera nos villes) ;
    –– search (qui référencera les villes recherchées par nos utilisateurs).
    Les structures et données des tables users et villes peuvent être récupérées du cours.
    Les recherches (les villes recherchées par nos utilisateurs) seront stockées dans une table search aux champs
    suivants :
    –– search_id (INT) : clef primaire unique auto-incrémentée d’une recherche ;
    –– user_id (INT) : identifiant d’un utilisateur référencé en table users ;
    –– ville_id (INT) : identifiant d’une ville référencée en table villes.
    Sur ce premier point, la table "search" est une table associative, elle ne devrait donc pas avoir d'identifiant propre. Search_id est une colonne inutile, elle n'apporte rien et ne correspond à rien. La PK d'une table associative, c'est l'ensemble des FK des tables participant à l'association. Ici user_id + ville_id.
    Le professeur qui vous a communiqué cet énoncé n'est donc pas un expert en modélisation

    Le MCD est :
    [UTILISATEUR] 0,n --- (rechercher) --- 0,n [VILLE] (un utilisateur peut rechercher plusieurs villes et une ville peut être recherchée par plusieurs utilisateurs)

    Le MLD qui en découle est (PK soulignées, FK suffixées par #) :
    T_USER(user_id, user_nom, user_prenom, user_ddn, user_pseudo...)
    T_ville(ville_id, ville_code_insee, ville_nom...)
    T_search(user_id#, ville_id#, rech_derniere_date...)


    Sur les autres points, en consultant les différents scripts, je constate que la syntaxe SQL est loin d'être maîtrisée, cf. ma remarque précédente sur la clause de jointure (ON manquant) et aussi l'utilisation de de la restriction WHERE qui est mal codée : WHERE user_search.ville_id = villes.ville_id LIKE "%'.$ville_nom.'%"'.
    Pour ne pas être confronté à toutes les difficultés en même temps, il est préférable de mettre au point les requêtes en dehors du code PHP et de les intégrer dans celui-ci qu'une fois qu'elles sont stabilisées

  18. #18
    Membre Expert
    Avatar de Paprick
    Homme Profil pro
    Professeur des Universités
    Inscrit en
    Juin 2019
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Professeur des Universités
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2019
    Messages : 771
    Par défaut
    Boinjour,
    Citation Envoyé par escartefigue Voir le message
    Sur ce premier point, la table "search" est une table associative, elle ne devrait donc pas avoir d'identifiant propre. Search_id est une colonne inutile, elle n'apporte rien et ne correspond à rien. La PK d'une table associative, c'est l'ensemble des FK des tables participant à l'association. Ici user_id + ville_id.
    En complément, on peut aussi prendre en compte la nécessité de stocker plusieurs recherches pour une même ville par un même user : dans ce cas, la date + l'heure de recherche doit être incluse dans la clé. Au niveau du MCD, on rajouterait alors une classe d'entité fictive "Calendrier" associée également à T_search. Et se pose alors la question de maintenir ville_id# dans la clé primaire puisque qu'un user ne va pas faire plusieurs requêtes au même moment : la solution est alors de rajouter une CIF excluant ville_id# de la clé primaire de T-search.

  19. #19
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    j'ai pas mal avancé sur le sujet.
    Concernant le besoin évoqué au post #10, les points 1, 2 et une partie du 3 sont traités.
    Pour avoir éventuellement des retours, je mets le code ici.

    Comme l'a justement remarqué Escartefigue au post #17, la colonne search_id de la table search ne sert à rien.

    J'ai essayé de mettre des commentaires dans le code :

    nouvelle bdd :
    Code sql : 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
    CREATE TABLE `search` (
      `user_id` varchar(30) NOT NULL,
      `ville_id` varchar(11) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
     
    CREATE TABLE `user` (
      `user_id` tinyint NOT NULL AUTO_INCREMENT,
      `user_login` varchar(20) NOT NULL,
      `user_password` varchar(34) NOT NULL,
      PRIMARY KEY (`user_id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
     
    CREATE TABLE `villes` (
      `ville_ID` int NOT NULL AUTO_INCREMENT,
      `ville_nom` varchar(15) NOT NULL,
      `villes_texte` text NOT NULL,
      PRIMARY KEY (`ville_ID`)
    ) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;

    Dans le code actuel, seule la table villes est utilisée.

    Pas familier du tout à mysqli, j'ai utilisé pdo pour gérer la bdd.

    Utilisation de variables de session pour une plus grande persitence de ces variables.

    je remplace fetch_array par fetch car fetch_array n'existe pas en pdo.

    index.php :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    <?php
    session_start(); //démarrage des sessions
     
    /* la connexion à la bdd est changée (cf explications dans db_mysql.php) */
    $pdo = require('db_mysql.php');
    ?>
    <!DOCTYPE html>
    <html>
        <head>
            <title>Accueil</title> <!-- title, pas tittle-->
            <link rel="stylesheet" type="text/css"  href="style.css"/> <!-- tu m'as pas donné ce fichier -->
        </head>
     
        <body>
     
     
                <h1>Accueil</h1>
     
                <p>Bienvenue sur le mini site consacré aux villes. </p>
                <?php include('user_authent.php');
                if ((isset($_SESSION['user_name'])) && ($_SESSION['user_name']))
                {
                    include('write_Menu.php');
                    write_Menu($pdo);
                }?>
                <?php //require('inc_footer.php'); //ça sert plus ?>

    user_authent.php :
    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
    19
    20
    21
    22
    23
    24
    25
      <?php
      $_SESSION['user_name'] = ""; //les sessions sont déjà démarrées dans index.php
     
         if ((!isset($_POST['user_name'])) ||
          ((isset($_POST['user_name'])) && (empty($_POST['user_name']))) ) { ?>
        <!--on affiche le formulaire :
         - s'il n'a pas déjà été validé : !isset($_POST['user_name'])
         - s'il a été validé mais que aucun nom n'a été saisi : (isset($_POST['user_name'])) && (empty($_POST['user_name']))
         -->
        <p>
          Pour commencer, merci de vous identifier :<p/>
     
          <form method="POST" action="">
            <input type="text" name="user_name" />
            <input type="submit" name ="submit_user_name" value="votre nom" />
        </form>
    <?php }
    else {
        /* action du formulaire ; on utilise une variable de session pour que la variable existe encore quand on sort de
        ce fichier (par exemple, on l'utilise dans search.php) */
        $user_nom = $_SESSION['user_name'] = $_POST['user_name'];
      ?>
        <p>Utilisez le menu de navigation pour consulter les pages du site ou rechercher <a href="search.php?name=<?= $user_nom ?>">ici</a>. <br>
        Bonne visite !</p>
     <?php } ?>

    write_menu.php :
    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
    <?php
    function write_Menu($pdo) {
    $result = $pdo->query('SELECT ville_id, ville_nom FROM villes');
    while ($row = $result->fetch())
    {
        $villes[$row['ville_id']] =$row['ville_nom'];
    }
    ?>
        <ul>
            <li><a href="index.php">Accueil</a></li>
            <?php foreach($villes as $id => $ville) : ?>
                <li><a href="villes.php?id=<?php echo $id ?>"><?php echo $ville ?></a></li>
            <?php endforeach ?>
        </ul>
    <?php } ?>

    villes.php :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    <!DOCTYPE html>
    <html>
        <head>
            <link rel="stylesheet" type="text/css"  href="style.css"/>
        </head>
     
        <body>
        </div>
        <?php
        $id = $_GET['id'];
        $pdo = include 'db_mysql.php';
        $result = $pdo->query('SELECT ville_id, ville_nom, villes_texte FROM villes WHERE ville_id ='.$id );
        $row = $result->fetch();
        $nom = $row['ville_nom'];
        $text = $row['villes_texte'];
     
        include("write_Menu.php");
        write_Menu($pdo);
        ?>
            <div>
                <h1><?php echo $nom ?></h1>
                <p><?php echo $text ?></p>
     
                <?php
                $result = $pdo->query('SELECT ville_id, ville_nom FROM villes');
                while ($row= $result->fetch())
                {
                    $villes[$row['ville_id']] =$row['ville_nom'];
                }
                ?>
     
     
                    <?php
    //                $result->free();
    //                $pdo->close();
                    ?>
        </body>
    </html>

    search.php :
    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
    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
    <?php
      session_start(); //démarrage des sessions
     
      $pdo = require('db_mysql.php');
     
      /*
       * pour l'affichage de message, on utilise une variable de session, persistante, une fois qu'on est sorti de la
       * fonction qui l'a créée
       */
    function setMessage($value){
        $_SESSION['message'] = $value;
    }
     
    function getMessage(){
        return($_SESSION['message']);
    }
    /*
     "clean code" : un fichier includé ne doit rien faire (rien modifier et aucune sortie) ; donc on y implémente une
    fonction, qu'on appelle juste après l'include
     */
      include('write_Menu.php');
      write_Menu($pdo);
     
      $_SESSION['message'] = ""; //on initialise le message à rien
     
      $user_nom = $_GET['name']; //on récupère le nom passé dans l'URL (donc méthode GET)
      //traitement de la requête et récupération des variables
    if (isset($_POST['submit_form']))  {
     
        $ville_nom = $_POST['ville_nom'];
     
        if((empty($ville_nom)) )
        {
            setMessage('Vous devez saisir le nom d\'une ville.');
        }
        else
        {
          //recherche de la ville avec LIKE
            $result = $pdo->query('SELECT villes_texte FROM villes  WHERE ville_nom LIKE "%'.$ville_nom.'%"');
            $row = $result->fetch();
     
            //$row[0] contient la valeur retournée par le count() de Mysql
              if((isset($row[0])) && ($row[0] > 0))
              {
                  echo $row['villes_texte'];
              }
              else
              {
                  setMessage('Aucun résultat.');
              }
        }
     
        echo getMessage();
     
    }
      else {
          if (isset($_SESSION['user_nom'])) {
    ?>
    <p>bonjour <?php echo $_SESSION['user_nom']; ?>, <br><br> faites votre recherche.</p>
    <?php } ?>
     
    <hr/>
     
     
      <form method="POST" action="">
      	<input type="search" name="ville_nom" />
        <input type="submit" name ="submit_form" value="Rechercher" />
      </form>
    <?php } ?>

    db_mysql.php :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <?php
    // @author : rawsrc - 2018 - Pour DVP
    // on vérifie si la fonction de connexion a déjà été définie afin d'éviter de la redéfinir
    //
    // tuto très bien fait : https://www.developpez.net/forums/blogs/244172-dendrite/b5417/pdo-soupe-lit/
    if ( ! function_exists('db_connexion')) {
        function db_connexion() {
            // une fois ouverte, on renvoie toujours la même connexion
            static $pdo;
            // on vérifie si la connexion n'a pas déjà été initialisée
            if ( ! ($pdo instanceof PDO)) {
                // tentative d'ouverture de la connexion MySQL
                try { //les paramètres de connexion sont à adapter
                    $pdo = new PDO('mysql:host=localhost;port=15432;dbname=projet_villes_sql;charset=utf8','root', 'root', [
                        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                        PDO::ATTR_EMULATE_PREPARES   => false
                    ]);
                }
                catch (PDOException $e) {
                    throw new InvalidArgumentException('Erreur connexion à la base de données : '.$e->getMessage());
                    exit;
                }
            }
            // renvoi de la ressource : connexion à la base de données
            return $pdo;
        }
    }
    return db_connexion();

    test.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php //test de la connexion
    echo "connexion<br/>";
    $db = include 'db_mysql.php';
    var_dump($db);

    Si ça t'intéresse, je travaille sur ce qui n'est pas encore fait, selon le post #10.

    Concernant la remarque de paprick (post #18), pas sûr que ça te parle. Même moi, j'ai un peu de mal. Je relierai son bouquin car j'en ai bien besoin...

  20. #20
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 654
    Billets dans le blog
    10
    Par défaut
    La remarque de Paprick explique ceci

    Si la règle de gestion est
    un utilisateur peut rechercher plusieurs villes et une ville peut être recherchée par plusieurs utilisateurs

    Soit on ne s'intéresse qu'à la dernière recherche, en ce cas, le modèle conceptuel basé sur une association binaire est valide :

    [UTILISATEUR] 0,n --- (rechercher) --- 0,n [VILLE]

    Avec ce MCD, la table associative, comme décrit précédemment, possède une PK ayant deux colonnes
    T_search(user_id#, ville_id#, rech_derniere_date...).
    Ce faisant, on ne peut connaitre qu'une seule occurrence de recherche d'une ville pour une même personne (unicité de la PK oblige).
    C'est la raison pour laquelle j'avais nommé l'attribut de cette association "rech_derniere_date" (dernière date de recherche).


    Soit on veut connaître toutes les recherches d'un utilisateur pour une même ville, en ce cas le modèle conceptuel implique l'utilisation d'une association ternaire, il devient :

    [UTILISATEUR] 0,n --- (rechercher) --- 0,n [VILLE]
    .......................................│
    ......[CALENDRIER] 0,n -----┘

    Le type d'entité [calendrier] est dit "fictif", car on n'a pas besoin de créer la table "calendrier" correspondante, ça ne servirait à rien.
    [CALENDRIER] ne sert qu'à faire participer sa PK (une date) à la PK de la table associative "rechercher".

    Avec ce modèle conceptuel, le MLD qui en découle produit une table "rechercher" comme suit
    T_search(user_id#, ville_id#, CA_date#...)
    Ici, l'unicité est vérifiée sur le triolet de FK, on peut donc connaître l'historique

    La question complémentaire de la pertinence de l'identifiant de la ville comme FK contributive de la PK se pose si CA_calendrier a pour identifiant un horodatage fin (un timestamp).
    Si c'est une date, rien ne s'oppose que le même jour, M. Dupont fasse des recherches sur Marseille puis sur Lille, auquel cas, l'identifiant de la ville doit être maintenu dans la pk de la table "rechercher"
    Si c'est un timestamp, c'est impossible, (le timestamp ayant une finesse à la nanoseconde), en ce cas, il faut évacuer l'identifiant de la ville de la PK de la table associative "rechercher" en mettant en oeuvre une contrainte.
    Avec Looping, ce genre de manip se fait très simplement

Discussions similaires

  1. recherche dans base de donnée mysql
    Par alex01pernot dans le forum Bases de données
    Réponses: 13
    Dernier message: 03/05/2020, 16h50
  2. Formulaire de recherche en base de donnèe
    Par MelanieM27 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/11/2015, 21h05
  3. Réponses: 8
    Dernier message: 20/07/2006, 15h08
  4. [Conception] formulaire en php et base de donnée
    Par damien_1985 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 16/06/2006, 22h47
  5. [ JSP ] Formulaire tres dynamique avec base de données.
    Par Dukedoom dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 08/06/2006, 10h19

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