2009-09-09 5 views
1

Ci-dessous est juste une maquette de 2 codes en PHP/MySQL.
Le premier renvoie un résultat mysql et exécute une boucle while pour itérer les résultats, le second fait presque la même chose mais place le résultat dans une requête et le met ensuite à l'écran. Maintenant, pour une approche plus OO, la deuxième méthode serait mieux je pense (pas sûr, j'apprends) mais là où je suis confus est, ne pas utiliser la deuxième méthode ci-dessous utiliser deux fois plus de mémoire? N'est-il pas fondamentalement en train de créer 2 tableaux au lieu de 1? Le mettre dans un tableau semble beaucoup plus flexible, s'il vous plaît donnez-moi vos conseils/conseils. Gardez à l'esprit que ce ne serait pas une simple chose courue 1 fois sur une page, un exemple réel sur une page sur mon site que tableau peut contenir 5000 noms d'utilisateur et numéro d'utilisateur dans le tableau et plusieurs requêtes peuvent être faites sur la même page tous avec des données différentes.En PHP devrais-je utiliser WHILE avec un résultat mysql ou un tableau?

<?PHP 
// first method without using array 
$url = "http://www.google.com/"; 
$sql = "SELECT user_id, nickname FROM `".TABLE_USERS."` 
      WHERE referrer LIKE '".$db->escape($url)."%' 
      ORDER BY nickname DESC 
      LIMIT 0,10"; 

$rows = $db->query($sql); 

while ($record = $db->fetch_array($rows)) { 
    echo "<tr><td>$record[user_id]</td> 
      <td>$record[nickname]</td></tr>"; 
} 
////////////////////////////////////////////////////////////////////// 
//second method using array 
$url = "http://www.google.com/"; 
$sql = "SELECT user_id, nickname FROM `".TABLE_USERS."` 
      WHERE referer LIKE '".$db->escape($url)."%' 
      ORDER BY nickname DESC 
      LIMIT 0,10"; 

// feed it the sql directly. store all returned rows in an array 
$rows = $db->fetch_all_array($sql); 

// print out array later on when we need the info on the page 
foreach($rows as $record){ 
    echo "<tr><td>$record[user_id]</td> 
      <td>$record[nickname]</td></tr>"; 
} 

?> 

Répondre

2

La seconde méthode utilise beaucoup plus de deux fois plus de mémoire. La première méthode ne récupère qu'une seule ligne à la fois et l'envoie à STDOUT. La deuxième méthode lit dans chaque rangée dans un tableau. Si vous avez 5000 lignes, cela va utiliser environ 5000 fois la mémoire (ne pas tenir compte des choses comme la mémoire tampon de sortie interne de PHP, etc.).

La deuxième méthode vous permet de manipuler les données beaucoup plus, mais elle utilise certainement beaucoup plus de mémoire. Si vous traitez vraiment autant de données sur une page, vous devrez peut-être trouver des moyens de les décomposer si vous commencez à rencontrer des problèmes de ressources.

+0

J'ai un peu gâché ça, avec la limite ce serait probablement comme 50 éléments sur une page par requête, mais j'ai l'idée de l'utiliser beaucoup plus de mémoire – JasonDavis

+0

Vous pourriez obtenir 50 résultats assez facilement et ne vous inquiétez pas trop sur la mémoire. Il semble que vous ne récupériez que deux champs dans vos requêtes, un identifiant et un pseudonyme, donc nous ne parlons que de quelques octets de données pour chaque enregistrement. MySQL aurait également besoin de mémoire pour le jeu de résultats, mais vous l'utiliserez dans les deux cas, cela ne fait donc aucune différence pour votre approche PHP. – zombat

-2

while me semble mieux, car il laisse la possibilité de ne pas charger la totalité du tableau de données en mémoire.

-2

La première option est plus rapide car elle nécessite moins de calculs de la part du processeur.

-1

Ceci n'a rien à voir avec OO. Pour être OO, vous devez remplir certains objets dans la boucle. Comme cela, par exemple:

$o = new MyObject(); 
$o->aField = $record['aField']; 
$objects[] = $o; 

Mais dans ce cas, vous êtes en train de faire simplement l'impression à la page, et les deux approches sont juste une autre façon de transférer ces données.

La première approche utilise un tableau à la fois, dans la taille de l'enregistrement. Le second utilise un tableau de la taille d'un enregistrement multiplié par le nombre d'enregistrements. Puisque vous ne traitez pas le tableau entier de toute façon, allez avec le premier.

Questions connexes