1

これは私の最初の PhP-MySQL プロジェクトであり、最初の (これまでの) 質問です。小さなポータルを作成しようとしています。現在、オブザーバー パターンを使用する自信がないため、基本を学ぶためにフロント コントローラー パターンを使用しようとしています。

フロント コントローラーは基本的に以下のようになり、正しいクラスの適切なメソッドを呼び出します。

$controller =''; $action =''; $queryString ='';
parseURL($controller, $action, $queryString);
$objView = new View;
if ($controller == 'adminlogin' && $action == 'authenticate') {
    AdminLogin::getInstance()->authenticate();
} else if ($controller && $action) {
    SessionFactory::getSession();
    if (isset($_SESSION['userName'])) { // and some more validations
        callHook($controller, $action, $queryString);
    } else {
        $objView->assign('message', SESSION_INVALID);
        $objView->display('index');
    } 
} else {
    $objView->display('index');
}

ビューもシンプルです。

public function assign ($variable, $value)
{
    $this->passArray[$variable] = $value;
}

public function display ($view)
{
    $mapper = ViewmapSingleton::getinstance();
    if (1 == preg_match("/\/|\.|\\\\/", $view)) {
        echo 'View name should not contain . / or \ ';
    }
    $template = $mapper->getViewPath($view);
    if (!$template || is_dir($template)) {
        echo 'The requested view file does not exist';
    } else {
        extract ($this->passArray);
        include_once($template);
    }
}

私の問題は、$_POST フォームを送信するときのブラウザの [戻る] ボタンです。記事のリストを表示し、ページネーション、一括アクション、「タイトル/カテゴリによる記事の検索」などを許可する管理ページを作成しようとしています.

この (最も役立つ) Web サイトで読んだことから、ブラウザの [戻る] ボタンがフォームを再送信しないようにする 2 つの解決策が存在します。

解決策 1. [検索] ボタンで Javascript を使用して URL に検索パラメーターを追加することにより、検索パラメーターをアクション (メソッド) に渡します。

<input id="btn1" type="submit" onclick="SubmitForm('index.php?   controller=articles&action=showList&articleTitle='+document.getElementById('articleTitle').value)" value="Search" name="btn1"></input>

=> article-category などの多くのパラメーターが存在する可能性があるため、最善の方法ではありません。

解決策 2. パラメータを渡さず、代わりに呼び出されたメソッドで $_POST データを使用します。すべてを $_SESSION に保存してから、header() を使用して同じクラスの別の表示メソッドにリダイレクトします。表示関数で $_SESSION からすべてを抽出し、ビューを生成します。

=>セッションに保存してから抽出する必要がある多くのパラメーターが存在する可能性があるため、最良の方法ではありません。

フロントコントローラーを使用しているときに、ブラウザーの戻るボタンがフォームを再送信するのを防ぐよりエレガントな方法はありますか? フロントコントローラーパターンを使用する場合、特に一部の一括アクションがDBの変更を必要とし、タイプが「非公開」である場合、 $_GET はあまり役に立たない可能性があるためです。

私の無知を無視して助けてください!

ありがとう

4

2 に答える 2

0

これを行う別の方法は、リダイレクトを使用することです。

更新: このソリューションを参照してください。 戻るボタン フォームデータの再送信 ($_POST)

于 2013-10-18T19:37:00.523 に答える
0

SOへようこそ!

まず、GET がどうしても必要な場合を除き、フォームの送信には常に POST を使用してください。(詳細は下記参照)

PHP コードは、送信されたデータを取得するために $_POST のみに依存する必要があります ($_GET はおそらく空であり、$_REQUEST は $_GET と $_POST の両方を結合します)。

アプリケーションがフォーム データを受け取り、おそらくそれを処理したら、ブラウザをリダイレクトします。HTML 応答を送信するのではなく、ブラウザを次のページに誘導する 302 Moved を送信します。

非常に基本的な例:

session_start();                                       // make sure a session is available
if (is_array($_POST) && array_key_exists('submitbutton_name', $_POST)) {
    // user has submitted the form
    $inputdata = $_POST;                               // retrieve input data
    $next_page_html = determine_next_page($inputdata); // process and construct next page
    $_SESSION['page_to_show'] = $next_page_html;       // keep the HTML response

    // redirect the browser to the very same location, but using GET
    header('Location: ' + $_SERVER['REQUEST_URI']);
    exit;
}

// the redirect will end up here
if (array_key_exists('page_to_show', $_SESSION)) {
    // we have a next page to show
    echo $_SESSION['next_page_to_show'];
    // don't forget to remove the session entry
    unset($_SESSION['next_page_to_show']);
}
else {
    // output the starting page, probably the form that the user should submit
}

HTH

于 2013-10-18T19:38:14.033 に答える