サポート » 使い方全般 » 外部投稿でりロード時の二重投稿を防ぐために

  • よろしくお願いいたします。

    管理画面以外の外部から投稿できるようにしています。
    index.phpから投稿し、そのままindex.phpに戻ります。

    一度投稿した後にりロードすると2重投稿されてしまうので、防止のためにフォーム部分に、

    <?php $_SESSION['lc'] = uniqid(); ?>
    <input type= "hidden" name="lc" value="<?php echo htmlspecialchars($_SESSION['lc'], ENT_QUOTES); ?>">

    とし、後はif文で、$_POST[‘lc’] と $_SESSION[‘lc’]が同じ時だけ投稿ができるようにしています。

    しかしこれがうまくいきません。
    どうも調べてみると、$_POST[‘lc’] と $_SESSION[‘lc’]が通常でも違っているようです。
    1日あれこれ苦戦しましたが、どうにもわかりません。

    どなたか分かる方教えてください。
    よろしくお願いいたします。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック投稿者 bigi879

    (@bigi879)

    昨日よりあれこれ苦戦していますが自力では解決ができない状況です。どなたかご教授下さい。

    ・・・・・・・・・・・・・・・・・・・

    参考サイト
    http://ixi-ioi.info/

    こちらのサイトは外部から投稿を許可しています。
    一度投稿した後にリロードしても再投稿されることはありません。

    このような形にしたいのですが、どうすればよいでしょうか?
    よろしくお願いいたします。

    header関数で飛ばしてしまってはどうでしょう。
    以下コード例。

    [index.php]

    <?php
    session_start();
    if($_POST['title'] && $_POST['message'] && $_SESSION['lc'] === $_POST['lc']){
      /*
        パラメータを検証して問題なければwp_insert_post等で登録処理を行う。
        ...
        登録処理が完了。
      */
      unset($_SESSION['lc']);
      header("Location: index.php?state=ok");
    }
    ?>
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8" />
      <title>二重送信防止</title>
    </head>
    <body>
      <?php if($_GET['state'] === 'ok'): ?><p>登録しました。</p><?php endif; ?>
      <form action="index.php" method="post">
        <p><label for="title">タイトル:</label><br /><input type="text" name="title" value="" /></p>
        <p><label for="message">メッセージ:</label><br /><textarea name="message"></textarea></p>
        <?php $_SESSION['lc'] = uniqid(); ?>
        <input type= "hidden" name="lc" value="<?php echo htmlspecialchars($_SESSION['lc'], ENT_QUOTES); ?>">
        <input type="submit" value="送信" />
      </form>
    </body>
    </html>

    便宜上、PHPのheader関数で飛ばしていますが、WordPressにはwp_redirectというリダイレクト用の関数があるため、余裕がある場合はwp_redirect関数の使い方を調べて(すげー簡単ですが)使ってみてはどうかと思います。
    また、上記のコード例だと若干意味合いの異なる使い方をしていますが、lcパラメータに相当するトークンの生成にも、WordPressが提供するwp_nonce_fieldというCSRF対策用のトークン生成関数が用意されているので、こちらも余裕があったら使って下さい。

    参考サイトのようにしたいのであれば、
    PHPの修正ではなくjavascriptで非同期通信を行うのが良いかと思います。

    Google検索「ajax 投稿」

    トピック投稿者 bigi879

    (@bigi879)

    c2nprdsさん

    すいません、回答いただいていたの気が付きませんでした。

    >PHPの修正ではなくjavascriptで非同期通信を行うのが良いかと思います。

    そうなのですね。
    また勉強してみます。
    どうもありがとうございました。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「外部投稿でりロード時の二重投稿を防ぐために」には新たに返信することはできません。