フォームが送信されたかどうかの確認-PHP


122

フォームの変数を検証クラスに渡す必要があるかどうかを判断するためにフォームが送信されたかどうかを確認する最良の方法は何ですか?

まず私は多分思った:

isset($_POST)

しかし、スーパーグローバルはどこでも定義されているため、常にtrueを返します。フォームの各要素を次のように反復する必要はありません。

if(isset($_POST['element1']) || isset($_POST['element2']) || isset(...etc

この質問を書いている間、もっと基本的な解決策を考えましたが、チェックできるフラグとして機能する非表示フィールドを追加します。

独自のフラグを追加するよりも「クリーン」な方法はありますか?


4
まあ、特定の名前が付いた送信ボタンを作成してsubmited、php if(isset($_POST['submited']))または非表示の入力を使用することもできます...
Max Allan

2
フォームへのリプレイ攻撃を防ぐために、通知を追加する必要があります。
2010年

回答:


191

POSTアクションが使用されたかどうかの一般的なチェック:

if (!empty($_POST))

編集:コメントに記載されているように、このメソッドは場合によっては機能しません(たとえば、名前のないチェックボックスとボタンがある場合)。あなたは本当に使うべきです:

if ($_SERVER['REQUEST_METHOD'] == 'POST')


69

実際、送信ボタンは既にこの機能を実行しています。

フォームで試してください:

<form method="post">
<input type="submit" name="treasure" value="go!">
</form>

次に、PHPハンドラーで:

if (isset($_POST['treasure'])){
echo "treasure will be set if the form has been submitted (to TRUE, I believe)";
}

6
これが正解です。$ _POSTをチェックするだけでは十分ではありません。フォームの投稿だけでなく、さまざまな場所から生成されている可能性があるためです。Tzshandに感謝します。
ヒューストン

理想的にif (null !== (filter_input(INPUT_POST, 'macaddress'))){は、filter_inputを使用する習慣を身に付けるために使用する必要があります
depicus

2
POSTは、送信ボタンがないAjaxで実行できるため、これは普遍的なソリューションではありません。
ムハンマドビンユスラット2015

それは本当だ; また、AJAXによって投稿された変数をチェックすることもできます。
Tzshand 2017年

34

使用する

if(isset($_POST['submit'])) // name of your submit button

1
最も簡単な解決策。すべてのフォームに送信ボタンが必要です!
Anh Tran

1
ただし、一部のフォームには複数のボタンがある場合があります。
Progrock

2
@rilwisは、フォームがJavaScriptによって送信され、送信ボタンを必要としない/持たない
Waqas Malik


14

これを試して

 <form action="" method="POST" id="formaddtask">
      Add Task: <input type="text"name="newtaskname" />
      <input type="submit" value="Submit"/>
 </form>

    //Check if the form is submitted
    if($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['newtaskname'])){

    }

2
この方法は、「コーディングアカデミー」から「ベストプラクティス」として認識されているようで、最も推奨されています。
Darkeden

1

別の見方をすると、フォームにトークンを追加して検証し、データが外部から送信されていないかどうかを確認することも常に良い方法です。手順は次のとおりです。

  1. 一意のトークンを生成します(ハッシュを使用できます)例:

    $token = hash (string $algo , string $data [, bool $raw_output = FALSE ] );
  2. このトークンをセッション変数に割り当てます。例:

    $_SESSION['form_token'] = $token;
  3. 非表示の入力を追加して、トークンを送信します。例:

    input type="hidden" name="token" value="{$token}"
  4. 次に、検証の一環として、送信されたトークンがセッション変数と一致するかどうかを確認します。

    Ex: if ( $_POST['token'] === $_SESSION['form_token'] ) ....

0

私は同じ問題を抱えていました-またname=""、入力ボタンを追加してください。まあ、その修正は私のために働いた。

if($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['add'])){
    echo "stuff is happening now";
}

<input type="submit" name="add" value="Submit">

-6

あなたも使うことができます:

is_array($_POST)

4
is_array($_POST)(私のマシンでは)常にtrueを返します。するためによるとstackoverflow.com/questions/5594020/php-check-if-post-is-array$_POST is a superglobal array which is always definedunless somewhere in your code you either unset or overwrite $_POST somehow、、常にtrueを返すことを期待しているように見えるので...
GitaarLAB

is_array($_POST)フォームが送信されたかどうかを確認する方法ではありません。
Lukas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.