我试图使一些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);
但是,就像你说的,它很脏