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

时间:2013-06-03 11:18:02

标签: php sql

我正在尝试创建一些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";
);

5 个答案:

答案 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);

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