THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline

#1 Bug sauvegarde panier

(06-02-2009 11:47:54)


Bonjour,

Je n'ai pas trouvé de réponse sur le forum, donc j'expose mon problème ici
Je suis sur Thelia 1.3.9 et j'ai activé le plugin sauvegarde du panier.

Je me logue en tant que client, j'ajoute des articles au panier.
Je me délogue et je vide le panier.
Puis je me reloggue pour vérifier si le panier associé à mon compte client est bien récupéré depuis la base de données

Et j'ai le message suivant qui apparaît :
Fatal error: Call to a member function poids() on a non-object in C:\wamp\www\thelia2\fonctions\substitutions\substitpanier.php on line 89

Une idée quelqu'un ?

Elo

Offline

#2 Re: Bug sauvegarde panier

(08-02-2009 02:26:59)


Le bug provient de la ligne 100 du script client/plugins/sauvpanier/Sauvpanier.class.php : le unserialize($recsauv->panier) renvoie false.

Si je regarde dans la table sauvpanier, l'objet est sérialisé avec des backslashes en trop.

Est-il normal qu'on rajoute des slahes avec addslashes dans les méthodes post() et demarrage() de Sauvpanier.class.php, et qu'en plus on fasse un mysql_real_escape_string() sur la même variable dans Baseobj::getListValsSql() ? Comme on a backslashé par deux fois, la variable sérialisée est mal stockée dans la base de données.

Si je retire tous les addslashes() dans Sauvpanier.class.php, et que je purge la table sauvpanier, tout rentre dans l'ordre. C'est effectivement plus logique que la fonction qui génère la requête sql s'occupe de backslasher, et que le programmeur n'ai pas à s'inquiéter de ce backslash à tout bout de champ. D'ailleurs nulle part ailleurs dans le code ne subsiste d'appels à addslashes(). Des restes d'une ancienne version ?

Proposition d'une nouvelle version de Sauvpanier.class.php (supprimer les portions de codes que j'ai commenté) :

<?php
/*************************************************************************************/
/*                                                                                   */
/*      Thelia	                                                            		 */
/*                                                                                   */
/*      Copyright (c) Octolys Development		                                     */
/*		email : thelia@octolys.fr		        	                             	 */
/*      web : http://www.octolys.fr						   							 */
/*                                                                                   */
/*      This program is free software; you can redistribute it and/or modify         */
/*      it under the terms of the GNU General Public License as published by         */
/*      the Free Software Foundation; either version 2 of the License, or            */
/*      (at your option) any later version.                                          */
/*                                                                                   */
/*      This program is distributed in the hope that it will be useful,              */
/*      but WITHOUT ANY WARRANTY; without even the implied warranty of               */
/*      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                */
/*      GNU General Public License for more details.                                 */
/*                                                                                   */
/*      You should have received a copy of the GNU General Public License            */
/*      along with this program; if not, write to the Free Software                  */
/*      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA    */
/*                                                                                   */
/*************************************************************************************/
?>
<?php
	include_once(realpath(dirname(__FILE__)) . "/../../../classes/PluginsClassiques.class.php");
	include_once(realpath(dirname(__FILE__)) . "/../../../classes/Panier.class.php");
	include_once(realpath(dirname(__FILE__)) . "/../../../classes/Client.class.php");
		
	class Sauvpanier extends PluginsClassiques{

		var $id;
		var $client;
		var $panier;
		var $date;

        var $table="sauvpanier";
        var $bddvars = array("id", "client", "panier", "date");
	
		function Sauvpanier(){
			$this->Baseobj();	
		}

		function init(){
			$cnx = new Cnx();
			$query_sauvpanier = "CREATE TABLE  `sauvpanier` (
			 `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
			 `client` INT NOT NULL ,
			 `panier` TEXT NOT NULL,
			 `date` datetime NOT NULL default '0000-00-00 00:00:00'		  
			) ;";
			$resul_sauvpanier = mysql_query($query_sauvpanier, $cnx->link);     
		}

        function charger($client){
                return $this->getVars("select * from $this->table where client=\"$client\"");
        }

		
		function post(){
			if(($_REQUEST['action'] == "ajouter" || $_REQUEST['action'] == "supprimer") && $_SESSION['navig']->client->id){
							
				$tempsauv = new Sauvpanier();
		
				if($tempsauv->charger($_SESSION['navig']->client->id)){
				 	$this->charger($_SESSION['navig']->client->id);
 					$this->panier = /*addslashes(*/serialize($_SESSION['navig']->panier)/*)*/;
					$this->date = date("Y-m-d H:i:s");
					$this->maj();
				}
				else {
					$this->client = $_SESSION['navig']->client->id;
					$this->panier = /*addslashes(*/serialize($_SESSION['navig']->panier)/*)*/;
					$this->date = date("Y-m-d H:i:s");
					$this->add();
				}
			}
		  				
		}
		

		function demarrage(){
			if($_REQUEST['action'] == "connexion") {
				
				$client = new Client();
				if($client->charger($_REQUEST['email'], $_REQUEST['motdepasse'])){
				
					$recsauv = new Sauvpanier();
					if(! $recsauv->charger($client->id)){
						$recsauv->client = $client->id;
						$recsauv->panier = /*addslashes(*/serialize($_SESSION['navig']->panier)/*)*/;
						$recsauv->date = date("Y-m-d H:i:s");
						$recsauv->add();
						return;					
					}
					
					if(! $_SESSION['navig']->panier->nbart){	
						$_SESSION['navig']->panier = new Panier();
						$_SESSION['navig']->panier = unserialize($recsauv->panier);
					}
					else {
						$recsauv->panier = /*addslashes(*/serialize($_SESSION['navig']->panier)/*)*/;
						$this->date = date("Y-m-d H:i:s");
						$recsauv->maj();
						
					}				
				}	
			}
		}

	}


?>

Offline

#3 Re: Bug sauvegarde panier

(09-02-2009 10:04:07)


Merci bpillot !

Ta modif marche bien, et effectivement ça me parait plus logique de supprimer les addslashes() puisqu'un mysql_real_escape_string() est déjà appliqué sur les valeurs à insérer dans la base de données.

Offline

#4 Re: Bug sauvegarde panier

(19-02-2009 18:26:45)


Bonjour bpillot,

J'ai le même message d'erreur qu'Elo

Fatal error: Call to a member function poids() on a non-object in /var/www/vhosts/editionmr.fr/httpdocs/fonctions/substitutions/substitpanier.php on line 89

sauf que je n'ai pas activé le plugin sauvegarde panier. J'ai quand même fait la modif indiqué sauf purger la table car je n'en ai pas de ce nom.

As-tu une idée pour me dépaner ? j'utilise aussi thelia 1.3.9. avec le plugin spip

Merci d'avance car je galère trop avec ces fatal error

Offline

#5 Re: Bug sauvegarde panier

(24-07-2009 14:13:22)


Merci, c'est un bug qui arrive aussi ave thelia1.4.0 dès qu'on active sauvpanier. Peut-être faudrait-il tout simplement corriger le plugin ?