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 :

"Undefined property" dans une fonction


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 131
    Par défaut "Undefined property" dans une fonction
    Bonjour à tous,

    Suite au passage à php 5.5, j'ai réalisé diverses adaptations sur un petit plugin qui m'avait été fourni par un développeur pour la gestion d'un serveur Trackmania Nations/United sous Manialive1_r267.

    Comme je ne suis pas développeur, je fais comme je peux mais là je cale sur une erreur
    Undefined property
    dans une des fonctions.

    Je sollicite donc votre expertise pour essayer de trouver l'origine du problème et le corriger.

    Pour résumer, au début de chaque course, cette fonction vérifie si les joueurs ont assez de «*Crédits*» pour participer sinon ils sont déconnectés, vérifie s'il y a assez de joueurs pour organiser un tournois, prélève les joueurs du prix de participation au tournois, constitue un «*pot*» à l'attention du gagnant et met à jour les widgets affichés ingame.

    La fonction est la suivante*:

    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
    function onChallengeListModified($curChallengeIndex, $nextChallengeIndex, $isListModified)
    {
         $this->debugLog("*** ChallengeListModified\n");
         if (!self::$connected) return;
    }
     
    function onBeginChallenge($challenge,$warmUp, $matchContinuation)
    {
         if (!self::$connected) return;
         $this->debugLog('*** BeginChallenge '.TMStrings::stripAllTmStyle($challenge['Name']));
         $this->connection->chatSendServerMessage(self::$prefSrv.'Begin Challenge',null,true);
     
         self::$prix = $this->getPrix(self::$idEvenement);
     
         // les spectateurs ne peuvent pas participer
         foreach($this->storage->spectators as $login=>$player)
         { // on interdit de jouer aux spectateurs pour la mise
                 $this->joueurs[$login]->ready = false;
                 $this->joueurs[$login]->spectator = true;
         }
         foreach($this->storage->players as $login=>$player)
         { // on passe tout le monde en ready = false
                 $this->joueurs[$login]->ready = false;
                 $this->joueurs[$login]->spectator = false;
         }
     
         // on fait le ménage : si pas assez de crédit on zappe
         self::$participants = 0;
         foreach($this->joueurs as $login=>$joueur)
         {
                 $this->joueurs[$login]->rank = 0;
                 $this->joueurs[$login]->best = -1;
                 $this->joueurs[$login]->credits = $this->getCredits($joueur->id_j);
                 if ($joueur->credits < self::$prix)
                 {
                         // on vire ceux qui n'ont plus rien a faire l▒|
                         $this->debugLog("* BeginChallenge : $login n'a pas assez de crédit");
                         $this->cacheWidget($login);
                         $this->cacheCredit($login);
                         $this->kickPlayer($login);
                         $this->joueurs[$login]->ready = false;
     
                 }
                 else
                 {
                         if ($joueur->spectator == false)
                         {
                                 $this->joueurs[$login]->ready = true;
                                 self::$participants++;
                         }
                 }
         }
     
         $this->debugLog('* BeginChallenge : Nb participants :'.self::$participants.' | Min : '.self::$nbMin);
         // si  nb joueur >= nbmin on joue sinon on attend de nouveau joueur
         if (self::$participants < self::$nbMin)
         {
                 self::$race = false;
                 $msg = self::$prefSrv.'Il n\'y a pas assez de joueurs (au moins '.self::$nbMin.' joueurs)';
                 $this->connection->chatSendServerMessage($msg,null,true);
                 $this->debugLog('* BeginChallenge : '.$msg);
                 $liste = $this->getListeJoueur();
         }
         else
         {
                 self::$race = true;
                 foreach($this->joueurs as $login=>$joueur)
                 {
                         if ($joueur->ready)
                         {
                                 $joueur->credits -= self::$prix;
                                 $this->afficheCredit($login,$joueur->credits);
                                 $this->joueurs[$login]->credits = $joueur->credits;
                                 $this->updateCredits($joueur->id_j,$joueur->credits);
                                 $this->connection->chatSendServerMessage(self::$prefPlayer.'Vous participez ▒|  cette map, il vous reste '.$joueu    r->credits.' credit(s).',$login,true);
                                 self::$pot += self::$prix;
                         }
                 }
                 $liste = $this->getListeJoueur();
                 $msg = 'Nouvelle donne avec un pot de '.self::$pot.'<br/>Participants : '.count($liste).' ('.TMStrings::stripColors(implode(',',$    liste)).')';
                 $this->updateHisto(self::$idEvenement,$msg);
                 $msg = self::$prefSrv.self::$participants. ' participants, le pot est de '.self::$pot.' crédits';
                 $this->connection->chatSendServerMessage($msg,null,true);
                 $this->debugLog('* BeginChallenge : '.$msg);
         }
     
         $this->setPot(self::$pot,self::$idEvenement);
     
         // on met a jour le widget GC
         $players= array_merge($this->storage->players,$this->storage->spectators);
         foreach($players as $login=>$p)
                 $this->afficheWidget($login,self::$pot,'','',$liste);
     
         $this->connection->executeMulticall();
    Alors j'ai l'erreur suivante que je ne sais pas comment corriger*:

    -> ErrorException with code 0
    Undefined property:
    ManiaLivePlugins\Monplugin\Monplugin::$joueurs
    - in
    /home/games/TMServ/ManiaLive1_r267/libraries/ManiaLivePlugins/MonPlugin/Monplugin.php on line 249
    ...et la ligne 249 (correspond à la ligne 29 du code ci-dessus)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach($this->joueurs as $login=>$joueur)
    Pourriez-vous m'aider à identifier la source du problème pour la corriger*?

    Merci de vos suggestions...

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Billets dans le blog
    12
    Par défaut
    Salut,

    semblerait que $this->joueurs soit inconnu.
    Cela voudrait dire que le traitement de $this->storage->spectators ne rentre pas dans la boucle foreach() et que le tableau est désespérément vide et idem pour $this->storage->players.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 131
    Par défaut
    Bonjour rawsrc et merci pour ton message.

    Alors après analyse sur base de ta remarque, je trouve ceci dans mes logs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TMServ/ManiaLive1_r267/logs/monPlugin/log_Runtime.txt:      ManiaLivePlugins\monPlugin\monPlugin->onBeginChallenge(Array, false,
    Se pourrait-il que ce soit la confirmation qu'il manque les données ?

    Pourtant, dans le même log, j'ai bien la confirmation de la connexion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TMServ/ManiaLive1_r267/logs/monPlugin/log_Runtime.txt:2016.03.11_12:35 [2016-03-11 12:35:50|MonPlugin] [Database] Database Connexion Ok !
    Comment remonter plus haut ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 131
    Par défaut
    comme je ne sais pas bien comment les interpréter, peut-être que les éléments relatifs à l'erreur pourraient aider à m'orienter...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    2016.03.12_21:16
        Occured on 12.03.2016 at 21:16:03 at process with ID #28200
        ---------------------------------
     -> ErrorException with code 0
        Undefined property: ManiaLivePlugins\monPlugin\monPlugin::$joueurs
      - in /home/monuser/TMServ/ManiaLive1_r267/libraries/ManiaLivePlugins/monPlugin/monPlugin.php on line 249
      - Stack: #0 /home/monuser/TMServ/ManiaLive1_r267/libraries/ManiaLivePlugins/monPlugin/monPlugin.php(249): ManiaLive\Application\ErrorHandling::createExceptionFromError(8, 'Undefined prope...', '/home/monuser/TMS...', 249, Array)
               #1 [internal function]: ManiaLivePlugins\monPlugin\monPlugin->onBeginChallenge(Array, false, false)
               #2 /home/monuser/TMServ/ManiaLive1_r267/libraries/ManiaLive/DedicatedApi/Callback/Event.php(28): call_user_func_array(Array, Array)
               #3 /home/monuser/TMServ/ManiaLive1_r267/libraries/ManiaLive/Event/Dispatcher.php(52): ManiaLive\DedicatedApi\Callback\Event->fireDo(Object(ManiaLivePlugins\monPlugin\monPlugin))
               #4 /home/monuser/TMServ/ManiaLive1_r267/libraries/ManiaLive/DedicatedApi/Connection.php(108): ManiaLive\Event\Dispatcher::dispatch(Object(ManiaLive\DedicatedApi\Callback\Event))
               #5 /home/monuser/TMServ/ManiaLive1_r267/libraries/ManiaLive/Application/AbstractApplication.php(146): ManiaLive\DedicatedApi\Connection->executeCallbacks()
               #6 /home/monuser/TMServ/ManiaLive1_r267/bootstrapper.php(82): ManiaLive\Application\AbstractApplication->run()
               #7 {main}

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 131
    Par défaut
    je viens aussi de remarquer qu'au lancement du contrôleur Manialive, et seulement à ce moment, j'ai l'erreur suivante qui se produit sur un autre plugin (Yuggy), écrit à l'époque par le même programmeur:

    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
    Occured on 12.03.2016 at 22:08:41 at process with ID #29755
        ---------------------------------
     -> ErrorException with code 0
        mysqli_real_escape_string() expects parameter 1 to be mysqli, string given
      - in /home/monuser/TMServ/ManiaLive1_r267/libraries/ManiaLivePlugins/Yuggy/Yuggy/Yuggy.php on line 512
      - Stack: #0 [internal function]: ManiaLive\Application\ErrorHandling::createExceptionFromError(2, 'mysqli_real_esc...', '/home/monuser/TMS...', 512, Array)
               #1 /home/monuser/TMServ/ManiaLive1_r267/libraries/ManiaLivePlugins/Yuggy/Yuggy/Yuggy.php(512): mysqli_real_escape_string('a:15:{i:0;a:4:{...', Object(ManiaLive\DedicatedApi\Connection))
               #2 /home/monuser/TMServ/ManiaLive1_r267/libraries/ManiaLivePlugins/Yuggy/Yuggy/Yuggy.php(169): ManiaLivePlugins\Yuggy\Yuggy\Yuggy->setServerConfig()
               #3 /home/monuser/TMServ/ManiaLive1_r267/libraries/ManiaLive/PluginHandler/PluginHandler.php(157): ManiaLivePlugins\Yuggy\Yuggy\Yuggy->onReady()
               #4 /home/monuser/TMServ/ManiaLive1_r267/libraries/ManiaLive/PluginHandler/PluginHandler.php(682): ManiaLive\PluginHandler\PluginHandler->loadPlugins()
               #5 /home/monuser/TMServ/ManiaLive1_r267/libraries/ManiaLive/Application/Event.php(39): ManiaLive\PluginHandler\PluginHandler->onInit()
               #6 /home/monuser/TMServ/ManiaLive1_r267/libraries/ManiaLive/Event/Dispatcher.php(52): ManiaLive\Application\Event->fireDo(Object(ManiaLive\PluginHandler\PluginHandler))
               #7 /home/monuser/TMServ/ManiaLive1_r267/libraries/ManiaLive/Application/AbstractApplication.php(130): ManiaLive\Event\Dispatcher::dispatch(Object(ManiaLive\Application\Event))
               #8 /home/monuser/TMServ/ManiaLive1_r267/libraries/ManiaLiveApplication/Application.php(38): ManiaLive\Application\AbstractApplication->init()
               #9 /home/monuser/TMServ/ManiaLive1_r267/libraries/ManiaLive/Application/AbstractApplication.php(137): ManiaLiveApplication\Application->init()
               #10 /home/monuser/TMServ/ManiaLive1_r267/bootstrapper.php(82): ManiaLive\Application\AbstractApplication->run()
               #11 {main}
    ... et la ligne en question est la suivante, j'y avais changé le "mysql" en "mysqli" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $liste = mysqli_real_escape_string(serialize($setting_map), $this->connection);
    Comment réécrire cette syntaxe pour mysqli puisque l'ajout du "i" ne suffit manifestement pas ?

    Se pourrait-il que cela provoque l'autre erreur en cascade ?

  6. #6
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Billets dans le blog
    12
    Par défaut
    Salut,

    l'erreur t'est donnée en toutes lettres :
    mysqli_real_escape_string() expects parameter 1 to be mysqli, string given
    essaie comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysqli_real_escape_string($this->connection, serialize($setting_map));

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/04/2010, 16h08
  2. Réponses: 4
    Dernier message: 04/09/2008, 11h32
  3. problème de passage de valeur dans une fonction
    Par jeremie74 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 21/09/2007, 18h30
  4. [MySQL] Problème de récupération des données dans une fonction
    Par highman dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 26/10/2006, 20h04
  5. Réponses: 9
    Dernier message: 13/05/2005, 03h13

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