2009-09-07 9 views
2

J'utilise ma propre classe pour les requêtes de base de données, l'extension mysqli:Comment puis-je résumer des instructions préparées mysqli en PHP?

class iDatabase extends mysqli 
{ 
    public $errorMsg; 
    private $totalQueries; 
    private $stmt; 

    public function __construct() 
    { 
     parent::__construct('localhost', 'asd', 'asd', 'asd'); 

     if (mysqli_connect_errno()) 
     { 
      $this->errorMsg = 'Could not connect to server.<br /><i>' . mysqli_connect_error() . '</i>.'; 
      return; 
     } 

     parent::query('SET NAMES utf8'); 
    } 

} 

Cependant, je suis en cours d'exécution en difficulté lors de l'exécution des requêtes et obtenir des résultats de retour. J'utilise des instructions préparées, mais la façon dont les valeurs et les résultats sont liés me confond. Après un peu de recherche, je suis venu avec cette fonction qui accepte la requête et les paramètres:

public function psQuery($query, $params) 
{ 
    $this->stmt = parent::prepare($query); 
    call_user_func_array(array($this->stmt,'bind_param'), $params); 
    $this->stmt->execute(); 
} 

Ma question est, quelle est la meilleure façon d'obtenir des résultats de retour de tout cela? Je dois utiliser bind_result, puis récupérer chaque ligne, puis fermer l'instruction. Je préférerais juste avoir un tableau associatif pour chaque rangée - est-ce possible?

Répondre

4

je travaillais sur les classes Zend_Db_Adapter_Mysqli et Zend_Db_Statement_Mysqli un peu pour obtenir ce travail, car nous voulions le rendre conforme à l'interface PDO et PDOStatement. C'était assez laborieux, à cause de la manière confuse dont MySQLi insiste pour que vous liez les variables pour obtenir des résultats, et la variété des modes de récupération supportés par PDOStatement.

Si vous voulez voir le code Zend_Db, accorder une attention particulière aux fonctions Zend_Db_Statement_Mysqli::_execute() et fetch(). Fondamentalement, la méthode _execute() lie un tableau de références de variables en utilisant call_user_func_array(). La partie délicate est que vous devez initialiser le tableau afin que la fonction bind_result() obtienne les références. Euh, ce n'était pas totalement clair, alors jetez un oeil au code. Ou sinon, utilisez simplement le pilote MySQL de PDO. C'est ce que je ferais à ta place.

+0

+1 pour aider à créer l'une de mes bibliothèques préférées. – karim79

+0

Où trouverais-je le code? J'ai regardé ici mais c'est seulement la documentation, pas de code: http://framework.zend.com/apidoc/core/Zend_Db/Statement/Zend_Db_Statement_Mysqli.html – DisgruntledGoat

+0

@DisgruntledGoat: Vous pouvez le télécharger, bien sûr, sinon vous pouvez parcourir le source en ligne à http://framework.zend.com/code/browse/Standard_Library/standard/trunk/library/Zend –

0

Il semble que vous devez faire ce que vous avez dit « je dois utiliser bind_result, puis aller chercher chaque ligne, puis fermez la déclaration »

Je pense qu'il n'y a aucun moyen plus simple.

Questions connexes