<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.variables.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'language.variables.external.php',
    1 => 'Variables externes &agrave; PHP',
    2 => 'Variables externes &agrave; PHP',
  ),
  'up' => 
  array (
    0 => 'language.variables.php',
    1 => 'Les variables',
  ),
  'prev' => 
  array (
    0 => 'language.variables.variable.php',
    1 => 'Les variables dynamiques',
  ),
  'next' => 
  array (
    0 => 'language.constants.php',
    1 => 'Les constantes',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'language/variables.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.variables.external" class="sect1">
  <h2 class="title">Variables externes à PHP</h2>
  
  <div class="sect2" id="language.variables.external.form">
   <h3 class="title">Formulaires HTML (GET et POST)</h3>
   
   <p class="simpara">
    Lorsqu&#039;un formulaire est envoyé à un script PHP,
    toutes les variables du formulaire seront automatiquement disponibles
    dans le script. Il y a peu de façons pour récupérer ces informations,
    par exemple :
   </p>
   
   <p class="para">
    <div class="example" id="example-1">
     <p><strong>Exemple #1 Exemple avec un formulaire simple</strong></p>
     <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;form action=&quot;foo.php&quot; method=&quot;post&quot;&gt;
    Nom  :  &lt;input type=&quot;text&quot; name=&quot;username&quot; /&gt;&lt;br /&gt;
    Email: &lt;input type=&quot;text&quot; name=&quot;email&quot; /&gt;&lt;br /&gt;
    &lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;Envoie!&quot; /&gt;
&lt;/form&gt;</pre>
</div>
     </div>

    </div>
   </p>
   
   <p class="para">
    Il n&#039;y a que deux façons d&#039;accéder aux données provenant d&#039;un formulaire HTML.
    Les méthodes disponibles actuellement sont décrites ci-dessous :
   </p>
   
   <p class="para">
    <div class="example" id="example-2">
     <p><strong>Exemple #2 Accéder simplement à des variables de formulaires POST</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'username'</span><span style="color: #007700">];<br />echo </span><span style="color: #0000BB">$_REQUEST</span><span style="color: #007700">[</span><span style="color: #DD0000">'username'</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>

   <p class="para">
    Utiliser un formulaire de type GET est similaire, hormis le fait que
    les variables prédéfinies de GET peuvent être utilisées à la place.
    GET s&#039;applique aussi à la <code class="literal">QUERY_STRING</code>
    (les informations disponibles après le &#039;?&#039; dans une URL).
    De ce fait, par exemple,
    <code class="literal">http://www.example.com/test.php?id=3</code>
    contient les données de GET, qui sont accessibles via <var class="varname"><a href="reserved.variables.get.php" class="classname">$_GET['id']</a></var>.
    Voir aussi <var class="varname"><a href="reserved.variables.request.php" class="classname">$_REQUEST</a></var>.
   </p>
   
   <blockquote class="note"><p><strong class="note">Note</strong>: 
    <p class="para">
     Les points et les espaces dans les noms de variables
     sont convertis en underscores. Par exemple,
     <code class="literal">&lt;input name=&quot;a.b&quot; /&gt;</code> deviendra
     <code class="literal">$_REQUEST[&quot;a_b&quot;]</code>.
    </p>
   </p></blockquote>
   
   <p class="simpara">
    PHP comprend aussi les tableaux dans le contexte des formulaires.
    (voir aussi <a href="faq.html.php" class="link">la FAQ</a>).
    Par exemple, des variables peuvent être groupées ensemble ou cette
    fonctionnalité peut être utilisée pour lire des valeurs multiples d&#039;un menu déroulant.
    Par exemple, voici un formulaire qui se poste lui-même des données,
    et les affiche :
   </p>
   
   <p class="para">
    <div class="example" id="example-3">
     <p><strong>Exemple #3 Variables de formulaires complexes</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">if (</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">) {<br />    echo </span><span style="color: #DD0000">'&lt;pre&gt;'</span><span style="color: #007700">;<br />    echo </span><span style="color: #0000BB">htmlspecialchars</span><span style="color: #007700">(</span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">, </span><span style="color: #0000BB">true</span><span style="color: #007700">));<br />    echo </span><span style="color: #DD0000">'&lt;/pre&gt;'</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;<br /></span>&lt;form action="" method="post"&gt;<br />    Name:  &lt;input type="text" name="personal[name]" /&gt;&lt;br /&gt;<br />    Email: &lt;input type="text" name="personal[email]" /&gt;&lt;br /&gt;<br />    Beer: &lt;br /&gt;<br />    &lt;select multiple name="beer[]"&gt;<br />        &lt;option value="warthog"&gt;Warthog&lt;/option&gt;<br />        &lt;option value="guinness"&gt;Guinness&lt;/option&gt;<br />        &lt;option value="stuttgarter"&gt;Stuttgarter Schwabenbräu&lt;/option&gt;<br />    &lt;/select&gt;&lt;br /&gt;<br />    &lt;input type="submit" value="Validez moi !" /&gt;<br />&lt;/form&gt;</span></code></div>
     </div>

    </div>
   </p>
   
   <blockquote class="note"><p><strong class="note">Note</strong>: 
     <span class="simpara">
      Si le nom d&#039;une variable externe commence par une syntaxe valide pour un tableau, les caractères qui suivent
      sont silencieusement ignorés. Par exemple : <code class="literal">&lt;input name=&quot;foo[bar]baz&quot;&gt;</code>
      devient <code class="literal">$_REQUEST[&#039;foo&#039;][&#039;bar&#039;]</code>.
     </span>
    </p></blockquote>
   
   <div class="sect3" id="language.variables.external.form.submit">
    <h4 class="title">Nom de variables IMAGE de type SUBMIT</h4>
    
    <p class="simpara">
     Lors de la soumission d&#039;un formulaire, il est possible d&#039;utiliser
     une image au lieu d&#039;un bouton standard, comme ceci :
    </p>
    
    <div class="informalexample">
     <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;input type=&quot;image&quot; src=&quot;image.gif&quot; name=&quot;sub&quot; /&gt;</pre>
</div>
     </div>

    </div>
    
    <p class="simpara">
     Lorsque l&#039;utilisateur clique sur cette image, le formulaire
     associé est envoyé au serveur, avec deux données supplémentaires,
     <var class="varname">sub_x</var> et <var class="varname">sub_y</var>. Elles contiennent
     les coordonnées du clic de l&#039;utilisateur dans l&#039;image. Il est à noter
     que ces variables sont envoyées par le navigateur avec un point dans leur
     nom, mais PHP convertit ces points en soulignés.
    </p>
   </div>
   
  </div>
  
  <div class="sect2" id="language.variables.external.cookies">
   <h3 class="title">Cookies HTTP</h3>
   
   <p class="simpara">
    PHP supporte les cookies HTTP de manière totalement
    transparente, comme défini dans la
    <a href="https://datatracker.ietf.org/doc/html/rfc6265" class="link external">&raquo;&nbsp;RFC 6265</a>. Les cookies
    sont un mécanisme permettant de stocker des données
    sur la machine cliente à des fins d&#039;identification de
    l&#039;utilisateur. Il est possible d&#039;établir un cookie grâce à
    la fonction <span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span>. Les cookies
    font partie intégrante des en-têtes HTTP et donc
    la fonction <span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span> doit être
    appelée avant que le moindre affichage ne soit envoyé
    au navigateur. C&#039;est la même restriction que pour la fonction
    <span class="function"><a href="function.header.php" class="function">header()</a></span>. Les données contenues dans les cookies
    sont alors disponibles dans les tableaux de cookies appropriés, comme
    <var class="varname"><a href="reserved.variables.cookies.php" class="classname">$_COOKIE</a></var> mais aussi <var class="varname"><a href="reserved.variables.request.php" class="classname">$_REQUEST</a></var>.
    Consulter la page de la documentation sur la fonction
    <span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span> pour plus de détails ainsi que des exemples.
   </p>

    <blockquote class="note"><p><strong class="note">Note</strong>: 
     <span class="simpara">
      À partir de PHP 7.2.34, 7.3.23 et 7.4.11, respectivement, les
      <em>noms</em> des cookies entrants ne sont plus
      url-décodés, et ce, pour des raisons de sécurité.
     </span>
    </p></blockquote>
   
   <p class="simpara">
    Si plusieurs valeurs peuvent être assignées à un seul
    cookie, ils peuvent être assignés sous forme de tableau.
    Par exemple :
   </p>
   
   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />setcookie</span><span style="color: #007700">(</span><span style="color: #DD0000">"MyCookie[foo]"</span><span style="color: #007700">, </span><span style="color: #DD0000">'Test 1'</span><span style="color: #007700">, </span><span style="color: #0000BB">time</span><span style="color: #007700">()+</span><span style="color: #0000BB">3600</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">setcookie</span><span style="color: #007700">(</span><span style="color: #DD0000">"MyCookie[bar]"</span><span style="color: #007700">, </span><span style="color: #DD0000">'Test 2'</span><span style="color: #007700">, </span><span style="color: #0000BB">time</span><span style="color: #007700">()+</span><span style="color: #0000BB">3600</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   
   <p class="simpara">
    Cela va créer deux cookies distincts bien que <var class="varname">MyCookie</var>
    soit maintenant un simple tableau dans le script. Si seulement un cookie
    doit être défini avec plusieurs valeurs, utiliser la fonction
    <span class="function"><a href="function.serialize.php" class="function">serialize()</a></span> ou <span class="function"><a href="function.explode.php" class="function">explode()</a></span>
    sur la première valeur.
   </p>
   
   <p class="simpara">
    Il est à noter qu&#039;un cookie remplace le cookie
    précédent par un cookie de même nom tant que
    le chemin ou le domaine sont identiques.
    Donc, pour une application de panier,
    il est possible de conserver un compteur et de l&#039;incrémenter au fur et à mesure.
    C&#039;est-à-dire :
   </p>
   
   <div class="example" id="example-4">
    <p><strong>Exemple #4 Exemple avec <span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span></strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">if (isset(</span><span style="color: #0000BB">$_COOKIE</span><span style="color: #007700">[</span><span style="color: #DD0000">'compte'</span><span style="color: #007700">])) {<br />    </span><span style="color: #0000BB">$compte </span><span style="color: #007700">= </span><span style="color: #0000BB">$_COOKIE</span><span style="color: #007700">[</span><span style="color: #DD0000">'compte'</span><span style="color: #007700">] + </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />} else {<br />    </span><span style="color: #0000BB">$compte </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">setcookie</span><span style="color: #007700">(</span><span style="color: #DD0000">'compte'</span><span style="color: #007700">, </span><span style="color: #0000BB">$compte</span><span style="color: #007700">, </span><span style="color: #0000BB">time</span><span style="color: #007700">()+</span><span style="color: #0000BB">3600</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">setcookie</span><span style="color: #007700">(</span><span style="color: #DD0000">"Panier[</span><span style="color: #0000BB">$compte</span><span style="color: #DD0000">]"</span><span style="color: #007700">, </span><span style="color: #0000BB">$item</span><span style="color: #007700">, </span><span style="color: #0000BB">time</span><span style="color: #007700">()+</span><span style="color: #0000BB">3600</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   
  </div>
  
  <div class="sect2" id="language.variables.external.dot-in-names">
   <h3 class="title">Cas des points dans les noms de variables</h3>
   
   <p class="para">
    Typiquement, PHP ne modifie pas les noms des variables lorsqu&#039;elles
    sont passées à un script. Cependant, il faut noter que
    les points (.) ne sont pas autorisés dans les noms de variables
    PHP. Pour cette raison, il convient d&#039;examiner :
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />  $varname</span><span style="color: #007700">.</span><span style="color: #0000BB">ext</span><span style="color: #007700">;  </span><span style="color: #FF8000">/* nom de variable invalide */<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    Dans ce cas, l&#039;analyseur croit voir la variable nommée
    <var class="varname">$varname</var>, suivie par l&#039;opérateur de concaténation,
    et suivie encore par la chaîne sans guillemets
    (une chaîne sans guillemets et qui n&#039;a pas de signification
    particulière). Visiblement, ce n&#039;est pas ce qu&#039;on attendait...
   </p>
   
   <p class="para">
    Pour cette raison, il est important de noter que PHP remplacera
    automatiquement les points des noms de variables entrantes par
    des soulignés.
   </p>
   
  </div>
  
  <div class="sect2" id="language.variables.determining-type-of">
   <h3 class="title">Détermination du type des variables</h3>
   
   <p class="para">
    Parce que PHP détermine le type des variables et
    les convertit (généralement) comme il faut,
    ce n&#039;est pas toujours le type de variable souhaité.
    PHP inclut des fonctions permettant de déterminer le
    type d&#039;une variable :
    <span class="function"><a href="function.gettype.php" class="function">gettype()</a></span>,
    <span class="function"><a href="function.is-array.php" class="function">is_array()</a></span>,
    <span class="function"><a href="function.is-float.php" class="function">is_float()</a></span>,
    <span class="function"><a href="function.is-int.php" class="function">is_int()</a></span>,
    <span class="function"><a href="function.is-object.php" class="function">is_object()</a></span> et
    <span class="function"><a href="function.is-string.php" class="function">is_string()</a></span>.
    Consulter également le chapitre sur les
    <a href="language.types.php" class="link">types</a>.
   </p>
    <p class="para">
     HTTP étant un protocole texte, la plupart, sinon tous, le contenu qui vient 
     dans les <a href="language.variables.superglobals.php" class="link">tableaux Superglobaux</a>, 
     comme <var class="varname"><a href="reserved.variables.post.php" class="classname">$_POST</a></var> et <var class="varname"><a href="reserved.variables.get.php" class="classname">$_GET</a></var> restera en tant 
     que chaînes. PHP n&#039;essaiera pas de convertir des valeurs en un type spécifique.
     Dans l&#039;exemple ci-dessous, <var class="varname"><a href="reserved.variables.get.php" class="classname">$_GET["var1"]</a></var> contiendra la 
     chaîne &quot;null&quot; et <var class="varname"><a href="reserved.variables.get.php" class="classname">$_GET["var2"]</a></var>, la chaîne &quot;123&quot;.
     <div class="example-contents">
<div class="cdata"><pre>
/index.php?var1=null&amp;var2=123
</pre></div>
      </div>

    </p>
  </div>
  
  <div class="sect2" id="language.variables.external.changelog">
   <h3 class="title">Historique</h3>

    <p class="para">
     <table class="doctable informaltable">
      
       <thead>
        <tr>
         <th>Version</th>
         <th>Description</th>
        </tr>

       </thead>

       <tbody class="tbody">
        <tr>
         <td>7.2.34, 7.3.23, 7.4.11</td>
         <td>
          Les <em>noms</em> des cookies entrants ne sont plus
          url-décodés, et ce, pour des raisons de sécurité.
         </td>
        </tr>

       </tbody>
      
     </table>

    </p>
   </div>
  
 </div><?php manual_footer($setup); ?>