8791 sujets

Développement web côté serveur, CMS

Pages :
Bonjour,

Je poste ici parce qu'en fait je ne sais pas où mettre ma question... Smiley ohwell

Je dois créer une fonction recherche par une liste de régions ou/et par insertion du code postal pour afficher une ou plusieurs adresses de magasins qui se trouvent dans ma base de données.

Je précise que je débute en php.

Que me conseillez-vous?
Dans ce cas, il "suffit" de faire une requête sur ces champs à partir d'un formulaire.

Un formulaire contenant une liste déroulante listant les régions présentes dans la table & un champ texte pour saisir le code postal permet de récupérer les valeurs recherchées, et tu peux faire un SELECT dans la table avec ces valeurs ...
Bonsoir,

Je continue ce sujet car j'y suis pas encore parvenue Smiley decu mais je m'accroche ! Smiley langue
Voila où j'en suis ...
J'ai crée une table avec le nom des régions en plus de ma table contenant les données des magasins présents dans la région.
Je suis arrivée à faire une requête vers ma table région pour afficher une liste de région puis une autre requête vers ma 2ème table pour afficher une seconde liste des ville de la région où il y a un magasin.
Jusque là tout va bien Smiley biggrin
Mon problème est que je ne sais pas comment faire maintenant pour afficher en dessous les coordonnées du magasin de cette ville.
Voila mon code

/* 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="chgville">
<fieldset style="border: 3px double #f49247">
<legend>Sélectionnez une région</legend>
<select name="region" id="region" onchange="document.forms['chgville'].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)
    {
        /* Création de la requête pour avoir les villes de cette région */
        $sql2 = "SELECT `id`, `ville`".
        " FROM `mag_gb`".
        " WHERE `id_region` = ". $idr ."".
        " ORDER BY `id`;";
        if($connexion != false)
        {
            $rech_ville = mysql_query($sql2, $connexion);
            /* Un petit compteur pour les villes */
            $nd = 0;
            /* On crée deux tableaux pour les numéros et les noms des villes */
            $code_ville = array();
            $nom_ville = array();
            /* On va mettre les numéros et noms des villes dans les deux tableaux */
            while($ligne_ville = mysql_fetch_assoc($rech_ville))
            {
                array_push($code_ville, $ligne_ville['id']);
                array_push($nom_ville, $ligne_ville['ville']);
                $nd++;
            }
            /* Maintenant on peut construire la liste déroulante */
            ?>
<select name="ville" id="ville">
            <?php  
            for($d = 0; $d<$nd; $d++)
            {
                ?>
  <option value= ""<?php echo((isset($ville_selectionne) && $ville_selectionne == $code_ville[$d])?" selected=\"selected\"":null); ?>><?php echo($nom_ville[$d].""); ?></option>
                <?php
            }
?>
</select>
<?php
        }
        /* Un petit coup de balai */
        mysql_free_result($rech_ville);
    }
?>
<input type="submit" name="ok" id="ok" value="" class="submit" />
</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, veuillez essayer à nouveau ultérieurement.</p>
<?php

et voila le lien pour voir ce que ça donne.
Je cherche encore en attendant une réponse Smiley smile
Hello Ipszy Smiley smile ,

à priori ta page est codée en utf-8 alors que ta base renvoie de l'iso. Il me semble qu'un mysql_query("SET NAMES 'utf8'") après la connexion devrait régler ça.

Sinon je ne comprends pas bien ton problème Smiley rolleyes : soit la région a été modifiée (1er affichage ou modification après avoir choisi une région) auquel cas tu (ré)affiche les villes de la région sélectionnée, soit une ville a été choisie (test if (isset($_POST['ville']))) auquel cas tu affiches l'adresse du magasin qui va bien, non ?
Hello Heyoan Smiley smile ,

Si tu as été voir mon lien tu as dû voir une liste de régions où, lorsque tu choisi une région il y a une liste de villes qui apparaît.
Jusque là ça va, encore que que comme il y a certaines ville où il y a plusieurs magasins donc elle apparaissent en double voir triple Smiley ohwell .
A partir on devrait appuyer sur Valider pour voir s'afficher en dessous le nom, l'adresse et le téléphone du ou des magasins.

Tu m'suis? Smiley biggrin
Oui, oui ! Je te suis Smiley lol ,

par contre je continue de ne pas voir où se situe ta difficulté : de la même façon que tu récupères $_POST['region'] pour afficher les villes il suffit de récupérer $_POST['ville'] pour afficher la liste des magasins de cette ville Smiley rolleyes !

Edit: par contre ça marcherait mieux si les villes en question avaient un value renseigné Smiley langue
Modifié par Heyoan (11 Dec 2007 - 11:35)
coucou Smiley smile ,

Voila j'ai renseigné le valuepour mes villes. Smiley smile
Le fait de mettre mysql_query("SET NAMES 'utf8'") après la connexion ne change rien. Smiley decu

Et lorsque je valide, les coordonnées des magasins ne s'affichent toujours pas Smiley bawling

<p>
  <?php
if(isset($_POST['ok']) && isset($_POST['region']) && $_POST['region'] != "")
{
    $region_selectionnee = $_POST['region'];
    $ville_selectionne = $_POST['ville'];
?>
<p>Vous avez sélectionné le magasin : <?php echo($region_selectionne); ?><?php echo($ville_selectionnee); ?></p>
<?php
}
?>
</p>

Je me rends bien compte que mon erreur est là Smiley ohwell
Amusant Smiley ravi !!!

tu as un e manquant à $region_selectionne et
tu as un e en trop à $ville_selectionnee !!!

Cela dit puisque tu dis que tu peux avoir plusieurs magasins dans une ville il va bien falloir refaire une requête et afficher les résultats mais ça devrait aller mieux Smiley cligne .

Conseil : dormir plus Smiley biggol
Smiley biggol

C'est vrai que je devrais dormir plus!
J'ai déjà l'id du magasin qui s'affiche même s'il ne me sert à rien Smiley ohwell
D'ailleurs je ne comprends même pas pourquoi c'est ça qui s'affiche ... Smiley rolleyes

J'avoue j'apprends le php toute seule... Smiley eek
Ipszy a écrit :
J'ai déjà l'id du magasin qui s'affiche même s'il ne me sert à rien Smiley ohwell
D'ailleurs je ne comprends même pas pourquoi c'est ça qui s'affiche ... Smiley rolleyes

Ce qui s'affiche est la concaténation des 2 value. D'ailleurs c'est une bonne chose car je suppose qu'il va te suffire de faire
"SELECT nom_magasin, adresse_magasin, etc... FROM magasins WHERE ville_magasin = $ville_selectionnee"


Ipszy a écrit :
J'avoue j'apprends le php toute seule... Smiley eek
Pareil Smiley cligne
Modifié par Heyoan (11 Dec 2007 - 12:40)
Alleluja! Smiley biggrin

Merci beaucoup Heyoan !
Si un jour on a l'occasion de se rencontrer je te paye un verre p'tet même un resto Smiley biggrin .

J'aimerais encore Smiley confused que tu regardes sur le lien,
tu choisis : Auvergne et tu me dis s'il y a moyen de régler le fait que certaines villes ne s'affichent qu'une seule fois
mais qu'à la validation j'ai toutes les coordonnées des magasins qui s'affichent.
Si oui peux-tu m'aiguiller sur la voie?
Pour "bien" faire tes tables devraient être structurées comme ça :

regions
* id_region
* libelle_region

villes
* id_ville
* libelle_ville
* id_region_ville (correspond à id_region de la table regions)

magasins
* id_magasin
* libelle_magasin
* adresse_magasin
* code_postal_magasin
* telephone_magasin
* id_ville_magasin (correspond à id_ville de la table villes)


Pour le traitement je ferais comme ça :

- si premier affichage => on n'affiche que le <select> région (le value correspond à id_region sauf -1 qui correspond à 'aucune sélection')
'SELECT id_region, libelle_region FROM regions ORDER BY libelle_region'

- si une région a été sélectionnée ($_POST['region'] <> -1) on affiche le <select> ville (le value correspond à id_ville)
'SELECT id_ville, libelle_ville FROM villes WHERE id_region_ville = '.$_POST['region'].' ORDER BY libelle_ville'

- si une région a été sélectionnée ($_POST['region'] <> -1) et donc qu'une ville peut être sélectionnée on affiche également le(s) magasin(s) correspondant(s) (pour le premier affichage on liste les magasins de la première ville de la liste)
'SELECT id_magasin, libelle_magasin, etc.. FROM magasins WHERE id_ville_magasin = '.$ville.' ORDER BY code_postal_magasin'
$ville vaut $_POST['ville'] ou le value de la première ville listée...

J'espère être clair Smiley rolleyes Smiley langue

Pour le resto ce serait avec plaisir mais tu habites un peu loin Smiley lol
Génial! j'étais justement en train de créer ma table villes Smiley biggrin

Je continue donc...

Il n'y a que les montagnes qui ne se rencontrent pas Smiley lol
Bien le bonjour en ce jour ensoleillé par de la Lorraine Smiley smile

Donc après avoir créer ma table des villes où se trouvent des points de ventes de mon client,
j'ai bien réussie à faire le lien entre les tables régions et villes. visible ici
Le problème est qu'avec mes maigres connaissances en php Smiley decu ,
lorsque je fais une requête vers ma 3eme table (magasins) où se trouvent les coordonnées des magasins,
j'ai une erreur que je n'arrive pas voir pour afficher les coordonnées.

Je désire dans un 1er temps afficher en dessous à gauche, une liste du nom des points de vente s'il y en a plusieurs dans la même ville,
et en cliquant sur chaque nom pouvoir afficher ses coordonnées en dessous à droite.

S'il n'y a qu'un point de vente afficher de suite les coordonnées.

C'est possible ce que je demande?

Le soleil s'en va, je devrais peut-être être moins perfectionniste... Smiley ohwell

Voila mon code :

/* 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++;
        }
    }
    ?>
    </p>
  <form action="<?php echo($_SERVER['PHP_SELF']); ?>" method="post" id="chgmag">
<fieldset style="border: 3px double #f49247">
<legend>Sélectionnez une région</legend>
<select name="region" id="region" onchange="document.forms['chgmag'].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)
    {
        /* Création de la requête pour avoir les villes de cette région */
        $sql2 = "SELECT `id_ville`, `ville`".
        " FROM `ville`".
        " WHERE `id_region` = ". $idr ."".
        " ORDER BY `ville`;";
        if($connexion != false)
        {
            $rech_ville = mysql_query($sql2, $connexion);
            /* Un petit compteur pour les villes */
            $nd = 0;

/* On crée deux tableaux pour les numéros et les noms des villes */

            $code_ville = array();
            $nom_ville = array();
            /* On va mettre les numéros et noms des villes dans les deux tableaux */
            while($ligne_ville = mysql_fetch_assoc($rech_ville))
            {
                array_push($code_ville, $ligne_ville['id_ville']);
                array_push($nom_ville, $ligne_ville['ville']);
                $nd++;
            }

/* Maintenant on peut construire la liste déroulante */

            ?>
<select name="ville" id="ville">
            <?php  
            for($d = 0; $d<$nd; $d++)
            {
                ?>
  <option value= "<?php echo($code_ville[$d]); ?>"<?php echo((isset($ville_selectionne) && $ville_selectionne == $code_ville[$d])?" selected=\"selected\"":null); ?>><?php echo($nom_ville[$d].""); ?></option>
                <?php
            }
?>
</select>
<?php
        }

/* Un petit coup de balai */
        
       mysql_free_result($rech_ville);
    }

/* 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)
	 {

/* Création de la requête pour avoir les magasins de cette ville */
		
               $sql3 ="SELECT `id_mag`, `societe`, `adresse`, `cp`, `ville`, `telephone`".
"FROM `mag_gb`".
"WHERE `id_ville` = ".$ville."".
"ORDER BY `cp`;";
if($connexion != false)
{
$resultat = mysql_query($sql3, $connexion);
	echo "<table>";
		while( $row = mysql_fetch_assoc($resultat))             // erreur ligne 147
		{
			echo "<tr><td>$row->societe</td></tr>";
		}
	echo "</table>";
}
}
?>

<input type="submit" name="ok" id="ok" value="" class="submit" />
<p>
  <?php
if(isset($_POST['ok']) && isset($_POST['region']) && $_POST['region'] != "")
{
    $region_selectionnee = $_POST['region'];
    $ville_selectionnee = $_POST['ville'];
	

?>
<p>Vous avez sélectionné le(s) magasin(s) de la région : <?php echo($region_selectionnee); ?> de la ville : <?php echo($ville_selectionnee); ?></p>

<?php

}
?>
</p>
</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, veuillez essayer à nouveau ultérieurement.</p>
<?php
}
?>

J'ai noté où se situe ma ligne 147 qui est sur le lien
Modifié par Ipszy (12 Dec 2007 - 13:18)
Ola que tal Smiley smile !

Bon je viens de faire un test avec le code suivant :
<?php
// Récupération des variables POST_ées
$idr = (isset($_POST['region'])) ? $_POST['region'] : -1; // région sélectionnée
$sav_idr = (isset($_POST['sav_idr'])) ? $_POST['sav_idr'] : -1; // sauvegarde de la dernière région sélectionnée
// Si la région sélectionnée a été modifiée on réinitialise la ville sinon on la récupère
if ($idr != $sav_idr) {
	$idv = 0;
} else {
	$idv = (isset($_POST['ville'])) ? $_POST['ville'] : 0;
}

/* Connexion à MySQL */
$connexion = mysql_connect("localhost", "root", "");
mysql_query("SET NAMES 'utf8'");
if($connexion != false)
{
    $choixbase = mysql_select_db("test", $connexion);
	// Sélection d'une région
?>

<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post" id="chgmag">
  <fieldset style="border: 3px double #f49247">
  <legend>Sélectionnez une région</legend>
  <select name="region" id="region" onchange="document.forms['chgmag'].submit();">
    <option value="-1">- - Choisissez une région - -</option>
    <?php
    $sql1 = "SELECT id_region, region FROM region ORDER BY id_region";
    $rech_regions = mysql_query($sql1);
    if($rech_regions != false)
    {
        while($ligne = mysql_fetch_assoc($rech_regions))
        { ?>
<option value="<?php echo($ligne['id_region']); ?>" <?php echo(($idr == $ligne['id_region'])? 'selected="selected"' : ''); ?>><?php echo($ligne['region']); ?></option>
    <?php }
    }
?>
</select>
  <input type="hidden" name="sav_idr" value="<?php echo $idr; ?>" />
  <?php
	/* On commence par vérifier si une région a été sélectionnée */
    if($idr != -1) {
	?>
  <select name="ville" id="ville">
    <?php
        /* Création de la requête pour avoir les villes de cette région */
        $sql2 = 'SELECT id_ville, ville FROM ville WHERE id_region = '.$idr.'  ORDER BY ville';
        if($connexion != false)
        {
            $rech_ville = mysql_query($sql2, $connexion);
            /* On va mettre les numéros et noms des villes dans les deux tableaux */
            while($ligne_ville = mysql_fetch_assoc($rech_ville))
            {
			if ($idv == 0) { $idv = $ligne_ville['id_ville']; } // Si aucune ville sélectionnée on sélectionne la première
			?>
    <option value= "<?php echo($ligne_ville['id_ville']); ?>" <?php echo(($idv == $ligne_ville['id_ville'])? 'selected="selected"' : ''); ?>><?php echo($ligne_ville['ville']); ?></option>
    <?php
            }
	}
		?>
  </select>
  <?php } ?>
  <input type="submit" name="ok" id="ok" value="OK" class="submit" />
  </fieldset>
</form>
<?php
    if($idr != -1) {
	/* Création de la requête pour avoir les magasins de cette ville */
	$sql3 ='SELECT id_mag, societe, adresse, cp, ville, telephone FROM mag_gb WHERE id_ville = '.$idv.' ORDER BY cp';
	if($connexion != false)
	{
	$rech_mag = mysql_query($sql3, $connexion);
		echo "<table>";
			while( $ligne_mag = mysql_fetch_assoc($rech_mag))             // erreur ligne 147
			{
				echo "<tr><td>".$ligne_mag['societe']."</td></tr>";
			}
		echo "</table>";
	}
}
/* 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, veuillez essayer à nouveau ultérieurement.</p>
<?php
}
?>
Quelques remarques :

- j'ai enlevé la connexion persistante (pconnect) et les mysql_free_result qui du coup n'ont plus rien à faire là car à moins que tu n'aies une bonne raison (autre que d'avoir repris un code écrit comme ça Smiley cligne ) c'est inutile...

- le $row->societe ne peux marcher que si tu utilises une classe PHP mais je n'en ai pas vu donc je l'ai aussi viré...

- pour ton idée de n'afficher que le nom des sociétés et de pouvoir cliquer dessus je dois bien dire que je n'en vois pas bien l'intérêt puisqu'à priori un visiteur de Clermont Ferrand n'en connait aucune des 3 existantes et qu'il va de toutes façons cliquer sur les 3 !!! Mais bon si tu veux quand même faire comme ça je te suggères de le faire en Javascript non intrusif (afficher / masquer un div) plutôt que de re-soumettre le formulaire encore une fois...

- sinon ce n'est pas une très bonne idée de mettre le bouton valider en background-image dans le css car en cas d'images désactivées on ne peut plus rien envoyer : il faudrait donc remplacer cela par un <input type="image" alt="Valider" ... />

Voili voilà !

A pluche Smiley langue
Modifié par Heyoan (15 Apr 2009 - 14:49)
Bonjour,

Me revoilà après ces quelques jours d'absences.
Je te remercie pour ta précieuse aide Heyoan.
Je te souhaite bonheur, santé et prospérité pour cette nouvelle année.

Smiley smile
Modifié par Ipszy (04 Jan 2008 - 12:48)
Pages :