1

これはn00bのトピックかもしれませんが、とにかく、私はこのバグでかなり困難で奇妙な時間を過ごしてきました。基本的には、フォームを表示するページのコントローラーメソッドに取り組んでいました。$this->input->post基本的に、私は次のようにcodeigniterの関数を使用してフォーム入力をvarダンプすることにより、フォームの送信データをデバッグしていました。

var_dump($this->input->post('first_name'));

これは1日おきに機能しましたが、今日、投稿変数をブラウザーにダンプすると、フォームを送信したときに値があったとしても、値がないかのようにfalseが返されることがわかりました。次に、次のように、PHPのPOSTスーパーグローバル配列を介して変数に直接アクセスしてみました。

var_dump($_POST['first_name']);

そしてそれも空に戻ったので、私は次のようにpost配列全体をダンプしようとしました:

var_dump($_POST);

フォーム全体に記入したにもかかわらず、空でした。それにもかかわらず、MySQLデータベースのレコードは更新されていました(つまり、$ _ POST変数が空のように見えてもフォームは送信されていました)。

また、通常、リダイレクト関数呼び出しの前にコントローラー関数に変数をvarダンプすると、「ヘッダーは既に送信されました」というエラーが発生するはずですが、発生しなかったと考えました。変数をダンプする代わりに、想定される成功ページにリダイレクトされました。

そのため、約2時間、POSTデータが送信されていないと思い、コードのエラーを再確認し、スクリプトで原因のステートメントが見つかるまで、ステートメントを1つずつコメントアウトし始めました。

最後に、次のように、成功メッセージをリダイレクトするコードのチャンクをコメントアウトしました。

/*
if($record_updated_successfully)
{
    $this->session->set_flashdata('success', $this->lang->line('record-updated-successfully'));
}
redirect('admin/success_page');
*/

その後、スクリプトは、codeigniterの$this->input->post関数と$_POSTスーパーグローバル配列を使用して、以前のすべての変数ダンプのダンプを開始しました。

さて、ヘッダーが送信される前に変数ダンプが出力を送信しているにもかかわらず、スクリプトが実際にリダイレクトする場合は、$_POST変数が空に見える理由がわかります。

では、本当の問題は、ヘッダーが送信される前に出力を送信したにもかかわらず、スクリプトがリダイレクトされるのはなぜですか?誰かがこれを経験したことがありますか?

これに関する助けをいただければ幸いです。

編集:ビューのロードに関して、ここに私のスクリプトの簡略化されたバージョンがデバッグvardumpステートメントのように見えます:

function some_controller_method() {
    var_dump($this->input->post());
    var_dump($_POST);

    // some code

    if($this->input->post('form_action') == 'update record') {
        // code that runs when the form is submitted
        /*
         * ...
         */

        if($record_updated_successfully)
        {
            $this->session->set_flashdata('success', $this->lang->line('record-updated-successfully'));
        }
        redirect('admin/success_page');
    }

    $this->load->view('my-view-file.php');
}
4

2 に答える 2

2

確かではありませんが、ビューファイルにvar_dump()などを出力していると仮定します。ビューは、呼び出した時点では実行されません。次に例を示します。

   $this->load->view('some_view');
   echo "hi!";

コントローラでは、一部のビューのコンテンツの後に「hi」が続くことはありません。結果は「hi」になり、その後にいくつかのビューのコンテンツが続きます。ビューは、コントローラー内の他のすべてが実行された後に実際に出力されます。

これはあなたが提示した情報で頭に浮かぶ唯一のことです。別の診断を提供するには、より多くのコードを確認する必要があります。

于 2011-06-07T00:11:46.333 に答える
-1

「同じ」問題が発生unset()し、コードのループに関数が見つかりました。おそらくこれは役立つでしょう。

于 2012-05-29T13:54:34.040 に答える