2010-09-30 6 views
1

Si je voulais obtenir une liste de product_ids avec une certaine marque. Je ferais ceci:Le moyen le plus efficace de remplir tableau à partir des valeurs de base de données?

$id_list = array(); 
$qry = 'SELECT product_id FROM products WHERE product_brand = :brand'; 
$STH = $this->pdo->prepare($qry); 
$STH->execute(array("brand" => $brand)); 
$STH->setFetchMode(PDO::FETCH_ASSOC); 
while($row = $STH->fetch()) 
{ 
    $id_list[] = $row['product_id']; 
} 

Existe-t-il un moyen plus rapide et plus efficace? Il semble que si je sélectionne seulement une colonne, il devrait y avoir une meilleure approche pour sélectionner/insérer cela dans un tableau.

+0

Avez-vous des raisons de poser une telle question? –

+0

@Col. Shrapnel, oui. J'ai différentes tables pour différents types de produits. Donc, pour générer une liste de tous les product_ids avec une certaine condition, j'ai besoin d'exécuter quelque chose comme le dessus sur chaque table. (Ils sont tous liés à une table de base, donc les ID ne se chevauchent pas). Je suis donc à la recherche de chaque table de type de produit pour les produits qui répondent à la condition, et de stocker les résultats dans un tableau. Puis, une fois que j'ai un tableau de tous les identifiants de produits correspondants. Je les feuilleterai et les transmettrai à ma classe de produits qui les listera sur la page. –

+0

.. Donc comme je vais faire l'appel ci-dessus plusieurs fois (sur des tables différentes), je voulais le rendre aussi efficace que possible. –

Répondre

4
$STH->setFetchMode(PDO::FETCH_COLUMN,0); 
$id_list = $STH->fetchAll(); 

Est-ce vraiment plus rapide? Local BenchMark:

$ cat 1.php 
<?php 
$d = new PDO('mysql:localhost'); 
$qry = 'SELECT SQL_NO_CACHE bar FROM test.foo'; //for completeness sake: foo has 400 rows 
$stmt = $d->query($qry); 
$stmt->setFetchMode(PDO::FETCH_COLUMN,0); 
$check = $stmt->fetchAll(); 
?> 
$ cat 2.php 
<?php 
$d = new PDO('mysql:localhost'); 
$qry = 'SELECT SQL_NO_CACHE bar FROM test.foo'; //for completeness sake: foo has 400 rows 
$stmt = $d->query($qry); 
$check = array(); 
$stmt->setFetchMode(PDO::FETCH_ASSOC); 
while($row = $stmt->fetch()){ 
     $check[] = $row['bar']; 
} 
?> 
$ time (for i in {1..100}; do php 1.php; done;) 

real 0m4.507s 
user 0m2.392s 
sys  0m1.288s 
$ time (for i in {1..100}; do php 2.php; done;) 

real 0m6.830s 
user 0m3.352s 
sys  0m2.328s 

.. donc, au moins cette différence de script, sur mon serveur, est plus rapide ...

+0

+1 Génial, merci! .. Je savais qu'il devait y avoir quelque chose ... Question tho, est-ce vraiment plus rapide ou juste besoin de moins de frappe? –

+0

Hmm, moins de tableaux créés, je pense que c'est négligeable, mais je vais avoir un benchmark dans quelques minutes. – Wrikken

+0

oh non. Wrikken et ses itérations zillion entraînées testent à nouveau. –

Questions connexes