2

我正在尝试从表单更新表格。

我有 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);
4

5 回答 5

2

它应该是

UPDATE tableName SET `title` = {$_POST['title']}, `post` = {$_POST['post']}...

问问自己,你在设置什么?

于 2012-06-22T22:48:44.543 回答
1

您更新数据库的 SQL 语句错误。它不仅应包括新值列表,还应包括相应的字段名称。这意味着它应该看起来更像这样:

$query = "UPDATE tableName SET `title` = {$_POST['title']}, `post` = {$_POST['post']} WHERE id = '$id'";

$_POST请注意,您还应该用大括号 ( ) 包含字符串内部的字段,{}或者将它们放在引号之外。(如" = " .$_POST['title']. ", ")。如果您使用标准方式访问带有他引号的那些(例如 not $_POST[title]but$_POST['title']$_POST["title"]),这是绝对必要的。

此外,您应该将以下内容添加到您的代码中:

  • 一些错误处理,目前你甚至不知道是否出了问题。最简单的方法是检查mysql_query()函数的返回值,null如果是null,则获取 mysql 错误消息mysql_error()
  • 转义传递的值。目前,您将发布的数据直接传递到非常不安全的 mysql 查询中。(例如参见wikipedia 上的SQL-Injection )在将它们插入查询之前,您应该在所有表单数据上使用它们。这会逃避所有可能是恶意的部分。mysql_real_escape_string()
于 2012-06-22T22:53:56.167 回答
0

那是因为您没有设置值。在声明中:

$query = "UPDATE tableName SET '$_POST[title]', '$post[post]' WHERE id='$id'";

您应该传递要更新的列名。

于 2012-06-22T22:49:34.907 回答
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”以避免混淆。

于 2012-06-22T22:54:34.637 回答
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'";

会很好地解决这个问题。:) 祝你好运!

于 2012-06-23T01:13:27.530 回答