8791 sujets

Développement web côté serveur, CMS

Bonjour à tous !


Je stocke un tableau dans la variable $grille...

Voici le code :

<?php
$grille = array();

for ($ligne = 1; $ligne <= 9; $ligne++)
{
	for ($col = 1; $col <= 9; $col++)
	{
		$grille[$ligne][$col] = 0;
	}
}
?>



Puis j'ai un formulaire, lorsque j'envoie ce formulaire je "sauvegarde" cette grille dans une variable session.

if (isset($_POST['formulaire']))
{

	$_SESSION['grille'] = $grille;

}


Mais ensuite lorsque j'actualise la page, sans le renvoie du formulaire, ma variable SESSION ne contient plus $grille mais contient un array vide : Array ! Smiley eek

Et ce problème n'apparait pas si je change le nom de la session en mettant par exemple $_SESSION['sauvegarde'],
alors ce que je voudrais savoir c'est pourquoi y a-t-il un conflit à ce niveau là ? $grille et 'grille', c'est pas pareil...

Puis $_SESSION['grille'] = $grille; n'est strictement exécuté que si le formulaire est envoyé, donc le problème n'est pas à ce niveau là !
Modifié par Crousti2 (19 Aug 2012 - 10:12)
Tu as dis que ce code là ne cause pas de problème c'est ça ?
if (isset($_POST['formulaire']))
{
    $_SESSION['sauvegarde'] = $grille;
}

As-tu essayé d'en afficher le contenu comme ceci ?
echo '<pre>';
print_r($_SESSION['grille']);
echo '</pre>';

Car si tu fais un simple "echo" de ton tableau à deux dimensions, cela t'afficheras effectivement juste "array" avec un message d'erreur.
Anymah a écrit :

Tu as dis que ce code là ne cause pas de problème c'est ça ?
if (isset($_POST['formulaire']))
{
    $_SESSION['sauvegarde'] = $grille;
}



Oui exactement, si j'utilise un autre nom que celui de la variable ça fonctionne !

Anymah a écrit :

As-tu essayé d'en afficher le contenu comme ceci ?
echo '&lt;pre&gt;';
print_r($_SESSION['grille']);
echo '&lt;/pre&gt;';


Oui j'affiche le tableau de cette manière bien sur Smiley cligne

Le problème intervient vraiment que lorsque le nom de la variable et identique à celui qui est entre les '' de la variable session.

Mais j'ai cherché sur google et ça viendrait du fait que register_globals soit en ON... Smiley biggol Alors je ne sais pas...
Modifié par Crousti2 (19 Aug 2012 - 14:01)
D'accord merci beaucoup, j'ai regardé la documentation, et ce que je ne comprends pas, malgré avoir lu c'est pourquoi ce code est un abus, que faut-il modifier :


<?php
// Nous ne savons pas d'où provient $username mais nous savons que
// $_SESSION contient les données de session
if (isset($_SESSION['username'])) {

    echo "Bonjour <strong>{$_SESSION['username']}</strong>";

} else {

    echo "Bonjour <strong>visiteur</strong><br />";
    echo "Voulez-vous vous identifier?";

}
?>
Bonsoir,

Voici ce que j'ai trouvé sur cette page :

php.net a écrit :
Si la directive obsolète register_globals est définie à on, alors les variables simples seront également disponibles dans le contexte global du script. Par exemple, $_POST['foo'] existera également sous la forme $foo.

Finalement, ça veux dire ça :

$foo = $_POST['foo'] = $_GET['foo'] = $_SESSION['foo'] // Ainsi de suite...

Dans l'exemple que tu as cité, si tu initialises $username en GET par l'URL, tu contournes donc la vérification.

La solution c'est d'initialiser ses variables en début de script. Étonnant, puisqu'il s'agit selon moi d'une convention de codage, même si en PHP c'est pas obligatoire.
Modifié par Anymah (20 Aug 2012 - 01:47)
Bonjour,


D'accord merci, donc ça confirme bien ce que j'avais trouvé...

Mais désolé, je ne comprends toujours pas pourquoi ce code ne va pas... Smiley confus Pourquoi ça contourne la vérification ? Et en quoi l'initialisation des variables au début va changer quelque chose ?



J'ai trouvé ça pour palier au problème :


// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
// this is just a workaround to kill all through register globals imported vars!
// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
// place this script after session_start() to be sure you unregister_globals('_SESSION');
// that's all, now all through "register_globals" assigned vars are deleted from scope.
// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

if (ini_get('register_globals') == 1)
{
if (is_array($_REQUEST)) foreach(array_keys($_REQUEST) as $var_to_kill) unset($$var_to_kill);
if (is_array($_SESSION)) foreach(array_keys($_SESSION) as $var_to_kill) unset($$var_to_kill);
if (is_array($_SERVER))  foreach(array_keys($_SERVER)  as $var_to_kill) unset($$var_to_kill);
																		unset($var_to_kill);
}


Modifié par Crousti2 (20 Aug 2012 - 10:33)
Hello,

En admettant que l'utilisateur entre ceci dans l'URL :

script.php?username=bob


Cela a comme conséquence d'initialiser cette variable :

$_GET['username'] = 'bob';


Et en raison du register_globals activé :

$username = 'bob'; $_POST['username'] = 'bob'; $_SESSION['username'] = 'bob'; // Ainsi de suite...


Du coup, tu laisses la possibilité à l'utilisateur d'initialiser une variable qui sert de vérification dans le code. En revanche, si tu prends soin d'initialiser toi-même cette dernière, la donnée entrée par l'utilisateur sera toujours remplacée.

Sinon, je m'embêterais pas avec ce script pour pallier au problème. Si cette directive est devenue obsolète en version 5.3, puis supprimée en version 5.4 c'est pas pour rien. Je te conseille simplement de mettre à jour ton PHP, ou de changer la directive dans la configuration.

Bye !
D'accord merci je comprends mieux...

Pour mettre à jour tout ça, faut d'abord que je réussisse à contacter mon hebergeur ^^
Certains hebergeurs proposent d'utiliser la version que tu veux via le .htaccess, c'est le cas d'OVH si mes souvenirs sont bons.