有沒有一個(棘手/非標準)的方式來做到這一點?在使用'IN(.....)'子句的查詢中使用準備好的語句?
會像
$stmt = $db->prepare('SELECT title FROM episode WHERE id IN (?, ?, ?, ?);
工作?所以,如果我想尋找ID的變量數量,我可以做
$ids = array(1,2,3,4,5,6,7);
$idSection = implode(array_pad(array(), count($ids), '?')) //To give ?,?,?,?,?,?,?
$stmt = $db->prepare('SELECT title FROM episode WHERE id IN ($idSection);
$stmp->execute($ids);
即使會工作,但它仍然是不適合運行多組數據與同準備好的聲明,除非設定真正有用正在搜索的$ids
每次都是相同的長度,並且它不適用於名稱佔位符。
我假設,如果你做
$stmt = $db->prepare('SELECT title FROM episode WHERE id IN (:ids);
$ids = implode('","' array(1,2,3,4,5,6,7));
$stmt->bindParam(':ids', $ids);
,因爲事先準備好的聲明,構建,這樣它會尋找一個id值,也未能「1」,「2」,「3」,」 4「,」5「,」6「,」7「不符合?
我敢肯定,有一個比只使用IN(...)
子句更好的答案。我只需要手動清理$ids
條款,並將其包含在沒有佔位符的查詢中?
$stmt = $db->prepare("SELECT title FROM episode WHERE id IN $ids AND genre like :genre");
$stmt->bindParam(':genre', '%$genre%);
這是一個好主意!但是因爲我試圖按照'準備好的方式'來做事情,那麼我要麼運行一個準備好的多插入語句來構建臨時表(運行相同類型的問題),要麼運行一個準備好的單插入語句多次。我知道,多次運行準備好的單插入應該比運行常規單插多次更快,但是它會比多插入還要慢嗎? – EvilAmarant7x 2011-05-20 15:26:56
取決於行數,但多次運行預準備語句是更好的做法。您可以將簡單的分隔字符串傳遞給服務器上的存儲過程,該存儲過程從字符串中提取組成值並將插入操作插入臨時表中。 – Tim 2011-05-26 21:07:02