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 :

Sérialisation instance PDO


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 24
    Points : 13
    Points
    13
    Par défaut Sérialisation instance PDO
    Bonjour à tous !

    Je rencontre une erreur et je n'arrive pas à comprendre comment la corriger ni exactement ce qui la provoque ><
    Version PHP : 7.0.23

    Voici les deux messages d'erreurs :
    Fatal error: Uncaught PDOException: You cannot serialize or unserialize PDO instances in [no active file] on line 0
    PDOException: You cannot serialize or unserialize PDO instances in [no active file] on line 0
    Cela se passe lors de l'exécution de ce bout de 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
    if(!empty($_POST['login']) && !empty($_POST['password']))
    {
        $_SQL = SQL::getInstance();
     
        $req = 'SELECT id, login, password FROM member WHERE login = :login';
     
        $rep = $_SQL->prepare($req);
     
        $rep->execute(array(':login' => $_POST['login']));
     
        $resultat = $rep->fetchAll();
     
        if(count($resultat) == 1)
        {
            if(password_verify($_POST['password'], $resultat[0]['password']))
            {
                // We can store some specific data in SESSION to access it easily
                $_SESSION['id'] = $resultat[0]['id'];
     
                // Load all member data
                // It's supposed to be the only SQL job until the member ask for an action
                // other than just show some data
                $member = new Member($_SESSION['id']);
                $member->loadAccountDataFromMemberId();
     
                // Store the object in SESSION
                $_SESSION['dataMember'] = $member;
     
    			// Load all game data
    			$game = new Game(1);
    			$game->setCategories(Categorie::loadList());
     
                //header('Location: index.php?p=accueil');
     
                exit();
            }
     
            //header('Location: index.php?erreur=1');
     
            exit();
        }
     
     
        //header('Location: index.php?erreur=1');
     
        exit();
    }
    Les fonctions appelées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        public function loadAccountDataFromMemberId()
        {
     
            $this->scores = Score::loadListFromMemberId($this->id);
     
            if(is_array($this->scores))
                return true;
     
            return false;  
        }
    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
    	public static function loadListFromMemberId($id)
    	{
            $_SQL = SQL::getInstance();
     
            $req = 'SELECT  s.id as s_id, 
    						s.valeur as s_valeur	
                    FROM scoreMember sm JOIN score s ON  sm.idScore = s.id
                    WHERE sm.idScore = :id';
     
            $rep = $_SQL->prepare($req);
     
            $rep->execute(array(':id' => $id));
     
            $resultat = $rep->fetchAll();
     
            if(count($resultat) > 0)
            {
                $scores = array();
                $i = 0;
     
                foreach($resultat as $score)
                {
                    // We store basics data
                    $scores[$i] = new score($score['s_id']);
    				$scores[$i]->setValeur($score['s_valeur']);
     
                    $i++;
                }
     
                return $scores;
            }
     
            return false; 		
    	}

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    D'ou vient ce SQL::getInstance() ?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Voici le code de la classe SQL ça devrait aider en effet, désolé pour cet oubli ><

    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
    define('DB_HOST', 'localhost');
    define('DB_NAME', 'jeuGastronomie');
    define('DB_USER', 'root');
    define('DB_PASS', '');
    define('DB_CHAR', 'utf8');
     
    class SQL
    {
        private static $_SQL = null;
     
        private function __construct()
        {
        }
     
        public static function getInstance()
        {
            if(self::$_SQL == null)
                self::$_SQL = new PDO('mysql:dbname=' . DB_NAME . ';host=' . DB_HOST . ';charset=' . DB_CHAR, DB_USER, DB_PASS);
     
            return self::$_SQL;
        }
    }

  4. #4
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 628
    Points
    3 628
    Billets dans le blog
    8
    Par défaut
    Regarde le code de connexion donné par le manuel PHP

    http://php.net/manual/fr/pdo.construct.php

    Les points virgule sont à l'intérieur du DSN, pas entre les autres paramètres, ce sont des virgules.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    /* Connexion à une base ODBC avec l'invocation de pilote */
    $dsn = 'mysql:dbname=testdb;host=127.0.0.1';
    $user = 'dbuser';
    $password = 'dbpass';
     
    try {
        $dbh = new PDO($dsn, $user, $password);
    } catch (PDOException $e) {
        echo 'Connexion échouée : ' . $e->getMessage();
    }
     
    ?>

  5. #5
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    le problème ne vient pas du bout de code posté.
    Tu ne peux pas sérialiser une ressource.
    Il y a quelque part dans ton code un appel à serialize() sur une instance de classe qui contient une ressource ou unserialize().
    Pour contourner ce problème, regarde du côté de __sleep() et __wakeup()

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    J'ai revu le code pour la connexion mais ça ne change pas l'erreur ><

    J'ai repris tout le code et pourtant nulle part il y a serialize ou unserialize ! C'est fou. Est ce que ce que font ces fonctions peut arriver d'une autre façon que par l'appel à celles-ci ?

  7. #7
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Alors là, mystère et boule de gomme.
    Quel est ton environnement ?

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Un mystère d'autant plus étranger que le même code fonctionne dans d'autres projets, enfin quasi le même code.

    Je suis sous Wampserver 3.1.0

  9. #9
    Membre éprouvé Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 540
    Points : 1 067
    Points
    1 067
    Par défaut
    Salut,

    Les données en session ($_SESSION['xxxx'] = 'valeur') sont aussi linéarisées, donc si 'valeur' est une instance de PDO ça peut expliquer l'erreur. A voir donc de ce côté.

Discussions similaires

  1. [ZF 1.10] [Zend_Log] Sérialisation des objets PDO
    Par fhebert dans le forum Autres composants
    Réponses: 0
    Dernier message: 19/02/2011, 21h55
  2. [WD12]Sérialiser une instance de l'objet en cours
    Par peijnoob dans le forum WinDev
    Réponses: 3
    Dernier message: 18/12/2008, 16h47
  3. [POO] Sérialiser un objet PDO dans une classe
    Par __fabrice dans le forum Langage
    Réponses: 9
    Dernier message: 15/09/2008, 22h30
  4. [POO] PHP5 et sérialisation, PDO et MySQL5
    Par sylk974 dans le forum Langage
    Réponses: 2
    Dernier message: 24/03/2006, 17h52

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