我正在尝试创建一些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";
);
答案 0 :(得分:1)
所以你的代码最终将成为
SELECT * FROM a UNION ALL
...
SELECT * FROM k UNION ALL
并且不需要最终的UNION ALL,这就是您收到错误的原因。删除它,看起来像:
SELECT * FROM a UNION ALL
...
SELECT * FROM k
它应该执行。确保每个表中的列数也相同!
答案 1 :(得分: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);
答案 2 :(得分:1)
因此,您的上一个子查询不应以UNION ALL
结尾,您可以这样做:
$parts = array();
foreach ($companiesArray as $company)
$parts[] = "SELECT * FROM " . $company;
$query = implode(" UNION ALL ", $parts) . " ORDER BY timestamp DESC LIMIT 50";
答案 3 :(得分: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-&gt; query($ sqlQuery);
感谢。
答案 4 :(得分:0)
也许你可以做到
foreach ($companiesArray as $company) {
$sqls[] = "SELECT * FROM ".$company;
}
$sql = implode(" UNION ALL ", $sqls);
$query = $db->query($sql);
但是,正如你所说,它非常脏