2010-08-10 10 views
1

J'essaie d'utiliser mysqli pour afficher des données, mais il n'affiche rien.mysqli resultset affiche null

Quel est le problème avec mon code?

classe php:

/* the database object */ 
     private $_db; 

     public function __construct($db=NULL) 
     { 
      if(is_object($db)) 
      { 
       $this->_db = $db; 
      } 
      else 
      { 

       $this->_db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME); 
      } 
     } 

     public function displayQuotes() 
     { 
      $sql = "SELECT cQuotes, vAuthor, cArabic, vReference 
          FROM thquotes 
          ORDER BY RAND() 
         LIMIT 1;"; 



         $query = $this->_db->prepare($sql); 
         $query->execute(); 
        $query->store_result(); 

         /* bind variables to prepared statement */ 
         $query->bind_result($cQuotes, $vAuthor, $cArabic, $vReference); 


         if(!$query->num_rows==0) 
         { 
         while($row = $query->fetch()) 
         { 
          //echo $this->formatQuotes($row); 
          $formatHTML = new formatHTML(); 
          echo $formatHTML->formatQuotes($row); 
         } 


         } 
         else 
         { 
          echo "There are no Quotes!"; 
         } 
         $query->free_result(); 
         $query->close(); 



     } 

ne lit la déclaration des if(!$query->num_rows==0) et des données est là dans le resultset car il ne va pas à la partie d'autre, mais je ne peux pas comprendre pourquoi il n'affiche rien .

fichier php:

include "base.php"; 
include_once "inc/class.quotes-m.inc.php"; 
$quotes = new Quotes($db); 

$quotes->displayQuotes(); 

php base.php:

include_once("inc/constants.inc.php"); 

error_reporting(E_ALL); 
ini_set("display_errors", 1); 



     $db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME); 

     if (!$db) { 
      echo 'db link fail'; 
     } 

Répondre

0

! a une higher precedence que ==, à savoir

if(!$query->num_rows==0) { ... } 
// is equivalent to 
if((!$query->num_rows) == 0) { ... } 

dire $query->num_rows est logiquement inversé (impliquant une distribution int > bool), cette valeur booléenne est comparée à 0.

Mais vous voulez quelque chose comme

if(0 < $query->num_rows) { ... } 

Vous utilisez un try {...} bloc catch(). Mais le mysqli extension ne lance pas d'exceptions (IIRC). Sauf si $this->_db est une sorte de wrapper (supplémentaire), vous devez tester les valeurs de retour des méthodes mysqli, ou utiliser une API qui lève réellement une exception lorsqu'une erreur survient, par exemple. PDO (lors de la définition du mode d'erreur sur PDO :: ERRMODE_EXCEPTION).


public function displayQuotes() 
    { 
    $sql = " 
     SELECT cQuotes, vAuthor, cArabic, vReference 
     FROM thquotes 
     ORDER BY RAND() 
     LIMIT 1 
    "; 

    $query = $this->_db->prepare($sql); 
    if (!$query) { 
     throw new ErrorException($this->_db->error, $this->_db->errno); 
    } 
    $r = $query->execute(); 
    if (!$r) { 
     throw new ErrorException($query->error, $query->errno); 
    } 

    $r = $query->store_result(); 
    if (!$r) { 
     throw new ErrorException($query->error, $query->errno); 
    } 

    /* bind variables to prepared statement */ 
    $r = $query->bind_result($cQuotes, $vAuthor, $cArabic, $vReference); 
    if (!$r) { 
     throw new ErrorException($query->error, $query->errno); 
    } 

    if(0 < $query->num_rows) { 
     $formatHTML = new formatHTML(); 
     while(false!==($row=$query->fetch())) { 
     echo $formatHTML->formatQuotes($row); 
     } 
    } 
    else { 
     echo "There are no Quotes!"; 
    } 
    $query->free_result(); 
    $query->close(); 
    } 
+0

$ this -> _ db est l'objet de base de données. J'ai enlevé 'try/catch' mais il affiche maintenant 'no Quotes'. – input

+0

"$ this -> _ db est l'objet de base de données" quel type d '"objet de base de données"? Une instance (directe) de mysqli? "J'ai supprimé try/catch" - et ajouté une autre gestion d'erreur à la place? – VolkerK

+0

J'ai mis à jour mon code, s'il vous plaît vérifier. le fichier php inclut le fichier de base qui se connecte à la base de données. il crée ensuite une instance de la classe et appelle la fonction requise pour afficher les données. Je crois que le problème réside dans cette ligne '$ query = $ this -> _ db-> prepare ($ sql);' – input