【问题标题】:PHP + SQL gradebook updating multiple rowsPHP + SQL 成绩簿更新多行
【发布时间】:2016-01-29 02:54:23
【问题描述】:

所以在过去的几天里,我一直在绞尽脑汁在网上搜索,试图弄清楚这一点:我想更新 SQL 中的多行。问题是这个数据库不会更新。我知道将 SQL 查询放入循环不是一个好主意,但这是我能够从表中获取数据的唯一方法。

代码如下:

    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 不应该在成绩表中,但我只是想让它工作,稍后会优化 SQL 查询)。

【问题讨论】:

  • 我最初在没有循环的情况下尝试了它,认为它是不必要的,然后出于某种原因包含它,认为它会在每次迭代时更新。

标签: php mysql sql database row


【解决方案1】:

由于您指出自己的原因,更新不起作用:有多个 'grade' 字段导致数组类型为 $_POST['grade'],但这里还有一些内容需要指出。

  1. &lt;td name='grade'&gt;&lt;form name="grade" method="post"&gt;&lt;input ... type='text' name='grade'&gt;&lt;/td&gt; 您在此处为 3 个元素设置了相同的 name 属性。尽管这不是一个真正的问题并且可能不会导致任何问题,但 name 属性通常分配给 html 表单的 inside 字段。 &lt;td&gt; 不应有 name 属性。表单的 name 可能与文本输入 name 不同,如果您选择有的话。然而,&lt;form&gt;name 属性已被弃用,因为 HTML4 根据Mozilla Foundation:

表单的名称。在 HTML 4 中,不推荐使用它(应该使用 id 代替)。它在文档中的表单中必须是唯一的,而不仅仅是 HTML 5 中的空字符串。

  1. 我猜你的成绩实际上是不同学科的,所以你可能需要在你的“成绩”表中设置一个“subject_type”列,应该从一个单独的“学科”表中分配外国 ID正确使用关系数据库。并且有不同的方法可以在前端实现这一点。一种方法是您可以将文本字段的名称属性设置为不同的主题名称,而不仅仅是“等级”。

  2. 虽然您可以在 SQL 中执行批量插入语句,但没有等效的更新语法。因此,在将表单提交到 PHP 脚本后,您应该执行一个循环来更新多行。但是,在读取 select 查询结果时,可以使用 mysqli_fetch_all($result) 来避免循环执行查询。

我记得当我第一次开始学习 PHP 时,我也很困惑,因为它可以混合 HTML。开始的书中将所有代码都放在一个脚本中。前几天在 SO 上,我看到一个人正在将 PHP 会话变量分配给 JavaScript 的帖子......在开始时要记住,PHP、MySQL、HTML、JavaScript 都是独立的语言,并且每个都有自己的语言,这一点很重要句法。 PHP MySQLi 库只是将字符串表示形式的查询传递给 MySQL,因此它需要遵守 MySQL 规则:)

【讨论】:

  • " PHP MySQLi 库只是将字符串表示形式的查询传递给 MySQL,因此它需要遵守 MySQL 规则 :)" 不,MySQL 和 MySQLi 都使用 SQL 与数据库服务器通信。它们都遵循 SQL 语法。然而,MySQL 定义了一些额外的子句,但这并不能使它成为一种全新的查询语言。
  • MySQLi 本身不处理查询是我想说的。这里我指的是 MySQL 作为数据库系统,而不是 PHP MySQL 库。很抱歉造成混乱。
【解决方案2】:

第一个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 注入攻击。

【讨论】:

  • 我刚刚尝试过,但仍然没有运气,遗憾的是。 “保存更改”上未显示错误和成功消息。页面将重定向并更新片刻,没有任何反应。
猜你喜欢
  • 2021-11-29
  • 2019-09-18
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
相关资源
最近更新 更多