2010-03-03 4 views
2

Le serveur chez mon ancien employeur a été enraciné le week-end dernier et apparemment le fournisseur de serveur a apporté des modifications au serveur qui affecte le code PHP.Pourquoi les objets sont-ils transformés en chaînes lorsque d'autres objets non liés sont sérialisés?

Le problème qui s'est posé concerne la sérialisation des objets. Les objets en sérialisation et les autres objets n'étant pas sérialisés sont convertis en chaînes, ce qui brise le code. Ce code a fonctionné avant que le serveur ait été piraté.

Voici ce qui se passe:

$plate = new Plate(); 
$plate2 = clone $plate; 
gettype($plate); // Prints "object" 
gettype($plate2); // Prints "object" 

$_SESSION['plate'] = serialize($plate); 

gettype($plate); // Prints "string" 
gettype($plate2); // Prints "string" 


$plate = new Plate(); 
$plate2 = new Plate(); 
gettype($plate); // Prints "object" 
gettype($plate2); // Prints "object" 

$_SESSION['plate'] = serialize($plate); 

gettype($plate); // Prints "string" 
gettype($plate2); // Prints "string" 

Comme vous pouvez le voir les objets, même ceux en cours de sérialisation, sont converties en chaînes. Des idées?

EDIT: Ils exécutent PHP 5.2.12 avec globals de registre sur.

Répondre

4

Mise à jour: Je peux reproduire moitié de votre cas de test sur PHP 5.3.1, mais seulement si je register_globals ensemble à Sur:

session_start(); // obviously 

class Plate // to have something on my plate 
{ 

    var $Member1; 
    var $Member2; 

} 

$plate = new Plate(); 
$plate2 = clone $plate; 
echo gettype($plate); // Prints "object" 
echo gettype($plate2); // Prints "object" 

$_SESSION['plate'] = serialize($plate); 

echo gettype($plate); // Prints "string" 
echo gettype($plate2); // Prints "object", unlike in your example 

$plate = new Plate(); 
$plate2 = new Plate(); 
echo gettype($plate); // Prints "object" 
echo gettype($plate2); // Prints "object" 
$_SESSION['plate'] = serialize($plate); 

echo gettype($plate); // Prints "string" 
echo gettype($plate2); // Prints "object", unlike in your example 

$plate2 reste toujours intacte pour moi. Peut-être que vous avez une référence drôle $plate2 = &something quelque part? Est-ce le code actuel? Que fait mon fragment de code sur votre système?

Je pense que la partie boguée a à voir avec le bogue $ _SESSION (ou effet secondaire) qui traite les variables unitalisées de $ _SESSION comme des variables globales. Voir this SO question. Changer le nom de la variable de session en quelque chose d'autre va remédier à cela.

$_SESSION['session_plate'] = serialize($plate); // $plate will remain unharmed 

Si la mise à register_globalsOn a été le changement le fournisseur a fait, alors vous devriez aussi aller battre votre fournisseur.

+0

register_globals semble être un coupable très probable basé sur mes tests avec votre code. Je reçois les mêmes résultats que vous maintenant (ils ont mentionné faire quelques changements à quelque chose sans préciser ce que "quelque chose" était). Je leur ai demandé de désactiver register_globals plus tôt aujourd'hui, mais ils ont en quelque sorte ignoré ma demande. Je leur donnerai un coup de pied à l'arrière un peu plus dur demain et je vous dirai comment ça se passe. –

+0

register_globals ont été désactivés et tout fonctionne de nouveau correctement. Merci de votre aide. Je n'aurais pas pensé à register_globals comme étant le coupable. –

Questions connexes