Manuel PHP
Précédent |  | Suivant

# Chapitre 50. Utiliser `PHP`

Cette section regroupe plusieurs erreurs que vous pouvez rencontrer lors de l'écriture de vos scripts `PHP`.

1. 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 ?
2. Il faut que je convertisse tous les guillemets simples (') en un anti-slash suivi d'un guillemet simple (\'). Comment le faire avec une expression regulière ? J'aimerais aussi convertir " en \" et \ en \\.
3. Tous mes " se transforment en \" et mes ' en \', comment me débarrasser de tous ces anti-slashs ? Comment et pourquoi sont-ils apparus ?
4. 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 ?
5. 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>`

6. J'obtiens le message 'Warning: Cannot send session cookie - headers already sent...' ou 'Cannot add header information - headers already sent...'.
7. J'ai besoin d'accèder à des informations dans l'en-tête de requête directement. Comment puis-je le faire ?
8. Quand j'essaye d'utiliser l'authentification avec IIS j'obtiens 'No Input file specified'.
9. Mon script `PHP` fonctionne avec IE et Lynx, mais avec Netscape une portion de ce qui devrait s'afficher manque. Quand j'affiche la source HTML de la page, je vois le contenu avec IE mais pas avec Netscape.
10. Comment mélanger XML et `PHP` ? `PHP` se plaint de mes balises <?xml !
11. Comment utiliser `PHP` avec FrontPage ou d'autres éditeurs HTML qui insistent pour mettre mon code ailleurs ?
12. Où puis-je trouver une liste complète des variables prédéfinies que je peux utiliser dans mes scripts `PHP` ?
13. Comment puis-je générer des fichiers PDF sans utiliser les librairies non libres ClibPDF et PDFLib ? J'aimerais une façon gratuite et qui ne requière pas de librairies PDF externes.
14. 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 ?

1. 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 super globale `$_POST`. Vous puvez boucler sur `$_POST` puisque c'est un tableau associatif de toutes les valeurs POSTées. 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;
}
}
print "<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;
}
?>`

> Superglobales : disponiblité : Depuis PHP 4.1.0, les tableaux superglobaux tels que `$_GET`, `$_POST` et `$_SERVER`, etc... sont disponibles. Pour plus d'informations, lisez la section superglobals

2. Il faut que je convertisse tous les guillemets simples (') en un anti-slash suivi d'un guillemet simple (\'). Comment le faire avec une expression regulière ? J'aimerais aussi convertir " en \" et \ en \\.

La fonction addslashes() le fera. Voir aussi mysql_escape_string(). Vous pouvez aussi supprimer les anti-slashs avec stripslashes().

> 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.

3. Tous mes " se transforment en \" et mes ' en \', comment me débarrasser de tous ces anti-slashs ? Comment et pourquoi sont-ils apparus ?

La fonction `PHP` stripslashes() supprimera ces anti-slashs de votre chaîne de caractères. La plupart du temps, ils appraissent car la directive `PHP` magic_quotes_gpc est activée.

> 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.

4. 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().

5. 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.

6. 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 entê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 example. La fonction headers_sent() vérifiera si votre script a déjà envoyé des entêtes. Voyez aussi les fonctions de bufferisation de sortie .

7. 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()

8. Quand j'essaye d'utiliser l'authentification 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'authentifier. Utilisez alors une balise META pour rediriger vers la page `PHP`, ou encore proposez un lien vers celle-ci. `PHP` reconnaîtra alors l'authentification 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/support/kb/articles/q160/4/22.asp et la section du manuel concernant l'authentification HTTP.

9. Mon script `PHP` fonctionne avec IE et Lynx, mais avec Netscape une portion de ce qui devrait s'afficher manque. Quand j'affiche la source HTML de la page, je vois le contenu avec IE mais pas avec Netscape.

Netscape est plus strict que IE concernant les balises HTML (comme les tables). Faire valider votre HTML généré par un validateur HTML, comme validator.w3.org, peut se révéler utile. Par exemple, une </table> maquante peut provoquer ce problème.

De plus, IE et Lynx ignorent les NULs (`\0`) dans le flux HTML, Netscape non. La meilleure façon de le vérifier est de compiler la version en ligne de commande de `PHP` (aussi connue sous le nom de version CGI) et d'exécuter vos scrpts à partir de la console. Sous *nix, redirigez la sortie sûr `od -c` et cherchez les caractères `\0`. Si vous êtes sous Windows, vous devez trouver un éditeur ou un autre programme qui vous permettra de visualiser les fichiers binaires. Lorsque Netscape rencontre un NUL dans un fichier, il n'affichera la plupart du temps rien dans cette ligne, alors que IE et Lynx le feront.

10. 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.

11. Comment utiliser `PHP` avec FrontPage ou d'autres éditeurs HTML qui insistent pour mettre mon code ailleurs ?

La façon la plus simple est d'activer l'utilisation des balises ASP dans votre code `PHP`. Cela vous permettra d'utiliser des délimiteurs de code à la manière de ASP : <% et %>. Quelques éditeurs HTML populaires gèrent cela plus habilement. Pour activer les balises ASP, vous devez configurer la variable asp_tags de `php.ini`, ou utiliser la directive Apache appropriée.

12. 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.

> 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.

13. Comment puis-je générer des fichiers PDF sans utiliser les librairies non libres ClibPDF et PDFLib ? J'aimerais une façon gratuite et qui ne requière pas de librairies PDF externes.

Il y'a quelques alternatives écrites en `PHP` tel que http://www.ros.co.nz/pdf/, http://www.fpdf.org/, http://www.gnuvox.com/pdf4php/, et http://www.potentialtech.com/ppl.php. Il existe aussi le module Panda.

14. 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. A 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 parceque elle est comme toute autre variable et requière 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.

> Superglobales : disponiblité : Depuis PHP 4.1.0, les tableaux superglobaux tels que `$_GET`, `$_POST` et `$_SERVER`, etc... sont disponibles. Pour plus d'informations, lisez la section superglobals

Précédent | Sommaire | Suivant
Problèmes de compilation | Niveau supérieur | PHP and HTML