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

Langage PHP Discussion :

Faire une recherche via un formulaire


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2022
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2022
    Messages : 11
    Points : 9
    Points
    9
    Par défaut Faire une recherche via un formulaire
    Bonjour,
    J'ai un devoir concernant une recherche de ville via un formulaire et cela fait 15 jours que j'ai le même soucis . J'ai cherché sur le net mais les réponses que je trouve sont dans un langage que je ne connais pas ( et dans me devoir je ne dois utiliser que PHP / MySQL).

    Voici l'énoncé de ce devoir :

    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.

    Après avoir créé la table villes ('ville_id, ville_nom, ville_texte) je créé un formulaire sur la page index afin de rechercher une ville en question. Le formulaire fonctionne et renvoi sur la page "ville.php" une fois que l'on remplit et clique sur envoyer. Et c'est sur la page ville que trois problèmes surviennent constamment.

    Le premier est un message d'erreur de type "undefined index" à la ligne 8. Pourtant j'ai l'impression que ma variable est récupérée correctement (et aussi récupérée dés le début du script) : Les deuxièmes et troisièmes problèmes m'affiche respectivement une : "Fatal error: uncaught error" et "call to member function fetch_array " dont voici la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $row = $result -> fetch_array();
    Je ne comprends pas ce qui va pas (ma variable me semble correcte ainsi que ma table) et après avoir retourner le problème dans pas mal de sens je sèche.

    Je joins le pdf du code "ville.php" par pdf.


    Si quelqu'un pouvait me dire ou sont les problèmes car là je comprend pas, ma table est entrée correctement et la fatal error concerne un "fetch array" qui me parait correctement indenter.

    Merci à tous ceux qui liront ce message.
    Images attachées Images attachées

  2. #2
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 438
    Points : 4 936
    Points
    4 936
    Par défaut
    Bonjour,

    Tout d'abord ce n'est pas possible de copier/coller votre code depuis un PDF, donc personne n'aura envie de vous aider parce que vous lui compliquez la tâche.

    Mettez votre code dans une balise [code][/code] ou utiliser directement le diez # du menu au dessus.

  3. #3
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 791
    Points : 3 058
    Points
    3 058
    Par défaut
    Bonjour

    Tu mentionnes que tu as fait un formulaire : tu peux avoir deux types d'actions; soit GET soit POST. Lequel as-tu utilisé ?
    C'est important parce que tu tentes d'accéder à $_GET['id'] qui n'existe donc pas si ton formulaire utilise POST. (perso, je préfère POST et donc $_POST['id']). OUPS NON, je vois ton code php, tu n'as pas créé un formulaire mais juste une liste avec des <li>...</li>, c'est donc bien $_GET['id'] qu'il te faut utiliser. Quelle est l'URL qui est exécutée quand tu accèdes à ta page ?

    Je survole ton PDF (quelle drôle d'idée d'envoyer ton code en PDF ;-)) et je m'étonne de voir ton code php après la balise <head>. Ce n'est pas un problème technique juste ... pourquoi l'avoir mis là ? Tu pourrais déplacer tes lignes 4 à 30 (le bloc php) au tout début du fichier pour scinder d'abord le code php puis le code html. Cela ne change rien mais c'est juste plus propre.

    Pour ton souci de mysql; je n'ai plus codé ce type de lignes depuis des lustres aussi je passe la main sur cette question-là. J'aurais juste tendance à m'assurer que $mysqli est bien instancié c'est-à-dire, après la ligne 12 de ton pdf; de vérifier que mysqli n'est pas null et est bien un objet. En effet, peut-être la connexion va planter parce que ... le mot de passe est incorrect, le nom de la db est mauvais, ... et là, tu présumes donc que tout ira bien. Tu utilises directement la variable comme si, forcément, la connexion n'a pas pu planter.

    Note : revenons à ta ligne $_GET['id'] ; je suppose donc que tu t'attends à recevoir un chiffre. Que se passe-t-il si je t'envoie "COUCOU LE MONDE" comme id ? Tu devrais forcer la conversion vers un chiffre; il existe plein de fonctions pour ça, p.e. intval() ou https://www.w3schools.com/php/filter_validate_int.asp. Ne présume jamais rien ! Tout qui peut planter ... plantera un jour.

    Ne présume jamais rien : programme en étant défensif; cela t'évitera des bugs silencieux (que tu ne verras pas tout de suite puis tu passeras des heures à essayer de comprendre mais souvent, trop tard, c'est déjà en production et tu auras un incendie et donc du stress). Ne présume jamais rien (yep, je me répète :-)). Je me permets de le souligner puisque tu es étudiant et que c'est toujours mieux d'apprendre les bonnes bases dès le début.

    Ligne 23, tu récupères un array grâce à fetch_array()... ne présume jamais rien ;-) Es-tu sûr que tu as récupéré quelque chose ? Si ton id était 99999999, est-ce que tu SELECT a bien retourné quelque chose ? Ton retour pourrait être "null" ou "false" non ? Du coup; accéder à $row['ville_nom'] ne peut pas réussir; $row étant peut-être égal à false (voir la doc de fetch_array() et les valeurs de retour).

    Et si un petit malin avait créé une ville nommé <script>alert("Bonjour à tous!");</script>, d'après toi, qu'est-ce qui va se passer si on exécute ton script?

    Ligne 54 : tu accèdes à une variable nommée $villes; idéalement tu devrais la déclarer avant ton while; ok ce n'est pas une obligation mais en déclarant tes variables avant de les utiliser ton code est plus propre, tu peux dire que ta variable est de tel type (un array ici) et tu réduis alors le risque d'une erreur silencieuse. C'est le concept connu sous le terme "clean code" (voir la très bonne source https://github.com/jupeter/clean-code-php si cela t'intéresse).

  4. #4
    Membre averti Avatar de Philcmoi
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 666
    Points : 412
    Points
    412
    Par défaut
    Assurres toi que le $_GET['id"] existe.
    Par isset($_GET["id"]).
    Montres nous ton formulaire.
    La méthode est elle post ou get.
    A plus

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2022
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2022
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Désolé pour les complications, je n'avais pas saisi que je compliquais la tache avec mon pdf. Je pose les code du formulaire, de a liste villes ainsi que la connexion en dessous :


    index.php (ou se trouve le formulaire)

    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
    <?php require ('inc_connexion.php');?>
     
    <!doctype html>
      <html lang="fr">
        <head>
            <meta charset="utf-8">
            <title>DEVOIR PHP 3</title>
            <link rel="stylesheet" type="text/css" href="">
            </head>
        <body>
     
        <center>
          <div>
            <h1>Formulaire de recherche</h1>
          </div>      
          <form action='ville.php' method="GET">                  <!-- DEFINIR ACTION -->
        <div>
            <label><b>Ville recherchée :</b></label><br>
            <input type="text" id="recherche" name="ville" required>
        </div>
        <input type="submit" id='submit' value='valider' >
    </form>
        </center>
        </body>
      </html>
     
      <?php
          // 1 CONNEXION : etablie vie php inc_connexion
     
     
          // 2 REQUETE
     
          $result = $mysqli -> query ('SELECT ville_id, ville_nom FROM villes');
     
          // 3 a TRANSFORMATION EN ARRAY AVEC fetch_array
     
          while ($row= $result->fetch_array())
     
          {
          // 3 b CREATION D'UN NOUVEL ARRAY POUR UN AFFICHAGE HORS DE LA BOUCLE
            $villes[$row['ville_id']] = $row['ville_nom'];
          }
     
          // 4 AFFICHAGE
     
     
          // verification de la soumission du formulaire
          if (isset($_GET['submit']))
     
          {
     
            $ville = $_GET['ville'];
     
            // Resultat affiché
     
            echo '<h3> Villes recherchée via le formulaire</h3>';
            echo $villes;
            exit;
          }
     
     
     
     
     
          ?>
          <?php require ('inc_connexion.php');?>
    ville.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
    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
    <!DOCTYPE html>
    <html>
        <head>
            <?php 
     
          // 1 . RECUPERATION DE LA VARIABLE EXTERNE
     
          $id = $_GET['id']; 
     
          // 2 . CONNEXION A LA BASE
     
          $mysqli = new mysqli ('localhost', 'root', '', 'devoir3');
     
          // 3 . REQUETE
     
          // CONCATENATION DE LA REQUETE AVEC LA VARIABLE ID
     
          $result = $mysqli->query ('SELECT ville_id, ville_nom, ville_texte FROM villes WHERE ville_id = ' . $id );
     
     
          // 4 . CREATION D'UN NOUVEL ARRAY
     
          $row = $result -> fetch_array();
     
          // 5. AFFICHAGE
     
          $nom = $row['ville_nom'];
          $texte = $row ['ville_texte'];
     
          ?>
     
          <title><?php echo $nom ?></title>
          <link rel="stylesheet" type="text/css" href=""/>
    </head>
     
        <body>
        <div>
     
        <h1> <?php echo $nom ?></h1>  
        <p> <?php echo $texte ?></p>  
     
        <?php
     
        // 2. REQUETE
     
        $result = $mysqli->query ('SELECT ville_id, ville_nom FROM villes');
     
        // 3. a. TRANSFORMATION EN ARRAY AVEC fetch_array
     
        while ($row = $result-> fetch_array())
     
        {
            // 3. b. CREATION DU NOUVEL ARRAY POUR AFFICHAGE HORS DE LA BOUCLES
            $villes[$row['ville_id']] = $row['ville_nom'];
        }
         // 4 AFFICHAGE
        ?>
         </div>
     
         <ul>
            <li><a href="index.php">Accueil</a></li>
     
            <?php foreach ($villes as $id => $ville) : ?>
                <li><a href="ville.php?id=<?php echo $id ?>"><?php echo $ville ?></a></li>
     
                <?php endforeach ?>
            </ul>
            <?php 
            /* LIBERATION DES RESULTATS */
     
            $result -> free() ;
     
            /* FERMETURE DE LA CONNEXION */
            $mysqli -> close ();
                ?>
                </body>
    </html>
    inc_connexion.php (elle fonctionne très bien mais je la met quand même) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /* CONNEXION A LA BASE DE DONNEES */
     
    $mysqli = new mysqli ('localhost', 'root', '', 'devoir3');

  6. #6
    Membre averti Avatar de Philcmoi
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 666
    Points : 412
    Points
    412
    Par défaut
    Ton code:
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <div>
            <h1>Formulaire de recherche</h1>
          </div>      
          <form action='ville.php' method="GET">                  <!-- DEFINIR ACTION -->
        <div>
            <label><b>Ville recherchée :</b></label><br>
            <input type="text" id="recherche" name="ville" required>
        </div>
        <input type="submit" id='submit' value='valider' >
    </form>

    ce qu'il faut
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <form action='ville.php' method="get"> // method en minuscule et non en majuscule.  "get" et non "GET"

    De plus, d'ou vient ton $_GET['id'];, c'est plutôt $_GET['ville'];.
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
     <input type="text" id="recherche" name="ville" required>

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2022
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2022
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Merci pour le "GET", j'était tellement concentré ailleurs que je l'avais pas remarqué. Maintenant je passe au fetch array.

    Je vous retiens au courant et merci encore pour votre aide

Discussions similaires

  1. [11g] Problème de recherche via une requete
    Par android59 dans le forum SQL
    Réponses: 6
    Dernier message: 11/06/2020, 10h38
  2. Réponses: 2
    Dernier message: 11/12/2014, 10h11
  3. [AC-2007] Problème avec recherche via liste déroulante
    Par akroma59 dans le forum Access
    Réponses: 2
    Dernier message: 25/05/2012, 17h00
  4. Recherche via un formulaire
    Par Smox78 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 17/07/2008, 13h42
  5. Recherche dans une table via un formulaire
    Par Z[ee]k dans le forum Access
    Réponses: 3
    Dernier message: 05/06/2006, 11h14

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