Impossible d'afficher du PHP
Résoluje débute en PHP, et j'ai déjà un problème. C'est vraiment tout bête mais je ne vois pas pourquoi ça ne marche pas. Tout ce qui est relatif au PHP ne s'affiche pas, alors que tout ce qui est HTML fonctionne correctement.
Voici le code:
<?php
// Ci-dessous, la fonction qui calcule le volume du cône
function VolumeCone($rayon, $hauteur)
{
$volume = $rayon * $rayon * 3.14 * $hauteur * (1/3); // calcul du volume
return $volume; // indique la valeur à renvoyer, ici le volume
}
$volume = VolumeCone(3, 1);
echo "Le volume d'un cône de rayon 3 et de hauteur 1 est de $volume";
?>
Ou même avec quelque chose de plus simple: je déclare une variable, que je récupère sur une autre page et que je dois afficher mais rien ne marche. Pourtant, WAMP est ouvert et "en ligne".
Ou bien autre chose plus simple mais qui ne fonctionne pas non plus:
Sur une première page:
<p>
<a href="cible.php?nom=Dupont&prenom=Michel">Lien vers cible.php?nom=Dupont&prenom=Michel</a><br />
<a href="cible.php?nom=Guichard&prenom=Patrick">Lien vers cible.php?nom=Guichard&prenom=Patrick</a><br />
<a href="cible.php?nom=Surret&prenom=Coralie">Lien vers cible.php?nom=Surret&prenom=Coralie</a>
</p>
Sur une seconde:
<p>
Bonjour !
Votre nom est <?php echo $_GET['nom']; ?> , et votre prénom est <?php echo $_GET['prenom']; ?>.
</p>
Bref, si vous avez une idée...
Configuration: Windows XP Firefox 3.1
31 réponses
Le problème central concerne une erreur de parsing PHP lors de l’affichage de données issues d’un paramètre GET, illustrée par l’exemple où echo $_GET['prenom'] ne fonctionne pas correctement. Des solutions essentielles proposent d’enlever les guillemets autour de la variable et d’écrire directement <?php echo $_GET['prenom']; ?>, puis d’ajouter une protection avec htmlentities($_GET['prenom']) pour limiter les risques d’injection. D’autres éléments évoquent l’importance d’un serveur local (WAMP, EasyPHP) et d’exécuter PHP via un navigateur plutôt qu’en ouvrant le fichier, pour éviter les messages d’erreur et garantir l’exécution. Pour aller plus loin, plusieurs pratiques complémentaires existent, comme la validation et le filtrage des entrées, et l’emploi d’un système de templating pour éviter les erreurs d’affichage et améliorer la sécurité.
-
ContributeurC'est avec plaisir =)
-
J'ai coché résolu !
Merci donc à vous tous d'avoir participé et de m'avoir aidé pour ce petit problème !
En même temps, j'ai pu découvrir de nouvelles notions (ça à des avantages le squat quand même !!) ainsi que des choses qui me dépassent totalement (mais que je devrais apprendre, normalement).
Donc merci pour votre gentillesse, votre accessibilité et votre patience !
Bonne continuation. -
Contributeur
-
vi, c'est ce que je voulais dire, en assez mal exprimé ^^
-
Contributeursalut,
PHP n'apprécie pas qu'il y ait à la fois des guillements et des apostrophes.
c'est plutôt que PHP ne peut pas parser directement une variable de type tableau dans une chaîne de caractères.
pour PHP,Un nom de variable valide doit commencer par une lettre ou un souligné (_), suivi de lettres, chiffres ou soulignés
source
donc quand il parse "$_POST['ma_variable']", la variable se termine au crochet ouvrant, il ne tient pas compte de l'index.
pour que ça fonctionne il faut ajouter des accolades :<?php echo "{$_POST['ma_variable']}"; ?> -
Salut,
juste une précision quant à htmlentities : cette fonction n'a d'utilité qu'à l'affichage ! Sinon, dans la bdd elle ne sert à rien ! Dans les requêtes, il faut juste faire gaffe aux injection sql.
sinon, pour les guillemets je parlais d'une structure comme ça :
<?php
echo " $_POST['ma_variable'] ";
?>
PHP n'apprécie pas qu'il y ait à la fois des guillements et des apostrophes.
Evidement tu peux faire :
<?php
$nom=$_POST['ma_variable'] ;
echo " $nom";
?>
mais c'est une ligne de plus -
merci pour toute cette doc !
-
-
ContributeurDirection doc php ;)
Mais pour la sécurité, même règle. Dès qu'un utilisateur envoie quelque chose, il peut faire quelque chose que tu n'as pas prévu. Donc toujours tout prévoir =) -
désolé ! de squaté ! j'arrette !
-
une autre question !
j'ai oublier de preciser je suis un adepte de mysqli et non pas mysql
est ce que ça change des truc au niveau de la securité ?
et du coups puis je mettre mysql_realescape_string ? -
ContributeurAh ouais j'avais pas vu... en fait t'es un vilain squatteur de topic :p
La prochaine fois, ouvre ton propre sujet, ça aide a garder un forum propre et clair =)
-
ben j'voudrais bien cocher mais je suis pa a l'origine du message !
-
ContributeurMais c'est avec plaisir.
Les gens intéressés, et qui ne demandent pas qu'on leur fasse le boulot sont rares ;)
N'oublie pas de cocher résolu. -
et bien écoute !
mille merci pour ces conseil avisé !
-
ContributeurC'est pour ça que je t'ai parlé de la fonction "mysql_realescape_string " (dont je ne suis pas sur du nom).
Je te conseille de lire la doc de ces fonctions sur www.php.fr
Tu as toutes les fonctions, les fonctions qui peuvent y être liées, et tu pourras comprendre les différences. Par exemple celle dont je te parle fait précéder les guillemets de slash, alors que htmlentities protège des balises '<' et '>'.
Question de protection, dès qu'un utilisateur peux taper du code (champ, get, post, ...) dès qu'une info reviens du client, tu dois la protéger à mort. Par exemple, on conseille même de vérifier le type de la variable pour être sur qu'il corresponde au type attendu. (Par exemple si tu demande l'age, tu vérifie que ça soit bien un chiffre, et tu exclue tout le reste). Bref, bon courage. Et si jamais tu as besoin de faire tester un site, contacte moi en mp, je te donnerai l'adresse d'un forum beaucoup plus axé sécurité et dont les membres auditent des sites. (mais pas de pub ici). -
ok !
en gros tu vien de me montrer comment vider une bdd a distance !
je crois que j'ai bien compris le principes !
merci pour ce conseil aviser !
mais un truc m'intrigue ! les requetes ne sont pas des entité html !!!
donc il ne vas rien transformer !!(je parle de htmlentities !)
-
re !
encore une petite question !
est il utile de mettre htmlentities lorsque l'on affiche pas les données et qu'on les met dans une bdd !
(en admettant bien qu'on ne compte pas les afficher par la suite!)-
ContributeurBien sur que oui, mais tu peux aussi utliser la fonction mysql_realescape_string (j'ai un gros doute sur le nom d'un coup.. php.fr pour la bonne fonction). Elle permet de ne pas tenir compte des guillemets. Pourquoi? Exemple
<?php $result = mysql_query("UPDATE valeur SET id = '$variable' "); ?>
(Wa les trous de mémoire que je me tape.. ça fait trop longtemps que j'ai pas codé moi...)
Bref, imagine que tu aies<?php $variable = "1' UNION DELETE * FROM 'table"; ?>
Tu vas te retrouver avec une requete dans ce gout là<?php $result = mysql_query("UPDATE valeur SET id = '1' UNION DELETE * FROM table'"); ?>
Bref, même si mon code est tout bugué, tu vois le principe je pense...
-
-
bonjour!
petite question ne rapport avec le sujet !:
"ce n'est pas correct : enlève les guillemets et ça marchera :"
pourtant il me semble que le php permet de faire:
$w="wolrd";
echo "hello $w";
sinon plutot que de faire:
<?php
echo $_GET['prenom'];
?>
pourquoi pas
<?php
$prenom=$_GET['prenom'];
echo "$prenom ";
?> -
Salut,
c'est normal que tu ais une parse error.
<?php echo "$_GET['prenom']";
?>
ce n'est pas correct : enlève les guillemets et ça marchera :
<?php
echo $_GET['prenom'];
?>
Petite info :
n'affiche jamais une valeur issue d'un GET ou d'un POST sans la protéger un minimum. mets au moins :
<?php
echo htmlentities($_GET['prenom'])
?>
cette fonction dit au navigateur : si tu vois du code, n'en tiens pas compte et affiche le tel quel.
dans l'url change la valeur du prénom avec <script>alert('Et hop une injection');</script> en mettant ou non la fonction htmlentities, tu verras par toi même la différence ;)
- 1
- 2