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

Flex Discussion :

AMFPHP et RemoteObject : couldn't fetch mysqli [Flex4]


Sujet :

Flex

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 76
    Par défaut AMFPHP et RemoteObject : couldn't fetch mysqli
    Bonjour,

    j'ai une application Flex 4 qui utilise AMFPHP 1.9 pour communiquer avec une base de données MySQL, tout ca sur un serveur EasyPHP 5.3.1.

    J'ai placé plusieurs services PHP dans le répertoire d'AMFPHP et à priori pas de problème pour y accéder et les utiliser.

    Parfois, quand j'interagis avec mon application Flex, il lance une requête via un service mais ne reçoit pas de résultat. Avec Charles Web Debugging Proxy, je m'aperçois que la fonction PHP lance cette exception : mysqli_prepare() : couldn't fetch mysqli
    Voici la fonction incriminée :
    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
    public function getGenreSimilaire($genre) {
     
     
    		$stmt = mysqli_prepare($this->connection, "SELECT genreSimilaire FROM genresimilaire WHERE genre =? ORDER BY score_genreSimilaire");
    		$this->throwExceptionOnError();
     
    		mysqli_stmt_bind_param($stmt, 's', utf8_decode($genre));		
    		$this->throwExceptionOnError();
     
    		mysqli_stmt_execute($stmt);
    		$this->throwExceptionOnError();
     
    		$rows = array();
     
    		mysqli_stmt_bind_result($stmt, $row);
     
    	    while (mysqli_stmt_fetch($stmt)) {
    	      $row = utf8_encode($row);
    	      $rows[] = $row;
    	      $row = new stdClass();
    	      mysqli_stmt_bind_result($stmt, $row);
    	    }
     
    	    mysqli_stmt_free_result($stmt);
    	    mysqli_close($this->connection);
     
    	    return $rows;
    	}

    La requête en question est testée et fonctionnelle. Elle retourne le bon résultat sous le browser intégré à AMFPHP.

    Dans mon appli Flex, je m'y prends comme ca pour lancer ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var genreSimilaire:RemoteObject = new RemoteObject();
    			genreSimilaire.destination = "MusicServer";
    			genreSimilaire.source = "GenreService2";
    			genreSimilaire.showBusyCursor = true;
    			genreSimilaire.addEventListener(ResultEvent.RESULT, getGenresSimilairesHandler);
    			genreSimilaire.addEventlistener(FaultEvent.FAULT, getFaultEventData);
     
    			genreSimilaire.getGenreSimilaire(value);
    Cette fonction marche 1 première fois et affiche le résultat de la requête PHP. Mais ensuite, l'exception PHP est lancée et la fonction getGenresSimilairesHandler n'est pas appelée.

    Avez-vous une idée de pourquoi cette exception survient au niveau du mysql_prepare ? Des pistes de réflexions ?
    J'ai testé la connexion de cette manière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(!$this->connection)
    			throw new Exception("Connection null");
    Mais je n'ai pas d'exception autre que celle du mysql_prepare...

    Merci de votre attention

  2. #2
    Membre éprouvé
    Homme Profil pro
    Tech Lead
    Inscrit en
    Novembre 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Tech Lead
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Par défaut
    Hello,

    Pour commencer je pense que tu peux éliminer Flex de l'équation. Ton problème est dans PHP.
    Une petite recherche de ton message d'erreur sur google semble dire qu'il existe un bug dans PHP 5.1.x avec l'extension mysqli.
    Quelle version de PHP utilise tu ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 76
    Par défaut
    Bonjour,

    D'après ce que j'ai vu en Googlant, le couldn't fetch mysqli pourrait venir d'un défaut de connexion.
    Pourtant, le test sur la connexion que je fais juste avant le mysqli_prepare ne lève pas d'exception.

    EasyPHP utilise la version 5.3.2 de PHP.
    Est-ce que je devrais quand même tester mysql plutôt que mysqli ?

    Merci de ton attention

  4. #4
    Membre éprouvé
    Homme Profil pro
    Tech Lead
    Inscrit en
    Novembre 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Tech Lead
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Par défaut
    Pas de quoi,

    Quand je regarde le bout de code PHP que tu as mis dans le poste je vois :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <?php
    mysqli_close($this->connection);
    ?>
    Ce qui pourrait expliquer pourquoi la requête marche la première fois mais plus après...
    Comment est ce que tu gère l'ouverture de la connexion ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 76
    Par défaut
    En fait, chaque fois que je veux accéder à la base de données, je créé un RemoteObject comme décrit dans le premier post.
    Ca me fait penser : peut-être que je ne devrais avoir qu'un seul RemoteObject par service PHP ?

    Au niveau AMFPHP, pour chaque classe service PHP, j'ai un constructeur comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public function __construct() {
    	  	$this->connection = mysqli_connect(
    	  							$this->server,  
    	  							$this->username,  
    	  							$this->password, 
    	  							$this->databasename,
    	  							$this->port
    	  						);
     
    		$this->throwExceptionOnError($this->connection);
    	}
    Donc dans chaque méthode d'une classe service, je libère les ressources Mysql et je ferme la connexion. C'est le mysqli_close($this->connection); que l'on voit dans la méthode montrée au premier post.

    Du coup, il est présent dans chacune de mes méthodes PHP (qui marchent bien) et j'ai beau l'enlever dans la méthode qui ne fonctionne pas, ca ne résout pas le problème.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Tech Lead
    Inscrit en
    Novembre 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Tech Lead
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Par défaut
    Ok,

    Est ce que pour le test tu peux mettre l'ouverture/fermeture de la connexion dans ta méthode ?
    (Je me demande si AMFPHP n'aurait pas un cache intelligent qui éviterait d'instancier systématiquement tes services PHP...)

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 76
    Par défaut
    Bien vu
    En créant une connexion dans la méthode, cela fonctionne bien.
    J'ai des services similaires avec le même genre de méthodes. Ces services ne créent pas ce genre d'exception. Une idée du pourquoi ?
    Je vais inspecter ca de plus près.

    Est-ce que du coup, je devrais avoir un RemoteObject dédié par service PHP ?
    Est-ce que je devrais plutôt créer mes fonctions PHP de manière procédurale, avec création d'une connexion au sein de chaque fonction ?

    Merci de ton aide.

  8. #8
    Membre éprouvé
    Homme Profil pro
    Tech Lead
    Inscrit en
    Novembre 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Tech Lead
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Par défaut
    Pas de quoi

    Ben pour faire les choses bien, il faut que l'appelle à tes méthodes mysqli soient encapsuler dans une classe singleton qui s'occupera de vérifier si y a une connexion ouverte et si y'en a pas il en ouvrira une.
    Dans tes services, tu te contenteras de faire tes requêtes SQL :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?php
    public class ServicePHP{
      public function methodeQuiFaitUneRequeteSQL(){
        DBManager::getInstance()->query("SELECT...");
      }
    }
    ?>
    En délégant la connexion SQL à un manager tu auras pas à te poser la question de savoir si ton service a déjà été instancié ou non.
    De plus en utilisant un manager du éviteras de créer des connexions simultanées à ta BDD dans un même script.

    Si tu ne sais pas ce qu'est un Singleton : C'est un design pattern qui te permet d'être sûr qu'une classe n'a été instanciée une seule fois.
    Une petite recherche sur google de : PHP5 singleton te donneras une multitude de liens qui t'expliquent comment mettre en place cette chose

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 76
    Par défaut
    Merci pour la suggestion, je vais regarder la mise en place d'un singleton !

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

Discussions similaires

  1. [MySQL] [MySQLi] - problème récupération de valeur fetch()
    Par fabtav59 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 06/04/2010, 13h25
  2. Probleme AMFPHP - RemoteObject - Endpoint
    Par Invité dans le forum Flex
    Réponses: 3
    Dernier message: 21/07/2009, 15h49
  3. Parametre avec RemoteObject (amfphp)
    Par lyrix dans le forum Flex
    Réponses: 2
    Dernier message: 13/11/2008, 12h39
  4. [MySQL] mysqli fetch array
    Par Kiwimenthe dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 16/08/2007, 09h17
  5. [Sécurité] Mysqli couldn't fetch() ..
    Par ..:: Atchoum ::.. dans le forum Langage
    Réponses: 5
    Dernier message: 27/12/2005, 02h17

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