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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problème serialize, boucle for, et caractères illisibles

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

par two3d » 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"

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

par vangardis » 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... :)

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

par two3d » 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 ;)

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

par vangardis » 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.

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

par two3d » 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 ?

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

par vangardis » 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.

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

par two3d » 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 ?

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

par vangardis » 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.

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

par two3d » 25 déc. 2023, 02:04

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

par vangardis » 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?