错误的语法导致MySQL查询错误


Bad syntax causing errors for MySQL query

我试图使一些PHP创建一个基于它从URL得到的查询。我很确定我接近完成它所需的代码,但我不能得到我的语法正确。其思想是,它循环遍历URL ?companies=bla,bla,bla(我将其存储在一个数组中)中的所有公司,然后对每个公司返回$query的部分SQL语句。我知道我的代码会很糟糕。我完全意识到这一点,但如果没有正确的语法,我无法调试它。如果有人能纠正我的语法,我会非常感激!

感谢
$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";
);

所以你的最后一个子查询不应该以UNION ALL结尾,你可以这样做吗:

$parts = array();
foreach ($companiesArray as $company)
    $parts[] = "SELECT * FROM " . $company;
$query = implode(" UNION ALL ", $parts) . " ORDER BY timestamp DESC LIMIT 50";

所以你的代码最终会变成

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

和最后的UNION ALL是不需要的,这就是为什么你会得到错误。删除它,使其看起来像:

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

,它应该执行。确保每个表中的列数也是相同的!

您不能将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);

试一试:

$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);

谢谢。

也许你可以做

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

但是,就像你说的,它很脏