2010-08-15 4 views
4

J'ai le plus étrange problème avec PHP lui-même, que j'ai jamais vu.Comportement bizarre PHP si je mets le point d'exclamation dans le nom de la variable

Configuration:

PHP 5,33, (essayé PHP 5.2.14 ainsi) sous IIS

Problème: PHP supprime toutes les données de session, dès que je mets un point d'exclamation dans une clé dans un tableau de session.

Exemple:

session1.php

session_start(); 
$_SESSION["foo"] = 'test'; 
header('Location: session2.php'); 

session2.php

session_start(); 
var_dump($_SESSION); 
die(); 

fonctionne très bien, je vois des données variables imprimées.

array(1) { ["foo"]=> &string(4) "test" } 

Mais si je change la ligne en premier fichier à

$_SESSION["foo!"] = 'test'; 

ou

$_SESSION["f!oo"] = 'test'; 

Je veux dire que si j'ajouter un point d'exclamation -Alors $ _SESSION est vide quand je reçois au deuxième fichier

array(0) { } 

J'ai pensé que c'était une version buggée de PHP quand j'étais sur 5.2.14, mais la mise à jour n'a pas aidé. Je ne sais même pas quel pourrait être le problème. Peut-être que cela a quelque chose à voir avec l'installation de Windows, ou IIS?

Des idées?

+0

quel backend de session utilisez-vous? fichiers simples? 'session.save_handler = files' – stillstanding

+1

Mon php 5.3.1 fonctionne très bien avec"! " (xampp). – ehpc

+0

Il y avait un vieux rapport de bogue sur ceci, mais apparemment il n'était pas reproductible (http://bugs.php.net/bug.php?id=14160) – nico

Répondre

2

bien quelle est votre question? quelle est la raison de cette erreur ou comment l'éviter?
Un premier est probablement à cause de certains internes PHP étranges. Par exemple, vous ne pouvez pas utiliser les touches numériques avec les mêmes conséquences.
Un dernier est encore plus simple - ne placez pas le point d'exclamation dans une clé du tableau de session. Si je me souviens bien, le mécanisme des sessions PHP est venu du PHPLib, un premier framework PHP. Écrit par quelques étudiants volontaires. Pas très optimal. Une fois ajouté à PHP dans la version 4.0, devenez utilisable seulement en 4.1 mais toujours avec un héritage étrange, comme le support de register_globals. Ce dernier est probablement la raison de votre problème. La clé de tableau $ _SESSION doit être un nom de variable PHP valide, à cause de ce comportement ancien de register_globals où les variables de session deviennent des variables PHP globales.

+0

register_globals a été déprécié en 5.3. cbglum utilise 5.3.3 – stillstanding

+0

@stillstanding alors quoi? –

+0

J'ai désactivé register_globals après avoir remarqué le problème. Maintenant, je suis plus convaincu que c'est plus de IIS, ou problème de Win, mais je n'ai aucune idée de la façon de résoudre le problème sans quitter ce serveur. Des indices? – glum

2

Il est pas Windows, il est pas Apache ou tout autre serveur web, il est au cœur de PHP. Je l'ai regardé - à partir de 5.3 à 5.6 et le problème existe toujours là: Vous n'êtes pas autorisé à avoir un "!" (point d'exclamation) ou "|" (pipe) à l'intérieur de la clé de session.

Le patch Suhosin le réparera partiellement. Vous êtes alors autorisé à avoir un point d'exclamation à n'importe quelle position à l'intérieur de votre clé, mais pas en première position, donc "foo!" est autorisé, mais pas "! foo". Une pipe est toujours interdite.

Le correctif:

  1. changement session.serialize_handler dans votre php.ini à php_binary ou php_serialize
  2. Redémarrez le serveur Web.

Amusez-vous!

Questions connexes