2010-11-16 3 views
0

J'ai une page qui a besoin de faire six presque requêtes identiques à la seule différence entre eux étant la valeur de « catégorie »:Comment abréger les requêtes MySQL en PHP?

$query = "SELECT * FROM table_name WHERE category="CATEGORY1"; 

au lieu d'écrire six différentes variables de requête $ (query1 $, query2 de $ , etc.) pour chaque catégorie, je voudrais abréger si je peux passer dans la catégorie comme une variable chaque fois que j'instancier $ requête, comme suit:

$query = "SELECT * FROM table_name WHERE category='$cat'"; 
$results= mysql_query($query,'CATEGORY1'); 

Il doit y avoir un moyen de le faire, mais je ne trouve tout simplement pas la syntaxe n'importe où pour passer une variable à une requête MySQL de cette façon (j'ai vérifié php.net, ce site, vario nous autres ressources php sur Google). Quelqu'un peut m'aider?

Très apprécié, merci!

+0

Tel est le cas d'utilisation pour des premiers âges des déclarations préparées. Ce qui est vraiment simple si vous utilisez des espaces réservés '? 'Et que vous passez simplement les paramètres sous la forme' -> execute() '. – mario

+0

"primeval"? Cela ne peut pas être juste. – staticsan

Répondre

0

Vous pouvez utiliser sprintf pour que:

$query = "SELECT * FROM table_name WHERE category='%s'"; 
$results= mysql_query(sprintf($query,'CATEGORY1')); 
+0

C'est ce que je cherchais! Merci a tous. – Chris

3

Utilisez PDO et prepared statements

$categories = array(
    'CATEGORY1', 
    'CATEGORY2', 
    'CATEGORY3', 
    'CATEGORY4', 
    'CATEGORY5', 
    'CATEGORY6' 
); 

$db = new PDO(...); 
$stmt = $db->prepare('SELECT * FROM table_name WHERE category = :category'); 
$stmt->bindParam('category', $category); 
foreach ($categories as $category) { 
    $stmt->execute(); 
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
     // do stuff with $row 
    } 
} 
+0

Alors que c'est sympa c'est paramétré, n'est-ce pas encore en train d'exécuter une requête par catégorie? –

+0

@OMGPonies Oui, mais cette déclaration n'est préparée/compilée qu'une seule fois. Dans le PO, chaque déclaration serait compilée séparément. – Phil

+0

Ne faites jamais en six requêtes, ce que vous pouvez en un. –

3

Vous ne pouvez pas utiliser une seule variable dans SQL pour représenter une liste séparée par des virgules, comme je l'avais utiliser pour des situations comme celles-ci en tant que valeurs pour une clause IN. Vous devez utiliser SQL dynamique, ce qui signifie que vous construisez la requête sous forme de chaîne avant de la soumettre à la base de données.

$array = array('category1', 'category2', 'category3'); 
$comma_separated = implode("','", $array); 

$query = "SELECT * 
      FROM table_name 
      WHERE category IN ('$comma_separated')"; 

$results = mysql_query($query); 

Une alternative serait d'utiliser MySQL's Prepared Statement syntax, qui est dynamique syntaxe SQL MySQL ...

+0

Ne pas oublier les citations de début et de fin ;-) – Phil

+0

@Phil Brown: Merci, corrigé. –