<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/faq.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'faq.using.php',
    1 => 'Utiliser PHP',
    2 => 'Utiliser PHP',
  ),
  'up' => 
  array (
    0 => 'faq.php',
    1 => 'FAQ',
  ),
  'prev' => 
  array (
    0 => 'faq.build.php',
    1 => 'Probl&egrave;mes de compilation',
  ),
  'next' => 
  array (
    0 => 'faq.passwords.php',
    1 => 'Hachage de mots de passe',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'faq/using.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="faq.using" class="chapter">
  <h1 class="title">Utiliser PHP</h1>

  

  <p class="para">
   Cette section regroupe plusieurs erreurs pouvant survenir
   lors de l&#039;écriture de scripts PHP.
  </p>

  <div class="qandaset"><ol class="qandaset_questions"><li><a href="#faq.using.parameterorder">
     
      Je ne me rappelle pas de l&#039;ordre des param&egrave;tres dans les fonctions PHP,
      sont-ils al&eacute;atoires ?
     
    </a></li><li><a href="#faq.using.anyform">
     
      J&#039;aimerais &eacute;crire un script PHP g&eacute;n&eacute;rique qui pourrait traiter les
      donn&eacute;es provenant de tout formulaire. Comment savoir quelles variables
      de la m&eacute;thode POST sont disponibles ?
     
    </a></li><li><a href="#faq.using.addslashes">
     
      Il faut que je convertisse tous les guillemets simples (&#039;)
      en un antislash suivi d&#039;un guillemet simple (\&#039;). Comment le faire
      avec une expression r&eacute;guli&egrave;re ? J&#039;aimerais aussi convertir &quot; en \&quot; et
      \ en \\.
     
    </a></li><li><a href="#faq.using.wrong-order">
     
      Quand je fais ce qui suit, l&#039;affichage se fait dans le mauvais ordre :
     

&lt;?php
function mafonction($argument)
{
    echo $argument + 10;
}
$variable = 10;
echo &quot;mafonction($variable) = &quot; . mafonction($variable);
?&gt;

    
     que se passe-t-il ?
     
    </a></li><li><a href="#faq.using.newlines">
     
      Hey, o&ugrave; sont mes nouvelles lignes ?
      

&lt;pre&gt;
&lt;?php echo &quot;Ceci est ma premi&egrave;re ligne.&quot;; ?&gt;
&lt;?php echo &quot;Celle-ci devrait s&#039;afficher en dessous de la premi&egrave;re.&quot;; ?&gt;
&lt;/pre&gt;

      
     
    </a></li><li><a href="#faq.using.headers-sent">
     
      J&#039;obtiens le message &#039;Warning: Cannot send session cookie - headers already
      sent...&#039; ou &#039;Cannot add header information - headers already sent...&#039;.
     
    </a></li><li><a href="#faq.using.header">
     
      J&#039;ai besoin d&#039;acc&eacute;der &agrave; des informations dans l&#039;en-t&ecirc;te de requ&ecirc;te
      directement. Comment puis-je le faire ?
     
    </a></li><li><a href="#faq.using.authentication">
     
      Quand j&#039;essaye d&#039;utiliser l&#039;identification avec IIS j&#039;obtiens 
      &#039;No Input file specified&#039;.
     
    </a></li><li><a href="#faq.using.iis.sharing">
     
      Windows: Je ne peux pas acc&eacute;der aux fichiers partag&eacute;s sur un autre ordinateur
      utilisant IIS
     
    </a></li><li><a href="#faq.using.mixml">
     
      Comment m&eacute;langer XML et PHP ? PHP se plaint de mes balises &lt;?xml !
     
    </a></li><li><a href="#faq.using.variables">
     
      O&ugrave; puis-je trouver une liste compl&egrave;te des variables pr&eacute;d&eacute;finies que je 
      peux utiliser dans mes scripts PHP ?
     
    </a></li><li><a href="#faq.using.freepdf">
     
      Comment puis-je g&eacute;n&eacute;rer des fichiers PDF sans utiliser les biblioth&egrave;ques
      non libres
      PDFLib ? J&#039;aimerais une fa&ccedil;on gratuite
      et qui ne requiert pas de biblioth&egrave;ques PDF externes.
     
    </a></li><li><a href="#faq.using.shorthandbytes">
     
      Certaines directives PHP peuvent prendre des noms litt&eacute;raux,
      et pas seulement des valeurs entier.
      Quels sont tous les raccourcis disponibles ?
     
    </a></li></ol></div>

   <dl class="qandaentry" id="faq.using.parameterorder">
    <dt><strong>
     
      Je ne me rappelle pas de l&#039;ordre des paramètres dans les fonctions PHP,
      sont-ils aléatoires ?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      PHP rassemble des centaines de bibliothèques externes et ça peut paraître
      parfois déroutant. Cependant, une règle simple à retenir :
     </p>
     <p class="para">
      Les paramètres concernant les
      <a href="book.array.php" class="link">fonctions sur les tableaux</a> sont dans
      l&#039;ordre &quot;<em>needle, haystack</em>&quot; tandis que les paramètres
      sur les
      <a href="book.strings.php" class="link">fonctions gérant les chaînes</a>
      sont exactement à l&#039;opposé
      &quot;<em>haystack, needle</em>&quot;.
     </p>
     <p class="para">
      À partir de PHP 8.0, les <a href="functions.arguments.php#functions.named-arguments" class="link">arguments nommés</a>
      permettent de passer les arguments par nom de paramètre, rendant l&#039;ordre des paramètres moins important.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.anyform">
    <dt><strong>
     
      J&#039;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 ?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      PHP fournit plusieurs <a href="language.variables.predefined.php" class="link">
      variables pré-définies</a>, comme la superglobale <var class="varname">
      $_POST</var>. Il est possible de boucler sur <var class="varname"><a href="reserved.variables.post.php" class="classname">$_POST</a></var>
      puisque c&#039;est un tableau associatif de toutes les valeurs envoyées par 
      la méthode POST.
      Par exemple, bouclons dessus simplement avec <a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a>, vérifions
      les valeurs vides et affichons-les.
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$empty </span><span style="color: #007700">= </span><span style="color: #0000BB">$post </span><span style="color: #007700">= array();<br />foreach (</span><span style="color: #0000BB">$_POST </span><span style="color: #007700">as </span><span style="color: #0000BB">$nomvar </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$valeurvar</span><span style="color: #007700">) {<br />    if (empty(</span><span style="color: #0000BB">$valeurvar</span><span style="color: #007700">)) {<br />        </span><span style="color: #0000BB">$empty</span><span style="color: #007700">[</span><span style="color: #0000BB">$nomvar</span><span style="color: #007700">] = </span><span style="color: #0000BB">$valeurvar</span><span style="color: #007700">;<br />    } else {<br />        </span><span style="color: #0000BB">$post</span><span style="color: #007700">[</span><span style="color: #0000BB">$nomvar</span><span style="color: #007700">] = </span><span style="color: #0000BB">$valeurvar</span><span style="color: #007700">;<br />    }<br />}<br /><br />echo </span><span style="color: #DD0000">'&lt;pre&gt;'</span><span style="color: #007700">;<br />if (empty(</span><span style="color: #0000BB">$empty</span><span style="color: #007700">)) {<br />    print </span><span style="color: #DD0000">"Aucune valeur POSTée n'est vide, postées :\n"</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$post</span><span style="color: #007700">);<br />} else {<br />    print </span><span style="color: #DD0000">"Nous avons " </span><span style="color: #007700">. </span><span style="color: #0000BB">count</span><span style="color: #007700">(</span><span style="color: #0000BB">$empty</span><span style="color: #007700">) . </span><span style="color: #DD0000">" valeurs vides\n"</span><span style="color: #007700">;<br />    print </span><span style="color: #DD0000">"Postées :\n"</span><span style="color: #007700">; </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$post</span><span style="color: #007700">);<br />    print </span><span style="color: #DD0000">"Vides :\n"</span><span style="color: #007700">;  </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$empty</span><span style="color: #007700">);<br />    exit;<br />}<br />echo </span><span style="color: #DD0000">'&lt;/pre&gt;'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.addslashes">
    <dt><strong>
     
      Il faut que je convertisse tous les guillemets simples (&#039;)
      en un antislash suivi d&#039;un guillemet simple (\&#039;). Comment le faire
      avec une expression régulière ? J&#039;aimerais aussi convertir &quot; en \&quot; et
      \ en \\.
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Si l&#039;on suppose que c&#039;est pour une base de données, utiliser
      le mécanisme d&#039;échappement fourni avec la base de données. Par
      exemple, utiliser la fonction
      <span class="function"><a href="function.mysql-real-escape-string.php" class="function">mysql_real_escape_string()</a></span> avec MySQL et
      <span class="function"><a href="function.pg-escape-string.php" class="function">pg_escape_string()</a></span> avec PostgreSQL.
      Il y a également les fonctions génériques comme
      <span class="function"><a href="function.addslashes.php" class="function">addslashes()</a></span> et <span class="function"><a href="function.stripslashes.php" class="function">stripslashes()</a></span>,
      qui sont plus communes avec l&#039;ancien code PHP.
     </p>
     <p class="para">
      Échapper manuellement les valeurs est sujet aux erreurs et dépend du contexte.
      Il est préférable d&#039;utiliser les API de base de données qui prennent en charge les instructions préparées et
      la liaison de paramètres au lieu de construire des requêtes en concaténant
      des chaînes échappées.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.wrong-order">
    <dt><strong>
     
      Quand je fais ce qui suit, l&#039;affichage se fait dans le mauvais ordre :
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">mafonction</span><span style="color: #007700">(</span><span style="color: #0000BB">$argument</span><span style="color: #007700">)<br />{<br />    echo </span><span style="color: #0000BB">$argument </span><span style="color: #007700">+ </span><span style="color: #0000BB">10</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">$variable </span><span style="color: #007700">= </span><span style="color: #0000BB">10</span><span style="color: #007700">;<br />echo </span><span style="color: #DD0000">"mafonction(</span><span style="color: #0000BB">$variable</span><span style="color: #DD0000">) = " </span><span style="color: #007700">. </span><span style="color: #0000BB">mafonction</span><span style="color: #007700">(</span><span style="color: #0000BB">$variable</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

     que se passe-t-il ?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Pour pouvoir utiliser le résultat d&#039;une fonction dans une expression
      (comme le concaténer avec une chaîne comme dans cet exemple), il faut
      retourner la valeur avec <span class="function"><a href="function.return.php" class="function">return</a></span>,
      et non pas l&#039;afficher avec <span class="function"><a href="function.echo.php" class="function">echo</a></span>.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.newlines">
    <dt><strong>
     
      Hey, où sont mes nouvelles lignes ?
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">&lt;pre&gt;<br /><span style="color: #0000BB">&lt;?php </span><span style="color: #007700">echo </span><span style="color: #DD0000">"Ceci est ma première ligne."</span><span style="color: #007700">; </span><span style="color: #0000BB">?&gt;<br />&lt;?php </span><span style="color: #007700">echo </span><span style="color: #DD0000">"Celle-ci devrait s'afficher en dessous de la première."</span><span style="color: #007700">; </span><span style="color: #0000BB">?&gt;<br /></span>&lt;/pre&gt;</span></code></div>
      </div>

     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      En PHP, la fin d&#039;un bloc de code est soit &quot;?&gt;&quot; ou
      &quot;?&gt;\n&quot; (où \n signifie une nouvelle ligne). Donc dans l&#039;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 qu&#039;il
      faut insérer une nouvelle ligne de plus après chaque bloc de code PHP
      pour la lui faire afficher.
     </p>
     <p class="para">
      Pourquoi PHP fait-il cela ? Car lors du formatage du HTML, cela
      simplifie les choses car cette nouvelle ligne n&#039;est pas souhaitée,
      mais il faudrait créer de très longues lignes ou rendre la source brute
      de la page illisible pour arriver à cet effet.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.headers-sent">
    <dt><strong>
     
      J&#039;obtiens le message &#039;Warning: Cannot send session cookie - headers already
      sent...&#039; ou &#039;Cannot add header information - headers already sent...&#039;.
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Les fonctions <span class="function"><a href="function.header.php" class="function">header()</a></span>, <span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span>,
      et les <a href="ref.session.php" class="link">fonctions de session</a>
      doivent ajouter des en-têtes au flux de sortie, mais ceux-ci ne
      peuvent être envoyés qu&#039;avant le reste du contenu. Il ne doit y avoir
      aucun affichage avant d&#039;utiliser ces fonctions, comme le HTML par
      exemple. La fonction <span class="function"><a href="function.headers-sent.php" class="function">headers_sent()</a></span> vérifiera si
      le script a déjà envoyé des en-têtes. Voir aussi
      <a href="ref.outcontrol.php" class="link">les fonctions de bufferisation de sortie</a>.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.header">
    <dt><strong>
     
      J&#039;ai besoin d&#039;accéder à des informations dans l&#039;en-tête de requête
      directement. Comment puis-je le faire ?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      La fonction <span class="function"><a href="function.getallheaders.php" class="function">getallheaders()</a></span> le fera si PHP est exécuté
      en tant que module Apache. Le code suivant affiche tous les
      en-têtes de requête :
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$headers </span><span style="color: #007700">= </span><span style="color: #0000BB">getallheaders</span><span style="color: #007700">();<br />foreach (</span><span style="color: #0000BB">$headers </span><span style="color: #007700">as </span><span style="color: #0000BB">$nom </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$contenu</span><span style="color: #007700">) {<br />    echo </span><span style="color: #DD0000">"headers[</span><span style="color: #0000BB">$nom</span><span style="color: #DD0000">] = </span><span style="color: #0000BB">$contenu</span><span style="color: #DD0000">&lt;br /&gt;\n"</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </p>
     <p class="para">
      Voir aussi 
      <span class="function"><a href="function.apache-lookup-uri.php" class="function">apache_lookup_uri()</a></span>,
      <span class="function"><a href="function.apache-response-headers.php" class="function">apache_response_headers()</a></span> et
      <span class="function"><a href="function.fsockopen.php" class="function">fsockopen()</a></span>.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.authentication">
    <dt><strong>
     
      Quand j&#039;essaye d&#039;utiliser l&#039;identification avec IIS j&#039;obtiens 
      <code class="literal">&#039;No Input file specified&#039;</code>.
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Le modèle sécuritaire de IIS est en faute. C&#039;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&#039;entrée dans
      le dossier où il faut s&#039;identifier. Utiliser alors une balise META
      pour rediriger vers la page PHP, ou encore proposer un lien vers
      celle-ci. PHP reconnaîtra alors l&#039;identification correctement.
      Cela ne devrait pas non
      plus affecter d&#039;autres serveurs NT. Pour plus d&#039;informations, voir :
      <a href="http://support.microsoft.com/kb/q160422/" class="link external">&raquo;&nbsp;http://support.microsoft.com/kb/q160422/</a> et la section du manuel
      concernant l&#039;<a href="features.http-auth.php" class="link">identification HTTP</a>.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.iis.sharing">
    <dt><strong>
     
      Windows: Je ne peux pas accéder aux fichiers partagés sur un autre ordinateur
      utilisant IIS
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Il faut modifier le service <code class="literal">Go to Internet Information
      Services</code>. Localiser le fichier PHP et éditer ses propriétés.
      Se placer sur l&#039;onglet <code class="literal">File Security</code>, <code class="literal">Edit -&lt;
      Anonymous access and authentication control</code>.
     </p>
     <p class="para">
      Il est possible de résoudre ce souci soit en décochant la case <code class="literal">Anonymous
      Access</code> et en laissant la case <code class="literal">Integrated Window
      Authentication</code> cochée, soit en cochant la case <code class="literal">Anonymous
      Access</code> et en éditant l&#039;utilisateur qui ne doit pas avoir les droits d&#039;accès.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.mixml">
    <dt><strong>
     
      Comment mélanger XML et PHP ? PHP se plaint de mes balises &lt;?xml !
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Pour inclure &lt;?xml dans le code PHP, il faut désactiver les
      short tags en configurant la directive PHP
      <a href="ini.core.php#ini.short-open-tag" class="link">short_open_tags</a> à
      <code class="literal">0</code>. Il n&#039;est pas possible de modifier cette directive avec
      <span class="function"><a href="function.ini-set.php" class="function">ini_set()</a></span>.  Que <a href="ini.core.php#ini.short-open-tag" class="link">
      short_open_tags</a> soit à on ou off, il est toujours possible de faire ceci :
      <code class="literal">&lt;?php echo &#039;&lt;?xml&#039;; ?&gt;</code>.  La valeur par
      défaut pour cette directive est <code class="literal">On</code>.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.variables">
    <dt><strong>
     
      Où puis-je trouver une liste complète des variables prédéfinies que je 
      peux utiliser dans mes scripts PHP ?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Consulter la page du manuel qui concerne les <a href="language.variables.predefined.php" class="link">
      variables prédéfinies</a> vu qu&#039;elle présente une liste
      partielle des variables prédéfinies disponibles dans un script. Une
      liste complète des variables disponibles (et beaucoup d&#039;informations)
      peut être vue en appelant la fonction <span class="function"><a href="function.phpinfo.php" class="function">phpinfo()</a></span>.
      Consulter la section du manuel traitant des
      <a href="language.variables.external.php" class="link">variables non-issues de
      PHP</a>, elle décrit des scénarios communs pour les variables
      externes, comme celles issues d&#039;un formulaire HTML, d&#039;un cookie, et de
      l&#039;URL.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.freepdf">
    <dt><strong>
     
      Comment puis-je générer des fichiers PDF sans utiliser les bibliothèques
      non libres
      PDFLib ? J&#039;aimerais une façon gratuite
      et qui ne requiert pas de bibliothèques PDF externes.
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Il y a quelques alternatives écrites en PHP tel que
      <a href="http://www.fpdf.org/" class="link external">&raquo;&nbsp;FPDF</a> et
      <a href="http://www.tcpdf.org/" class="link external">&raquo;&nbsp;TCPDF</a>.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.shorthandbytes">
    <dt><strong>
     
      Certaines directives PHP peuvent prendre des noms littéraux,
      et pas seulement des valeurs <a href="language.types.integer.php" class="link">entier</a>.
      Quels sont tous les raccourcis disponibles ?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Les options disponibles sont K (pour kilooctets), M (pour mégaoctets) et
      G (pour gigaoctets), et sont
      insensibles à la casse. Toute autre syntaxe est supposée représenter des octets.
      <code class="literal">1M</code> équivaut à un mégaoctet ou <code class="literal">1048576</code>
      octets. <code class="literal">1K</code> équivaut à un kilooctet ou 
      <code class="literal">1024</code> octets. Ces notations abrégées peuvent être utilisées dans le fichier <var class="filename">php.ini</var> et dans la fonction <span class="function"><a href="function.ini-set.php" class="function">ini_set()</a></span>.
      Il est à noter que la valeur numérique est transtypée en <a href="language.types.integer.php" class="link">entier</a> ;
      par exemple, <code class="literal">0.5M</code> est interprété comme <code class="literal">0</code>.
     </p>
     <blockquote class="note"><p><strong class="note">Note</strong>: 
      <strong>kilooctet contre kibioctet</strong><br />
      <p class="para">
       La notation PHP décrit un kilooctet comme étant égal à 1024 octets, alors que
       le standard <abbr>IEC</abbr> considère ça comme un kibioctet.
       En bref: k et K = 1024 octets.
      </p>
     </p></blockquote>
    </dd>
   </dl>
  
 </div>
<?php manual_footer($setup); ?>