конкатенация запроса MySQL в цикле

Я искал интернет и переполнение стека для лучшей логики, с которой я мог работать, но не мог найти. Ошибка кода — синтаксическая ошибка, которую я не мог понять. Я новичок и не очень хорошо знаком с 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

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;
0

Другие решения

Вам нужна запятая, разделяющая каждое выражение в списке SELECT.

Переместите запятую из первой строки SQL, чтобы быть первым символом, добавленным в цикл.

Похоже, вы генерируете утверждение вроде этого:

SELECT expr1, expr2 expr3 expr4

Вам нужно создать такое заявление

SELECT expr1, expr2, expr3, expr4
^      ^

Просто добавьте запятую, прежде чем добавить другое выражение.

Для отладки сделайте echo или же var_dump вашего сгенерированного SQL, прежде чем выполнить его.


Сгенерированный SQL кажется уязвимым для SQL-инъекций, если только в другом месте вы не избежали потенциально небезопасных значений, включаемых в текст SQL.

1

По вопросам рекламы [email protected]