MySQL没有更新表

时间:2013-02-16 06:08:11

标签: php mysql sql ajax database

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

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

其中一个要求是使用自动递增主键。由于这个密钥对用户没有真正的重要性,我认为没有必要在他们的提交中包含它们所包含的东西(因此没有它的字段。)此外,因为它应该自动增加,给出选项手动添加的密钥并没有多大意义。

所以我把一小组字段和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>

3 个答案:

答案 0 :(得分:2)

马上你的where id_no缺少一个='s

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

答案 1 :(得分:1)

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

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

祝你好运并感谢免责声明: - )

答案 2 :(得分:1)

不是答案,但对评论来说太大了。

这里有一些给你的教授留下深刻印象的一般提示:

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

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

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

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

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

应该在每个单独的数据库操作上作为最低限度。

3)了解sql注入问题并至少使用mysql_real_escape_string()来缓解这些问题的荣誉

4)仍然使用mysql函数的嘘声。切换到PDO或mysqli库并使用预处理语句和占位符肯定会使该项目看起来更好。