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?
@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
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. –