1

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

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

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

因此,我将一小部分字段和 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>
4

3 回答 3

2

马上你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
  );
于 2013-02-16T06:09:43.830 回答
1

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

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

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 库并使用准备好的语句和占位符肯定会让这个项目在教授看来更好。

于 2013-02-16T06:51:34.223 回答
1

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

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

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

于 2013-02-16T06:23:16.773 回答