 |
Utiliser PHP
Utiliser PHP
Cette section regroupe plusieurs erreurs que vous pouvez rencontrer
lors de l'écriture de vos scripts PHP.
-
Je ne me rappelle par de l'ordre des paramètres dans les fonctions PHP,
sont-ils aléatoires ?
-
PHP rassemble des centaines de bibliothèques externes et ça peut paraître
parfois déroutant. Cependant, une règle simple à retenir :
Les paramètres concernant les
fonctions sur les tableaux sont dans
l'ordre "needle, haystack" tandis que les paramètres
sur les
fonctions gérants les chaînes
sont exactement à l'opposé
"haystack, needle".
-
J'aimerais écrire un script PHP générique qui pourrait traiter les
données provenant de tout formulaire. Comment savoir quelles variables
de la méthode POST sont disponibles ?
-
PHP fournit plusieurs
variables pré-définies, comme la superglobale
$_POST. Vous pouvez boucler sur $_POST
puisque c'est un tableau associatif de toutes les valeurs envoyés par
la méthode POST.
Par exemple, bouclons dessus simplement avec foreach, vérifions
les valeurs vides et affichons-les.
<?php $empty = $post = array(); foreach ($_POST as $nomvar => $valeurvar) { if (empty($varvalue)) { $empty[$nomvar] = $valeurvar; } else { $post[$nomvar] = $valeurvar; } }
echo '<pre>'; if (empty($empty)) { print "Aucune valeur POSTée n'est vide, postées :\n"; var_dump($post); } else { print "Nous avons " . count($empty) . " valeurs vides\n"; print "Postées :\n"; var_dump($post); print "Vides :\n"; var_dump($empty); exit; } echo '</pre>'; ?>
-
Il faut que je convertisse tous les guillemets simples (')
en un antislash suivi d'un guillemet simple (\'). Comment le faire
avec une expression régulière ? J'aimerais aussi convertir " en \" et
\ en \\.
-
Si l'on suppose que c'est pour une base de données, utilisez
le méchanisme d'échappement fourni avec la base de données. Par
exemple, utilisez la fonction
mysql_real_escape_string() avec MySQL et
pg_escape_string() avec PostgreSQL.
Il y a également les fonctions génériques comme
addslashes() et stripslashes(),
qui sont plus communes avec l'ancien code PHP.
Note:
Note concernant la directive : magic_quotes_gpc
La
directive PHP magic_quotes_gpc est par défaut à
on. En bref, elle applique la fonction
addslashes() sur toutes vos données issues de GET, POST
et COOKIE. Vous pouvez utiliser la fonction stripslashes()
pour supprimer cet effet.
-
Tous mes " se transforment en \" et mes ' en \', comment me débarrasser
de tous ces antislashs ? Comment et pourquoi sont-ils apparus ?
-
Les anti-slashes existent très probablement parce que la directive PHP
magic_quotes_gpc est activée.
C'est une ancienne fonctionnalité de PHP et elle doit être désactivée et
plus jamais être utilisée. De même, la fonction PHP
stripslashes() peut être utilisée pour supprimer
les slashes d'une chaîne de caractères.
Note:
Note concernant la directive : magic_quotes_gpc
La
directive PHP magic_quotes_gpc est par défaut à
on. En bref, elle applique la fonction
addslashes() sur toutes vos données issues de GET, POST
et COOKIE. Vous pouvez utiliser la fonction stripslashes()
pour supprimer cet effet.
-
Comment la directive register_globals affecte-t-elle mes scripts ?
-
AvertissementCette fonctionnalité est devenue
OBSOLETE depuis PHP 5.3.0 et a été SUPPRIMEE
depuis PHP 5.4.0.
Tout d'abord, une rapide explication sur ce que réalise cette configuration
ini. Supposons que nous utilisons l'URL suivante :
http://example.com/foo.php?animal=cat
et, dans le fichier foo.php, nous avons le code PHP suivant :
<?php // L'utilisation de $_GET est ici préférée echo $_GET['animal'];
// Pour que $animal existe, register_globals doit être actif // NE FAITE JAMAIS CELA ! echo $animal;
// Ceci s'applique à toutes les variables, y compris à $_SERVER echo $_SERVER['PHP_SELF'];
// Encore une fois, pour que $PHP_SELF existe, register_globals doit être actif // NE FAITE JAMAIS CELA ! echo $PHP_SELF; ?>
Le code ci-dessus démontre la façon dont register_globals crée un grand
nombre de variables. Durant des années, ce type de codage a été désapprouvé,
et donc, depuis des années, cette fonctionnalité a été désactivée par défaut.
Bien que la majorité des hébergeurs Web a désactivé cette fonctionnalité,
il y a toujours sur le web des articles, des tutoriels et des livres qui
demandent à ce que cette option de configuration soit activée.
Voir aussi les ressources suivantes pour plus d'informations :
Note:
Dans l'exemple ci-dessus, nous utilisez une URL qui contient
une QUERY_STRING. Passer des informations comme cela se fait via une requête
HTTP GET, c'est la raison pour laquelle la superglobale $_GET
est utilisée.
-
Quand je fais ce qui suit, l'affichage se fait dans le mauvais ordre :
<?php function mafonction($argument) { echo $argument + 10; } $variable = 10; echo "mafonction($variable) = " . mafonction($variable); ?>
que se passe-t-il ?
-
Pour pouvoir utiliser le résultat de votre fonction dans une expression
(comme le concaténer avec une chaîne comme dans cet exemple), vous devez
retourner la valeur avec return,
et non pas l'afficher avec echo.
-
Hey, où sont mes nouvelles lignes ?
<pre> <?php echo "Ceci est ma première ligne."; ?> <?php echo "Celle-ci devrait s'afficher en dessous de la première."; ?> </pre>
-
En PHP, la fin d'un bloc de code est soit "?>" ou
"?>\n" (où \n signifie une nouvelle ligne). Donc dans l'exemple plus
haut, les phrases affichées le seront sur une seule ligne, car PHP
oublie les nouvelles lignes après la fin du bloc. Cela signifie que vous
devez insérer une nouvelle ligne de plus après chaque bloc de code PHP
pour la lui faire afficher.
Pourquoi PHP fait-il cela ? Car lors du formatage du HTML, cela
vous simplifie la vie car vous ne voulez pas de cette nouvelle ligne,
mais vous devez créer de très longues lignes ou rendre la source brute
de la page illisible pour arriver à cet effet.
-
J'obtiens le message 'Warning: Cannot send session cookie - headers already
sent...' ou 'Cannot add header information - headers already sent...'.
-
Les fonctions header(), setcookie(),
et les fonctions de session
doivent ajouter des en-têtes au flux de sortie, mais ceux-ci ne
peuvent être envoyés qu'avant le reste du contenu. Il ne doit y avoir
aucun affichage avant d'utiliser ces fonctions, comme le HTML par
exemple. La fonction headers_sent() vérifiera si
votre script a déjà envoyé des en-têtes. Voyez aussi
les fonctions de bufferisation de sortie.
-
J'ai besoin d'accéder à des informations dans l'en-tête de requête
directement. Comment puis-je le faire ?
-
La fonction getallheaders() le fera si vous exécutez
PHP en tant que module Apache. Le code suivant vous montrera tous les
en-têtes de requête :
<?php $headers = getallheaders(); foreach ($headers as $nom => $contenu) { echo "headers[$nom] = $contenu<br />\n"; } ?>
Voir aussi
apache_lookup_uri(),
apache_response_headers() et
fsockopen().
-
Quand j'essaye d'utiliser l'identification avec IIS j'obtiens
'No Input file specified'.
-
Le modèle sécuritaire de IIS est en faute. C'est un problème commun à
tous les programmes CGI fonctionnant avec IIS. Une alternative est de
créer un fichier HTML (non exécuté par PHP) comme page d'entrée dans
le dossier où il faut s'identifier. Utilisez alors une balise META
pour rediriger vers la page PHP, ou encore proposez un lien vers
celle-ci. PHP reconnaîtra alors l'identification correctement. Avec
le module ISAPI, cela n'est pas un problème. Cela ne devrait pas non
plus affecter d'autres serveurs NT. Pour plus d'informations, voyez :
» http://support.microsoft.com/kb/q160422/ et la section du manuel
concernant l'identification HTTP.
-
Windows: Je ne peux pas accéder aux fichiers partagés sur un autre ordinateur
utilisant IIS
-
Vous devez modifier le service Go to Internet Information
Services. Localisez votre fichier PHP et éditez ces propriétés.
Placez-vous sur l'onglet File Security, Edit -<
Anonymous access and authentication control.
Vous pouvez résoudre ce souci soit en décochant la case Anonymous
Access et en laissant la case Integrated Window
Authentication cochée, soit en cochant la case Anonymous
Access et en éditant l'utilisateur qui ne doit pas avoir les droits d'accès.
-
Comment mélanger XML et PHP ? PHP se plaint de mes balises <?xml !
-
Pour inclure <?xml dans votre code PHP, vous devrez désactiver les
short tags en configurant la directive PHP
short_open_tags à
0. Vous ne pouvez pas modifier cette directive avec
ini_set(). Que
short_open_tags soit à on ou off, vous pouvez toujours faire ceci :
<?php echo '<?xml'; ?>. La valeur par
défaut pour cette directive est On.
-
Où puis-je trouver une liste complète des variables prédéfinies que je
peux utiliser dans mes scripts PHP ?
-
Lisez la page du manuel qui concerne les
variables prédéfinies vu qu'elle présente une liste
partielle des variables prédéfinies disponibles dans votre script. Une
liste complète des variables disponibles (et beaucoup d'informations)
peut être vue en appelant la fonction phpinfo().
Lisez la section du manuel traitant des
variables non-issues de
PHP, elle décrit des scénarios communs pour les variables
externes, comme celles issues d'un formulaire HTML, d'un cookie, et de
l'URL.
Note:
register_globals : note importante
Depuis PHP 4.2.0, la
valeur par défaut de la directive de configuration PHP register_globals vaut
off.
La communauté PHP vous recommande de ne pas dépendre
de cette directive, mais de trouver d'autres moyens pour accéder aux
données, tels que les superglobals.
-
Comment puis-je générer des fichiers PDF sans utiliser les bibliothèques
non libres
PDFLib ? J'aimerais une façon gratuite
et qui ne requiert pas de bibliothèques PDF externes.
-
Il y a quelques alternatives écrites en PHP tel que
» FPDF et
» TCPDF.
Il y a également l'extension Haru
qui utilise la bibliothèque externe libre libHaru.
-
J'essaye d'accéder à une des variables standard CGI (comme
$DOCUMENT_ROOT ou
$HTTP_REFERER) dans une fonction écrite par moi-même,
et il semblerait qu'elle ne soit pas définie. Que se passe-t-il ?
-
Il est important de réaliser que la directive PHP register_globals affecte aussi les
variables d'environnement et de serveur. Lorsque register_globals = off
(valeur par défaut depuis PHP 4.2.0), $DOCUMENT_ROOT
n'existera pas. À la place, utilisez
$_SERVER['DOCUMENT_ROOT'].
Si register_globals = on alors les variables
$DOCUMENT_ROOT et
$GLOBALS['DOCUMENT_ROOT'] existeront aussi.
Si vous êtes sûrs que register_globals = on et que vous vous demandez
pourquoi $DOCUMENT_ROOT n'est pas disponible à
l'intérieur de votre fonction, c'est parce que elle est comme toute autre
variable et requiert donc global $DOCUMENT_ROOT dans
le corps de la fonction. Voyez aussi la page du manuel à propos de la
portée des variables. Il
est recommandé de coder avec register_globals = off.
-
Certaines directives PHP peuvent prendre des noms littéraux,
et pas seulement des valeurs entières.
Quelles sont tous les raccourcis disponibles?
-
Les options disponibles sont K (pour Kilo octets) et M (pour mégaoctet) et
G (pour gigaoctet ; disponible depuis PHP 5.1.0), ils sont
insensibles à la casse. Tout autre syntaxe est supposée représenter des octets.
1M équivaut à un mégaoctet ou 1048576
octets. 1K équivaut à un kilooctet ou
1024 octets. Ces notations abrégées peuvent être utilisées dans le fichier php.ini et dans la fonction ini_set().
Note:
kilooctet contre kibibyte
La notation PHP décrit un kilooctet comme étant égal à 1024 octets, alors que
le standard IEC considère ça comme un kibioctet (kibibyte).
En bref: k et K = 1024 octets.
-
Windows: Il y a des echecs de connexions (timeouts) en utilisant localhost,
alors que "127.0.0.1" fonctionne?
-
Avant PHP 5.3.4, il y avait un bug dans le code réseau de résolution des noms qui faisait
échouer la résolution de localhost si IPv6 est activé. Utiliser
"127.0.0.1" ne posait pas de problème, ou encore désactiver la résolution IPV6
dans le fichier hosts.
|
|