我试图从表单更新表。
我有3页。 第一个查询所有从我的表中的行与“编辑”链接。 当编辑被点击(第2页)的代码拉$ ID,并把它的URL。 在$ ID从URL中拉出并在查询中使用填写的表格。
我的问题是经过更新的表单信息,以我的表。 基本上,更新没有发生。
第二页
<?php
include '../db/config.php';
include '../db/opendb.php';
$id = $_GET["id"];
$order = "SELECT * FROM tableName where id='$id'";
$result = mysql_query($order);
$row = mysql_fetch_array($result);
?>
<form method="post" action="edit_data.php">
<input type="hidden" name="id" value="<?php echo "$row[id]"?>">
<tr>
<td>Title</td>
<td>
<input type="text" name="title" size="20" value="<?php echo"$row[title]"?>">
</td>
</tr>
<tr>
<td>Post</td>
<td>
<input type="text" name="post" size="40" value="<?php echo
"$row[post]"?>">
</td></tr>
<tr>
<td align="right">
<input type="submit" name="submit value" value="Edit">
</td>
</tr>
</form>
第三页
include '../db/config.php';
include '../db/opendb.php';
$query = "UPDATE tableName SET '$_POST[title]', '$post[post]' WHERE id='$id'";
mysql_query($query);
if (isset($_POST[title])){
$title = mysql_real_escape_string(trim($_POST['title']));
}else{
$title = NULL;
}
if (isset($_POST[post])){
$post = mysql_real_escape_string(trim($_POST['post']));
}else{
$post = NULL;
}
$query = "UPDATE tableName SET title='$title', post='$post' WHERE id='$id'";
mysql_query($query);
我还建议mysqli的功能,而不是MySQL的,我可能不会把一个变量和表列“后”,以避免混乱。
它应该是
UPDATE tableName SET `title` = {$_POST['title']}, `post` = {$_POST['post']}...
问问你自己,你有什么设置?
数据库更新你的SQL语句是错误的。 它不仅应包括新值,而且相应的字段名的列表。 这意味着它应该看起来更像是这样的:
$query = "UPDATE tableName SET `title` = {$_POST['title']}, `post` = {$_POST['post']} WHERE id = '$id'";
请注意,你也应该拥抱的领域$_POST
用两个大括号的字符串里( {}
或将其放在引号之外。 (如" = " .$_POST['title']. ", "
如果你使用标准的方法来访问那些与他引用(例如,不这是绝对必要的$_POST[title]
但$_POST['title']
或$_POST["title"]
此外,您应该添加以下代码:
- 一些错误处理 ,目前你甚至不知道出事了。 最简单的方法是检查返回值
mysql_query()
的函数null
,如果是null
,与获得MySQL错误信息mysql_error()
- 摆脱了传递的值。 目前,你直接发布数据传递到一个MySQL查询,这是非常不安全的。 (参见例如SQL注入 的维基百科 )您应使用
mysql_real_escape_string()
将它们插入到查询之前的所有形式的数据。 该逃逸,可能是恶意的所有部分。
那是因为你没有设置值。 在声明中:
$query = "UPDATE tableName SET '$_POST[title]', '$post[post]' WHERE id='$id'";
你应该通过列名进行更新。
如果你不使用PDO语句没有防止SQL注入攻击,那么你应该使用更多的保护,那么只是mysql_real_escape_string()。 在逃离的数据之上,你应该验证所提交的数据,其实是你期待。
IE浏览器。 在你的代码在这里:
$id = $_GET["id"];
$order = "SELECT * FROM tableName where id='$id'";
$result = mysql_query($order);
$row = mysql_fetch_array($result);
如果你说:
if(is_numeric($_GET['id'])){
$id = mysql_real_escape_string(trim($_GET["id"]));
$order = "SELECT id, title, post FROM tableName where id='$id'";
$result = mysql_query($order);
$row = mysql_fetch_array($result);
}
这至少会验证你正在执行什么实际上是一个ID号(也就是说,如果ID实际上是一个数)。 你可以,如果你还没有使用PDO陈述适用这个逻辑您的所有投入。 如果你期待的信件,然后进行验证字母,数字验证数字,特殊字符进行转义。 再次,这是最低限度。 我真的建议对数百个SQL注入技术阅读,并开始对PDO的阅读起来。
此外,关于使用SELECT *语句。 我会尽量避免它。 它增加了脆弱性的一个层,你的陈述,如果更改表中的字段的顺序,并使用了$行[0](编号请求)可事情搞砸的时候,最后,如果你的表包含数据的其他字段是无关的,你需要,那么你正在使用此页面上,那么你加载你不需要信息的人。
$order = "SELECT id, title, post FROM tableName where id='$id'";
将解决这个很好。 :) 祝好运!