Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

passage parametres php

8 réponses
Avatar
Gaelle
Bonjour,

Je débute en php, et je rencontre un problème.
J'ai un formulaire qui contient 2 listes déroulantes contenant dont
chacun des items provient d'une base de données MySQL.
Afin d'effectuer une recherche, je voudrais en postant le form
récupérer les valeurs des 2 listes selectionnées par l'utilisateur.
Dans la barre de lien, les 2 valeurs apparaissent, mais lorsque
j'affiche une fenetre JS je n'ai qu'une seule valeur.
Je ne vois pas mon erreur... pourriez vous m'aider ??

Merci d'avance !!!! :D

Voici le code :
// connexion a la base
<form name=\"choix\" method=GET action=ind.php?dep=$a&arr=$b>
<select name=\"menuvdep\">
<option selected>Sélectionnez une ville</option>";
// Recuperation des villes de départ
$tab1 =array();
while($row = mysql_fetch_row($result)){
$tab1[] = $row[0];
}

$tabtri1 = array_unique($tab1);
sort($tabtri1);
for($j=0;$j<sizeof($tabtri1);$j++)
{ $a = $tabtri1[$j];
echo "<option value=$a>$a</option>";}

echo "<tr><td>pays d'arrivée</td></tr>";
$query = "SELECT paysdest FROM voyage ";
$result = mysql_query($query);
echo "<tr><td><select name=\"menupaysdest\">
<option selected>Sélectionnez un pays</option>";
// Recuperation des pays de dest
$tab = array();
while($row = mysql_fetch_row($result)){
$tab[]= $row[0];
}
$tabtri = array_unique($tab);
sort($tabtri);
for($i=0;$i<sizeof($tabtri);$i++)
{$b = $tabtri[$i];
echo "<option value=$b>$b</option>";}


echo"</select>"

echo"<input type=hidden name="dep" value=$a >"
echo"<input type=hidden name="dest" value=$b >"
echo"<input type="submit" name="fin" value="voir" >"
?>
</form>

--
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net

8 réponses

Avatar
Guillaume Bouchard
Gaelle wrote:
Bonjour,


Bonjour/soir.

Je débute en php, et je rencontre un problème.


Cela arrive.

J'ai un formulaire qui contient 2 listes déroulantes contenant dont
chacun des items provient d'une base de données MySQL.
Afin d'effectuer une recherche, je voudrais en postant le form récupérer
les valeurs des 2 listes selectionnées par l'utilisateur.
Dans la barre de lien, les 2 valeurs apparaissent, mais lorsque
j'affiche une fenetre JS je n'ai qu'une seule valeur.


Afficher une fenetre JS ? Pardon ? Ne voyant pas la moindre once de JS
dans ton code, je ne comprand pas.

Je ne vois pas mon erreur... pourriez vous m'aider ??


Cf plus haut. Je vais juste me contenter de corriger les mauvaises
habitudes à ne pas prendre.

Voici le code :
// connexion a la base


Ne pas oublié la gestion d'erreur (Cf plus bas) lors de la connection à
la base.

<form name="choix" method=GET action=ind.php?dep=$a&arr=$b>
<select name="menuvdep">
<option selected>Sélectionnez une ville</option>";


Il manque pas un echo quelque part.
Maitenant je te conseil d'utiliser des chaines à quotes simples pour
eviter de devoir backslasher tes formulaires, cela devient long et
illisibles à la fin.

Maitenant, premier point important, tu ne connais pas le html. Or php
genere du html, mais il n'en fait pas du propre par magie. Donc apprend
le html ;o) D'autant plus qu'un html foireux peut être la cause d'un
script php qui ne fonctionne pas (dans le cas de l'utilisation de
formulaire)

<?php
echo '<form name="choix" method="GET"
action="ind.php?dep='.url_encode($a).'&amp;arr='.url_encode($b).'">";
?>
L'attibut selected doit être remplit. Je sais c'est moche, mais c'est
ainsi. Des grands sages l'on decidé (comme dirait mon prof de math)

<option selected="selected">Sélectionnez une ville</option>

method et action prennent des quotes. le & de l'url s'ecrit &amp;

// Recuperation des villes de départ
$tab1 =array();
while($row = mysql_fetch_row($result)){
$tab1[] = $row[0];
}


La fonction mysql_fetch_assoc te renvera un tableau indicer avec les
noms des champs dans ta base SQL. Ce qui te permetra d'utiliser
$tab1[numero]['nomduchamps'];

De plus, on à pour habitude de ne pas stocker l'integralité des
resultats d'une requete SQL dans un tableau, cela peut vite prendre une
place monstrueuse. Le truc etant de faire la boucle de cette façon :

while( $truc = mysql_fetch_assoc($res)){

// Traitement ligne par ligne.
$data['champs1'];


}



$tabtri1 = array_unique($tab1);
sort($tabtri1);


Ces deux lignes peuvent être evitée grace à la bonne utilisation du SQL.
Principalement les clauses DISTINCT, ainsi que ORDERBY.

for($j=0;$j<sizeof($tabtri1);$j++)


Cette boucle peut être evité en mettant tout son contenu dans la boucle
while (cf plus haut)

{ $a = $tabtri1[$j];




echo "<option value=$a>$a</option>";}


Html toujours et encore, les quotes NE sont PAS en OPTION !

echo '<option value="'.htmlspecialchars($a).'">$a</option>';


echo "<tr><td>pays d'arrivée</td></tr>";


Je passerais mon avis sur les td tr truc, ce n'est pas le debat ;o)

Par contre, je ne comprand pas, juste avant tu affichais un element
option d'une liste et là tu joue avec les tableaux. Il faut donc fermer
la balise select.

Attention à l'imbrications de tes balises html. Je te conseil de passer
ta page au validateur du W3C (http://validator.w3.org) qui t'insulteras
pour tous les élements de syntaxes mal foutue tel que ces imbrications.

$query = "SELECT paysdest FROM voyage ";
$result = mysql_query($query);


Tu ne fait aucune gestion d'erreurs, si ta requete SQL rate, tu ne le
sauras pas:

$result = mysql_query($query) or die(mysql_error().$query);

echo "<tr><td><select name="menupaysdest">
<option selected>Sélectionnez un pays</option>";
// Recuperation des pays de dest
$tab = array();
while($row = mysql_fetch_row($result)){
$tab[]= $row[0];
}
$tabtri = array_unique($tab);
sort($tabtri);
for($i=0;$i<sizeof($tabtri);$i++)
{$b = $tabtri[$i];
echo "<option value=$b>$b</option>";}


echo"</select>"


Même problème, tu pourrais imbriquer cela pour faire plus propre et tu
pourrais eviter les fonctions de tri en utilisant celle de mysql qui
sont fait pour ;o)

echo"<input type=hidden name="dep" value=$a >"
echo"<input type=hidden name="dest" value=$b >"
echo"<input type="submit" name="fin" value="voir" >"


echo '<input type="hidden" name="dep" value="'.htmlspecialchars($a).'" />';
echo '<input type="hidden" name="dest" value="'.htmlspecialchars($b).'" />';
echo '<input type="submit" name="fin" value="voir" />";

Je ne comprandrais jamais cette manie d'oublié des doubles quotes a
certains endroit. Un peu de coherence, cela me choquerais moins de ne
pas en voir que d'en voir juste la moitié.

J'ai ajouté les fonctions htmlspecialchars et url_encode qui permettent
de "protegé" tes chaines pour ne pas avoir de bonne surprises :

- url_encode prepare les chaines pour les url car certains caractères ne
sont pas autorisés dans les urls (tu devras utilisé url_decode pour lire
tes variables.)

- htmlspecialchars permet que les formulaires marchent bien, je te fais
un exemple qui justifie de plus les guillemets.

Imagine que tu affiche dans un champs input un variable qui contient
"toto bubu", voici le html obtenu, sans les guillemets:

<input type="text" name="truc" value=toto bubu />

Le navigateur risque de n'afficher que toto et d'oublier bubu, alors
qu'avec les quotes, il n'oublie rien.

Maitenant, pourquoi le htmlspecialchars, c'est pour te proteger d'effet
indesirables qui peuvent casser ton application.


Imagine la variable qui contient

'hahahah" /> I'm the warrior --mechand code JS qui flash de partout --
<input type="text" name="bouh" value="'

Voici ce que ton champs texte va recevoir:


<input type="text" name="truc" value="hahahah" /> I'm the warrior
--mechand code JS qui flash de partout -- <input type="text" name="bouh"
value="" />

Tu saisis la faille ? Alors que htmlspecialchars va remplacer les
caracteres dangereux par des entites html inoffencives.

Ouf ;o)

--
Guillaume.

Avatar
Olivier Miakinen
Le 17/01/2005 17:39, Guillaume Bouchard répondait à Gaelle :

<form name="choix" method=GET action=ind.php?dep=$a&arr=$b>
<select name="menuvdep">
<option selected>Sélectionnez une ville</option>";


Il manque pas un echo quelque part.
Maitenant je te conseil d'utiliser des chaines à quotes simples pour
eviter de devoir backslasher tes formulaires, cela devient long et
illisibles à la fin.


Oui. Ceci peut se faire de deux façons : remplacer les guillemets
doubles par des simples dans les chaînes PHP ; ou remplacer les
guillemets doubles par des simples dans le code HTML.

Je rappelle, parce que tout le monde ne le sait pas encore, que ceci est
légal dans *toutes* les versions de HTML de même que dans *toutes* les
versions de XHTML, et que c'est reconnu par *tous* les navigateurs
connus (oui, même Internet Explorer).

<?php
echo '<form name="choix" method="GET"
action="ind.php?dep='.url_encode($a).'&amp;arr='.url_encode($b).'">";
?>


Autre possibilité :

<?php
echo "<form name='choix' method='GET'
action='ind.php?dep=" .url_encode($a). "&amp;arr=" .url_encode($b). ">";
?>

Ou encore, si le contenu des variables $a et $b est sûr (par exemple
déjà url_encodé) :

<?php
echo "<form name='choix' method='GET' action='ind.php?dep=$a&amp;arr=$b>";
?>

L'attibut selected doit être rempli. Je sais c'est moche, mais c'est
ainsi. Des grands sages l'on decidé (comme dirait mon prof de math)

<option selected="selected">Sélectionnez une ville</option>


C'est pas plutôt ton prof de XHTML qui disait ça ? En HTML, ce n'est pas
obligatoire (même si ça ne peut pas faire de mal).

method et action prennent des quotes.


Ça aussi, c'est toléré en HTML pour les chaînes « sans problème » (i.e.
pas d'espaces, pas de caractères réservés, etc.) c'est-à-dire que des
chaînes ne comportant que des lettres et des chiffres n'ont pas besoin
d'être guillemetées.

Cela dit, encore plus que pour le selected="selected", il est vraiment
recommandé de prendre l'habitude de mettre des guillemets dans tous les
cas, même en HTML. Cela permet d'éviter des problèmes pour le cas où un
caractère non prévu se glisse dans la chaîne.

le & de l'url s'ecrit &amp;


Oui, ça c'est obligatoire même en HTML. Ne pas oublier le point-virgule,
sinon cela ne marche que dans les navigateurs bugués (je ne cite pas de
nom).

echo"<input type=hidden name="dep" value=$a >"
echo"<input type=hidden name="dest" value=$b >"
echo"<input type="submit" name="fin" value="voir" >"


echo '<input type="hidden" name="dep" value="'.htmlspecialchars($a).'" />';
echo '<input type="hidden" name="dest" value="'.htmlspecialchars($b).'" />';
echo '<input type="submit" name="fin" value="voir" />";

Je ne comprendrai jamais cette manie d'oublier des doubles quotes à
certains endroit. Un peu de cohérence, cela me choquerait moins de ne
pas en voir que d'en voir juste la moitié.


Tu es trop jeune : tu as dû apprendre le XHTML directement, alors que
d'autres se contentent de recopier des bouts de HTML datant des années
1990. Heureux homme.

Imagine la variable qui contient

'hahahah" /> I'm the warrior --mechand code JS qui flash de partout --
<input type="text" name="bouh" value="'

Voici ce que ton champs texte va recevoir:

<input type="text" name="truc" value="hahahah" /> I'm the warrior
--mechand code JS qui flash de partout -- <input type="text" name="bouh"
value="" />


Excellent exemple.

Ouf ;o)


Et bravo pour ton courage d'avoir répondu à tout.

--
Olivier Miakinen
Non, monsieur le juge, je vous le jure : jamais je n'ai cité
Bruxelles dans ma signature.


Avatar
Guillaume Bouchard
Olivier Miakinen wrote:
Je rappelle, parce que tout le monde ne le sait pas encore, que ceci est
légal dans *toutes* les versions de HTML de même que dans *toutes* les
versions de XHTML, et que c'est reconnu par *tous* les navigateurs
connus (oui, même Internet Explorer).


C'est pas faux ;o) Mais c'est pas beau, je trouve les quotes doubles
plus jolies...

<?php
echo "<form name='choix' method='GET' action='ind.php?dep=$a&amp;arr=$b>";
?>


/mode chieur=on
Non, mais ce n'est pas optimisé tout cela :)
/mode chieur=off


C'est pas plutôt ton prof de XHTML qui disait ça ? En HTML, ce n'est pas
obligatoire (même si ça ne peut pas faire de mal).


Effectivement encore.

Ça aussi, c'est toléré en HTML pour les chaînes « sans problème » (i.e.
pas d'espaces, pas de caractères réservés, etc.) c'est-à-dire que des
chaînes ne comportant que des lettres et des chiffres n'ont pas besoin
d'être guillemetées.


Oui, mais vaux mieux prendre l'habitude, sinon on se retrouve avec une
question sur fclp : "Mes variables sont tronqués dans les formulaires,
au secours."

Tu es trop jeune : tu as dû apprendre le XHTML directement, alors que
d'autres se contentent de recopier des bouts de HTML datant des années
1990. Heureux homme.


J'admet être trop jeune, quoi que l'age se fait sentir en ce moment ;o)
mais j'ai apprit le html au debut en recopiant dans mon code php le code
que generait frontpage, puis dreamweaver. Et j'ai vite prit l'habitude
de rajouté des quotes de partout pour un souci d'homogeneité.

Excellent exemple.

Et bravo pour ton courage d'avoir répondu à tout.


Je me suis fais plaisir, après 3 heures enfermé dans un amphi à cogiter
sur des formules bizarre, rien de mieux pour decompresser qu'un peu de php.

--
Guillaume.

Avatar
Olivier Miakinen
Le 18/01/2005 09:12, Guillaume Bouchard me répondait :

[ guillemets simples en HTML ]


C'est pas faux ;o) Mais c'est pas beau, je trouve les quotes doubles
plus jolies...


Simple question d'habitude. Les guillemets simples ne semblent pas te
gêner dans le code PHP, et l'utilisateur final ne verra ni les uns ni
les autres.

<?php
echo "<form name='choix' method='GET' action='ind.php?dep=$a&amp;arr=$b>";
?>


/mode chieur=on
Non, mais ce n'est pas optimisé tout cela :)
/mode chieur=off


/mode remarque_prise_au_premier_degré=on
John Gallet a maintes fois répondu sur ce point. Je passe.
/mode remarque_prise_au_premier_degré=off

[ selected="selected" ]

C'est pas plutôt ton prof de XHTML qui disait ça ? En HTML, ce n'est pas
obligatoire (même si ça ne peut pas faire de mal).



Dans la norme HTML 4.01, on lit ceci :

<http://www.w3.org/TR/html4/intro/sgmltut.html#h-3.3.4.2>
In HTML, boolean attributes may appear in minimized form -- the
attribute's value appears alone in the element's start tag. Thus,
selected may be set by writing:
<OPTION selected>
instead of:
<OPTION selected="selected">
</>

Mais surtout :

<(idem)>
Authors should be aware that many user agents only recognize the
minimized form of boolean attributes and not the full form.
</>

[ traduction pour les non anglophones : on peut écrire aussi bien
« selected » que « selected="selected" », mais de nombreux (?)
navigateurs ne reconnaissent que la première forme et pas la seconde ]


Pendant que j'y suis, un peu plus haut sur la même page il y a :

<http://www.w3.org/TR/html4/intro/sgmltut.html#h-3.2.2>
By default, SGML requires that all attribute values be delimited using
either double quotation marks (ASCII decimal 34) or single quotation
marks (ASCII decimal 39). Single quote marks can be included within the
attribute value when the value is delimited by double quote marks, and
vice versa.
</>

[ traduction : SGML impose que toutes les valeurs d'attributs soient
délimitées soit par des guillemets simples, soit par des guillemets
doubles. Des guillemets simples peuvent être inclus dans la valeur de
l'attribut quand celle-ci est délimitée par des guillemets doubles, et
réciproquement. ]

<(idem)>
In certain cases, authors may specify the value of an attribute without
any quotation marks. The attribute value may only contain letters (a-z
and A-Z), digits (0-9) [etc.]. We recommend using quotation marks even
when it is possible to eliminate them.
</>

[ traduction : bien qu'il soit toléré dans HTML de se passer des
guillemets pour certaines valeurs d'attributs, la norme recommande
de toujours les mettre. ]



En conclusion : il est peut-être plus sage d'écrire « selected » au
lieu de « selected="selected" » quand on fait du HTML (encore que je ne
connaisse pas de navigateur à qui cela pose un problème) mais en tout
cas il vaut mieux écrire « type="hidden" » plutôt que « type=hidden ».


Avatar
FAb
Olivier Miakinen <om+ writes:

Le 17/01/2005 17:39, Guillaume Bouchard répondait à Gaelle :

Oui. Ceci peut se faire de deux façons : remplacer les guillemets
doubles par des simples dans les chaînes PHP ; ou remplacer les
guillemets doubles par des simples dans le code HTML.

Je rappelle, parce que tout le monde ne le sait pas encore, que ceci est
légal dans *toutes* les versions de HTML de même que dans *toutes* les
versions de XHTML, et que c'est reconnu par *tous* les navigateurs
connus (oui, même Internet Explorer).


%-)
Faudra le dire au robot de validation du w3c.

FAb

Avatar
Olivier Miakinen

Je rappelle, parce que tout le monde ne le sait pas encore, que ceci est
légal dans *toutes* les versions de HTML de même que dans *toutes* les
versions de XHTML, et que c'est reconnu par *tous* les navigateurs
connus (oui, même Internet Explorer).


Faudra le dire au robot de validation du w3c.


Lui dire quoi ? Que beaucoup de développeurs croient que ce n'est pas
valide, alors que lui sait bien que ça l'est ?

Voir :
<http://www.miakinen.net/vrac/valide.html>
<http://validator.w3.org/check?uri=http%3A%2F%2Fwww.miakinen.net%2Fvrac%2Fvalide.html;ss=1>

--
Olivier Miakinen
Non, monsieur le juge, je vous le jure : jamais je n'ai cité
Bruxelles dans ma signature.


Avatar
FAb
Olivier Miakinen <om+ writes:


Je rappelle, parce que tout le monde ne le sait pas encore, que ceci est
légal dans *toutes* les versions de HTML de même que dans *toutes* les
versions de XHTML, et que c'est reconnu par *tous* les navigateurs
connus (oui, même Internet Explorer).


Faudra le dire au robot de validation du w3c.


Lui dire quoi ? Que beaucoup de développeurs croient que ce n'est pas
valide, alors que lui sait bien que ça l'est ?

Voir :
<http://www.miakinen.net/vrac/valide.html>
<http://validator.w3.org/check?uri=http%3A%2F%2Fwww.miakinen.net%2Fvrac%2Fvalide.html;ss=1>


Au temps pour moi ! J'ai du rêver et garder rancune envers ce robot ;-)
Je confonds peut-être avec mes lectures sur le xml.

FAb



Avatar
FAb
FAb writes:

Olivier Miakinen <om+ writes:

Au temps pour moi ! J'ai du rêver et garder rancune envers ce robot ;-)
Je confonds peut-être avec mes lectures sur le xml.


Re: autant pour moi ! je viens de relire un bouquin sur xml et c'est pas là que je l'ai lu.
Bon demain j'arrête la drogue.

FAb