2010-11-16 34 views
0

我有一個需要花費六個幾乎相同的查詢與他們之間的唯一區別是「類別」的值的頁面:如何在PHP中縮寫MySQL查詢?

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

而不是寫了六種不同的$查詢變量($ QUERY1,$ QUERY2等),對每個不同的類別,我想縮寫,所以我可以在類別中的每個我實例$查詢,像這樣通過時間爲變量:

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

一定有辦法做到這一點,但我根本找不到用這種方法將變量傳遞給MySQL查詢的語法(我檢查了php.net,這個站點,vario我們在Google上的其他php資源)。誰能幫我嗎?

非常感謝,謝謝!

+0

這是原始的用例準備語句。如果你使用'?'佔位符並且只是將參數作爲列表傳遞給' - > execute()',那麼這真的很簡單。 – mario 2010-11-16 01:59:41

+0

「原始」?這是不對的。 – staticsan 2010-11-16 05:25:35

回答

0

您可以使用sprintf爲:

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

這就是我一直在尋找的!謝謝大家。 – Chris 2010-11-16 02:26:21

3

使用PDOprepared 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

雖然這是很好的參數化,是不是仍然執行每個類別的聲明? – 2010-11-16 02:02:59

+0

@OMGPonies是的,但該語句只准備/編譯一次。在OP中,每條語句都將分別編譯。 – Phil 2010-11-16 02:28:55

+0

千萬不要做六個查詢,你可以在一個。 – 2010-11-16 02:32:29

3

不能使用一個變量在SQL來表示一個逗號分隔的列表,就像我用於像這樣的情況作爲IN子句的值。您需要使用動態SQL,這意味着在將查詢提交到數據庫之前將查詢構建爲字符串。

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

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

$results = mysql_query($query); 

另一種方法是使用MySQL's Prepared Statement syntax,這是MySQL的動態SQL語法...

+0

不要忘記開始和結束引號;-) – Phil 2010-11-16 03:03:07

+0

@Phil Brown:謝謝,修復。 – 2010-11-16 03:06:31