MySQL 没有更新表

Posted

技术标签:

【中文标题】MySQL 没有更新表【英文标题】:MySQL isn't updating tables 【发布时间】:2013-02-01 04:26:51 【问题描述】:

免责声明:这是一个作业。我不是要求人们给我明确的代码,只是为了获得足够的帮助,以便我可以看到我的错误,纠正它,并防止将来发生类似的错误。

我正在处理一项任务,要求我在数据库中创建一个表,用一些条目填充它,然后创建一个表单并允许用户通过表单更新数据库(这是非常基本的东西。)除了更新之外,用户在提交更改后应该会看到他们的条目。

其中一个要求是使用自动递增的主键。由于此密钥对用户没有真正的重要性,我认为没有必要将其包含在提交中(因此没有字段。)此外,由于它应该自动递增,因此可以选择手动添加的密钥没有任何意义。

所以我将一小部分字段和 mysql 语句放在一起,我认为所有这些都应该有效。当我有一个字段来添加一个键(在本例中为id_no)并在那里手动输入一个值时,提交的内容成功存储到数据库中。但是,当我删除该选项时,不会向数据库提交任何内容。

我应该注意我的主键字段id_no 标记为自动递增,所以这不是问题。根据我的理解以及我通过手动插入实体所看到的情况,自动递增值应该会自动更新,而无需将它们包含在任何 insert 语句中。

这是我目前所做的(这是我的第一个 MySQL/php 作业,所以请轻点):

<!DOCTYPE html>

<html>

<head>
  <title>Actor Database</title>

  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
  <script src="//ajax.aspnetcdn.com/ajax/jquery.validate/1.11.0/jquery.validate.js"></script>
  <script>
  $(document).ready(function() 
    $("form").validate();
  );
  </script>
</head>

<body>


 <form method="post">
   First Name: <input name="first_name" type="text" id="first" class="required" minlength="3">
   <br>
   Last Name: <input name="last_name" type="text" id="last" class="required" minlength="3">
   <br>
   <!--ID Number: <input name="id_no" type="text" id="id_num" class="required digits" maxlength="5">
   <br>-->
   Photo: <input name="photo" type="file" id="photo" class="required">
   <br>
   <input type="submit" id="submit">
 </form>

 <?php

 $dbhost = '*******************';
 $dbname = '*******************';
 $dbuser = '*******************';
 $dbpass = '*******************';

 $mysql_handle = mysql_connect($dbhost, $dbuser, $dbpass)
 or die("Error connecting to database server");

 mysql_select_db($dbname, $mysql_handle)
 or die("Error selecting database: $dbname");

 //mysql_query("INSERT INTO Actors(first_name, last_name) VALUES('Anne', 'Hathaway')");

 $id_no = array_key_exists("id_no", $_REQUEST) ? $_REQUEST["id_no"] : 0;
 $first_name = array_key_exists("first_name", $_REQUEST) ? $_REQUEST["first_name"] : '';
 $last_name = array_key_exists("last_name", $_REQUEST) ? $_REQUEST["last_name"] : '';
 $photo = array_key_exists("photo", $_REQUEST) ? $_REQUEST["photo"] : NULL;

 if ($id_no <= 0) 
  echo "";
  else if ($id_no > 0) 
  $rs = mysql_query("SELECT id_no FROM Actors WHERE id_no = ".$id_no);
  if (mysql_numrows($rs) == 0) 
    mysql_query("INSERT INTO Actors(id_no, last_name, first_name) VALUES("
        . $id_no
        . ",'" . mysql_real_escape_string($last_name) . "'"
        . ",'" . mysql_real_escape_string($first_name) . "')"
      );
   else 
    mysql_query("UPDATE Actors 
      SET last_name  = '".mysql_real_escape_string($last_name). "',
      SET first_name = '".mysql_real_escape_string($first_name)."'
      WHERE id_no ".$id_no
      );
  
  

  $results = mysql_query('SELECT id_no, last_name, first_name, photo FROM Actors');
  $nrows = mysql_numrows($results);

  echo "<table>";
  for ($i = 0; $i < $nrows; $i++) 
   echo "<tr>";
   echo "<td>".htmlspecialchars(mysql_result($results, $i, "first_name")). " " .htmlspecialchars(mysql_result($results, $i, "last_name"))."</td>";
   echo "</tr>";
  
  echo "</table>";


 mysql_close($mysql_handle);

 ?>
</body>


</html>

【问题讨论】:

【参考方案1】:

马上你的where id_no 缺少一个 =

mysql_query("UPDATE Actors 
  SET last_name  = '".mysql_real_escape_string($last_name). "',
  first_name = '".mysql_real_escape_string($first_name)."'
  WHERE id_no =".$id_no
  );

【讨论】:

更新也应该只有一个setupdate table set field=value, field=value, etc...【参考方案2】:

当您插入时,如果设置了 auto_increment 时有默认值,则不需要包含 id_no。所以从插入语句中删除 id_no。

id_no 的逻辑需要改变。要么有一个将 id_no 设置为 0 的新命令/操作,这表明这是一条新记录;或者通过唯一索引确定并设置一个真正的主键并搜索它以确定记录是否已经存在。

祝你好运,感谢您的免责声明 :-)

【讨论】:

【参考方案3】:

不是答案,但太大了,无法发表评论。

这里有一些一般提示可以打动你的教授:

1) array_key_exists 有点多余,您可以通过以下方式使您的检查更具可读性:

$photo = isset($_REQUEST['photo']) ?: NULL;

(请注意,此快捷语法仅适用于 php 5.3+)

2) 您对查询调用没有错误处理,这意味着您只是假设它们总是成功。数据库操作只有 一种 的成功方式(“不要失败”),以及几乎无限的失败方式。始终检查返回值是否失败:

$result = mysql_query($sql) or die(mysql_error());
                           ^^^^^^^^^^^^^^^^^^^^^^

至少应该在每个数据库操作上进行。

3) 感谢您意识到 sql 注入问题并至少使用 mysql_real_escape_string() 来缓解它们

4) 仍然使用 mysql 函数的嘘声。切换到 PDO 或 mysqli 库并使用准备好的语句和占位符肯定会让这个项目在教授看来更好。

【讨论】:

以上是关于MySQL 没有更新表的主要内容,如果未能解决你的问题,请参考以下文章

Mysql触发器没有更新记录

Mysql根据不同的行更新表中的行值

MySQL更新表中的第一行

无法在 mysql 中使用 tkinter 更新表

注销PHP / MySql后如何更新表

mysql 中desc 作为一个表项导致的不能更新表项的问题