0

我正在尝试制作一些 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";
);
4

5 回答 5

1

所以你的代码最终会成为

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

并且不需要最后的 UNION ALL,这就是您收到错误的原因。删除它,使其看起来像:

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

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

于 2013-06-03T11:22:16.537 回答
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);
于 2013-06-03T11:23:27.313 回答
1

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

$parts = array();

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

$query = implode(" UNION ALL ", $parts) . " ORDER BY timestamp DESC LIMIT 50";
于 2013-06-03T11:26:17.747 回答
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);

谢谢。

于 2013-06-03T11:42:56.763 回答
0

也许你可以做

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

但是,正如你所说,它很脏

于 2013-06-03T11:24:30.773 回答