循环中连接的mysql查询语句

时间:2015-04-30 02:46:53

标签: php mysql foreach case

我搜索了互联网和堆栈溢出,以获得更好的逻辑,我可以使用但无法找到。代码的错误是语法错误,我无法弄清楚。我是新手,对pdo或mysqli方式不熟悉。所以我使用了弃用的mysql。截至目前,print_r()命令不输出任何内容,因为存在语法错误。哪里可能出错?请帮我。

$sub = "SELECT id FROM subjects WHERE class_id = 5 GROUP BY name";
$subj = mysql_query($sub,$dbconnect);
$rows = array();
 while ($row = mysql_fetch_assoc($subj)) {
     $rows[] = $row;
 }

$i=1;
    $query_res = "SELECT regd,";
    foreach($rows as $sub):
    $query_res .= " SUM(CASE WHEN `subject` IN ('".$sub['id']."')";
    $query_res .= " AND entry IN ('1')"; 
    $query_res .= " THEN (mark_score) END)/";
    $query_res .= " SUM(CASE WHEN `subject` IN ('".$sub['id']."')";
    $query_res .= " AND entry IN ('1')";
    $query_res .= " THEN (full_mark) END)*100 AS subj$i";
    endforeach;
    $query_res .= " FROM $dbexam WHERE regd='1' AND session='6'";   

    $res = mysql_query($query_res, $dbconnect) or die(mysql_error());
    $row_res = mysql_fetch_assoc($res);
    print_r($row_res);

以下是实际错误:

You have an error in your SQL syntax; check the manual that corresponds
to your MySQL server version for the right syntax to use near 'SUM(CASE
WHEN `subject` IN ('16') AND entry IN ('1') THEN (mark_score) 
END)/ SU' at line 1

2 个答案:

答案 0 :(得分:1)

您需要用逗号分隔SELECT列表中的每个表达式。

将逗号从SQL的第一行移动到循环中添加的第一个字符。

看起来你正在生成这样的声明:

SELECT expr1, expr2 expr3 expr4

你需要生成一个像这样的语句

SELECT expr1, expr2, expr3, expr4
                   ^      ^

只需在附加另一个表达式之前添加逗号。

要进行调试,请在执行之前执行生成的SQL的echovar_dump

生成的SQL似乎容易受到SQL注入攻击,除非您在其他地方正确转义了SQL文本中包含的潜在不安全值。

答案 1 :(得分:0)

格式化是残酷的。我甚至不知道这是否是有效的SQL,但在这里它被格式化并且更有可能被调试:

$query_res = 'SELECT regd';
foreach($rows as $sub):
    $query_res .= <<<SQL
        , SUM (
          CASE WHEN `subject` IN ('{$sub['id']}')
          AND entry IN ('1')
          THEN (mark_score)
          END
        ) /
        SUM (
          CASE WHEN `subject` IN ('{$sub['id']}')
          AND entry IN ('1')
          THEN (full_mark)
          END
        ) * 100 AS subj$i
SQL;
    $i++;
endforeach;