mirror of
https://github.com/macintoshplus/doc-fr.git
synced 2026-03-24 17:02:18 +01:00
443 lines
17 KiB
XML
443 lines
17 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
||
<!-- EN-Revision: 1ad4e2d550953000e2441b663226300596962ef2 Maintainer: yannick Status: ready -->
|
||
<!-- Reviewed: no -->
|
||
<refentry xml:id="function.setcookie" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||
<refnamediv>
|
||
<refname>setcookie</refname>
|
||
<refpurpose>Envoie un cookie</refpurpose>
|
||
</refnamediv>
|
||
|
||
<refsect1 role="description">
|
||
&reftitle.description;
|
||
<methodsynopsis>
|
||
<type>bool</type><methodname>setcookie</methodname>
|
||
<methodparam><type>string</type><parameter>name</parameter></methodparam>
|
||
<methodparam choice="opt"><type>string</type><parameter>value</parameter><initializer>""</initializer></methodparam>
|
||
<methodparam choice="opt"><type>int</type><parameter>expires_or_options</parameter><initializer>0</initializer></methodparam>
|
||
<methodparam choice="opt"><type>string</type><parameter>path</parameter><initializer>""</initializer></methodparam>
|
||
<methodparam choice="opt"><type>string</type><parameter>domain</parameter><initializer>""</initializer></methodparam>
|
||
<methodparam choice="opt"><type>bool</type><parameter>secure</parameter><initializer>&false;</initializer></methodparam>
|
||
<methodparam choice="opt"><type>bool</type><parameter>httponly</parameter><initializer>&false;</initializer></methodparam>
|
||
</methodsynopsis>
|
||
<para>Signature alternative disponible à partir de PHP 7.3.0 (pas supporté avec les paramètres nommés) :</para>
|
||
<methodsynopsis>
|
||
<type>bool</type><methodname>setcookie</methodname>
|
||
<methodparam><type>string</type><parameter>name</parameter></methodparam>
|
||
<methodparam choice="opt"><type>string</type><parameter>value</parameter><initializer>""</initializer></methodparam>
|
||
<methodparam choice="opt"><type>array</type><parameter>options</parameter><initializer>[]</initializer></methodparam>
|
||
</methodsynopsis>
|
||
<para>
|
||
<function>setcookie</function> définit un cookie qui sera envoyé
|
||
avec le reste des en-têtes HTTP. Comme pour les autres en-têtes, les cookies
|
||
doivent être envoyés <emphasis>avant</emphasis> toute autre sortie
|
||
(c'est une restriction du protocole HTTP, pas de PHP). Cela vous impose
|
||
d'appeler cette fonction avant toute balise <literal><html></literal>
|
||
ou <literal><head></literal> et aussi des caractères d'espacement blanc.
|
||
</para>
|
||
<para>
|
||
Une fois que les cookies ont été placés, ils seront accessibles lors du prochain
|
||
chargement de page dans le tableau <varname>$_COOKIE</varname>.
|
||
Les valeurs des cookies
|
||
peuvent aussi exister dans la variable <varname>$_REQUEST</varname>.
|
||
</para>
|
||
</refsect1>
|
||
|
||
<refsect1 role="parameters">
|
||
&reftitle.parameters;
|
||
<para>
|
||
La <link xlink:href="&url.rfc;6265">RFC 6265</link> est la référence pour
|
||
l'interprétation des paramètres passés à <function>setcookie</function>.
|
||
<variablelist>
|
||
<varlistentry>
|
||
<term><parameter>name</parameter></term>
|
||
<listitem>
|
||
<para>
|
||
Le nom du cookie.
|
||
</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term><parameter>value</parameter></term>
|
||
<listitem>
|
||
<para>
|
||
La valeur du cookie. Cette valeur est stockée sur l'ordinateur du client ;
|
||
ne stockez pas d'informations importantes.
|
||
Si le paramètre <parameter>name</parameter> vaut <literal>'cookiename'</literal>,
|
||
cette valeur est récupéré avec <varname>$_COOKIE['cookiename']</varname>.
|
||
</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term><parameter>expires_or_options</parameter></term>
|
||
<listitem>
|
||
<para>
|
||
Le temps après lequel le cookie expire. C'est un timestamp Unix, donc,
|
||
ce sera un nombre de secondes depuis l'époque Unix (1 janvier 1970).
|
||
Une façon de définir cette valeur est d'ajouter le nombre de secondes avant
|
||
que le cookie n'expire au résultat d'un appel à <function>time</function>.
|
||
Par exemple <literal>time()+60*60*24*30</literal> configurera le cookie pour
|
||
qu'il expire dans 30 jours. Une autre possibilité consiste à utiliser la
|
||
fonction <function>mktime</function>. Si vous ne spécifiez pas ce
|
||
paramètre ou s'il vaut 0, le cookie expirera à la fin de la session
|
||
(lorsque le navigateur sera fermé).
|
||
</para>
|
||
<para>
|
||
<note>
|
||
<para>
|
||
Vous pourrez noter que le paramètre <parameter>expires_or_options</parameter> prend un
|
||
horodatage unique, et non pas la date au format <literal>Jour, JJ-Mois-AAAA
|
||
HH:MM:SS GMT</literal>, car PHP fait la conversion en interne.
|
||
</para>
|
||
</note>
|
||
</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term><parameter>path</parameter></term>
|
||
<listitem>
|
||
<para>
|
||
Le chemin sur le serveur sur lequel le cookie sera disponible.
|
||
Si la valeur est <literal>'/'</literal>, le cookie sera disponible
|
||
sur l'ensemble du domaine <parameter>domain</parameter>. Si la valeur
|
||
est <literal>'/foo/'</literal>, le cookie sera uniquement disponible
|
||
dans le répertoire <literal>/foo/</literal> ainsi que tous ses
|
||
sous-répertoires comme <literal>/foo/bar/</literal> dans le domaine
|
||
<parameter>domain</parameter>. La valeur par défaut est le répertoire
|
||
courant où le cookie a été défini.
|
||
</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term><parameter>domain</parameter></term>
|
||
<listitem>
|
||
<para>
|
||
Le (sous-)domaine pour lequel le cookie est disponible. Définir ceci à un
|
||
sous-domaine (tel que <literal>'www.example.com'</literal>) rendra le cookie
|
||
disponible pour ce sous-domaine ainsi que tous ses sous-domaines
|
||
(par exemple : w2.www.example.com). Pour rendre le cookie
|
||
disponible sur tout le domaine (ainsi que tous ses sous-domaines), définissez
|
||
simplement la valeur avec le nom de domaine (<literal>'example.com'</literal>,
|
||
avec cet exemple).
|
||
</para>
|
||
<para>
|
||
Les anciens navigateurs continuant d'implémenter la
|
||
<link xlink:href="&url.rfc;2109">RFC 2109</link> (obsolète)
|
||
peuvent nécessiter un <literal>.</literal> pour rendre disponible
|
||
tous les sous-domaines.
|
||
</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term><parameter>secure</parameter></term>
|
||
<listitem>
|
||
<para>
|
||
Indique si le cookie doit uniquement être transmis à travers une
|
||
connexion sécurisée HTTPS depuis le client. Lorsque ce paramètre
|
||
vaut &true;, le cookie ne sera envoyé que si la connexion est sécurisée.
|
||
Côté serveur, c'est au développeur d'envoyer ce genre de cookie
|
||
uniquement sur les connexions sécurisées (par exemple, en utilisant
|
||
la variable <varname>$_SERVER["HTTPS"]</varname>).
|
||
</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term><parameter>httponly</parameter></term>
|
||
<listitem>
|
||
<para>
|
||
Lorsque ce paramètre vaut &true;, le cookie ne sera accessible que par
|
||
le protocole HTTP. Cela signifie que le cookie ne sera pas accessible
|
||
via des langages de scripts, comme Javascript. Il a été suggéré que cette
|
||
configuration permet de limiter les attaques via XSS (bien qu'elle ne soit
|
||
pas supportée par tous les navigateurs), néanmoins ce fait est souvent contesté.
|
||
&true; ou &false;
|
||
</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term><parameter>options</parameter></term>
|
||
<listitem>
|
||
<para>
|
||
Un &array; associatif qui peut avoir comme clés
|
||
<literal>expires</literal>, <literal>path</literal>, <literal>domain</literal>,
|
||
<literal>secure</literal>, <literal>httponly</literal> et <literal>samesite</literal>.
|
||
Si une autre clé est présente une erreur de niveau
|
||
<constant>E_WARNING</constant> est émise.
|
||
Les valeurs ont la même signification que celles décrits pour les paramètres
|
||
avec le même nom. La valeur de l'élément <literal>samesite</literal> doit
|
||
être <literal>None</literal>, <literal>Lax</literal> ou <literal>Strict</literal>.
|
||
Si une options autorisé n'est pas donnée alors sa valeur par défaut sera
|
||
identique à la valeur par défaut des paramètres explicite. Si l'élément
|
||
<literal>samesite</literal> est omit, alors l'attribut SameSite du cookie
|
||
ne sera pas définie.
|
||
</para>
|
||
<para>
|
||
<note>
|
||
<para>
|
||
Pour définir un cookie qui inclut des attributs qui ne figurent pas parmi les clés répertoriées,
|
||
utilisez <function>header</function>.
|
||
</para>
|
||
</note>
|
||
</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
</variablelist>
|
||
</para>
|
||
</refsect1>
|
||
|
||
<refsect1 role="returnvalues">
|
||
&reftitle.returnvalues;
|
||
<para>
|
||
Si quelque chose a été envoyé sur la sortie standard avant l'appel
|
||
à cette fonction, <function>setcookie</function> échouera et
|
||
retournera &false;. Si <function>setcookie</function> réussi,
|
||
elle retournera &true;.
|
||
Cela n'indique pas si le client accepte ou pas le cookie.
|
||
</para>
|
||
</refsect1>
|
||
|
||
<refsect1 role="changelog">
|
||
&reftitle.changelog;
|
||
<para>
|
||
<informaltable>
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>&Version;</entry>
|
||
<entry>&Description;</entry>
|
||
</row>
|
||
</thead>
|
||
<tbody>
|
||
<row>
|
||
<entry>8.2.0</entry>
|
||
<entry>
|
||
Le date du cookie est au format <literal>'D, d M Y H:i:s \G\M'T'</literal>;
|
||
précédemment c'était <literal>'D, d-M-Y H:i:s T'</literal>.
|
||
</entry>
|
||
</row>
|
||
<row>
|
||
<entry>7.3.0</entry>
|
||
<entry>
|
||
Une signature alternative supportant un tableau
|
||
d'<parameter>options</parameter> a été ajouté. Cette signature supporte
|
||
la définition de l'attribut SameSite du cookie.
|
||
</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</informaltable>
|
||
</para>
|
||
</refsect1>
|
||
|
||
<refsect1 role="examples">
|
||
&reftitle.examples;
|
||
<para>
|
||
Les exemples suivants démontrent quelques façons d'envoyer des cookies.
|
||
<example>
|
||
<title>Exemple d'envoi d'un cookie avec <function>setcookie</function></title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
|
||
$value = 'Valeur de test';
|
||
|
||
setcookie("TestCookie", $value);
|
||
setcookie("TestCookie", $value, time()+3600); /* expire dans 1 heure */
|
||
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", "example.com", true);
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
</para>
|
||
<para>
|
||
Notez que la partie "valeur" du cookie sera automatiquement
|
||
encodée URL lorsque vous envoyez le cookie et, lorsque vous
|
||
le recevez, il sera automatiquement décodé et affecté à la
|
||
variable du même nom que le cookie. Si vous ne souhaitez pas
|
||
ce comportement par défaut, vous pouvez utiliser la fonction
|
||
<function>setrawcookie</function>.
|
||
Pour voir le résultat, essayez les scripts suivants :
|
||
</para>
|
||
<para>
|
||
<informalexample>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
// Afficher un cookie
|
||
echo $_COOKIE["TestCookie"];
|
||
|
||
// Une autre méthode pour afficher tous les cookies
|
||
print_r($_COOKIE);
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</informalexample>
|
||
</para>
|
||
<para>
|
||
<example>
|
||
<title>Exemple d'effacement d'un cookie avec <function>setcookie</function></title>
|
||
<para>
|
||
Pour effacer un cookie sur le client, vous devez toujours vous assurer
|
||
que sa date d'expiration est passée, pour déclencher
|
||
le mécanisme du navigateur client. Voici comment procéder :
|
||
</para>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
// Définie la date d'expiration à une heure avant la date courante
|
||
setcookie("TestCookie", "", time() - 3600);
|
||
setcookie("TestCookie", "", time() - 3600, "/~rasmus/", "example.com", 1);
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
</para>
|
||
<para>
|
||
<example>
|
||
<title><function>setcookie</function> et les tableaux</title>
|
||
<para>
|
||
Vous pouvez aussi utiliser les cookies avec des tableaux, en utilisant la
|
||
notation des tableaux. Cela a pour effet de créer autant de
|
||
cookies que votre tableau a d'éléments, mais lorsque
|
||
les cookies seront reçus par votre script, les valeurs seront
|
||
placées dans un tableau :
|
||
</para>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
// Définit les cookies
|
||
setcookie("cookie[three]", "cookiethree");
|
||
setcookie("cookie[two]", "cookietwo");
|
||
setcookie("cookie[one]", "cookieone");
|
||
|
||
// Après le rechargemet de la page, nous les affichons
|
||
if (isset($_COOKIE['cookie'])) {
|
||
foreach ($_COOKIE['cookie'] as $name => $value) {
|
||
$name = htmlspecialchars($name);
|
||
$value = htmlspecialchars($value);
|
||
echo "$name : $value <br />\n";
|
||
}
|
||
}
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
&example.outputs;
|
||
<screen>
|
||
<![CDATA[
|
||
three : cookiethree
|
||
two : cookietwo
|
||
one : cookieone
|
||
]]>
|
||
</screen>
|
||
</example>
|
||
<note>
|
||
<simpara>
|
||
L'utilisation des caractères de séparation comme <literal>[</literal> et
|
||
<literal>]</literal> comme faisant partie du nom du cookie n'est pas
|
||
respectueux de la RFC 6265, section 4, mais est supposé être supporté
|
||
par les user agents, suivant la RFC 6265, section 5.
|
||
</simpara>
|
||
</note>
|
||
</para>
|
||
</refsect1>
|
||
|
||
<refsect1 role="notes">
|
||
&reftitle.notes;
|
||
<note>
|
||
<para>
|
||
Vous pouvez utiliser un tampon de sortie pour pouvoir
|
||
envoyer du contenu avant d'appeler cette fonction, avec la contrepartie
|
||
que toute votre page sera envoyée en une fois. Vous pouvez faire cela
|
||
en appelant <function>ob_start</function> et <function>ob_end_flush</function>
|
||
dans votre script, ou en activant la directive <literal>output_buffering</literal>
|
||
dans votre fichier de configuration &php.ini; ou dans le fichier de configuration
|
||
de votre serveur.
|
||
</para>
|
||
</note>
|
||
<para>
|
||
Erreurs communes :
|
||
<itemizedlist>
|
||
<listitem>
|
||
<simpara>
|
||
Les cookies ne seront accessibles qu'au chargement de la prochaine page,
|
||
ou au rechargement de la page courante. Pour tester si un cookie
|
||
a été défini avec succès, vérifiez la présence du cookie au prochain
|
||
chargement de la page avant que le cookie n'expire. Le délai d'expiration
|
||
est défini en utilisant le paramètre <parameter>expires_or_options</parameter>.
|
||
Une façon simple de vérifier le positionnement du cookie est d'utiliser
|
||
<literal>print_r($_COOKIE);</literal>.
|
||
</simpara>
|
||
</listitem>
|
||
<listitem>
|
||
<simpara>
|
||
Les cookies doivent être effacés avec les mêmes paramètres
|
||
que ceux utilisés lors de leur création. Si l'argument
|
||
<parameter>value</parameter> est une chaîne vide et que les autres
|
||
arguments sont exactement les mêmes que lors d'un appel <function>setcookie</function> précédent,
|
||
alors le cookie sera effacé du client.
|
||
En interne, l'effacement est réalisé en positionnant la valeur à
|
||
<literal>'deleted'</literal> et la date d'expiration à une année dans le passé.
|
||
</simpara>
|
||
</listitem>
|
||
<listitem>
|
||
<simpara>
|
||
Du fait que l'assignation d'une valeur valant &false; à un cookie
|
||
tente de l'effacer, vous ne devriez pas utiliser de &boolean;.
|
||
À la place, utilisez <emphasis>0</emphasis> pour &false;
|
||
et <emphasis>1</emphasis> pour &true;.
|
||
</simpara>
|
||
</listitem>
|
||
<listitem>
|
||
<simpara>
|
||
Les noms des cookies peuvent être des tableaux de noms et seront
|
||
disponibles dans vos scripts PHP sous la forme de tableaux, mais
|
||
des cookies différents seront placés sur le client.
|
||
Utilisez <function>explode</function> pour placer un cookie
|
||
avec des noms et des valeurs multiples. Il n'est pas recommandé d'utiliser
|
||
la fonction <function>serialize</function> pour réaliser ceci, car
|
||
cela peut conduire à des problèmes de sécurité.
|
||
</simpara>
|
||
</listitem>
|
||
</itemizedlist>
|
||
</para>
|
||
<simpara>
|
||
Les appels multiples à la fonction <function>setcookie</function>
|
||
seront effectués dans l'ordre.
|
||
</simpara>
|
||
</refsect1>
|
||
|
||
<refsect1 role="seealso">
|
||
&reftitle.seealso;
|
||
<para>
|
||
<simplelist>
|
||
<member><function>header</function></member>
|
||
<member><function>setrawcookie</function></member>
|
||
<member><link linkend="features.cookies">Section sur les cookies</link></member>
|
||
<member><link xlink:href="&url.rfc;6265">RFC 6265</link></member>
|
||
<member><link xlink:href="&url.rfc;2109">RFC 2109</link></member>
|
||
</simplelist>
|
||
</para>
|
||
</refsect1>
|
||
|
||
</refentry>
|
||
|
||
<!-- Keep this comment at the end of the file
|
||
Local variables:
|
||
mode: sgml
|
||
sgml-omittag:t
|
||
sgml-shorttag:t
|
||
sgml-minimize-attributes:nil
|
||
sgml-always-quote-attributes:t
|
||
sgml-indent-step:1
|
||
sgml-indent-data:t
|
||
indent-tabs-mode:nil
|
||
sgml-parent-document:nil
|
||
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
|
||
sgml-exposed-tags:nil
|
||
sgml-local-catalogs:nil
|
||
sgml-local-ecat-files:nil
|
||
End:
|
||
vim600: syn=xml fen fdm=syntax fdl=2 si
|
||
vim: et tw=78 syn=sgml
|
||
vi: ts=1 sw=1
|
||
-->
|