2010-06-14 18 views
0

En supposant que l'objet mysqli est déjà instancié (et connecté) avec la variable globale $ mysql, voici le code avec lequel j'essaye de travailler.Comment générer plusieurs lignes à partir d'une requête SQL en utilisant l'objet mysqli

class Listing { 
private $mysql; 
function getListingInfo($l_id = "", $category = "", $subcategory = "", $username = "", $status = "active") { 
     $condition = "`status` = '$status'"; 
     if (!empty($l_id)) $condition .= "AND `L_ID` = '$l_id'"; 
     if (!empty($category)) $condition .= "AND `category` = '$category'"; 
     if (!empty($subcategory)) $condition .= "AND `subcategory` = '$subcategory'"; 
     if (!empty($username)) $condition .= "AND `username` = '$username'"; 
     $result = $this->mysql->query("SELECT * FROM listing WHERE $condition") or die('Error fetching values'); 
     $this->listing = $result->fetch_array() or die('could not create object'); 
     foreach ($this->listing as $key => $value) : 
      $info[$key] = stripslashes(html_entity_decode($value)); 
     endforeach; 
     return $info; 
    } 
} 

il y a plusieurs centaines d'annonces dans la db et quand je l'appelle $ result-> fetch_array() le place dans un tableau de la première ligne dans la db. Cependant quand j'essaye d'appeler l'objet, je ne peux pas sembler accéder plus que la première rangée. Par exemple: $ listing_row = new Listing; while ($ listing = $ listing_row-> getListingInfo()) { echo $ listing [0]; }

Ceci génère une boucle infinie de la même ligne dans la base de données. Pourquoi ne passe-t-il pas au rang suivant? si je déplace le code:

$this->listing = $result->fetch_array() or die('could not create object'); 
     foreach ($this->listing as $key => $value) : 
      $info[$key] = stripslashes(html_entity_decode($value)); 
     endforeach; 

si je déménage ce en dehors de la classe, il fonctionne exactement comme prévu une sortie ligne à la fois en boucle à travers l'instruction while. Existe-t-il un moyen d'écrire ceci afin que je puisse garder l'appel fetch_array() dans la classe et toujours faire une boucle dans les enregistrements?

Répondre

0

Votre objet est fondamentalement défectueux - il réexécute la requête chaque fois que vous appelez la méthode getListingInfo(). De plus, mysql_fetch_array() ne va pas chercher l'ensemble des résultats, il va chercher uniquement la ligne suivante, de sorte que votre méthode se résume à:

  1. Exécuter la requête
  2. chercher première rangée processus
  3. première ligne
  4. retour première ligne

Chaque appel à l'objet crée une nouvelle requête, un nouvel ensemble de résultats et ne pourra donc jamais extraire les 2e, 3e, etc ... lignes. A moins que votre jeu de données ne soit "énorme" (c'est-à-dire: plus grand que vous ne pouvez/ne peut définir le PHP memory_limit), il n'y a aucune raison de ne pas récupérer tout l'ensemble. au dessus. En guise de remarque, l'utilisation de stripslashes me fait penser à l'activation de magic_quotes_gpc sur votre installation PHP. Cette fonctionnalité a été longtemps dépréciée et sera supprimée de PHP à chaque fois que v6.0 sortira. Si votre code s'exécute tel quel sur une telle installation, il peut être légitime d'échapper à l'échappement dans les données. De même, c'est généralement une mauvaise idée de stocker des données encodées/échappées dans la base de données. La base de données doit contenir une copie "vierge" des données, et vous devez ensuite les traiter (échappement, citation, etc ...) si nécessaire au moment où vous avez besoin de la version traitée.

+0

@mark: Merci pour l'explication. Je suis très nouveau à OOP. J'ai une question concernant la sécurité à titre de suivi. Je n'ai pas magic_quotes_gpc activé mais j'utilise addslashes() pour tout ce qui est envoyé à travers un formulaire avant de l'ajouter à la base de données. Y a-t-il un meilleur moyen de sécuriser les données? Sinon, comment dois-je filtrer les données que quelqu'un envoie via une entrée de formulaire afin que je puisse l'entrer en toute sécurité dans ma base de données? – codescribblr

+0

La meilleure façon d'écrire des requêtes 'sécurisées' est d'utiliser PDO (http://php.net/PDO) avec des instructions préparées. Ceux-ci géreront toutes les lourdes levées de données de citation/d'échappement. Sinon, il est préférable d'utiliser mysql_real_escape_string() plutôt que addslashes(). La fonction mysql utilise les propres mécanismes de devis de mysql. addslashes est fondamentalement juste une fonction de remplacement de chaîne stupide et pourrait potentiellement être berné par des caractères unicode/non conventionnels. –