Code postal => ville

Statut
N'est pas ouverte pour d'autres réponses.

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
 

sebge2

Elite
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:
 

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 . ";"
 
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.
 
1er
OP
II phl II

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:
 

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 ... )
 
1er
OP
II phl II

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
 

THiBOo

Elite
II phl II a dit:
c'est gentil mais je préfère de loin ce que j'ai (avec la grande aide d'un amis) fait :D
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.
 

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:
 

null

ose();
FoX SpeEd a dit:
Code:
<form method="POST" action="cp22.php">
t'aura plus simple à mettre

Code:
<form method="POST" action="">
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
 

.Vinc.

Oh, un LamZ !
null, il assure trop en PHP :cool: !
 
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 ^^
 
1er
OP
II phl II

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:)
 
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.
 

FoX SpeEd

Touriste
RoXioR@LamZ a dit:
null, il assure trop en PHP :cool: !

normal c'était moi son proff :cool:

non je rigole c'était plutot l'inverse :p
 

guslinux

Gamerz'ien
sebge2 a dit:
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:
ca te rapelle pas qqch ce "module" ...

le temps de remettre ca d'alure sur mon serveur je ballance le lien :wink:
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut