Kiểm tra nếu biểu mẫu đã được gửi - PHP


122

Cách tốt nhất để kiểm tra xem một biểu mẫu đã được gửi hay chưa để xác định xem tôi có nên chuyển các biến của biểu mẫu cho lớp xác thực của mình không?

Đầu tiên tôi nghĩ có lẽ:

isset($_POST)

Nhưng điều đó sẽ luôn trở lại đúng như một siêu lớp được định nghĩa ở mọi nơi. Tôi không muốn phải lặp lại qua từng yếu tố trong biểu mẫu của mình với:

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

Trong khi viết câu hỏi này, tôi đã nghĩ đến một giải pháp cơ bản hơn nhiều, hãy thêm một trường ẩn để hoạt động như một lá cờ mà tôi có thể kiểm tra.

Có cách nào 'sạch' hơn để làm điều đó hơn là thêm cờ của riêng tôi không?


4
Chà, bạn có thể tạo một nút gửi có một tên cụ thể, như submitedsau đó sử dụng php if(isset($_POST['submited']))hoặc đầu vào ẩn ...
Max Allan

2
Bạn nên thêm một thông báo để ngăn chặn các cuộc tấn công phát lại trên biểu mẫu của bạn.
hakre

Câu trả lời:


191

Để kiểm tra chung nếu có POSTsử dụng hành động:

if (!empty($_POST))

EDIT : Như đã nêu trong các bình luận, phương pháp này sẽ không hoạt động trong một số trường hợp (ví dụ: với hộp kiểm và nút không có tên). Bạn thực sự nên sử dụng:

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

168

Làm thế nào về

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

69

Trên thực tế, nút gửi đã thực hiện chức năng này.

Hãy thử trong MẪU:

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

Sau đó, trong trình xử lý PHP:

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

6
Đây là câu trả lời chính xác. Đơn giản chỉ cần kiểm tra $ _POST là không đủ vì nó có thể được tạo từ một số nơi khác nhau ... không chỉ từ một bài đăng mẫu. Cảm ơn Tzshand.
Houston

Tốt nhất là bây giờ bạn nên sử dụng if (null !== (filter_input(INPUT_POST, 'macaddress'))){, điều này giúp bạn có thói quen sử dụng bộ
lọc_input

2
POST có thể được thực hiện với Ajax, không có nút gửi nào, vì vậy đây không phải là một giải pháp phổ quát.
Muhammad bin Yusrat

Đúng; nó cũng có thể kiểm tra bất kỳ biến nào được đăng bởi AJAX.
Tzshand

34

Sử dụng

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

1
Giải pháp đơn giản nhất. Tất cả các hình thức nên có một nút gửi!
Anh Trần

1
Nhưng một số hình thức có thể có nhiều nút.
Progrock

2
@rilwis đôi khi các biểu mẫu được gửi bằng JavaScript và không cần / có nút gửi
Waqas Malik


14

Thử cái này

 <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
Phương pháp này được khuyến nghị nhất, vì dường như được "học viện mã hóa" công nhận là "thực tiễn tốt nhất".
Darkeden

1

Ở một lưu ý khác, việc thêm mã thông báo vào biểu mẫu của bạn và luôn xác minh để kiểm tra xem dữ liệu không được gửi từ bên ngoài hay không. Dưới đây là các bước:

  1. Tạo mã thông báo duy nhất (bạn có thể sử dụng hàm băm) Ex:

    $token = hash (string $algo , string $data [, bool $raw_output = FALSE ] );
  2. Chỉ định mã thông báo này cho một biến phiên. Ví dụ:

    $_SESSION['form_token'] = $token;
  3. Thêm một đầu vào ẩn để gửi mã thông báo. Ví dụ:

    input type="hidden" name="token" value="{$token}"
  4. sau đó là một phần của xác thực của bạn, kiểm tra xem mã thông báo đã gửi có khớp với phiên var không.

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

0

Tôi đã có cùng một vấn đề - cũng đảm bảo bạn thêm name=""vào nút đầu vào. Vâng, sửa chữa đó đã làm việc cho tôi.

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

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

-6

Bạn cũng có thể sử dụng:

is_array($_POST)

4
is_array($_POST)luôn luôn cho đúng (trên máy của tôi). Theo 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 somehowvì vậy, điều này dường như được mong đợi rằng điều này luôn luôn trả về đúng ..
GitaarLAB

is_array($_POST)chắc chắn không phải là cách để kiểm tra nếu mẫu đã được gửi.
Lukas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.