在循环中连接 mysql 查询语句
concatenated mysql query statement in a loop
我在互联网和堆栈溢出中搜索了可以使用但找不到的更好逻辑。代码的错误是我无法弄清楚的语法错误。我是新手,不太熟悉 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
您需要用逗号分隔 SELECT 列表中的每个表达式。
将 SQL 第一行的逗号移到循环中添加的第一个字符。
看起来您正在生成这样的语句:
SELECT expr1, expr2 expr3 expr4
您需要生成这样的语句
SELECT expr1, expr2, expr3, expr4
^ ^
只需在追加另一个表达式之前添加逗号即可。
为了调试,在执行之前对生成的 SQL 执行 echo
或 var_dump
。
生成的 SQL 似乎容易受到 SQL 注入攻击,除非您在其他地方正确地转义了 SQL 文本中包含的潜在不安全值。
格式很糟糕。我什至不知道这是否有效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;
我在互联网和堆栈溢出中搜索了可以使用但找不到的更好逻辑。代码的错误是我无法弄清楚的语法错误。我是新手,不太熟悉 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
您需要用逗号分隔 SELECT 列表中的每个表达式。
将 SQL 第一行的逗号移到循环中添加的第一个字符。
看起来您正在生成这样的语句:
SELECT expr1, expr2 expr3 expr4
您需要生成这样的语句
SELECT expr1, expr2, expr3, expr4
^ ^
只需在追加另一个表达式之前添加逗号即可。
为了调试,在执行之前对生成的 SQL 执行 echo
或 var_dump
。
生成的 SQL 似乎容易受到 SQL 注入攻击,除非您在其他地方正确地转义了 SQL 文本中包含的潜在不安全值。
格式很糟糕。我什至不知道这是否有效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;