我正在进行一项任务,要求我在数据库中创建一个表,用一些条目填充它,然后创建一个表单并允许用户通过表单更新数据库(这是非常基本的东西。)除了更新之外,用户还应在提交更改后查看其条目。
其中一个要求是使用自动递增主键。由于这个密钥对用户没有真正的重要性,我认为没有必要在他们的提交中包含它们所包含的东西(因此没有它的字段。)此外,因为它应该自动增加,给出选项手动添加的密钥并没有多大意义。
所以我把一小组字段和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>
答案 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库并使用预处理语句和占位符肯定会使该项目看起来更好。