我正在尝试从表单更新表。
我有3页。第一个用“编辑”链接查询我表中的所有行。 单击编辑(第2页)时,代码会拉出$ id并将其放入url中。 $ id从网址中提取,用于查询以填写表单。
我的问题是将更新的表单信息传递给我的表。基本上没有发生更新。
第二页
<?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);
答案 0 :(得分:2)
应该是
UPDATE tableName SET `title` = {$_POST['title']}, `post` = {$_POST['post']}...
问问自己,你在设置什么?
答案 1 :(得分:1)
您的数据库更新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()
的{{1}}函数的返回值,如果是null
,请使用null
获取mysql错误消息。mysql_real_escape_string()
。这可以逃避所有可能是恶意的部分。答案 2 :(得分:0)
那是因为你没有设置值。在声明中:
$query = "UPDATE tableName SET '$_POST[title]', '$post[post]' WHERE id='$id'";
您应该传递要更新的列名。
答案 3 :(得分:0)
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,我可能不会调用变量和表格列'post'来避免混淆。
答案 4 :(得分:0)
如果您还没有使用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 *语句。我会尽力避免它。它为您的语句添加了一层漏洞,如果您更改表中字段的顺序并且使用$ row [0](编号请求),它可以解决问题,最后如果您的表包含其他字段包含数据与您在此页面上使用的那些无关,然后您正在加载您不需要的信息。
$order = "SELECT id, title, post FROM tableName where id='$id'";
很好地解决了。 :) 祝好运!