0

私は非常に厄介な問題を抱えています。投稿を編集するたびに、最初の編集時にすべての情報が失われます。私はそれを理解することができません、私はそれに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,
         ));
?>

繰り返しますが、唯一の問題は、投稿を初めて編集するときに、その情報が失われることです。その後、その特定の投稿に発生することはありません。

その後、編集は問題なく機能します。

4

1 に答える 1

0

これはあなたの質問に直接答えるものではありません。実際に何を取得している$_GET['id']のか、データベースで実行されている実際の SQL は何か、フォームの生成されたコンテンツがどのように見えるのかを知ることは役に立ちます。

でも:

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

間違っている。クライアントへの出力htmlspecialchars用にデータをエスケープします。SQL の特殊文字をエンコードしても、SQL インジェクション攻撃から保護されません。

$postは (おそらく) 整数であると予想されるため、これで十分です。

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

ただし、有効な整数が返されていることを確認し、そうでない場合は適切なエラーをスローしてください。

edit-new.phpでこれをもう一度行うことを忘れないでtitleくださいdetails

最後に、エスケープとフォームで使用する必要があります。そうしないと、次のようなコンテンツが正しく表示されず、XSS の欠陥に対して脆弱になります (たとえば、htmlspecialchars$details$title</textarea><script>alert("I'm going to do bad things now");</script>

于 2012-05-29T23:24:39.827 に答える