Files
doc-fr/reference/session/examples.xml
2010-03-29 00:47:47 +00:00

278 lines
10 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 96c9d88bad9a7d7d44bfb7f26c226df7ee9ddf26 Maintainer: dams Status: ready -->
<!-- Reviewed: yes -->
<appendix xml:id="session.examples" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
&reftitle.examples;
<section xml:id="session.examples.basic">
<note>
<para>
Depuis PHP 4.1.0, <varname>$_SESSION</varname> est disponible comme
variable globale, au même titre que <varname>$_POST</varname>,
<varname>$_GET</varname>, <varname>$_REQUEST</varname>, etc.
Contrairement à <varname>$HTTP_SESSION_VARS</varname>,
<varname>$_SESSION</varname> est toujours globale. Par conséquent, vous
n'avez pas besoin d'utiliser le mot réservé
<link linkend="language.variables.scope"><command>global</command></link>
avec <varname>$_SESSION</varname>. Notez que cette documentation
a été modifiée pour utiliser <varname>$_SESSION</varname>.
Vous pouvez toujours le remplacer par
<varname>$HTTP_SESSION_VARS</varname> si vous préférez l'ancienne version.
Notez également que vous devez démarrer votre session en utilisant la fonction
<function>session_start</function> avant d'utiliser
la variable super-globale <varname>$_SESSION</varname>.
</para>
<para>
Les clés du tableau <varname>$_SESSION</varname> sont sujettes
aux mêmes limitations que les variables PHP habituelles, c'est-à-dire
qu'elles ne peuvent pas commencer par un nombre, mais commencer par
une lettre ou un souligné '_'. Pour plus de détails, reportez-vous à
la section sur les <link linkend="language.variables">variables</link>.
</para>
</note>
<para>
Si <link linkend="ini.register-globals">register_globals</link>
est désactivé, seuls les éléments du tableau global
<varname>$_SESSION</varname> contiendront les variables
enregistrées dans la session. Les variables de sessions relues seront
uniquement disponibles dans <varname>$_SESSION</varname>.
</para>
<para>
L'utilisation de <varname>$_SESSION</varname> (ou
<varname>$HTTP_SESSION_VARS</varname> avec PHP 4.0.6 et plus ancien) est
recommandé pour une meilleure sécurité et un code plus facilement
entretenu. Avec <varname>$_SESSION</varname>, il n'y a pas besoin
d'utiliser les fonctions <function>session_register</function>,
<function>session_unregister</function> et
<function>session_is_registered</function>. Les variables de sessions
sont accessibles comme toute autre variable.
<example>
<title>
Enregistrer une variable avec <varname>$_SESSION</varname>.
</title>
<programlisting role="php">
<![CDATA[
<?php
session_start();
// Utilisez $HTTP_SESSION_VARS avec PHP 4.0.6 ou plus ancien
if (!isset($_SESSION['count'])) {
$_SESSION['count'] = 0;
} else {
$_SESSION['count']++;
}
?>
]]>
</programlisting>
</example>
<example>
<title>
Retirer une variable de session avec <varname>$_SESSION</varname> et <link
linkend="ini.register-globals"><option>register_globals</option></link> inactif.
</title>
<programlisting role="php">
<![CDATA[
<?php
session_start();
// Utilisez $HTTP_SESSION_VARS avec PHP 4.0.6 ou plus ancien
unset($_SESSION['count']);
?>
]]>
</programlisting>
</example>
</para>
<para>
<caution>
<para>
N'utilisez PAS la fonction <function>unset</function>
avec <varname>$_SESSION</varname> sous la forme
<literal>unset($_SESSION)</literal> sinon, cela rendra impossible
l'enregistrement de données dans la session en utilisant la super-globale
<varname>$_SESSION</varname>.
</para>
</caution>
</para>
<warning>
<para>
Vous ne pouvez pas utiliser les références sur des variables de session
car il n'y a aucune manière faisable de restaurer une référence vers une
autre variable.
</para>
</warning>
<para>
Si <link linkend="ini.register-globals">register_globals</link>
est activé, alors toutes les variables globales peuvent être
enregistrées comme variables de session, et toutes les variables de
sessions seront reconstituées comme variables globales. Comme PHP doit
savoir quels variables globales sont enregistrées comme variables
de sessions, l'utilisateur doit enregistrer les variables avec
<function>session_register</function> tandis que
<varname>$HTTP_SESSION_VARS</varname> et <varname>$_SESSION</varname>
ne nécessitent pas <function>session_register</function>.
<caution>
<para>
Avant PHP 4.3.0, si vous utilisez <varname>$_SESSION</varname> et que
vous avez désactivé <link
linkend="ini.register-globals"><option>register_globals</option></link>,
n'utilisez pas <function>session_register</function>,
<function>session_is_registered</function> ou
<function>session_unregister</function>.
Désactiver
<link linkend="ini.register-globals">register_globals</link>
est recommandé pour des raisons de sécurité et de performances.
</para>
</caution>
</para>
<para>
Si <link
linkend="ini.register-globals">register_globals</link>
est activé, alors les variables globales et les entrées dans le tableau
<varname>$_SESSION</varname> seront des références sur la même valeur pour
les valeurs qui auront été enregistrées avant le démarrage de la session
(donc, dans les page précédentes). Cependant, si la variable a été enregistrée
avec <varname>$_SESSION</varname>, alors, la variable globale est disponible
jusqu'à la prochaine requête.
</para>
<para>
De plus, si vous enregistrez une nouvelle variable avec la fonction
<function>session_register</function>, l'entrée dans l'environnement
global et <varname>$_SESSION</varname> ne fera pas de référence vers la
même valeur jusqu'à la prochaine utilisation de
<function>session_start</function> (ceci s'applique à PHP 4.2.3 et
avant seulement). C'est à dire qu'une modification dans les variables
globales ne sera pas répercutée dans les entrées de
<varname>$_SESSION</varname>. Il est peu probable que cela ait un impact en
pratique et, de plus, cela a été corrigé en PHP 4.3.0.
</para>
</section>
<section xml:id="session.idpassing">
<title>Passer l'identifiant de session (session ID)</title>
<para>
Il y a deux méthodes de propagation de l'identifiant de session :
<itemizedlist>
<listitem>
<simpara>
Cookies
</simpara>
</listitem>
<listitem>
<simpara>
Par URL
</simpara>
</listitem>
</itemizedlist>
</para>
<para>
Le module de session supporte les deux méthodes. Les cookies sont
optimaux, mais comme ils ne sont pas sûrs (tous les internautes
ne les acceptent pas), ils ne sont pas fiables. La seconde
méthode place l'identifiant de session directement dans les URL.
</para>
<para>
PHP est capable de faire cela de manière transparente, lorsqu'il est
compilé avec l'option <link linkend="ini.session.use-trans-sid">
--enable-trans-sid</link>. Si vous activez
cette option et que l'option d'exécution <literal>session.use_trans_sid</literal>
est activée, les URLs relatives seront modifiées pour contenir l'identifiant
de session automatiquement.
<note>
<para>
L'option <link linkend="ini.arg-separator.output">arg_separator.output</link>
de &php.ini; vous permet de personnaliser le séparateur d'arguments.
Pour être complètement en accord avec les spécifications XHTML, spécifiez
&amp;amp; ici.
</para>
</note>
</para>
<para>
Alternativement, vous pouvez utiliser la constante <constant>SID</constant>
qui est définie si la session a commencé. Si le client n'envoie pas un cookie de session
approprié, il aura la forme <literal>session_name=session_id</literal>.
Sinon, il vaudra une chaîne vide. Ainsi, vous pouvez dans tous les cas
l'inclure dans l'URL.
</para>
<para>
L'exemple suivant vous montre comment enregistrer une variable et comment
réaliser un lien correct avec une autre page, avec
<constant>SID</constant>.
<example>
<title>Compter le nombre de passages d'un utilisateur sur une page</title>
<programlisting role="php">
<![CDATA[
<?php
session_start();
if (empty($_SESSION['count'])) {
$_SESSION['count'] = 1;
} else {
$_SESSION['count']++;
}
?>
<p>
Bonjour visiteur, vous avez vu cette page <?php echo $_SESSION['count']; ?> fois.
</p>
<p>
Pour continuer, <a href="nextpage.php?<?php echo htmlspecialchars(SID); ?>">cliquez ici</a>.
</p>
]]>
</programlisting>
</example>
</para>
<para>
La fonction <function>htmlspecialchars</function> est utilisée lors de l'affichage
du <constant>SID</constant> dans le but de contrer les attaques XSS.
</para>
<para>
L'affichage du <constant>SID</constant>, comme montré dans l'exemple
ci-dessus, n'est pas nécessaire si <link
linkend="ini.session.use-trans-sid">
--enable-trans-sid</link> a été utilisé pour compiler
PHP.
</para>
<note>
<para>
Les URL non-relatives sont considérées comme externes au site, et ne
recevront pas le <constant>SID</constant>, car c'est une fuite
d'informations vers un autre site (envoi d'informations importantes).
</para>
</note>
</section>
<section xml:id="session.customhandler">
<title>Gestion personnalisée des sessions</title>
<para>
Pour implémenter un stockage en base de données, ou toute autre méthode,
vous aurez besoin de la fonction
<function>session_set_save_handler</function> pour
paramétrer vos propres fonctions de stockage.
</para>
</section>
</appendix>
<!-- 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
-->