Problème serialize, boucle for, et caractères illisibles

Eléphanteau du PHP | 10 Messages

24 déc. 2023, 20:17

Bonjour.

J'ai ce code
$DateNonLu = date('U');
$ListeNonLu	= serialize(array('all'=>$DateNonLu));
$ListeNonLuBis = '';
for($i=0; $i < strlen($ListeNonLu); $i++)
{
$ListeNonLuBis = chr(ord($ListeNonLu[$i])+60).$ListeNonLuBis;
}

Il est sensé écrire en DB des données qui seront ensuite lues avec unserialize($ListeNonLu);

Le souci c'est que la variable $ListeNonLuBis qui sort après la boucle for me renvoie ça:
$ListeNonLuBis = �w^mstlppolsm^vlmv�w^���^vov��vmv�

Je tourne en rond depuis des heures sans comprendre....

La variable $ListeNonLu, avant la boucle FOR me renvoie ça
a:1:{s:3:"all";s:10:"1703440871";}

C'est donc bien dans la boucle, peut être avec chr et ord qu'il se passe quelque chose...
Quelqu'un aurait une idée?

Avatar du membre
Mammouth du PHP | 1564 Messages

25 déc. 2023, 02:04


Eléphanteau du PHP | 10 Messages

25 déc. 2023, 14:39

Cependant, il est à noter que cette fonction n'est pas conscient d'aucun encodage de chaîne de caractères, et en particulier ne peut pas être transmit une valeur de point de code Unicode pour générer une chaîne de caractères dans un encodage multioctet tel que UTF-8 ou UTF-16.
Est ce que ça veut dire que:
-de toute façon, vu que je suis en UTF-8, ce code ne fonctionnera jamais?
-> fin de l'histoire

-Il faut convertir mes variables, mais dans ce cas..je ne sais pas comment faire.

Avatar du membre
Mammouth du PHP | 1564 Messages

25 déc. 2023, 17:03

Pour moi, le retour de la variable est normal vu que tu utilise chr et ord. Est tu conscient de l'utilisation de ces deux fonction ou c'est un code copié sur le web et tu ne sais ce que le code fait ?

Eléphanteau du PHP | 10 Messages

25 déc. 2023, 17:35

Bonjour two3d

En fait, j'utilise un vieux CMS que j'essaye de passer en php8.
Je suis vraiment débutant en PHP.

J'ai plutôt bien avancé, mais en effet, je ne suis pas à la base du code, et j'en serai bien incapable d'ailleurs.

Le fichier en question est le suivant
<?php
include_once './modules/tete_de_module.php';
if ($K_ac=='index' OR $K_ac=='nonlu' OR $K_ac=='rubrique' OR $K_ac=='voir')
{
    if( ( (isset($_SESSION['not_in']) AND $_SESSION['not_in']) OR !isset($_SESSION['forum_lu']['all']) ) AND $K_grade >= GRD_MEMBR )
    {
        $ReqNonLu = reqmysql('SELECT `lu` FROM `forum_lecture` WHERE `ref`="'.intval($K_user->id).'"') or die(Kws_mysql_error());
        if(Kws_mysql_num_rows($ReqNonLu) > 0)
        {
            $RepNonLu = Kws_mysql_fetch_array($ReqNonLu);
            $ListeNonLu = '';
            for($i=0; $i < strlen($RepNonLu['lu']); $i++)
            {
                $ListeNonLu = chr(ord($RepNonLu['lu'][$i])-60).$ListeNonLu;
            }
            if(isset($_SESSION['not_in']) AND $_SESSION['not_in'] == TRUE)
            {
                $ArrayNonLu = unserialize($ListeNonLu);
                if(is_array($ArrayNonLu) && count($ArrayNonLu) > 0)
                {
                    foreach($ArrayNonLu as $IdNonLu => $DateNonLu)
                    {
                        if (!empty($IdNonLu) and !empty($DateNonLu))
                        {
                            if(isset($_SESSION['forum_lu'][$IdNonLu]) AND intval($IdNonLu)!=0 AND $DateNonLu > $_SESSION['forum_lu'][$IdNonLu])
                            {
                                $_SESSION['forum_lu'][$IdNonLu] = $DateNonLu;
                            }
                            elseif(!isset($_SESSION['forum_lu'][$IdNonLu]) OR intval($IdNonLu) == 0)
                            {
                                $_SESSION['forum_lu'][$IdNonLu] = $DateNonLu;
                            }
                        }
                    }
                }
            }
            else
            {
                $_SESSION['forum_lu'] = unserialize($ListeNonLu);
            }
        }
        else
        {
            $DateNonLu = date('U');
            $ListeNonLu = serialize(array('all'=>$DateNonLu));
            $ListeNonLuBis = '';
            for($i=0; $i < strlen($ListeNonLu); $i++)
            {
                $ListeNonLuBis = chr(ord($ListeNonLu[$i])+60).$ListeNonLuBis;
            }

            reqmysql('INSERT INTO `forum_lecture` SET `ref`="'.$K_user->id.'",`lu`="'.sp($ListeNonLuBis).'"') or die(Kws_mysql_error());
            $_SESSION['forum_lu']['all'] = $DateNonLu;
        }
    }
    elseif(!isset($_SESSION['forum_lu']['all']) AND $K_grade < GRD_MEMBR)
    {
        $DateNonLu  = date('U');
        $_SESSION['forum_lu']['all'] = $DateNonLu;
        $_SESSION['not_in'] = TRUE;
    }
}
##########################
## Fin Non-lu  ##
##########################
if (empty($Ref_cat_forum)) $Ref_cat_forum = 0;
// Sous forum
if ($K_ac=='index' and !empty($_REQUEST['ref'])) $Ref_cat_forum = intval($_REQUEST['ref']);
if ($K_forum_entete == 'haut' AND
(
$K_ac=='affgrd' OR
$K_ac=='aide' OR
$K_ac=='dePrev' OR
$K_ac=='index' OR
$K_ac=='nonlu' OR
$K_ac=='noReponse' OR
$K_ac=='regles'
)
)
{
    include_once 'modules/'.$K_mod.'/entete.php';
}
$StylePuceFofo = 'margin:auto 5px;vertical-align:middle;';
?>

Je pense que ça permet de noter les sujets lu/non lus des membres pour le forum.

Ce qui se passe:
Quand je viens sur le forum en tant que membre, dans la DB ça inscrit
?w^msssmqolsm^vlmv?w^???^vov??vmv?
dans la colonne 'lu" de "forum_lecture"

Au passage suivant sur le forum j'ai
Notice: unserialize(): Error at offset 0 of 34 bytes in /home/crfr8905/php8.limporiaphoto.com/modules/forum/tete_de_module.php on line 39

J'en déduis donc que ce que ça écrit en DB n'est pas du tout ce qu'il faut pour la fonction unserialize()...

Mais je me trompe peut-être.

Avatar du membre
Mammouth du PHP | 1564 Messages

25 déc. 2023, 19:34

L'erreur peur venir de plusieurs facteurs, tu t'engage dans une multitude de modifications si le cms est vraiment vieux, et si t novice, je te conseil de voir si le cms en question ne propose pas une maj sur leur site. Quel est ce cms ? Quel est sa version ?

Eléphanteau du PHP | 10 Messages

25 déc. 2023, 20:04

Le cms s'appelle kwsphp (https://www.kwsphp.org/)
Je m'en suis servi pour construire des sites dans les années 2006/2010, il était vraiment bien pour l'époque et la communauté très active.
Hélas, ils ont totalement loupé le passage au responsive design...et petit à petit les membres sont passés à autre chose. Du coup il n'y a pas de MAJ.

De mon côté, comme j'avais quelques sites faits avec, je me suis débrouillé pour modifier petit à petit les choses, passer le tout en responsive design, y adapter pas mal de scripts (jquery par exemple), tout passer en UTF-8 etc. Donc, pour ce qui est de la version, c'est une version "très personnalisée"...

De PHP 5 à PHP 7 j'ai réussi à gérer tout seul mais depuis le passage à PHP 8 c'est devenu compliqué pour moi. Le forum en particulier, car j'avoue que je m'y perds totalement.

J'ai toujours trouvé dommage de perdre ce CMS car je trouve qu'il n'a rien à envier à d'autres cms très connus et comme je le connais quand même pas mal, je réussis à l'adapter à mes besoins.

Je ne suis clairement pas codeur, mon truc de base c'est plutôt le design et jusqu'à maintenant je m'étais toujours débrouillé en bricolant... mais là je crois que j'ai atteint la limite du possible en bricolage.

Avatar du membre
Mammouth du PHP | 1564 Messages

25 déc. 2023, 20:19

OK, je comprends, je te propose qu'on fasse une modification, tu va enlever cette serialisation/deserialisation et mettre la colonne où est enregistré la date en TEXT.

Commente l'ancien code pour garder une trace du code supprimé, ne le supprime pas, commente le ;)

Eléphanteau du PHP | 10 Messages

25 déc. 2023, 21:31

Alors... avant tout, désolé si je te demande parfois de réexpliquer des choses, je ne suis pas spécialiste...

Pour le moment, j'ai donc commenté les 2 lignes
//reqmysql('INSERT INTO `forum_lecture` SET `ref`="'.$K_user->id.'",`lu`="'.sp($ListeNonLuBis).'"') or die(Kws_mysql_error());
 //$_SESSION['forum_lu']['all'] = $DateNonLu;
Pour que ça n'écrive plus rien en DB.
J'ai aussi vidé la table forum_lecture.

A ce stade, plus de message d'erreur quand je vais sur le forum, je pense que c'est normal, il n'(y a plus rien à unserialize... :)

Avatar du membre
Mammouth du PHP | 1564 Messages

25 déc. 2023, 22:29

Ne pas commenter l'insertion mais le code qui fait chr et ord.

Et modifier le type de la colonne qui enregistre la variable "$ListeNonLu"