我有一个非常讨厌的问题。每当我编辑帖子时,第一次时间会被编辑,它将丢失所有信息。我无法弄明白,我已经工作了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,
));
?>
再次,我想提一下,唯一的问题是,第一次时间我编辑帖子,它会丢失其信息。在此之后,它永远不会发生在那个特定的帖子上。
之后,编辑工作完美无缺。
答案 0 :(得分:0)
这并没有直接回答你的问题 - 知道你实际获得$_GET['id']
的内容,数据库上运行的实际SQL以及表单生成的内容是什么样的内容会很有用。
然而:
$post = htmlspecialchars($_GET["id"]);
错了。 htmlspecialchars
将输出的数据转义到客户端。为SQL编码特殊字符不会保护您免受SQL注入攻击。
由于预期$post
是一个整数(大概),这就足够了:
$post = (int)$_GET['id'];
但请务必检查是否返回了有效的整数,如果没有则抛出相应的错误。
不要忘记在edit-new.php
中再次执行此操作 - 更好的是,使用与title
和details
相同的参数化值。
最后,您应该使用htmlspecialchars
来逃避表单中的$details
和$title
。否则</textarea>
之类的内容将无法正确显示,您很容易受到XSS漏洞攻击(例如<script>alert("I'm going to do bad things now");</script>