PHP + MySQL (via easyphp)

Bonjour,

j'ai une page de recherche de "personnes" au format html
(objectif: rechercher les personnes par nom, prenom, ou matricule dans la base de données)


Ci-dessous mon fichier recherche.html


<html>
<head>
<title>Recherche de personne dans la base chantier Sanofi-Aventis PROJET DI 50 </title>
</head>

<body>
<h1>Recherche de personne dans la base chantier Sanofi-Aventis PROJET DI 50</h1>

<form action="resultats.php" method="post">
Choisissez un type de recherche :<br />
<select name="type_recherche">
<option value="nom">Par nom</option>
<option value="prenom">Par prenom</option>
<option value="matricule">Par matricule</option>
</select>
<br />
Entrez le terme recherché; :<br />
<input name="terme_recherche" type="text" size="40" />
<br />
<input type="submit" value="Rechercher" />
</form>

</body>
</html>

***************************************************
Mon fichier php resultat.php

<html>
<head>
<title>Résulat de la recherche de personnes dans la base du chantier Sanofi Aventis</title>
</head>
<body>
<h1>Résultat de la recherhe de personnes dans la base</h1>
<?php
// create short variable names
$type_recherche = $_POST['type_recherche'];
$terme_recherche = trim($_POST['terme_recherche']);

if (!$type_recherche || !$terme_recherche) {
echo 'vous navez pas saisi les détails de la recherche';
exit;
}

if (!get_magic_quotes_gpc()){
$type_recherche = addslashes($type_recherche);
$terme_recherche = addslashes($terme_recherche);
}

@ $db = new mysqli('localhost', '', 'projet ing', 'personnes');

if (mysqli_connect_errno()) {
echo 'Error: Impossible de se connecter à la base de données.';
exit;
}

$requete = "select * from personnes where ".$type_recherche." like '%".$terme_recherche."%'";
$resultat = $db->query($requete);

$nb_lig_resultat = $resultat->num_rows;

echo "<p>Nombre de personnes trouvées: ".$nb_lig_resultat."</p>";

for ($i=0; $i < $nb_lig_resultat; $i++) { // à partir de là je maitrise pas trop j'ai des doutes
$ligne = $resultat->fetch_assoc();
echo "<p><strong>".($i+1).". prenom : ";
echo htmlspecialchars(stripslashes($ligne['prenom']));
echo "</strong><br />nom : ";
echo stripslashes($ligne['nom']);
echo "<br />prenom : ";
echo stripslashes($ligne['prenom']);
echo "<br />matricule : ";
echo stripslashes($ligne['matricule']);
echo "</p>";
}

$resultat->free();
$db->close();

?>
</body>
</html>

********************************************************

mon msg d'erreur:

Résultat de la recherhe de personnes dans la base
query($requete); $nb_lig_resultat = $resultat->num_rows; echo "

Nombre de personnes trouvées: ".$nb_lig_resultat."
"; for ($i=0; $i < $nb_lig_resultat; $i++) { $ligne = $resultat->fetch_assoc(); echo "

".($i+1).". prenom : "; echo htmlspecialchars(stripslashes($ligne['prenom'])); echo "
nom : "; echo stripslashes($ligne['nom']); echo "
prenom : "; echo stripslashes($ligne['prenom']); echo "
matricule : "; echo stripslashes($ligne['matricule']); echo "
"; } $resultat->free(); $db->close(); ?>
Configuration: Windows XP
Firefox 3.0.10

16 réponses

  1. Tu avais une erreur et un problème de détection d'erreur. Tu as commencé par corriger le problème de détection d'erreur, c'est très bien mais il faudrait peut-être corriger l'erreur aussi !
    Car style objet ou procédural ta connexion est mauvaise, c'est elle le vrai problème. Vérifie la syntaxe dans le manuel PHP, tu ne la respectes pas.

    Ça m'étonnerait bien que la ligne 25 soit celle que tu indiques, l'erreur parse error est dans la suite , il y a un .mysqli_connect_error()); qui se promène tout seul.

    Enrin, si tu es passé en style procédural, il faut être logique te ne pas utiliser l'objet $db que tu n'as pas créé : le $resultat = $db->query($requete); ne te donnera rien de bon.

    Et si tu débutes, sache que recopier des bouts de code sans les comprendre est la meilleure méthode pour ne pas apprendre.
    1. Résultat.php ---> mode procédural sur quelques lignes

      <html>
      <head>
      <title>Résulat de la recherche de personnes dans la base du chantier Sanofi Aventis</title>
      </head>
      <body>
      <h1>Résultat de la recherhe de personnes dans la base</h1>
      <?php
      // create short variable names
      $type_recherche = $_POST['type_recherche'];
      $terme_recherche = trim($_POST['terme_recherche']);

      if (!$type_recherche || !$terme_recherche) {
      echo 'vous navez pas saisi les détails de la recherche';
      exit;
      }

      if (!get_magic_quotes_gpc()){
      $type_recherche = addslashes($type_recherche);
      $terme_recherche = addslashes($terme_recherche);
      }
      // modification en style procédural
      $link = mysqli_connect('localhost', 'root', '','projet ing', 'personnes'); // ligne 25

      if (!$link) {
      die( 'Erreur de connexion('.mysqli_connect_errno().')';
      .mysqli_connect_error());
      }
      echo 'succes'.mysqli_get_host_info($link)."\n";

      // fin de la modification en style procédural

      $requete = "select * from personnes where ".$type_recherche." like '%".$terme_recherche."%'";
      $resultat = $db->query($requete);

      $nb_lig_resultat = $resultat->num_rows;

      echo "<p>Nombre de personnes trouvées: ".$nb_lig_resultat."</p>";

      for ($i=0; $i < $nb_lig_resultat; $i++) {
      $ligne = $resultat->fetch_assoc();
      echo "<p><strong>".($i+1).". nom : ";
      echo htmlspecialchars(stripslashes($ligne['nom']));
      echo "</strong><br />prenom : ";
      echo stripslashes($ligne['prenom']);
      echo "<br />matricule : ";
      echo stripslashes($ligne['matricule']);
      echo "</p>";
      }

      $resultat->free();
      $mysqli_close($link); // passage de la ligne en procédural ?!

      ?>
      </body>
      </html>

      ********************************************
      -->> Parse error: parse error in C:\Program Files\EasyPHP 3.0\www\resultats.php on line 25
      1. Style orienté objet :
        mysqli::__construct ([ string $host= ini_get("mysqli.default_host") [, string $username= ini_get("mysqli.default_user") [, string $passwd= ini_get("mysqli.default_pw") [, string $dbname= "" [, int $port= ini_get("mysqli.default_port") [, string $socket= ini_get("mysqli.default_socket") ]]]]]] )

        Style procédural :
        mysqli mysqli_connect ([ string $host= ini_get("mysqli.default_host") [, string $username= ini_get("mysqli.default_user") [, string $passwd= ini_get("mysqli.default_pw") [, string $dbname= "" [, int $port= ini_get("mysqli.default_port") [, string $socket= ini_get("mysqli.default_socket") ]]]]]]

        je vais voir avec ça
        1. ok je commence bien mon apprentissage de PHP + mySQL ^^

          qu'est ce que tu appels le procédural ?
          1. dans le manuel de PHP
            http://www.php.net/manual/fr/mysqli.connect.php
            Ils parlent bien d'un bug autour de connect_error en style objet et ils préconisent de faire comme ce que tu as fait. Mais je constate comme toi que la solution n'est pas efficace, aucune erreur n'est détectée alors qu'il y en a une...
            Il ne te reste qu'à repasser en procédural
            1. Bonjour

              La connexion se passe mal car tu passes des mauvais paramètres. Enlève le @, tu verras le message d'erreur : tu passes un paramètre de trop, ce qui introduit un décalage (le 5ème devrait être un numéro de port et chez toi c'est un texte)

              Mais tu ne t'en rends pas compte car tu ouvres ta connexion en style objet et la fonction que tu utilises un test non objet. J'ai fait quelques essais et je n'ai pas encore trouvé comment faire un test propre en style objet (que je n'utilise jamais)
              1. ******************************************************************
                Mon fichier "recherche personnes.html" ci-dessous:

                <html>
                <head>
                <title>Recherche de personne dans la base chantier Sanofi-Aventis PROJET DI 50 </title>
                </head>

                <body>
                <h1>Recherche de personne dans la base chantier Sanofi-Aventis PROJET DI 50</h1>

                <form action="resultats.php" method="post">
                Choisissez un type de recherche :<br />
                <select name="type_recherche">
                <option value="nom">Par nom</option>
                <option value="prenom">Par prenom</option>
                <option value="matricule">Par matricule</option>
                </select>
                <br />
                Entrez le terme recherché; :<br />
                <input name="terme_recherche" type="text" size="40" />
                <br />
                <input type="submit" value="Rechercher" />
                </form>

                </body>
                </html>

                ***********************************************************************
                Mon fichier "résultats.php" ci-dessous

                <html>
                <head>
                <title>Résulat de la recherche de personnes dans la base du chantier Sanofi Aventis</title>
                </head>
                <body>
                <h1>Résultat de la recherhe de personnes dans la base</h1>
                <?php
                // create short variable names
                $type_recherche = $_POST['type_recherche'];
                $terme_recherche = trim($_POST['terme_recherche']);

                if (!$type_recherche || !$terme_recherche) {
                echo 'vous navez pas saisi les détails de la recherche';
                exit;
                }

                if (!get_magic_quotes_gpc()){
                $type_recherche = addslashes($type_recherche);
                $terme_recherche = addslashes($terme_recherche);
                }

                @ $db = new mysqli('localhost', 'root', '','projet ing', 'personnes');

                if (mysqli_connect_errno()) {
                echo 'Error: Impossible de se connecter à la base de données.';
                exit;
                }

                $requete = "select * from personnes where ".$type_recherche." like '%".$terme_recherche."%'";
                $resultat = $db->query($requete); // erreur ligne 30
                $nb_lig_resultat = $resultat->num_rows; // erreur ligne 32

                echo "<p>Nombre de personnes trouvées: ".$nb_lig_resultat."</p>";

                for ($i=0; $i < $nb_lig_resultat; $i++) {
                $ligne = $resultat->fetch_assoc();
                echo "<p><strong>".($i+1).". nom : ";
                echo htmlspecialchars(stripslashes($ligne['nom']));
                echo "</strong><br />prenom : ";
                echo stripslashes($ligne['prenom']);
                echo "<br />matricule : ";
                echo stripslashes($ligne['matricule']);
                echo "</p>";
                }

                $resultat->free(); // erreur ligne 47
                $db->close();

                ********************************************************************
                Le message d'erreur:

                Résultat de la recherhe de personnes dans la base

                Warning: mysqli::query() [mysqli.query]: Couldn't fetch mysqli in C:\Program Files\EasyPHP 3.0\www\resultats.php on line 30

                Notice: Trying to get property of non-object in C:\Program Files\EasyPHP 3.0\www\resultats.php on line 32

                Nombre de personnes trouvées:

                Fatal error: Call to a member function free() on a non-object in C:\Program Files\EasyPHP 3.0\www\resultats.php on line 47
                1. Peux-tu redonner ton code dans son état actuel et préciser sur quelles lignes apparaissent les erreurs ?
                  1. Error: Impossible de se connecter à la base de données --> Résolu :)

                    Résultat de la recherhe de personnes dans la base

                    Warning: mysqli::query() [mysqli.query]: Couldn't fetch mysqli in C:\Program Files\EasyPHP 3.0\www\resultats.php on line 30

                    Notice: Trying to get property of non-object in C:\Program Files\EasyPHP 3.0\www\resultats.php on line 32

                    Nombre de personnes trouvées:

                    Fatal error: Call to a member function free() on a non-object in C:\Program Files\EasyPHP 3.0\www\resultats.php on line 49
                    1. Error: Impossible de se connecter à la base de données

                      --> est ce qu'on peut regarder ensemble si j'ai bien renseigner les éléments de connexion à la base de données ?

                      @ $db = new mysqli('localhost', 'root', 'projet ing', 'personnes');

                      --> serveur, nom d'utilisateur, nom de la base de donnée, nom de la table, ::: c'est juste ?
                      1. file:///C:/Program%20Files/EasyPHP%203.0/www/recherche%20personnes.html

                        je viens de le faire en passant par http://localhost/ ça marche mieux ;) MERCI

                        humm j'ai une autre erreur maintenant, je vous tiens au courant ^^
                        1. Oui je suis en local, je fais un double clik dessus et c'est l'explorateur qui l'ouvre naturellement
                          Quelle est l'adresse qui s'affiche dans la barre d'addresse de l'explorateur ? style C:\\qqchose\recherche.html ou style http://localhost/qqchose/recherche.html ?
                          1. oui je suis en local, je fais un double clik dessus et c'est l'explorateur qui l'ouvre naturellement
                            1. les variables que tu récupère de la base ne sont pas affiché.
                              --> Pourquoi elles ne s'affichent pas ?

                              la ou tu as des doutes : dans ton echo enlève les double quotte ""
                              essai sa et dis nous quesque sa donne

                              --> j'ai essayé d'épurer la fin du programme ... mais le msg reste le même
                              1. Bonjour

                                N'enlève pas de double-quotes juste pour voir, sans savoir pourquoi.

                                Par contre, comment fais-tu tes essais ? ce que tu appelles un message d'erreur n'en est pas un, il vient du fait que ton php n'est pas interpreté. le HTML te cache tout ce qu'il y a entre le <?php qu'il ne comprend pas, et le > suivant, qu'il prend pour la fin d'une balise. et il te montre la suite
                                Je suppose que tu es en local. comment ouvres-tu ton fichier recherche.html ? en double-cliquant dessus dans le fenêtre de l'explorateur ?
                                1. d'après le msg d'erreur

                                  les variables que tu récupère de la base ne sont pas affiché.

                                  la ou tu as des doutes : dans ton echo enlève les double quotte ""
                                  essai sa et dis nous quesque sa donne