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 antislash suivi d'un guillemet simple (\'). Comment le faire avec une expression r�guli�re ? J'aimerais aussi convertir " en \" et \ en \\.
  3. Tous mes " se transforment en \" et mes ' en \', comment me d�barrasser de tous ces antislashs ? Comment et pourquoi sont-ils apparus ?
  4. Comment la directive register_globals affecte-t-elle mes scripts ?
  5. Quand je fais ce qui suit, l'affichage se fait dans le mauvais ordre : <?phpfunction mafonction($argument){    echo $argument + 10;}$variable = 10;echo "mafonction($variable) = " . mafonction($variable);?> que se passe-t-il ?
  6. 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>
  7. J'obtiens le message 'Warning: Cannot send session cookie - headers already sent...' ou 'Cannot add header information - headers already sent...'.
  8. J'ai besoin d'acc�der � des informations dans l'en-t�te de requ�te directement. Comment puis-je le faire ?
  9. Quand j'essaye d'utiliser l'identification avec IIS j'obtiens 'No Input file specified'.
  10. Windows: Je ne peux pas acc�der aux fichiers partag�s sur un autre ordinateur utilisant IIS
  11. 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.
  12. Comment m�langer XML et PHP ? PHP se plaint de mes balises <?xml !
  13. Comment utiliser PHP avec FrontPage ou d'autres �diteurs HTML qui insistent pour mettre mon code ailleurs ?
  14. O� puis-je trouver une liste compl�te des variables pr�d�finies que je peux utiliser dans mes scripts PHP ?
  15. 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.
  16. 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 ?
  17. Certaines directives PHP peuvent prendre des noms litt�raux, et pas seulement des valeurs enti�res. Quelles sont tous les raccourcis disponibles? Peut-on les utiliser en dehors de php.ini?

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>';
?>

Note: Superglobales : disponibilit�
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

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

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

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 ?

La fonction PHP stripslashes() supprimera ces antislashs de votre cha�ne de caract�res. La plupart du temps, ils apparaissent quand la directive PHP magic_quotes_gpc est activ�e.

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 ?

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. Depuis PHP 6, cette fonctionnalit� a �t� supprim�e. 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.

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> manquante 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 scripts � partir de la console. Sous *nix, redirigez la sortie sur 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.

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

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.

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 et est compl�tement retir�e depuis PHP 6.0.0. 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.

Note: Superglobales : disponibilit�
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

Certaines directives PHP peuvent prendre des noms litt�raux, et pas seulement des valeurs enti�res. Quelles sont tous les raccourcis disponibles? Peut-on les utiliser en dehors de php.ini?

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. Vous ne devriez pas utiliser ces abr�viations en dehors du fichier php.ini. � la place, utilisez une valeur enti�re en octets. Lisez la documentation sur la fonction ini_get() pour un exemple sur la fa�on de convertir ces valeurs.