2013-06-03 27 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);

谢谢。