【问题标题】:PHP update table by formPHP 按表格更新表格
【发布时间】:2012-06-25 06:39:01
【问题描述】:

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

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

【问题讨论】:

  • 使用 phpMyAdmin 等数据库 UI 对查询进行故障排除。
  • 请注意,社区正朝着使用 PDO 的方向发展:php.net/manual/en/book.pdo.php 使用它不仅容易,而且可以让您免受 sql 注入攻击!
  • 你看到了什么错误信息?
  • 不要编辑您的问题以使现有答案无效。

标签: php forms html-table


【解决方案1】:

应该是

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

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

【讨论】:

  • 我还认为您还需要用 {} 将 $_POST 括起来,否则我认为字符串的格式不正确。
【解决方案2】:

您的数据库更新 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_error()获取mysql错误消息。
  • 对传递的值进行转义。 目前您将发布的数据直接传递到非常不安全的 mysql 查询中。 (例如SQL-Injection on wikipedia)在将它们插入查询之前,您应该在所有表单数据上使用mysql_real_escape_string()。这会避开所有可能是恶意的部分。

【讨论】:

    【解决方案3】:
    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”以避免混淆。

    【讨论】:

    • 非常感谢,我还必须使用 if (isset($_POST[id])){ $id = mysql_real_escape_string(trim($_POST['id'] )); }else{ $id = NULL; }
    【解决方案4】:

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

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

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

    【讨论】:

    • $query="更新 tableName (title, post) WHERE id='$id'" VALUES ('$_POST[title]','$_POST[post]')";
    • @hobbywebsite 记得使用mysql_real_escape_string()
    【解决方案5】:

    如果您还没有使用 PDO 语句来防止 SQL 注入攻击,那么您应该使用更多的保护,而不是只使用 mysql_real_escape_string()。除了转义数据之外,您还应该验证提交的数据实际上是您所期望的。

    即。在您的代码中:

      $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'";
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-05
      • 2021-02-15
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多