2013-06-03 25 views
0

我試圖讓一些PHP根據從URL獲得的內容創建一個查詢。我很確定我接近完成它所需的代碼,但是我無法正確理解我的語法。這個想法是,它循環遍歷URL中的所有公司 - 公司= bla,bla,bla(我存儲在一個數組中),然後爲每個公司返回SQL語句的一部分以進行$查詢。 我知道我的代碼會壞。我完全意識到這一點,但如果沒有正確的語法,我無法調試它。如果有人能糾正我的語法,我會非常感激!對MySQL查詢造成錯誤的語法錯誤

感謝

$companies = $_GET['companies']; 
$companiesArray = explode(',', $companies); 
$companiesArrayLength = count($companiesArray); 

$query = $db->query(
    for ($i = 0; $i < $companiesArrayLength; $i++) { 
     echo "SELECT * FROM " . $companiesArray[$i] . " UNION ALL"; 
    } 
    //echo " ORDER BY timestamp DESC LIMIT 50"; 
); 
+0

你有一個公司的表,如果是的話,它是怎樣的? –

+2

對於SQL注入,您很**。 – h2ooooooo

+0

@ h2ooooooo我意識到這一點,我沒有添加代碼來防止它,但我知道需要做什麼來防止它。 – jskidd3

回答

1

所以,你的最後一個子查詢不應該以UNION ALL結束,你可以這樣做:

$parts = array(); 

foreach ($companiesArray as $company) 
    $parts[] = "SELECT * FROM " . $company; 

$query = implode(" UNION ALL ", $parts) . " ORDER BY timestamp DESC LIMIT 50"; 
1

所以,你的代碼最終會被

SELECT * FROM a UNION ALL 
... 
SELECT * FROM k UNION ALL 

,最終聯盟所有不需要的,這就是爲什麼你所得到的錯誤。刪除它看起來像:

SELECT * FROM a UNION ALL 
... 
SELECT * FROM k 

它應該執行。確保每個表中的列數都是一樣的!

+0

感謝您的支持!它沒有完全回答我的問題,因爲我的PHP語法已關閉,但您肯定更正了我的查詢! :) – jskidd3

1

你不能將echo轉換成函數參數(在這種情況下爲query())。相反,後來建立一個字符串,執行整個查詢:

$querystring = ""; 
for ($i = 0; $i < $companiesArrayLength; $i++) { 
    $querystring .= "SELECT * FROM " . $companiesArray[$i]; 
    // no UNION ALL after the last part 
    if($i != $companiesArrayLength-1){ 
     $querystring .= " UNION ALL"; 
    } 
} 
$querystring .= " ORDER BY timestamp DESC LIMIT 50"; 

$query = $db->query($querystring); 
+0

這與Andrius的查詢更正完美地回答了我的問題。非常感謝。 – jskidd3

+0

不客氣。請記住在問題解決後點擊左邊的勾號標記最有幫助的帖子作爲答案。 – oezi

+0

絕對!我只需要等待那個計時器:P – jskidd3

0

也許你可以做

foreach ($companiesArray as $company) { 
    $sqls[] = "SELECT * FROM ".$company; 
} 
$sql = implode(" UNION ALL ", $sqls); 
$query = $db->query($sql); 

但是,正如你所說,這是非常髒

1

試試看:

$ sqlQuery = NULL;

for ($i = 0; $i < $companiesArrayLength; $i++) { 
    if ($i != $companiesArrayLength-1){ 
    $sqlQuery .= " SELECT * FROM " . $companiesArray[$i] . " UNION ALL "; 
    } else { 
    $sqlQuery .= " SELECT * FROM " . $companiesArray[$i] ; 
    } 
} 

$sqlQuery .= " ORDER BY timestamp DESC LIMIT 50"; 

$ query = $ db-> query($ sqlQuery);

謝謝。