【问题标题】:PHP Editing postPHP 编辑帖子
【发布时间】:2012-05-29 22:56:42
【问题描述】:

我遇到了一个非常烦人的问题。每当我编辑一篇文章时,它会在第一次被编辑时丢失所有信息。我弄不明白,我已经研究了2天。

表格代码如下:

<?php 
$post = htmlspecialchars($_GET["id"]);


$name = $_SESSION['Username'];
if (in_array($name, $allowedposters)) {
$results = mysql_query("SELECT * FROM tool WHERE id = $post");
    while($row = mysql_fetch_array($results)){


$title= $row['title'];
$details= $row['details'];
$date= $row['date'];
$author= $row['author'];
$id= $row['id'];



echo "<a href=story.php?id=";
echo $post;
echo ">Cancel edit</a> <br><br><b>";
echo $title;
echo "</b> <br><br>";
echo '
<form action="edit-new.php?story=';
echo $id;
echo '" method="post" enctype="multipart/form-data">
<textarea rows="1" cols="60" name="title" wrap="physical" maxlength="100">';
echo $title;
echo '</textarea><br>';
?>



<textarea rows="30" cols="60" name="details" wrap="physical" maxlength="10000">
<?php 
echo $details;
echo '</textarea><br>';

echo '<label for="file">Upload featured image:</label><br>
      <input type="file" name="file" id="file" />';
echo'<br><input type="submit" />';
}

} else {
  echo "Not enough permissions.";
}
?>

。 .

这是实际的php代码,将信息插入数据库:

。 .

<?php
   $post = $_GET['story'];
   $title = $_POST['title'];
   $details = $_POST['details'];
         echo 'Updated.';
    $dbtype     = "mysql";
    $dbhost     = "localhost";
    $dbname     = "x";
    $dbuser     = "xx";
    $dbpass     = "xxx";
    $conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);
    $sql = "UPDATE  tool SET title=:title, details=:details WHERE id = '$post'";
        $q = $conn->prepare($sql);
        $q->execute(array(
        ':details'=>$details,
        ':title'=>$title,
         ));
?>

再次,我想提一下,唯一的问题是,我第一次编辑帖子时,它会丢失信息。在那之后,它永远不会发生在那个特定的帖子上。

在那之后,编辑工作完美无缺。

【问题讨论】:

  • 我把向数据库中插入信息的实际方法重写了2次。
  • 您有超过 1 个错误,您的整个代码都是错误的。启用error_reporting(E_ALL);
  • @LawrenceCherone 我这样做时没有收到任何错误。
  • 表单所在页面的名称是什么?
  • edit.php 是表单所在的位置。 edit-new.php 是它带你到数据库中插入信息的地方

标签: php mysql sql pdo


【解决方案1】:

这并不能直接回答您的问题 - 了解您对 $_GET['id'] 的实际获取、您的数据库上运行的实际 SQL 以及生成的表单内容是什么样子会很有用。

但是:

$post = htmlspecialchars($_GET["id"]);

错了。 htmlspecialchars输出 的数据转义到客户端。为 SQL 编码特殊字符并不能保护您免受 SQL 注入攻击。

由于$post 应该是一个整数(大概),这就足够了:

$post = (int)$_GET['id'];

但一定要检查是否返回了一个有效的整数,如果不是,则抛出适当的错误。

不要忘记在 edit-new.php 中再次执行此操作 - 更好的是,使用您对 titledetails 所做的参数化值。

最后,您应该使用htmlspecialchars 转义表​​单中的$details$title。否则 &lt;/textarea&gt; 之类的内容将无法正确显示,并且您容易受到 XSS 漏洞的攻击(例如,后跟 &lt;script&gt;alert("I'm going to do bad things now");&lt;/script&gt;

【讨论】:

  • $_GET['id'] 正在获取帖子 ID。示例:edit.php?id=137
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
  • 2016-12-15
  • 2015-06-16
相关资源
最近更新 更多