Làm cách nào để biết được nút nào đã được nhấp vào trong một lần gửi biểu mẫu PHP?


76

Tôi có một số nút trên trang của mình, nhưng tôi không chắc làm thế nào để biết cái nào đã được nhấp. Đây là đánh dấu cho hai nút của tôi:

<input type="submit" id="btnSubmit" value="Save Changes" />
<input type="submit" id="btnDelete" value="Delete" />

Câu trả lời:


147

Với một dạng HTML như:

<input type="submit" name="btnSubmit" value="Save Changes" />
<input type="submit" name="btnDelete" value="Delete" />

Mã PHP để sử dụng sẽ giống như sau:

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Something posted

    if (isset($_POST['btnDelete'])) {
        // btnDelete
    } else {
        // Assume btnSubmit
    }
}

Bạn nên luôn giả định hoặc mặc định nút gửi đầu tiên xuất hiện dưới dạng mã nguồn HTML . Trên thực tế, các trình duyệt khác nhau gửi tên / giá trị của nút gửi cùng với dữ liệu bài đăng một cách đáng tin cậy khi:

  1. Người dùng thực sự nhấp vào nút gửi bằng chuột hoặc thiết bị trỏ
  2. Hoặc có tiêu điểm trên nút gửi (họ gắn thẻ vào đó), và sau đó Enterphím được nhấn.

Các cách khác để gửi biểu mẫu tồn tại và một số trình duyệt / phiên bản quyết định không gửi tên / giá trị của bất kỳ nút gửi nào trong một số trường hợp này. Ví dụ: nhiều người dùng gửi biểu mẫu bằng cách nhấn Enterphím khi con trỏ / tiêu điểm nằm trên trường văn bản. Biểu mẫu cũng có thể được gửi qua JavaScript, cũng như một số phương pháp khó hiểu hơn.

Điều quan trọng là phải chú ý đến chi tiết này, nếu không, bạn có thể thực sự khiến người dùng của mình thất vọng khi họ gửi biểu mẫu, nhưng "không có gì xảy ra" và dữ liệu của họ bị mất, vì mã của bạn không phát hiện được biểu mẫu gửi, vì bạn không lường trước được sự thật rằng tên / giá trị của nút gửi có thể không được gửi cùng với dữ liệu bài đăng.

Ngoài ra, lời khuyên ở trên cũng nên được sử dụng cho các biểu mẫu có một nút gửi duy nhất vì bạn luôn phải giả định là nút gửi mặc định .

Tôi biết rằng Internet có rất nhiều hướng dẫn về trình xử lý biểu mẫu và hầu hết chúng không làm gì khác hơn là kiểm tra tên và giá trị của nút gửi. Nhưng, họ chỉ sai rõ ràng!


1
Cảm ơn bạn đã biết thêm thông tin về việc giả sử một nút mặc định ... dễ bỏ qua.
kad81

tại sao điều này sử dụng else thay vì else if?
Buts

@Gorg khác nếu gì? Bạn sẽ kiểm tra cái gì, và tại sao?

@goat Sẽ an toàn hơn khi chỉ định rằng btnSubmit chắc chắn đã được nhấp? Người dùng có thể thay đổi giá trị của nút và gửi dữ liệu khác không?
Buts

2
@Gorg nếu bạn đang nói về một người dùng đang cố lừa bạn, bạn không thể làm gì để ngăn chặn điều đó. Đây là một thực tế mà bạn phải chấp nhận với lập trình máy khách / máy chủ - máy khách có thể dễ dàng gửi cho bạn bất kỳ dữ liệu nào mà nó muốn. Việc lưu trữ phía máy chủ của người dùng, (ví dụ: phiên phía máy chủ) là điều phổ biến để lưu trữ dữ liệu mà bạn không muốn người dùng có thể giả mạo.

14

Trong HTML:

<input type="submit" id="btnSubmit" name="btnSubmit" value="Save Changes" />
<input type="submit" id="btnDelete" name="btnDelete" value="Delete" />

Trong PHP:

if (isset($_POST["btnSubmit"])){
  // "Save Changes" clicked
} else if (isset($_POST["btnDelete"])){
  // "Delete" clicked
}

4
Xin lỗi, gotta downvote. Các trình xử lý biểu mẫu hoạt động sai khi sử dụng phím enter để gửi là một thú cưng của tôi.

4
@chris - Không sao đâu, bạn đưa ra một quan điểm hoàn toàn hợp lệ. Đã ủng hộ câu trả lời của bạn.
MiffTheFox

1

Tất cả những gì bạn cần cung cấp thuộc tính tên cho mỗi nút. Và bạn cần giải quyết từng lần nhấn nút từ tập lệnh PHP. Nhưng hãy cẩn thận đặt tên riêng cho mỗi nút. Bởi vì tập lệnh PHP chỉ quan tâm đến tên hầu hết thời gian

<input type="submit" name="Submit_this" id="This" />

-2

Bạn đang hỏi bằng php hoặc javascript.

Nếu nó ở trong php, hãy cung cấp tên của nó và sử dụng phương thức post hoặc get, sau đó bạn có thể sử dụng tùy chọn Isset hoặc tên nút cụ thể đó được kiểm tra thành giá trị đó.

Nếu nó ở dạng js, hãy sử dụng getElementById cho điều đó

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.