PHP + SQL 成绩簿更新多行
PHP + SQL gradebook updating multiple rows
因此,过去几天我一直在绞尽脑汁并在网上搜索,试图解决这个问题:我想更新 SQL 中的多行。问题是这个数据库不会更新。我知道将 SQL 查询放入循环中不是一个好主意,但这是我能够从 table.
获取数据的唯一方法
代码如下:
if(isset($_POST['save'])){
$update_query = "UPDATE grades SET grade_value = '{$_POST['grade']}' WHERE user_id = 1";
$result = mysqli_query($link, $update_query);
while($row = mysqli_fetch_assoc($result)){
foreach($row as $grade){
mysqli_query($link, $update_query);
}
}
}
function editGrades() {
global $link;
$query = "SELECT * FROM grades WHERE user_id = 1";
$result = mysqli_query($link, $query);
if(!$result){
die('Query failed' . mysqli_error());
}
while($row = mysqli_fetch_assoc($result)) {
$gradeValue = $row['grade_value'];
$gradeValue = is_array($gradeValue) ? $gradeValue : array($gradeValue);
foreach($gradeValue as $val){
?>
<td name='grade'><form name="grade" method="post"><input value='<?php if (isset($val)){echo sprintf("%0.2f",$val);} ?>' type='text' class='form-control' name='grade'></td>
<?php }
}
}
<table class="table gradebook">
<tr><th>Student</th><?php displayAssignments(); ?></tr>
<tr><?php displayStudents();?><?php editGrades(); ?></tr>
</table>
<div id="btncontainer">
<br />
<input type="submit" method="post" name="save" action="gradebook.php" class="btn btn-success">Save Changes</button>
</div>
关于 mysqli_query
没有更新的原因,我的最佳猜测是因为提交了多个 $_POST['grade']
值,而 SQL 不知道如何处理它们。我已经检查了表单和输入名称,所有这些检查都很好。
(我知道 user_id
不应该在 table 年级,但我只是想让它正常工作,稍后会优化 SQL 查询)。
第一个 mysqli_query()
之后的循环是不必要的。 UPDATE
查询不生成要迭代的行,因此该循环不执行任何操作。
相反,您应该在以下时间之后检查错误:
$result = mysqli_query($link, $update_query);
像这样:
if (!$result)
die("Error running query:".mysqli_error($link));
如果你在成功的情况下打印更新的行数,这也有助于调试,例如:
echo("Updated rows:".mysqli_affected_rows($link));
这将帮助您确定您没有看到更新行的原因是查询中的语法错误还是没有匹配任何行。
您还应确保正确清理用户输入(例如使用 mysqli_escape_string()
)以避免 SQL 注入攻击。
由于您自己指出的原因,更新不起作用:有多个 'grade' 字段导致数组类型为 $_POST['grade'],但还有一些事情需要被指出这里。
<td name='grade'><form name="grade" method="post"><input ... type='text' name='grade'></td>
您在此处为 3 个元素设置了相同的 name 属性。尽管这不是真正的问题并且可能不会引起任何问题,但 name 属性通常分配给 [=54] 的 inside 字段=] 形式。 <td>
不应具有 name 属性。表单的 name 可能应该与文本输入 name 不同,如果您选择的话。但是 <form>
的 name 属性已弃用,因为 HTML4 根据 Mozilla Foundation:
The name of the form. In HTML 4,its use is deprecated (id should be used instead). It must be unique among the forms in a document and not just an empty string in HTML 5.
我猜你的成绩实际上是不同科目的,所以你可能需要 'grades' table 中的 'subject_type' 列从单独的 'subjects' table 中分配外部 ID,以正确利用关系数据库。并且有不同的方法可以在前端实现这一点。一种方法是您可以将文本字段的名称属性设置为不同的主题名称,而不仅仅是 'grade'.
虽然您可以在 SQL 中执行批量插入语句,但没有等效的更新语法。因此,在将表单提交给 PHP 脚本后,您应该执行一个循环来更新多行。但是,当读取 select 查询结果时,可以使用 mysqli_fetch_all($result) 来避免在循环中执行查询。
我记得我刚开始学习 PHP 时也很困惑,因为它可以混合 HTML。开始的书会将所有代码都放在一个脚本中。前几天在 SO 上,我看到一个 post 的人正在将 PHP 会话变量分配给 JavaScript...重要的是要记住一开始 PHP, MySQL, HTML, JavaScript 都是独立的语言,每种语言都有自己的语法。 PHP MySQLi 库只是将字符串表示形式的查询传递给 MySQL,因此它需要遵守 MySQL 规则 :)
因此,过去几天我一直在绞尽脑汁并在网上搜索,试图解决这个问题:我想更新 SQL 中的多行。问题是这个数据库不会更新。我知道将 SQL 查询放入循环中不是一个好主意,但这是我能够从 table.
获取数据的唯一方法代码如下:
if(isset($_POST['save'])){
$update_query = "UPDATE grades SET grade_value = '{$_POST['grade']}' WHERE user_id = 1";
$result = mysqli_query($link, $update_query);
while($row = mysqli_fetch_assoc($result)){
foreach($row as $grade){
mysqli_query($link, $update_query);
}
}
}
function editGrades() {
global $link;
$query = "SELECT * FROM grades WHERE user_id = 1";
$result = mysqli_query($link, $query);
if(!$result){
die('Query failed' . mysqli_error());
}
while($row = mysqli_fetch_assoc($result)) {
$gradeValue = $row['grade_value'];
$gradeValue = is_array($gradeValue) ? $gradeValue : array($gradeValue);
foreach($gradeValue as $val){
?>
<td name='grade'><form name="grade" method="post"><input value='<?php if (isset($val)){echo sprintf("%0.2f",$val);} ?>' type='text' class='form-control' name='grade'></td>
<?php }
}
}
<table class="table gradebook">
<tr><th>Student</th><?php displayAssignments(); ?></tr>
<tr><?php displayStudents();?><?php editGrades(); ?></tr>
</table>
<div id="btncontainer">
<br />
<input type="submit" method="post" name="save" action="gradebook.php" class="btn btn-success">Save Changes</button>
</div>
关于 mysqli_query
没有更新的原因,我的最佳猜测是因为提交了多个 $_POST['grade']
值,而 SQL 不知道如何处理它们。我已经检查了表单和输入名称,所有这些检查都很好。
(我知道 user_id
不应该在 table 年级,但我只是想让它正常工作,稍后会优化 SQL 查询)。
第一个 mysqli_query()
之后的循环是不必要的。 UPDATE
查询不生成要迭代的行,因此该循环不执行任何操作。
相反,您应该在以下时间之后检查错误:
$result = mysqli_query($link, $update_query);
像这样:
if (!$result)
die("Error running query:".mysqli_error($link));
如果你在成功的情况下打印更新的行数,这也有助于调试,例如:
echo("Updated rows:".mysqli_affected_rows($link));
这将帮助您确定您没有看到更新行的原因是查询中的语法错误还是没有匹配任何行。
您还应确保正确清理用户输入(例如使用 mysqli_escape_string()
)以避免 SQL 注入攻击。
由于您自己指出的原因,更新不起作用:有多个 'grade' 字段导致数组类型为 $_POST['grade'],但还有一些事情需要被指出这里。
<td name='grade'><form name="grade" method="post"><input ... type='text' name='grade'></td>
您在此处为 3 个元素设置了相同的 name 属性。尽管这不是真正的问题并且可能不会引起任何问题,但 name 属性通常分配给 [=54] 的 inside 字段=] 形式。<td>
不应具有 name 属性。表单的 name 可能应该与文本输入 name 不同,如果您选择的话。但是<form>
的 name 属性已弃用,因为 HTML4 根据 Mozilla Foundation:
The name of the form. In HTML 4,its use is deprecated (id should be used instead). It must be unique among the forms in a document and not just an empty string in HTML 5.
我猜你的成绩实际上是不同科目的,所以你可能需要 'grades' table 中的 'subject_type' 列从单独的 'subjects' table 中分配外部 ID,以正确利用关系数据库。并且有不同的方法可以在前端实现这一点。一种方法是您可以将文本字段的名称属性设置为不同的主题名称,而不仅仅是 'grade'.
虽然您可以在 SQL 中执行批量插入语句,但没有等效的更新语法。因此,在将表单提交给 PHP 脚本后,您应该执行一个循环来更新多行。但是,当读取 select 查询结果时,可以使用 mysqli_fetch_all($result) 来避免在循环中执行查询。
我记得我刚开始学习 PHP 时也很困惑,因为它可以混合 HTML。开始的书会将所有代码都放在一个脚本中。前几天在 SO 上,我看到一个 post 的人正在将 PHP 会话变量分配给 JavaScript...重要的是要记住一开始 PHP, MySQL, HTML, JavaScript 都是独立的语言,每种语言都有自己的语法。 PHP MySQLi 库只是将字符串表示形式的查询传递给 MySQL,因此它需要遵守 MySQL 规则 :)