Récupérer un portion de chaine de caractère.

Petit nouveau ! | 3 Messages

05 déc. 2005, 13:10

Bonjour,

Je voudrais adapter un programme qui donne le nom d'une commune en fonction du code postal et vice versa pour un association de revendeurs.

La principale différence est q'un code postal ne correspond pas forcément a un revendeur (il peut y avoir 0 réponses)

Je voudrais donc, au cas ou il y a 0 réponse, faire une recherche dans tout le département. Par exemple si la personne entre 85540, je prend les 2 premiers chiffres (85) par une inscruction : substr($codepostal,0,2) et je relance une requette.

Le premier problême que je rencontre c'est que ma variable ne retourne rien : echo substr($codepostal,0,2); alors qu'a un autre endroit du programme la variable $codepostal renvoit bien quelque chose : echo "Code postal: $codepostal , nom de ville contenant: $ville<BR>";
(je suis débutant en php)
Si déja quelqun peut me dire pourquoi ma variable est vide.
Voici le programme :
------------------------
function lance_requete($db, $sql) {
   if (! $res=mysql_db_query($db, $sql)) {
   echo mysql_error();
   exit;
   }
   return $res;
 }

function affichage_resultat($result) {
$nombre=mysql_num_fields($result);
$nbenr = mysql_num_rows($result);
if ($nbenr == 0) {
echo "Il n'y a pas de réponse correpondant à votre code postal.";
echo "<br>Recherche sur l'ensemble du département :";
echo substr($codepostal,0,2); // <= ERREUR ICI
} else {
echo "Il y a $nbenr réponse(s) correpondant à votre demande.";
echo "<table width=90% border=0 cellpadding='2' cellspacing='2'>";
echo "<tr bgcolor=#3e4c55>";
for ($i=0;$i<$nombre;$i++){
   echo "<th><font color='#FFFFFF'>";
   $nom_zone[$i]=mysql_field_name($result,$i);
   echo $nom_zone[$i];
   echo "</th></font>";
   }

echo "</tr>";
echo "<tr>";
$compteur=0;

while ($compteur<$nbenr)
      {
        for ($recup=0;$recup<$nombre;$recup++)
           {
           $val_zone[$recup]=mysql_result($result,$compteur,$nom_zone[$recup]);
           if (intval($compteur/2)==$compteur/2)
           {
           echo "<td bgcolor='#bee0fa'><font color='#000000' size='-1'>$val_zone[$recup]</font></td>";
           }
           else
           {
           echo "<td bgcolor='#afdddb'><font color='#000000' size='-1'>$val_zone[$recup]</font></td>";
           }
           }

      echo "</tr>";
      $compteur++;
      }

echo "</table>";
} 
}        
                                     
$codepostal=trim($codepostal);
// Requete contenant codepostal et ville provenant du formulaire.
$sql="SELECT cp_codpos as code_postal,cp_ville as ville,";
$sql.="cp_adresse as adresse ";
$sql.="FROM codpostal WHERE cp_codpos like '$codepostal%' ";
$sql.="AND cp_ville like '%$ville%' ORDER BY cp_codpos,cp_ville";

If ($res=lance_requete($db,$sql))  {
   echo "Revendeurs les plus proches du lieu avec les critères suivants :<br>";
   echo "Code postal: $codepostal , nom de ville contenant: $ville<BR>"; // <= ERREUR ICI
   affichage_resultat($res);
   }
----------------------------

Merci

Krysteo

Modération (Zeus) : merci d'utiliser les balises
 et [CODE] pour poster du code. Pour cette fois, je l'ai fait pour toi

De plus, j'ai remplacé le surlignage rouge par un commentaire[/color]

Eléphant du PHP | 383 Messages

05 déc. 2005, 13:41

tout simplement parce que ta variable $codepostal est locale, cad qu'elle est defnie dans le corps du programme, mais pas dans la fonction. en d'autre terme, aux yeux du compilateur $code_postal dans ta fonction et $code_postal dans le programme sont 2 variables differentes, qui n'ont pas de raison d'avoir la meme valeur. tu as donc trois possibilite :

- declarer $codepostal en global : global $codepostal; tu dois faire cela dans le programme et dans la fonction affiche_resultat. cela va indiquer au compilateur que ces 2 variables a priori differntes sont les memes.
- passer code_postal en paramtetre de ta fonction
- ou ne pas utiliser de fonction, et tout mettre d'un seul tenant. une fonction est utile pour effectuer une tache repetitive. creer une fonction pour ne l'appeler qu'une fois ne fait pas gagner de temps ! je ne sais pas si tu reutilise plusieurs fois ces fonctions dans la page, mais si ce n'est pas le cas, il vaudrait mieux s'en passer.

ViPHP
ViPHP | 2144 Messages

05 déc. 2005, 14:53

Tout à fait exact jobherzt, on peut éventuellement avoir une fonction qui ne sera appelée qu'une seule fois par soucis de lisibilité du code, si le traitement effectuée est particulièrement complexe.
Mais dans le cas présent, en effet, l'usage d'une fonction me parait inutile...

Petit nouveau ! | 3 Messages

05 déc. 2005, 14:54

Merci, ca fonctionne avec la variable globale.

Je recupère donc les 2 premiers chiffres du code postal.
A partir de là comment renvoyer automatiquement une requette avec cette nouvelle variable contenant les 2 chiffres ?

ViPHP
ViPHP | 2144 Messages

05 déc. 2005, 15:00

Ne te casse pas la tête, fais le sans fonction, ce sera plus rapide, plus léger, et plus simple :wink: :wink: :wink:

Eléphant du PHP | 383 Messages

05 déc. 2005, 15:22

je ferais un truc du genre :
<?

$resultat=mysql_query("select * bla where codepostal=$codepostal");
if(mysql_num_rows($resultat)==0)
{
      $resultat=mysql_query("selct * bla where codepostal like ".substr(0,2,$codepostal)."%";
}

?>
comme ca dans la suite du programme tu ne manipules que la variables $resultat, peu importe par quoi elle a ete généré.

Invité
Invité n'ayant pas de compte PHPfrance

05 déc. 2005, 16:18

J'ai fais ca :

---------------
function affichage_resultat($result) {
$nombre=mysql_num_fields($result);
$nbenr = mysql_num_rows($result);
if ($nbenr == 0) {
echo "Il n'y a pas de réponse correpondant à votre code postal.";
echo "<br>Recherche sur l'ensemble du département : ";
global $codepostal;
$newcode=substr($codepostal,0,2);
echo $newcode; 

$sql="SELECT cp_codpos as code_postal,cp_ville as ville,";
$sql.="cp_adresse as adresse ";
$sql.="FROM codpostal WHERE cp_codpos like '$newcode%' ";
$sql.="AND cp_ville like '%$ville%' ORDER BY cp_codpos,cp_ville";

echo "<table width=90% border=0 cellpadding='2' cellspacing='2'>";
echo "<tr bgcolor=#3e4c55>";
for ($i=0;$i<$nombre;$i++){
   echo "<th><font color='#FFFFFF'>";
   $nom_zone[$i]=mysql_field_name($result,$i);
   echo $nom_zone[$i];
   echo "</th></font>";
   }

echo "</tr>";
echo "<tr>";
$compteur=0;

while ($compteur<$nbenr)
      {
        for ($recup=0;$recup<$nombre;$recup++)
           {
           $val_zone[$recup]=mysql_result($result,$compteur,$nom_zone[$recup]);
           if (intval($compteur/2)==$compteur/2)
           {
           echo "<td bgcolor='#bee0fa'><font color='#000000' size='-1'>$val_zone[$recup]</font></td>";
           }
           else
           {
           echo "<td bgcolor='#afdddb'><font color='#000000' size='-1'>$val_zone[$recup]</font></td>";
           }
           }

      echo "</tr>";
      $compteur++;
      }

echo "</table>";
--------------------

Quand je lance le programme il me construit bien le tableau (cas ou nb reponses=0) mais je n'ai rien comme données. Dans le cas if ($nbenr == 0), j'ai bien ma variable contenant les 2 premiers chiffres du code postal mais c'est pour la requette que ca coince. J'ai bien l'impression que je n'envois pas de requette dans la fonction... et la je ne sais pas comment faire.

Modération (Zeus) : même remarque

Eléphant du PHP | 383 Messages

05 déc. 2005, 16:48

ben apparemment, apres avoir construit ta requet modifiee, tu ne refais pas de myql_query. donc il y a peu de risques que tu aie qqchose :-/

Petit nouveau ! | 3 Messages

05 déc. 2005, 17:17

Exact, en faisant un : $res=lance_requete($db,$sql) ca fonctionne.

Merci bien :)