【问题标题】:'Edit' function for forum posts and such论坛帖子等的“编辑”功能
【发布时间】:2010-07-27 22:02:07
【问题描述】:

我在网上寻找一个脚本来演示我将如何让我的网站上的用户能够编辑字段等,但我找不到任何关于它的信息。所以我想知道是否有人可以向我解释它是如何工作的,或者只是用脚本来演示?为了清楚起见,我希望用户能够编辑他们提交的内容,只需点击“编辑”并按下按钮即可更新他们所做的更改。

编辑:我忘了提到更改的内容应该更新 MySQL 数据库中的表。

【问题讨论】:

  • 当我编写我的 CMS 时,我这样做是为了让您使用相同的页面来编辑/创建帖子/线程。您只需使用“创建新帖子”编辑器,编辑框包含他们之前放入的内容。提交表单时,您只需更新数据库表的单元格...

标签: php mysql html


【解决方案1】:

您需要 2 个 PHP 文件来执行此操作。您可以使用单个文件,但这种方式更容易解释概念。

  1. 一种将数据库内容加载到字段中的表单,用户可以在这些字段中编辑值,然后在完成后按下按钮提交更改。
  2. 接收更改信息并更新数据库的文件。

这是第一个文件的代码示例:

<?php 
// connect to SQL
$dbcnx = @mysql_connect("localhost", "db_name", "password");
if (!$dbcnx) {
  echo( "<P>Unable to connect to the database server at this time.</P>" );
  exit();
}
// connect to database
$dbcon = @mysql_select_db("db_table", $dbcnx);
if (!$dbcon) {
  echo( "<P>Unable to locate DB table at this time.</P>" );
  exit();
}

#data preparation for the query
$id = intval($_GET["id"]);

# selects title and description fields from database
$sql = "SELECT * FROM table_name WHERE id=$id";
$result = mysql_query($sql) or die(mysql_error());        
# retrieved by using $row['col_name']
$row = mysql_fetch_array($result);

?>

<h3>Edit</h3>
<form action="save_edit.php" enctype="multipart/form-data" method="post" name="myForm" />
  <table>
    <tr>
      <td><b>Title</b></td>
      <td><input type="text" size="70" maxlength="100" name="title" value="<?php echo $row['title'] ?>"></td>
    </tr>
    <tr>
      <td><b>Description</b></td>
      <td><textarea cols="80" rows="18" name="description"><?php echo $row['description']; ?></textarea></td>
    </tr>
  </table>
  <input type="hidden" name="id" value="<?php echo $id; ?>" />
  <input name="enter" type="submit" value="Edit">
</form>

<?php 
mysql_close($dbcnx);
?>

这是第二个文件的代码示例,它接收用户所做的更改并更新数据库。

<?php
// connect to SQL
$dbcnx = @mysql_connect("localhost", "db_name", "password");
if (!$dbcnx) {
  echo( "<P>Unable to connect to the database server at this time.</P>" );
  exit();
}
// connect to database
$dbcon = @mysql_select_db("db_table", $dbcnx);
if (!$dbcon) {
  echo( "<P>Unable to locate DB table at this time.</P>" );
  exit();
}

#data preparation for the query
$id = intval($_POST["id"]);
foreach ($_POST as $key => $value) $_POST[$key] = mysql_real_escape_string($value);

$sql = "UPDATE table_name SET 
        title='$_POST[title]', 
        description='$_POST[description]', 
        WHERE id=$id";

if (!mysql_query($sql,$dbcnx)) {
  die('Error: ' . mysql_error());
}

mysql_close($dbcnx);
header ("location: http://www.domain.com/url_to_go_to_after_update");
?>

【讨论】:

  • 非常感谢!真的很有帮助。会试试这个。接受这个答案。
  • 感谢上校帮助阻止 SQL 注入攻击 - mysql_real_escape_string($value)
  • 并非如此。 mysql_real_escape_string 本身什么也不停止。 与引号结合它可以阻止语法错误。是什么阻止了注射 - 那是 intval 的事情。
  • 我希望我也能删除这些可怕的错误消息“无法定位等等”。肯定有503 http错误和一些借口。仅此而已。而真正的错误应该被触发和记录。
【解决方案2】:

如果您只需要了解如何在 PhP 中创建基本的编辑表单,这很容易。当他们单击编辑按钮时,会将他们带到一个新表单。从数据库中提取内容,使用任何数据库访问 api,然后用它初始化字段。例如,$content 具有该字段的内容:

echo '<textarea name="content">'.htmlspecialchars($content).'</textarea>';

当他们提交表单时,获取当前字段中的内容并使用它来更新表格。它与原始插入脚本相同,只是您使用更新语句而不是插入。

【讨论】:

    【解决方案3】:

    我不确定我是否理解你所说的。如果你想要一种就地编辑东西的方法,你可以使用这个 jQuery 插件:Jeditable(使用 Ajax)。

    【讨论】:

    • 是的,抱歉没提;但我想要它做的是更新 MySQL 表中的更改值。例如,如果有人在页面上编辑一个名为“标题”的字段,然后单击更新按钮,我希望它更新表格中的“标题”字段。
    • "UPDATE Table SET field='value', another_field='another_value' WHERE id=2" - 关于 SQL UPDATE:w3schools.com/sql/sql_update.asp
    • 是的,我知道 UPDATE 命令,但我不明白我如何“检测”已更改的内容以及如何更新它。或者我可以只使用 UPDATE 命令并简单地更新所有内容,即使只更改了一个字段?
    • 你可以像 Daniel Bingham 说的那样做,然后更新数据库中的所有内容。
    【解决方案4】:

    稍微扩展丹尼尔的代码

    <?php
    
    $filename = "file.txt";
    
    if ($_SERVER['REQUEST_METHOD'] == 'POST']) {
      file_put_contents($filename, $_POST['content']);
      header("Location: ".$_SERVER['PHP_SELF']);
      exit;
    }
    $content = htmlspecialchars(file_get_contents($filename));
    ?>
    <form method="POST">
    <textarea name="content"><?php echo $content?></textarea><br>
    <input type="submit">
    </form>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      相关资源
      最近更新 更多