IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[POO] Passer un objet d'une page à l'autre


Sujet :

Langage PHP

  1. #1
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut [POO] Passer un objet d'une page à l'autre
    Bonjour,

    Voila j'ai créé une classe qui hérite de la classe MySQLi (qui fait comme les fonctions mysql mais qui est orientée objet)

    Sur la première page, pas de problème elle marche, par contre quand je la serialize pour la mettre en session et que je la déserialize en la sortant de la session dans la page suivante elle ne fonctionne plus ...

    Voici mes codes test :

    la page index.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    <?php
    	session_start();
    	require_once("sql.class.php");
     
    	$sql = new sql("host", "login", "passwd", "db");
     
    	$request = 'SELECT auteur FROM articles WHERE id=%d';
     
    	$dvars = array();
    	array_push($dvars, 1);
     
    	if ($sql->is_connected())
    	{
    		echo '<p>connecté</p>';
    	}
    	else
    	{
    		echo '<p>raté</p>';
    	}
     
    	$result = $sql->do_query($request, $dvars, 0);
     
    	while ($display = mysqli_fetch_assoc($result))
    	{
    		echo '<p>'.$display['auteur'].'</p>';
    	}
     
    	$_SESSION['sql'] = serialize($sql);
     
    	echo '<p><a href="test.php" >page test</a></p>';
    ?>
    voici ce qu'elle m'affiche :
    connecté

    shadow_49

    page test
    et la page test.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    <?php
    	session_start();
    	require_once("sql.class.php");
     
    	if ($_SESSION['sql'] != null)
    	{
    		echo '<p>Existe</p>';
     
    		$sql = unserialize($_SESSION['sql']);
     
    		$request = 'SELECT auteur FROM articles WHERE id=%d';
     
    		$dvars = array();
    		array_push($dvars, 1);
     
    		if ($sql->is_connected())
    		{
    			echo '<p>connecté</p>';
    		}
    		else
    		{
    			echo '<p>raté</p>';
    		}
     
    		$result = $sql->do_query($request, $dvars, 0);
     
    		while ($display = mysqli_fetch_assoc($result))
    		{
    			echo '<p>'.$display['auteur'].'</p>';
    		}
     
    		$_SESSION['sql'] = serialize($sql);
    	}
    	else
    	{
    		echo '<p>pas de session</p>';
    	}
     
    	echo '<p><a href="index.php" >page index</a></p>';
    ?>
    avec ce qu'elle m'affiche :
    Existe

    connecté

    Warning: mysqli::query() [function.mysqli-query]: Couldn't fetch sql in /var/www/tests_sql/sql.class.php on line 97

    Warning: sql::do_query() [function.sql-do-query]: Couldn't fetch sql in /var/www/tests_sql/sql.class.php on line 105

    Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, null given in /var/www/tests_sql/test.php on line 27

    page index
    Voila on voit bien que c'est l'utilisation des fonctions qui touchent a la base de données qui bug car la fonction is_connected() fonctionne. A mon avis c'est parce que la connexion à la base de données est perdue pendant le serialize mais je ne sais pas comment y remédier.

    Voila le code de la classe pour le cas ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
     
    <?php
    	/**
    	* Fichier sql.class.php
    	* Classe héritant de la classe php mysqli
    	**********************************************************************************
    	* Création le 23/10/2008
    	* Auteur : Anthony PAMART
    	* Dernière modification le 23/10/2008 par Anthony PAMART
    	*/
     
    	class sql extends MySQLi
    	{
    		/**
    		* DEFINITION DES VARIABLES INTERNES SUPPPLEMENTAIRES
    		*/
     
    		//hote de la base de données
    		private $host;
     
    		//login de connexion à la base de données
    		private $login;
     
    		//password de la connexion à la base de données
    		private $passwd;
     
    		//base de données à utiliser
    		private $db;
     
    		//variable pour savoir si on est connecté ou pas
    		private $connected;
     
    		/**
    		* CONSTRUCTEUR
    		* il définit les variables $host, $login, $passwd et $db afin de créer l'objet (celles-i peuvent être modifiées lors de la création de la base)
    		* il utilise le constructeur de la classe MySQLi
    		* 
    		* @param string $host	host du serveur base de données
    		* @param string $login	login pour la connexion au serveur base de données
    		* @param string $passwd	mot de passe pour la connexion au serveur base de données
    		* @param string $db	base de données à utiliser
    		*/
    		public function __construct($host = '', $login = '', $passwd = '', $db = '')
    		{
    			//on récupère les données de connexion
    			$this->host = $host;
    			$this->login = $login;
    			$this->passwd = $passwd;
    			$this->db = $db;
     
    			//on réutilise le code de la classe mère
    			parent::__construct($host, $login, $passwd, $db);
     
    			if ($this->connect_errno)	//on regarde si il y a une erreur de connexion à la base de données
    			{
    				echo '<p>Erreur lors de la connexion à la base de données : '.$this->connect_error.'</p>';	//si il y en a une on afficle l'erreur
    				$this->connected = FALSE;	//on met connected à false
    			}
    			else	//si il n'y a pas d'erreur de connexion on met connected à TRUE
    			{
    				$this->connected = TRUE;
    			}
    		}
     
     
    		/**
    		* RECUPERATION D'UNE REQUETE DYNAMIQUE
    		* la fonction récupère la requête dynamique au format sprintf ainsi que la variable ou le tableau de variables
    		* lors de l'appel de la fonction, on précise si on veut échapper les variables chaines ou pas (0 pour non, 1 pour oui)
    		* 
    		* @param string $request	requête simple ou au format sprintf
    		* @param array $dvars		tableau des variables à insérer dans la requête
    		* @param bool $escape_strings	booléen indiquant si il faut échapper les variables ou non
    		*/
    		public function do_query($request = '', $dvars = array(), $escape_strings = FALSE)
    		{
    			if (empty($request))	//on regarde si on a une requête ou non
    			{
    				//on affiche une erreur si la requête est vide
    				echo '<p>Aucune requête à exécuter ...</p>';
     
    				//on renvoie FALSE
    				return FALSE;
    			}
    			else
    			{
    				if (count($dvars) > 0) //on regarde si on a des variables
    				{
    					if ($escape_strings)	//si $escape_strings est à 1 on appelle la fonction escape_vars pour protéger la requête des diverses injections possibles
    					{
    						$dvars = escape_vars($dvars);
    					}
     
    					//on crée la requête
    					$query = vsprintf($request, $dvars);
     
    					//on exécute la requête
    					$result = $this->query($query);
    				}
    				else	
    				{
    					//sinon on exécute la requête directement
    					$result = $this->query($request);
    				}
     
    				if ($this->errno)	//on regarde si on a eu une erreur lors de l'exécution de la requête
    				{
    					// on affiche l'erreur
    					echo '<p>Il y a eu une erreur lors de l\exécution de la requête : '.$this->error.'</p>';
     
    					//on renvoie false
    					return FALSE;
    				}
    				else
    				{
    					//on retourne le résultat de la requête
    					return $result;
    				}
    			}
    		}
     
     
    		/**
    		* ACTION SUR LES MAGIC QUOTES
    		* la fonction parcourt le tableau des variables et supprime les anti slash d'une chaine
    		* Elle applique également la fonction real_escape_string issue de la classe mère
    		* 
    		* @param array $dvars	tableau contenant les variables à échapper avant la requête
    		*/
    		private function escape_vars($dvars)
    		{
    			if(get_magic_quotes_gpc())
    			{
    				for ($i = 0; $i < count($dvars); $i++)
    				{
    					$dvars[$i] = stripslashes($dvars[$i]);
    					$dvars[$i] = $this->real_escape_string($dvars[$i]);
    				}
    			}
     
    			return $dvars;
    		}
     
     
    		/**
    		* FERMETURE DE LA CONNEXION
    		* La fonction tente de fermer la connexion à la base de données
    		* Elle renvoie TRUE su la déconnexion a réussie, FALSE sinon
    		*/
    		public function deconnexion()
    		{
    			if ($this->close())	//si on réussit à fermer la connexion à la base de données, on met connected à FALSE
    			{
    				$this->connected = FALSE;
    				return TRUE;
    			}
    			else	//sinon on affiche une erreur
    			{
    				echo '<p>Erreur lors de la déconnexion ... </p>';
    				return FALSE;
    			}
    		}
     
     
    		/**
    		* VERIFICATION DE LA CONNEXION
    		* la fonction renvoie simplement la valeur de connected
    		*/
    		public function is_connected()
    		{
    			return $this->connected;
    		}
    	}
    ?>
    Merci d'avance pour votre aide

  2. #2
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    Si j'ai bien compris ton problème, tu dois pouvoir utiliser les fonctions magiques __sleep() et __wakeup() pour te déconnecter et te reconnecter à la base de données respectivement lors de la sérialisation / désérialisation : http://php.net/oop5.magic

  3. #3
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut
    Merci pour la réponse.

    J'avais bien pensé à ces fonctions mais comme la connexion se fait dans le constructeur pour MySQLi je ne savais pas trop si cela se faisait.

    J'ai quand même essayé de les rajouter dans ma class, voici ce que j'ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    /**
    * FONCTION MAGIQUE __SLEEP POUR SERIALIZE
    * fonction appelée lors d'un serialize() sur l'objet sql
    */
    public function __sleep()
    {
    	$this->deconnexion();
    }
     
     
    /**
    * FONCTION MAGIQUE __WAKEUP POUR UNSERIALIZE
    * fonction appelée lors d'un unserialize() sur l'objet sql
    */
    public function __wakeup()
    {
    	$this->__construct($this->host, $this->login, $this->passwd, $this->db);
    }
    mais du coup voila ce que j'obtiens sur la page test.php lorsque je viens de la page index.php (donc en passant par un serialize() / unserialize() pour garder mon objet) :
    Existe

    Fatal error: Call to a member function is_connected() on a non-object in /var/www/tests_sql/test.php on line 15
    je n'ai pas modifié le code de mes pages et le seul code modifié dans ma classe est celui que j'ai ajouté dans cette réponse.

    Quelqu'un a-t-il une idée de comment faire ?

    Merci d'avance

  4. #4
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Il ne faut pas rappeler le constructeur, mais plutôt la méthode real_connect de mysqli (mais je n'ai pas testé, ce ne sont que des pistes ).

  5. #5
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut
    Ok, j'ai donc essayé re remplacer l'appel du constructeur par ceci ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    /**
    * FONCTION MAGIQUE __WAKEUP POUR UNSERIALIZE
    * fonction appelée lors d'un unserialize() sur l'objet sql
    */
    public function __wakeup()
    {
    	$this->real_connect($this->host, $this->login, $this->passwd, $this->db);
     
    	if ($this->connect_errno)	//on regarde si il y a une erreur de connexion à la base de données
     
    	{
     
    		echo '<p>Erreur lors de la connexion à la base de données : '.$this->connect_error.'</p>';	//si il y en a une on afficle l'erreur
     
    		$this->connected = FALSE;	//on met connected à false
     
    	}
     
    	else	//si il n'y a pas d'erreur de connexion on met connected à TRUE
    	{
    		echo 'Connexion réussie';
     
    		$this->connected = TRUE;
     
    	}
    }
    mais même résultat, et je ne vois pas beaucoup d'autres solutions ...

  6. #6
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    La méthode __sleep doit retourner un tableau des noms de variables à sérialiser (dans ton cas host, login, passwd, db et connected).

    Et avant d'appeler la méthode real_connect, il faut appeler la méthode init() de mysqli.

  7. #7
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut
    En effet, j'avais pas fais attention à la fonction init()

    et pour le tableau de valeurs, on m'avait dit que les données étaient sauvegardées automatiquement si on ne le précisait pas (ou alors c'est peut être que quand on ne définit pas de méthode __sleep, car je sais que quand on ne la définit pas ca marche, j'avais peut être mal compris alors)

    Je vais essayer ça dès ce soir (je n'ai pas eu le temps ce weekend et aujourd'hui non plus)

  8. #8
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut
    Je viens de modifier mon code des deux fonctions, ça avance mais je n'arrie pas à récupérer mes données de connexion lors du unserialize ...


    Voici le nouveau code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    /**
    * FONCTION MAGIQUE __SLEEP POUR SERIALIZE
    * fonction appelée lors d'un serialize() sur l'objet sql
    */
    public function __sleep()
    {
    	//on se déconnecte
    	$this->deconnexion();
     
    	//on sauvegarde les variables de connexion
    	$save[0] = $this->host;
    	$save[1] = $this->login;
    	$save[2] = $this->passwd;
    	$save[3] = $this->db;
     
    	return $save;
    }
     
     
    /**
    * FONCTION MAGIQUE __WAKEUP POUR UNSERIALIZE
    * fonction appelée lors d'un unserialize() sur l'objet sql
    */
    public function __wakeup()
    {
    	//on initialise la connexion
    	$this->init();
     
    	//on se reconnecte
    	$this->real_connect($this->host, $this->login, $this->passwd, $this->db);
     
    	if ($this->connect_errno)	//on regarde si il y a une erreur de connexion à la base de données
     
    	{
     
    		echo '<p>Erreur lors de la connexion à la base de données : '.$this->connect_error.'</p>';	//si il y en a une on afficle l'erreur
     
    		$this->connected = FALSE;	//on met connected à false
     
    	}
     
    	else	//si il n'y a pas d'erreur de connexion on met connected à TRUE
    	{
    		echo '<p>Connexion réussie.<br />Connecté :'.$this->host_info.'</p>';
     
    		$this->connected = TRUE;
     
    	}
    }
    J'ai remarqué ça en affichant une erreur lors d'une requête, la reconnexion avec real_connect se fait mais lors d'une requête il me marquait comme erreur qu'il n'y avai aucune base sélectionnée, et en affichant les variables de connexion après le unserialize, je me suis appercu qu'il n'y avais plus de host, login, passwd et db dans l'objet ...

    Et je ne trouve pas d'exemple qui montre comment les récupérer, le seul exemple que j'ai toruvé pour l'instant qui montre l'utilisation de __sleep et __wakeup avec une connexion et il ne retourne rien dans la fonction __sleep, il se contente juste de clore et de réouvrir une connexion à la base ...


    Comment faire alors avec MySQLi ?

    Merci d'avance pour votre aide

  9. #9
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    La fonction __sleep doit s'utiliser comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public function __sleep()
    {
    	//on se déconnecte
    	$this->deconnexion();
     
    	//on sauvegarde les variables de connexion
    	$save[] = 'host';
    	$save[] = 'login';
    	$save[] = 'passwd';
    	$save[] = 'db';
     
    	return $save;
    }
    Et là, normalement, serialize conserve les variables dont le nom est renvoyé par __sleep

  10. #10
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut
    Ah ok, en fait je met juste le nom de la variable à sauvegarder entre quote si j'ai bien compris (et sans le $this-> )

    En effet ca marche mieux -> Merci pour ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. passer un objet ResultSet à une page JSP
    Par SOA_j2EE dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 15/06/2009, 21h01
  2. [Résolut]Passer un objet d'une page à une autre
    Par toun1988 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 04/11/2008, 00h21
  3. [POO] passer un objet javascript à une action Struts
    Par abriotde dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/07/2007, 16h20
  4. passer des valeurs d'une page à l'autre
    Par casaoui dans le forum ASP.NET
    Réponses: 8
    Dernier message: 13/06/2007, 17h55
  5. [JSP] Passer un objet d'une page à une autre
    Par critok dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 07/07/2006, 14h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo