Code postal => ville

Discussion dans 'Web, design' créé par II phl II, 5 Novembre 2005.

Statut de la discussion:
Fermée.
  1. Offline
    II phl II Touriste
    Bonjour à tous,
    Ayant un probleme avec en php, je viens vous demandez de l'aide ;)
    Je précise que je début en php, donc désolé si ma question ou mon code vous semble mauvais (toutes remarques constructives est bien sûr la bienvenue)

    J'ai une base de donnée mysql avec 2 champs :
    Code : les codes postaux belges => 4 chiffres
    Name : le nom des villes correspondant aux différents codes

    J'aimerais avoir ceci :
    - un input 'code postal' où l'utilsateur rentre un code postal.
    - un bouton 'Chercher' qui va sélectionner dans ma bd le nom des (des, car il y en a souvent plusieurs) villes correspondant au code postal entré
    - un champ select qui affiche une liste déroulante de ces villes

    J'ai tout d'abord essayé de le faire en ouvrant un popup avec la fonction recherche et ensuite d'inclure les résultats dans une variable de session, mais je me suis aperçu qu'on ne pouvait pas faire passer une variable de session de type array d'une page à une autre (pour rappatrier $_SESSION du popup à la page principale)

    Voici ce que j'essaie à présent : (mon fichier s'appel cp22.php)

    Code:
    <?php
    session_start();
    
    if(isset($_POST['cp']))      $cp=$_POST['cp'];
    else      $cp="";
    
    // on se connecte à MySQL
    $db = mysql_connect('localhost', 'root', ''); 
    
    // on seléctionne la base
    mysql_select_db('client',$db); 
    
    // on crée la requete SQL
    $sql = "SELECT Code,Name FROM codes_tbl";
    
    // on envoie la requête
    $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
    ?>
    
    <html>
    <form method="POST" action="cp22.php">
    <table border="0">
    
    <tr>
    <td>Code postal :</td>
    <td><input type="text" name="cp" size="20" maxlength="4"></td>
    </tr>
    <tr>
    <td>Localité :</td>
    <td><select size="5" name="choix1">
    <select name="localite">
    <?php if ($cp="") { break; }
    	else
    	{
    		$sql = "SELECT Code,Name FROM codes_tbl WHERE Code=$cp";
    		echo '<select name="localite">';
    			 for($i=0; $i<mysql_num_rows($sql); $i++)
    			{
    			echo '<option value="Localite'.$i.'">'.$cp.'</option>';
    			}
    		echo '</select>';
    	}
    ?>
    </td>
    </tr>
    
    
    </table>
    
    <input type="submit" value="Chercher" name="chercher">
    </form>
    
    </html>
    <?php
    session_destroy();
    mysql_close();
    ?>
    Je précise que mon fichier s'appel cp22.php car <form method="POST" action="cp22.php"> => je reload la page

    J'obtiens ceci : <b>Warning</b>: mysql_num_rows(): supplied argument is not a valid MySQL result resource in <b>c:\program files\easyphp1-8\www\client\cp22.php</b> on line <b>37</b>
    Pas moyen d'échapper à cette erreur :/

    Pensez-vous que j'y prends mal, si oui donnez-moi des idées
    Pouvez-vous m'aider à faire fonctionner ce script ?
    Si vous le désirez, je peux vous envoyer par PM codes_tbl (fichier sql des codes postaux)

    D'avance, merci à tous
    II phl II, 5 Novembre 2005
    #1
  2. Offline
    sebge2 Touriste
    pour debuguer :

    affiche la requete mysql par un echo : echo $requete_mysql;

    ensuite montre nous ce que tu obtiens ainsi que la configuration de table MySQL :wink:
    sebge2, 5 Novembre 2005
    #2
  3. Offline
    moustic Touriste
    J'suis aussi débutant en php mais la requete devrait pas être :

    Code:
    "SELECT Code,Name FROM codes_tbl WHERE Code=" . $cp . ";" 
    moustic, 5 Novembre 2005
    #3
  4. Offline
    Loetheri Absent
    Pourquoi utilises-tu un for() alors que le while() est tout aussi approprié et meme plus simple dans ce cas.

    Tu peux nous éclairer sur les différents champs que tu as dans ta table ? Car déjà lorsque tu fais un mysql_fetch_row(), tes données sont stockées de la façon suivante :
    Code:
    $test = mysql_fetch_row($test);
    echo $test[0];
    Autrement dit, le nom de ta variable suivi d'un nombre entre crochet (et si le nombre est une variable, tu ne mets rien de plus. Exemple : $test[$i] )

    Edit : Au lieu de te connecter dans tous les cas à ta base de donnée, ne te connecte que lorsque tu en as besoin. Autrement dit, quand tu $_POST['cp'] est défini.

    Et essaye de faire un LIMIT sur ta recherche, enfin, si tu sais.
    Loetheri, 5 Novembre 2005
    #4
  5. Offline
    II phl II Touriste
    merci à tous

    en effet un while est plus approprié et j'ai changé le $cp pour tout simplement utiliser $_POST['cp']

    bien plus simple, tout roule mnt :wink:
    II phl II, 5 Novembre 2005
    #5
  6. Offline
    THiBOo Elite
    Sinon ce que tu peux faire ( et que je fais en général ), c'est un joli select avec les 2073 communes existantes :)

    Code:
    			<table><tr>
    				<td width="30%"><font face="Arial, Helvetica, sans-serif" size="+1">- Commune :</font></td>
    				<?/*<td><input name='commune_magasin' size='40' value="" /></td>*/?>
    				<td>
    				<?
    				require("../../util.php");
    				$results = @mysql_query("SELECT * FROM commune ORDER BY cp ASC");
    				$commune = array();
    				$i = 1;
    				while($result = @mysql_fetch_array($results)){
    					$commune[$i++] = $result["cp"]." ".$result["nom_com"];
    				}
    				//var_dump($provinces);
    				echo go_select_tab($commune_magasin, $commune, "commune_magasin");
    				?>
    				</td>
    			</tr></table>
    
    Code:
    function go_select_tab($selected, $list, $name){
    	$strout = "\n".'<select name="'.$name.'">';
    	$strout.= "\n".'<option value=""> --- </option>';
    	foreach($list as $key => $out){
    		$select = ($key == $selected)? " selected" : "";
    		$key = substr($out, 0, 4);
    		$strout.= "\n<option value=\"$key\" $select>$out</option>";
    	}
    	$strout.='</select>';
    	return $strout;
    }
    
    Ca marche assez bien :) ( ici je renvois le code postal, mais je peux renvoyer autre chose aussi ... )
    THiBOo, 5 Novembre 2005
    #6
  7. Offline
    II phl II Touriste
    c'est gentil mais je préfère de loin ce que j'ai (avec la grande aide d'un amis) fait :D
    II phl II, 5 Novembre 2005
    #7
  8. Offline
    THiBOo Elite
    D'un point de vue "user friendly", ça implique que ton utilisateur DOIT connaître le code postal de sa commune ...
    Alors qu'avec un menu déroulant s'il n'est pas sûr il peut facilement chercher ^_^

    Mais tant mieux si t'as trouvé ton bonheur.
    THiBOo, 5 Novembre 2005
    #8
  9. Offline
    FoX SpeEd Touriste
    si ton fichier dans lequelle tu va envoyer les info récolté dans ton formulaire est le même que celui qui traite les infos

    Donc si ton fichier s'apelle cp22.php et ke tu dans envoyer les données dans le même fichier

    Code:
    <form method="POST" action="cp22.php">
    t'aura plus simple à mettre

    Code:
    <form method="POST" action="">
    comme ca tu risquera pas de te gourer si tu renome ton fichier :wink:
    FoX SpeEd, 5 Novembre 2005
    #9
  10. Offline
    null ose();
    Il vaut mieux mettre :

    Code:
    <form method="POST" action="?">
    Bon, tu as fais des modifications sur ton code mais tu as dis qu'on pouvait faire des petites remarques donc voilà ce que j'ai a te dire :p

    Remarque 1

    Avant de traiter tes conditions, connecte toi à la base de données. C'est beaucoup plus "propre", c'est mieux de faire tout ce qui est "connexion" avant le reste : d'abord les autres (ce qui va sur les autres serveurs) et ensuite toi (le traitement local).

    Remarque 2

    Dans ton code HTML, tu as mis :

    Code:
    <select size="5" name="choix1">
    <select name="localite">
    C'est de trop, vu que tu mets le bon "<select>" (et sa balise qui le ferme) dans le traitement du "else".

    Rermarque 3

    Pourquoi tu as mis des sessions là ? Tu charges une session en haut de page et tu la détruit en fin de script. Tu utilises un formulaire avec POST, et tu prends les données que tu as besoin de $_POST. Tu n'utilises jamais la session donc elle n'a pas lieu d'être.

    Rermarque 4

    Code:
    if ($cp="") { break; }
       else
       {
    Alors, "break;" est utilisée pour "switch" ou alors pour les boucles mais il ne faut pas l'utiliser de cette manière (voir la remarque suivante)

    Remarque 5

    Toujours dans :

    Code:
    if ($cp="") { break; }
       else
       {
           //ici ton traitement
    
    Tu voudrais savoir si ta variable "$cp" est remplie et si c'est le cas, tu fais ton traitement. Le problème c'est que toi tu fais :

    - Si la variable est vide, on fait rien
    - Sinon on fait le traitement

    Tu devrais faire :

    - Si la variable n'est pas vide, on fait le traitement donc :

    Code:
    if($cp != "")
    { 
       //ici ton traitement
    Remarque 6 :

    Tu voulais savoir pourquoi tu avais une erreur ?

    Code:
    $sql = "SELECT Code,Name FROM codes_tbl WHERE Code=$cp";
    //...
    for($i=0; $i<mysql_num_rows($sql); $i++)
    //....
    Dans ta boucle, tu passes le paramètre "$sql" dans la fonction "mysql_num_rows()" mais le problème est que "$sql" est une chaîne, tu as oublié le traitement de la requête avec "mysql_query()", d'où l'erreur.

    Remarque 7

    Pour éviter les erreurs comme au dessus, tu peux écrire directement la reqûete SQL dans la fonction "mysql_query()", par exemple :

    Code:
    mysql_query("SELECT Code,Name FROM codes_tbl WHERE Code = '".$cp."'");
    Bonne continuation
    null, 5 Novembre 2005
    #10
  11. Offline
    .Vinc. Oh, un LamZ !
    null, il assure trop en PHP :cool: !
    .Vinc., 5 Novembre 2005
    #11
  12. Offline
    Loetheri Absent
    C'est ma vision des choses, mais je ne suis pas d'accord sur ta remarque n°1. Si tu peux éviter une connexion à la base de données, autant le faire.

    Si je ne m'abuse, les connexions, les recherches, et autres utilisations de fonction Mysql sont "lourdes". Donc quitte à mettre une condition avant, autant le faire.

    Non ?

    Par rapport à la remarque n°5, j'aurais plutot tendance à mettre :
    Code:
    if ( isset($cp)) {
    }
    qu'un
    Code:
    if ($cp != "") {
    }
    Bien sur, cela dépend si sur la page, il y a d'autres utilisations de $cp. Je vais essayer de voir ce qui est le plus rapide.
    Si quelqu'un retrouve les tests déjà effectuées :p
    Loetheri, 5 Novembre 2005
    #12
  13. Offline
    II phl II Touriste
    Voilà le code :
    Code:
    <tr>
    <td>Code postal :</td>
    <td>
    <input type="text" name="cp" size="20" maxlength="4" value="<?php if(isset($_POST['cp'])) { echo $_POST['cp']; } ?>">
    <input type="submit" value="Chercher localité" name="chercher">
    </td>
    </tr>
    
    <tr>
    <?php if(isset($_POST['cp']))
    	  {
    		?>
    		<td>Localité :</td>
    		<td><select name="ville">
    		<?
    		$sql = sprintf("SELECT Code,Name FROM codes_tbl WHERE Code='{$_POST['cp']}'");
    		$req = mysql_unbuffered_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
    		while( $dataresult = mysql_fetch_object($req))
    		{	
    			?><option value="<? echo $dataresult->Name ?>"><? echo $dataresult->Name ?></option><?
    		}
    		?> </select> <?
    	}
    ?>
    </td>
    </tr>
    Pour la session, j'avais commencé en utilisant une variable de session et j'avais oublié de virer le start et le destroy
    Pour le double select ... simple faute d'inattention.

    Avec ce code-ci, le champ Localité n'apparait qu'une fois le code postal entrer et que le bouton Chercher Localité a été enfoncé.

    Voilà, merci à tous pour vos remarques (surtout null :wink:)
    II phl II, 6 Novembre 2005
    #13
  14. Offline
    Loetheri Absent
    Juste encore un petit conseil :
    Connectes-toi et récupère toute les données de ta base avant d'écrire quoi que ce soit sur la page.
    Loetheri, 6 Novembre 2005
    #14
  15. Offline
    FoX SpeEd Touriste

    normal c'était moi son proff :cool:

    non je rigole c'était plutot l'inverse :p
    FoX SpeEd, 6 Novembre 2005
    #15
  16. Offline
    guslinux Gamerz'ien
    ca te rapelle pas qqch ce "module" ...

    le temps de remettre ca d'alure sur mon serveur je ballance le lien :wink:
    guslinux, 6 Novembre 2005
    #16
  17. Offline
    guslinux Gamerz'ien
    guslinux, 6 Novembre 2005
    #17
Statut de la discussion:
Fermée.