Php 错误语法导致MySQL查询出错

Php 错误语法导致MySQL查询出错,php,sql,Php,Sql,我正在尝试制作一些PHP,根据从URL获取的内容创建查询。我很确定我已经接近完成它所需的代码了,但是我的语法不正确。其思想是,它在URL?companys=bla,bla,bla(我存储在一个数组中)中遍历所有公司,然后为每个公司回显$query的SQL语句的一部分我知道我的代码会出错。我完全知道这一点,但如果没有正确的语法,我无法调试它。如果有人能纠正我的语法,我将不胜感激 谢谢 $companies = $_GET['companies']; $companiesArray = explod

我正在尝试制作一些PHP,根据从URL获取的内容创建查询。我很确定我已经接近完成它所需的代码了,但是我的语法不正确。其思想是,它在URL?companys=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";
);
$companys=$\u GET['companys'];
$companiesArray=explode(“,”,$companies);
$companiesArrayLength=计数($companiesArray);
$query=$db->query(
对于($i=0;$i<$companiesArrayLength;$i++){
回显“从“$companiesArray[$i]”中选择*。“联合所有”;
}
//echo“按时间戳顺序描述限制50”;
);

因此您的代码最终将

SELECT * FROM a UNION ALL
...
SELECT * FROM k UNION ALL
最终的联合是不需要的,这就是为什么你会得到错误。将其删除,使其看起来像:

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

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

因此您的代码最终将

SELECT * FROM a UNION ALL
...
SELECT * FROM k UNION ALL
最终的联合是不需要的,这就是为什么你会得到错误。将其删除,使其看起来像:

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

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

不能将
回送到函数参数中(
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);
$querystring=”“;
对于($i=0;$i<$companiesArrayLength;$i++){
$querystring.=“从“$companiesArray[$i]”中选择*;
//在最后一部分之后没有工会
如果($i!=$CompanyArrayLength-1){
$querystring.=“联合所有”;
}
}
$querystring.=“按时间戳描述的订单限制50”;
$query=$db->query($querystring);

您不能将
回送到函数参数中(
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);
$querystring=”“;
对于($i=0;$i<$companiesArrayLength;$i++){
$querystring.=“从“$companiesArray[$i]”中选择*;
//在最后一部分之后没有工会
如果($i!=$CompanyArrayLength-1){
$querystring.=“联合所有”;
}
}
$querystring.=“按时间戳描述的订单限制50”;
$query=$db->query($querystring);
也许你可以

foreach ($companiesArray as $company) {
    $sqls[] = "SELECT * FROM ".$company;
}
$sql = implode(" UNION ALL ", $sqls);
$query = $db->query($sql);
但是,正如你所说,它非常脏

也许你可以这样做

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

但是,正如您所说,它非常脏

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

$parts = array();

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

$query = implode(" UNION ALL ", $parts) . " 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";
试试看:

$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";
for($i=0;$i<$companiesArrayLength;$i++){
如果($i!=$CompanyArrayLength-1){
$sqlQuery.=“从“$companiesArray[$i]”中选择*。“联合所有”;
}否则{
$sqlQuery.=“从“$companiesArray[$i]”中选择*;
}
}
$sqlQuery.=“按时间戳描述的订单限制50”;
$query=$db->query($sqlQuery)

谢谢。

试试看:

$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";
for($i=0;$i<$companiesArrayLength;$i++){
如果($i!=$CompanyArrayLength-1){
$sqlQuery.=“从“$companiesArray[$i]”中选择*。“联合所有”;
}否则{
$sqlQuery.=“从“$companiesArray[$i]”中选择*;
}
}
$sqlQuery.=“按时间戳描述的订单限制50”;
$query=$db->query($sqlQuery)


谢谢。

您有公司表吗?如果有,它看起来怎么样?您非常容易受到SQL注入的攻击。@h2ooooooo我知道,我还没有添加代码来阻止它,但我知道需要做什么来阻止它。您有公司表吗,如果有,它看起来怎么样?您非常容易受到SQL注入的攻击。@H2Ooooo我知道,我还没有添加代码来阻止它,但我知道需要做些什么来阻止它。这完美地回答了我的问题,以及Andrius的查询更正。非常感谢,不客气。当你的问题解决后,请记住点击最有帮助的帖子左边的勾号,将其标记为答案。绝对正确!我只需等待计时器:P@jskidd3:我更喜欢使用
foreach
内爆
,这将导致更干净code@WouterHuysentruit只是刚刚看到你的答案,对不起。你的答案在我看来是最好的,所以你赢得了最好的答案。这完美地回答了我的问题,还有安德里奥斯的问题更正。非常感谢,不客气。当你的问题解决后,请记住点击最有帮助的帖子左边的勾号,将其标记为答案。绝对正确!我只需等待计时器:P@jskidd3:我更喜欢使用
foreach
内爆
,这将导致更干净code@WouterHuysentruit只是刚刚看到你的答案,对不起。在我看来,你的答案是最好的,所以你赢得了最好的答案。谢谢!它没有完全回答我的问题,因为我的PHP语法已关闭,但您确实更正了我的查询!:)谢谢你!它没有完全回答我的问题,因为我的PHP语法已关闭,但您确实更正了我的查询!:)