Formun gönderilip gönderilmediğini kontrol etme - PHP


122

Form değişkenlerini doğrulama sınıfıma aktarmam gerekip gerekmediğini belirlemek için bir formun gönderilip gönderilmediğini kontrol etmenin en iyi yolu nedir?

İlk önce belki düşündüm:

isset($_POST)

Ancak, her yerde bir süper küresel tanımlandığı için bu her zaman doğru olacaktır. Formumun her bir öğesini aşağıdakilerle yinelemek istemiyorum:

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

Bu soruyu yazarken çok daha basit bir çözüm düşündüm, kontrol edebileceğim bir bayrak görevi görecek gizli bir alan ekleyin.

Bunu yapmanın kendi bayrağımı eklemekten daha temiz bir yolu var mı?


4
Belirli bir adı olan bir gönderme düğmesi yapabilir submitedve sonra php'yi if(isset($_POST['submited']))veya gizli bir girişi kullanabilirsiniz ...
Max Allan

2
Formunuza yeniden oynatma saldırılarını önlemek için bir isim eklemelisiniz.
hakre

Yanıtlar:


191

Genel kontrol için bir POSTeylem olup olmadığını kontrol etmek için:

if (!empty($_POST))

DÜZENLEME : Yorumlarda belirtildiği gibi, bu yöntem bazı durumlarda işe yaramayacaktır (örneğin, onay kutuları ve isimsiz düğme ile). Gerçekten kullanmalısınız:

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

168

Ne dersin

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

69

Aslında, gönder düğmesi bu işlevi zaten gerçekleştiriyor.

FORM'u deneyin:

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

Ardından PHP işleyicisinde:

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

6
Bu doğru cevap. $ _POST'u kontrol etmek yeterli değildir çünkü bir dizi farklı yerden oluşturulmuş olabilir ... sadece bir form gönderisinden değil. Teşekkürler Tzshand.
Houston

İdeal olarak şimdi if (null !== (filter_input(INPUT_POST, 'macaddress'))){
filtre_input

2
POST, herhangi bir gönderme düğmesi olmayan Ajax ile yapılabilir, bu nedenle bu evrensel bir çözüm değildir.
Muhammed bin Yusrat

Bu doğru; AJAX tarafından gönderilen herhangi bir değişkeni de kontrol edebilir.
Tzshand

34

kullanım

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

1
En basit çözüm. Tüm formlarda bir gönder düğmesi bulunmalıdır!
Anh Tran

1
Ancak bazı formların birden çok düğmesi olabilir.
Progrock

2
@rilwis bazen formlar JavaScript tarafından gönderilir ve gönder düğmesine ihtiyaç duymaz / gerekmez
Waqas Malik


14

Bunu dene

 <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
Bu yöntem, "kodlama akademisi" tarafından "en iyi uygulama" olarak kabul edildiği için en çok tavsiye edilen yöntemdir.
Darkeden

1

Farklı bir notta, formunuza bir jeton eklemek ve verilerin dışarıdan gönderilip gönderilmediğini kontrol etmek için bunu doğrulamak da her zaman iyi bir uygulamadır. İşte adımlar:

  1. Benzersiz bir belirteç oluşturun (karma kullanabilirsiniz) Örn:

    $token = hash (string $algo , string $data [, bool $raw_output = FALSE ] );
  2. Bu belirteci bir oturum değişkenine atayın. Ör:

    $_SESSION['form_token'] = $token;
  3. Jetonu göndermek için gizli bir giriş ekleyin. Ör:

    input type="hidden" name="token" value="{$token}"
  4. daha sonra doğrulamanızın bir parçası olarak, gönderilen jetonun oturum varlığıyla eşleşip eşleşmediğini kontrol edin.

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

0

Aynı sorunu yaşadım - ayrıca name=""giriş düğmesini eklediğinizden emin olun . Bu düzeltme benim için çalıştı.

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

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

-6

Ayrıca şunları da kullanabilirsiniz:

is_array($_POST)

4
is_array($_POST)her zaman doğru verir (benim makinemde). Göre stackoverflow.com/questions/5594020/php-check-if-post-is-array : $_POST is a superglobal array which is always defined, unless somewhere in your code you either unset or overwrite $_POST somehow, .. bu her zaman doğru döndüren beklenen görünüyor böylece
GitaarLAB

is_array($_POST)kesinlikle formun gönderilip gönderilmediğini kontrol etmenin yolu değildir.
Lukas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.