プロが教えるわが家の防犯対策術!

MySQL,PHPについての質問です。

phpmyadmin(テーブル名XXX)を使った
掲示板を作ろうとしているのですが、
リロードの防止ができなくて困っています。
下記の記述途中のコードのどこにどのような関数を置けばいいのかがわかりません。

浅い知識の中で、今まで自分が調べた中では、header('Location:絶対パス',true,303);
を置けばリロード防止できるのではないかと思い、何度も位置を変え記述を変えしているのですが、上手くいきません。

ご回答してくださる方がいれば幸いです。
よろしくお願いします。

index.php

<body> //名前とコメントの投稿フォーム
<form method="POST" action="<?php echo($_SERVER['PHP_SELF']); ?>">
<input type="hidden" name="id">
<input type="text" name="name" placeholder="名前"><br>
<input type="text" name="comment" placeholder="コメント">
<input type="submit" value="投稿">
</form>

<?php

$id = $_POST["id"];
$name = $_POST["name"];
$comment = $_POST["comment"];

try { //SQLに接続
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//データベースに追加
$sql = "INSERT INTO XXX (id, name, comment) VALUES (:id, :name, :comment)";

$stm = $pdo->prepare($sql);

$stm->bindValue(':id', $id, PDO::PARAM_INT);
$stm->bindValue(':name', $name, PDO::PARAM_STR);
$stm->bindValue(':comment', $comment, PDO::PARAM_STR);

if ($stm->execute()){
// データベースから全ての投稿を取り出して、ページに表示
$sql = "SELECT * FROM XXX";
$stm = $pdo->prepare($sql);
$stm->execute();
$result = $stm->fetchAll(PDO::FETCH_ASSOC);

foreach ($result as $row) {
echo ($row['name']);
echo ($row['comment']);

";
}
} else {
echo '追加エラーがありました';
};
} catch (Exception $e) {
echo 'エラーがありました。<br>';
echo $e->getMessage();
}
?>


</body>

A 回答 (1件)

通常2重投稿の対策は3種類



・登録後別のheader()のLocationでページに飛ばす(登録完了ページなど)
・microtimeなどからワンタイムパスを作成しhiddenでおくりDBに投入
 おなじパスが来た場合は二重投稿とみなす
・本文が全く同じ内容は二重投稿とみなす
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!