Diiférence entre résultat sur Mysql et navigateur pour Moteur de recherche

Eléphant du PHP | 78 Messages

04 sept. 2007, 08:53

Bonjour,
Voilà j'ai fait un peu de code pour un moteur de recherche avec une première page formulaire (Test1.php) qui renvoie à la page (Recherche.php).
Au début j'ai eu quelques résultats convenables et maintenant le message d'erreur est :
Notice: Undefined index: force in c:\program files\easyphp1-7\www\recherche.php on line 44
Ci-dessous le code de la page Test1 :
<?php /* Date de création: 01/08/2007 */ ?>
<html>
<Title>Test1</Title>
<body>
<?php

?>
Formulaire de recherche :
<form action="Recherche.php" method="Post"> 
<input name="Recherche" size="10"> 
<input type="submit" value="Ok" onclick="this.value='Recherche en cour...'"> 
</form>


</body>
</html>
Ci-dessous le code de la page Recherche :
 <?php /* Date de création: 01/08/2007 */ ?>
 <html>
 <body>

 <?php 
$host = "127.0.0.1";  
       $user = "root"; 
       $pass = ""; 
       $bdd = "expeditions"; 
       $table = "force"; 
         
         // connexion 
 @mysql_connect($host,$user,$pass) 
    or die("Impossible de se connecter"); 
 @mysql_select_db("$bdd") 
   or die("Impossible de se connecter"); 
 $Recherche = (isset($_POST['Recherche'])) ? $_POST['Recherche'] : "";  
if($Recherche=="")  
 {  
 echo "Vous devez taper une recherche.";  
 }  
 else 
 { 
 	// Les deux requêtes ci-dessous donnent le même résultat, c.à.d indefined index
 //$requete = "SELECT nom_force FROM $table WHERE `nom_force` LIKE '%".  Recherche ."%' "; 
//$requete = "SELECT  force FROM  `force` WHERE  `nom_force` LIKE  '%". $Recherche ."%' ";

	//la requête ci-dessous marche sur Mysql, mais pas dans le navigateur...
	//... avec le message d'erreur suivant : Undefined index: force in c:\easyphp1-7\www\recherche.php on line 43
$requete = "SELECT `force`.`nom_force` , `produit`.`nom_produit` 
FROM `force` , `produit` 
WHERE (
force.id_produit = produit.id_produit
)
ORDER BY `force`.`nom_force` DESC , `produit`.`nom_produit` DESC  LIMIT 0 , 30 "; 
$rs = mysql_query($requete) or die (mysql_error(). ": <br :>".$requete);  
  
if(mysql_num_rows($rs) == 0)    
{ 
echo 'Aucun résultat ne correspond aux termes de votre recherche.';  
} 
else 
{ 
44 while($val = mysql_fetch_array($rs)) {echo "<BR>".$val["force"]."<BR>"."<BR>";} 
//echo $requete ; 
// on ferme la connexion à mysql 
mysql_close();  
} 
}
?>
</body>
</html>

J'ai indiqué la ligne 44 de l'erreur.
Cela vous aiderait-il si je rajoutais les deux tables correspondantes, 'produit' et 'force' ?

Merci par avance[/php]

ViPHP
ViPHP | 2287 Messages

04 sept. 2007, 09:44

Bonjour,
Notice: Undefined index: force in c:\program files\easyphp1-7\www\recherche.php on line 44
Ce message signifie qu'aucune variable n'existe à l'index 'force' du tableau que tu manipules à la ligne 44, ce qui devrait te mettre sur la voie.

Un autre indice : as-tu essayé d'afficher ta requête (avec un simple echo) et de l'éxécuter dans phpmyadmin ? N'hésite pas à le faire, et regarde attentivement les noms des colonnes que ton SELECT produit ;-)
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 78 Messages

04 sept. 2007, 10:36

Merci Calimero,

Voici la nouvelle ligne et effectivement je l'avais modifié en nom_force au lieu de force :
while($val = mysql_fetch_array($rs)) {echo "<BR>".$val["nom_force"]."<BR>"."<BR>";} 
Par contre, que je tape quoique ce soit dans le formulaire, ça affiche absolument tout ce qui est contenu dans la base. et non par rapport à la variable que je tape dans la case du formulaire.

ViPHP
ViPHP | 2287 Messages

04 sept. 2007, 10:47

Par contre, que je tape quoique ce soit dans le formulaire, ça affiche absolument tout ce qui est contenu dans la base. et non par rapport à la variable que je tape dans la case du formulaire.
Oui car comme tu peux le voir, la requête que tu as mis plus haut (et qui n'est pas commentée) n'utilise pas le paramètre $Recherche, contrairement aux deux autres... Alors que celle-là par exemple :
//$requete = "SELECT  force FROM  `force` WHERE  `nom_force` LIKE  '%". $Recherche ."%' ";
Prendrait en compte le paramètre :-) Vois-tu ce qu'il te reste à ajouter ?
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 78 Messages

04 sept. 2007, 11:11

Par contre, que je tape quoique ce soit dans le formulaire, ça affiche absolument tout ce qui est contenu dans la base. et non par rapport à la variable que je tape dans la case du formulaire.
Oui car comme tu peux le voir, la requête que tu as mis plus haut (et qui n'est pas commentée) n'utilise pas le paramètre $Recherche, contrairement aux deux autres... Alors que celle-là par exemple :
//$requete = "SELECT  force FROM  `force` WHERE  `nom_force` LIKE  '%". $Recherche ."%' ";
Prendrait en compte le paramètre :-) Vois-tu ce qu'il te reste à ajouter ?
Youpi, ça marche. par contre en modifiant comme ci-dessous :
		echo "<BR>".$val["nom_force"]."&nbsp;"."&nbsp;"."<B>".$val["nom_produit"]."</B>"."<BR>"."<BR>";

cela me classe tous les nom_force mais pas toujours avec le bon "produit.
Je m'explique avec un nom_force "alpha, qui n'existe normalement que en produit A et B, suite à ma requête, il est affiché en produit A, B, C et D.
Je me demande s'il n'y a pas un souci dans la requête avec :

Code : Tout sélectionner

ORDER BY `force`.`nom_force` DESC , `produit`.`nom_produit` DESC LIMIT 0 , 400 ";
Il me semble que de vouloir classer par nom-force et par nom-produit, cela ne soit pas compatiple...
Voilà l'affichage :
alpha - A

alpha - B

alpha - C

alpha - D

alpha - E

alpha - F

alpha - B

alpha - A

alpha - D

alpha - C

alpha - F

alpha - E

ViPHP
ViPHP | 2287 Messages

04 sept. 2007, 14:23

Pour pouvoir te répondre, est-ce que tu pourrais copier ici la requête complète telle qu'elle est maintenant stp (en particulier la clause WHERE) ? merci :-)
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 78 Messages

04 sept. 2007, 15:54

Pour pouvoir te répondre, est-ce que tu pourrais copier ici la requête complète telle qu'elle est maintenant stp (en particulier la clause WHERE) ? merci :-)
Ok la voici :
$requete = "SELECT `force`.`nom_force` , `produit`.`nom_produit` FROM `force` , `produit` WHERE ( force.id_produit = produit.id_produit ) ORDER BY `force`.`nom_force` ASC , `produit`.`nom_produit` DESC LIMIT 0 , 400 ";
Il semble donc que cela affiche en globalité les éléments de la table indépendamment des informations mises dans le formulaire.
Merci pour l'aide Dr Watson ! :wink:

ViPHP
ViPHP | 2287 Messages

04 sept. 2007, 16:15

Je recommence car je n'ai pas dû être clair dans le post précédent :-)

Il te manque ceci dans ta requête pour qu'elle prenne en compte ce que tu as saisi dans le formulaire :
`nom_force` LIKE  '%". $Recherche ."%'
Ca se place au niveau de la clause WHERE. Il te faut donc cumuler cette condition avec celle que tu as dans ta clause WHERE qui réalise la jointure entre les deux tables, donc avec un opérateur AND.

Ce qui nous donne :
$requete = "SELECT `force`.`nom_force` , `produit`.`nom_produit` FROM `force` , `produit` WHERE  force.id_produit = produit.id_produit  AND `nom_force` LIKE  '%". $Recherche ."%' ORDER BY `force`.`nom_force` ASC , `produit`.`nom_produit` DESC LIMIT 0 , 400 ";
Essaye au passage cette requête dans phpmyadmin pour vérifier que ton problème d'affichage est bien dû à la requête et/ou aux données, car cela pourrait aussi venir du code PHP.
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 78 Messages

05 sept. 2007, 09:49

Merci bien, en fait il me semble que j'avais bien changé la clause Where, mais je n'ai pas du sauvegarder le fichier.

D'un autre côté, j'ai une question.
J'ai récupéré un autre code avec un mysql_free_result qui fonctionne dans le fichier d'origine, mais quand je change les paramètres dans mon nouveau fichier, il me dit que :supplied argument is not a valid MySQL !

Le fichier d'origine poru avoir deux menus déroulants dont le second dépend de la sélection du premier.
<?php 
echo("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n"); 
/* Variables de connexion : ajustez ces paramètres selon votre propre environnement */ 
$serveur = "127.0.0.1"; 
$admin   = "root"; 
$mdp     = ""; 
$base    = "expeditions"; 
/* On récupère si elle existe la valeur de la région envoyée par le formulaire */ 
$idr = isset($_POST['region'])?$_POST['region']:null; 
?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" xml:lang="fr" /> 
<title>Sélectionner un département selon la région choisie</title> 
<meta name="description" content="Listes déroulantes dynamiques inter-dépendantes" /> 
<meta name="keywords" content="" /> 
<meta name="author" content="Cyrano" /> 
<meta name="generator" content="Zend Studio Environnement et WebExpert 5" /> 
<meta http-equiv="imagetoolbar" content="no" /> 
<meta http-equiv="Pragma" content="no-cache" /> 
</head> 
<body style="font-family: verdana, helvetica, sans-serif; font-size: 85%"> 
<?php 
if(isset($_POST['ok']) && isset($_POST['departement']) && $_POST['departement'] != "") 
{ 
    $region_selectionnee = $_POST['region']; 
    $dept_selectionne = $_POST['departement']; 
?> 
<p>Vous avez sélectionné le destinataire <?php echo($dept_selectionne); ?> du produit <?php echo($region_selectionnee); ?></p> 
<?php 
} 
?> 
<h3>Force  par produit</h3> 
<?php 
/* On établit la connexion à MySQL avec mysql_pconnect() plutôt qu'avec mysql_connect() 
*  car on aura besoin de la connexion un peu plus loin dans le script */ 
$connexion = mysql_pconnect($serveur, $admin, $mdp); 
if($connexion != false) 
{ 
    $choixbase = mysql_select_db($base, $connexion); 
    $sql1 = "SELECT `id_region`, `region`". 
    " FROM `region`". 
    " ORDER BY `id_region`"; 
    $rech_regions = mysql_query($sql1); 
    $code_region = array(); 
    $region = array(); 
    /* On active un compteur pour les régions */ 
    $nb_regions = 0; 
    if($rech_regions != false) 
    { 
        while($ligne = mysql_fetch_assoc($rech_regions)) 
        { 
            array_push($code_region, $ligne['id_region']); 
            array_push($region, $ligne['region']); 

            /* On incrémente de compteur */ 
            $nb_regions++; 
        } 
    } 
    ?> 
<form action="<?php echo($_SERVER['PHP_SELF']); ?>" method="post" id="chgdept"> 
<fieldset style="border: 3px double #333399"> 
<legend>Sélectionnez une région</legend> 
<select name="region" id="region" onchange="document.forms['chgdept'].submit();"> 
  <option value="-1">- - - Choisissez une région - - -</option> 
    <?php 
    for($i = 0; $i < $nb_regions; $i++) 
    { 
?> 
  <option value="<?php echo($code_region[$i]); ?>"<?php echo((isset($idr) && $idr == $code_region[$i])?" selected=\"selected\"":null); ?>><?php echo($region[$i]); ?></option> 
<?php 
    } 
    ?> 
</select> 
    <?php 
    mysql_free_result($rech_regions); 
    /* On commence par vérifier si on a envoyé un numéro de région et le cas échéant s'il est différent de -1 */ 

    if(isset($idr) && $idr != -1) 
    { 
        /* Cération de la requête pour avoir les départements de cette région */ 
        $sql2 = "SELECT `id_departement`, `departement`". 
        " FROM `departement`". 
        " WHERE `id_region` = ". $idr ."". 
        " ORDER BY `id_departement`;"; 
        if($connexion != false) 
        { 
            $rech_dept = mysql_query($sql2, $connexion); 
            /* Un petit compteur pour les départements */ 
            $nd = 0; 
            /* On crée deux tableaux pour les numéros et les noms des départements */ 
            //$code_dept = array(); 
            $nom_dept = array(); 
            /* On va mettre les numéros et noms des départements dans les deux tableaux */ 
            while($ligne_dept = mysql_fetch_assoc($rech_dept)) 
            { 
                //array_push($code_dept, $ligne_dept['id_departement']); 
                array_push($nom_dept, $ligne_dept['departement']); 
                $nd++; 
            } 
            /* Maintenant on peut construire la liste déroulante */ 
            ?> 
<select name="departement" id="departement"> 
            <?php   
            for($d = 0; $d<$nd; $d++) 
            { 
                ?> 
  <option value="<?php echo; ?>"<?php echo((isset($dept_selectionne) && $dept_selectionne == $code_dept[$d])?" selected=\"selected\"":null); ?>><?php echo($nom_dept[$d]); ?></option> 
                <?php 
            } 
?> 
</select> 
<?php 
        } 
        /* Un petit coup de balai */ 
        mysql_free_result($rech_dept); 
    } 
?> 
<br /><input type="submit" name="ok" id="ok" value="Envoyer" /> 
</fieldset> 
</form> 
<?php 
    /* Terminé, on ferme la connexion */ 
    mysql_close($connexion); 
} 
else 
{ 
    /* Si on arrive là, c'est pas bon signe, il faut vérifier les  
    * paramètres de connexion, mot de passe, serveur pas démarré etc... */ 
?> 
<p>Un incident s'est produit lors de la connexion à la base de données, veuiillez essayer à nouveau ultérieurement.</p> 
<?php 
} 
?> 
</body> 
</html> 
Ci-dessous, le mien retouché...
<?php 
echo("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n"); 
/* Variables de connexion : ajustez ces paramètres selon votre propre environnement */ 
$serveur = "127.0.0.1"; 
$admin   = "root"; 
$mdp     = ""; 
$base    = "expeditions"; 
/* On récupère si elle existe la valeur de la produit envoyée par le formulaire */ 
$idr = isset($_POST['produit'])?$_POST['produit']:null; 
?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" xml:lang="fr" /> 
<title>Sélectionner un force selon la produit choisie</title> 
<meta name="description" content="Listes déroulantes dynamiques inter-dépendantes" /> 
<meta name="keywords" content="" /> 
<meta name="author" content="Cyrano" /> 
<meta name="generator" content="Zend Studio Environnement et WebExpert 5" /> 
<meta http-equiv="imagetoolbar" content="no" /> 
<meta http-equiv="Pragma" content="no-cache" /> 
</head> 
<body style="font-family: verdana, helvetica, sans-serif; font-size: 85%"> 
<?php 
if(isset($_POST['ok']) && isset($_POST['force']) && $_POST['force'] != "") 
{ 
    $produit_selectionnee = $_POST['produit']; 
    $force_selectionne = $_POST['force']; 
?> 
<p>Vous avez sélectionné le destinataire <?php echo($force_selectionne); ?> du produit <?php echo($produit_selectionnee); ?></p> 
<?php 
} 
?> 
<h3>Force de vente par produit</h3> 
<?php 
/* On établit la connexion à MySQL avec mysql_pconnect() plutôt qu'avec mysql_connect() 
*  car on aura besoin de la connexion un peu plus loin dans le script */ 
$connexion = mysql_pconnect($serveur, $admin, $mdp); 
if($connexion != false) 
{ 
    $choixbase = mysql_select_db($base, $connexion); 
    $sql1 = "SELECT `id_produit`, `produit`". 
    " FROM `produit`". 
    " ORDER BY `id_produit`"; 
    $rech_produits = mysql_query($sql1); 
    $code_produit = array(); 
    $produit = array(); 
    /* On active un compteur pour les produits */ 
    $nb_produits = 0; 
    if($rech_produits != false) 
    { 
        while($ligne = mysql_fetch_assoc($rech_produits)) 
        { 
            array_push($code_produit, $ligne['id_produit']); 
            array_push($produit, $ligne['produit']); 

            /* On incrémente de compteur */ 
            $nb_produits++; 
        } 
    } 
    ?> 
<form action="<?php echo($_SERVER['PHP_SELF']); ?>" method="post" id="chgforce"> 
<fieldset style="border: 3px double #333399"> 
<legend>Sélectionnez une produit</legend> 
<select name="produit" id="produit" onchange="document.forms['chgforce'].submit();"> 
  <option value="-1">- - - Choisissez une produit - - -</option> 
    <?php 
    for($i = 0; $i < $nb_produits; $i++) 
    { 
?> 
  <option value="<?php echo($code_produit[$i]); ?>"<?php echo((isset($idr) && $idr == $code_produit[$i])?" selected=\"selected\"":null); ?>><?php echo($produit[$i]); ?></option> 
<?php 
    } 
    ?> 
</select> 
    <?php 
    mysql_free_result($rech_produits); 
    /* On commence par vérifier si on a envoyé un numéro de produit et le cas échéant s'il est différent de -1 */ 

    if(isset($idr) && $idr != -1) 
    { 
        /* Cération de la requête pour avoir les forces de cette produit */ 
        $sql2 = "SELECT `id_force`, `force`". 
        " FROM `force`". 
        " WHERE `id_produit` = ". $idr ."". 
        " ORDER BY `id_force`;"; 
        if($connexion != false) 
        { 
            $rech_force = mysql_query($sql2, $connexion); 
            /* Un petit compteur pour les forces */ 
            $nd = 0; 
            /* On crée deux tableaux pour les numéros et les noms des forces */ 
            //$code_force = array(); 
            $nom_force = array(); 
            /* On va mettre les numéros et noms des forces dans les deux tableaux */ 
            while($ligne_force = mysql_fetch_assoc($rech_force)) 
            { 
                //array_push($code_force, $ligne_force['id_force']); 
                array_push($nom_force, $ligne_force['force']); 
                $nd++; 
            } 
            /* Maintenant on peut construire la liste déroulante */ 
            ?> 
<select name="force" id="force"> 
            <?php   
            for($d = 0; $d<$nd; $d++) 
            { 
                ?> 
  <option value="<?php echo; ?>"<?php echo((isset($force_selectionne) && $force_selectionne == $code_force[$d])?" selected=\"selected\"":null); ?>><?php echo($nom_force[$d]); ?></option> 
                <?php 
            } 
?> 
</select> 
<?php 
        } 
        /* Un petit coup de balai */ 
        mysql_free_result($rech_force); 
    } 
?> 
<br /><input type="submit" name="ok" id="ok" value="Envoyer" /> 
</fieldset> 
</form> 
<?php 
    /* Terminé, on ferme la connexion */ 
    mysql_close($connexion); 
} 
else 
{ 
    /* Si on arrive là, c'est pas bon signe, il faut vérifier les  
    * paramètres de connexion, mot de passe, serveur pas démarré etc... */ 
?> 
<p>Un incident s'est produit lors de la connexion à la base de données, veuiillez essayer à nouveau ultérieurement.</p> 
<?php 
} 
?> 
</body> 
</html>