2010-04-18 32 views
8

Hiện tại, khi tôi thiết kế biểu mẫu của mình, tôi muốn giữ tên của nút gửi bằng với id của biểu mẫu. Sau đó, trong php của tôi, tôi chỉ làm if(isset($_POST['submitName'])) để kiểm tra xem biểu mẫu đã được gửi chưa và biểu mẫu nào đã được gửi.Cách tốt nhất để xác định biểu mẫu nào đã được gửi?

Thứ nhất, có bất kỳ vấn đề bảo mật hoặc lỗi thiết kế nào với phương pháp này không?

Một vấn đề tôi gặp phải là khi tôi muốn chồng lên biểu mẫu của mình bằng javascript để cung cấp xác thực nhanh hơn cho người dùng. Ví dụ, trong khi tôi rõ ràng cần phải giữ lại xác nhận phía máy chủ, nó là thuận tiện hơn cho người dùng nếu một thông báo lỗi được hiển thị nội tuyến, khi làm mờ đầu vào. Ngoài ra, nó sẽ là tốt để cung cấp toàn bộ xác nhận biểu mẫu, sau khi nhấp vào nút gửi.

Do đó, khi người dùng nhấp vào nút gửi của biểu mẫu, tôi sẽ dừng hành động mặc định, thực hiện xác thực của mình và sau đó thử đổi chức năng gửi truyền thống, nếu xác thực vượt qua. Để làm điều này, tôi đang sử dụng phương pháp form.submit() nhưng, thật không may, điều này không gửi biến nút gửi (vì nó phải là form.submit() có thể được gọi mà không cần bất kỳ nút nào được bấm). Điều này có nghĩa là tập lệnh PHP của tôi không phát hiện được rằng biểu mẫu đã được gửi.

Cách chính xác để giải quyết vấn đề này là gì? Có vẻ như giải pháp chuẩn là thêm một trường ẩn vào biểu mẫu, khi đi qua xác thực, có tên của id của biểu mẫu. Sau đó, khi form.submit() được gọi, điều này được truyền theo vị trí của nút gửi. Tuy nhiên, giải pháp này có vẻ rất không đúng với tôi và vì vậy tôi tự hỏi liệu tôi có nên:

a) Sử dụng phương pháp thay thế để phát hiện biểu mẫu nào đã được gửi mà không phụ thuộc vào việc gửi nút gửi. Nếu có gì thay thế? Rõ ràng, chỉ cần có thêm một lĩnh vực ẩn từ đầu là không tốt hơn.

b) Sử dụng giải pháp Javascript thay thế cho phép tôi giữ lại thiết kế không phải Javascript của mình. Ví dụ, có một thay thế cho form.submit() cho phép tôi chuyển vào dữ liệu bổ sung?

c) Nhét nó lên và chỉ cần chèn một trường ẩn bằng Javascript.

CẬP NHẬT: Tôi đã chấp nhận câu trả lời đúng nhưng tôi chỉ muốn làm rõ lỗi của mình ở đây để nó hữu ích hơn cho người khác. Tôi sử dụng Mootools và tôi rất ngây thơ tin rằng khi tôi sử dụng addEvent ('submit' ...), tôi cần gọi ngay event.stop() để ngăn chặn việc gửi đi. Trên thực tế đây không phải là trường hợp và tôi chỉ có thể gọi event.stop() chỉ khi xác thực không thành công. Nếu không, trình gửi mặc định sẽ được kích hoạt, như thường lệ và việc sử dụng form.submit() trở nên hoàn toàn không cần thiết.

+0

Nhóm của tôi hiện thực hiện theo cách này. Tôi không thích nó vì các hình thức của chúng tôi bây giờ được yêu cầu phải có một nút gửi. Những kẻ thực hiện điều này đã chuyển sang một đội khác; tôi và một đồng đội khác đã có một thời gian khó khăn để tìm ra lý do tại sao các biểu mẫu của chúng tôi không gửi, sau đó chúng tôi nhận ra nó cần một nút gửi để xác nhận. – b01

Trả lời

6

Bạn có thể gửi biểu mẫu cho những người xử lý khác nhau với action=file1.phpaction=file2.php.

Chúng có được xử lý bằng cách sử dụng cùng một mã không? Đặt nó vào các tệp riêng biệt, bao gồm các tính phổ biến và ghi các bit duy nhất trong mỗi tệp xử lý. Đừng hack, tổ chức.

Đối với xác nhận JavaScript, đừng ngăn chặn hành động mặc định sau đó tiếp tục, thay vì làm điều này:

if (validation != valid) { 
    return false; 
} 

Bằng cách đó nếu JS bị tắt hoặc xác nhận thất bại, hình thức hành động/sự kiện là nguyên vẹn và nó cư xử như mong đợi, nếu không nó sẽ sôi nổi. Và chắc chắn, chắc chắn giữ lại xác thực phía máy chủ. Đó là xác thực "thực", phía máy khách chỉ để làm hài lòng người dùng và tiết kiệm thời gian cho họ.Không bao giờ dựa vào nó vì lợi ích của bạn.

+0

Tôi đã bình chọn điều này vì cuối cùng, đó là câu trả lời "đúng" và thậm chí đôi khi bạn không sử dụng nó vì bạn chỉ đang hack một kịch bản nhanh hoặc dưới một số hạn chế/thời hạn không cho phép bạn, thật tốt khi biết thực hành tốt. –

+0

Cảm ơn bạn! Cảm ơn bạn! Đây là hoàn hảo. Sai lầm của tôi đã nghĩ rằng để thực thi bất kỳ trình duyệt Javascript nào, tôi phải dừng ngay hành động gửi mặc định. Thay vào đó, tôi chỉ có thể làm bất cứ điều gì tôi muốn onsubmit và hình thức chỉ được gửi sau khi tất cả các mã đó. Vì vậy, tôi có thể kiểm tra xác thực không thành công và, trong trường hợp đó, ngăn chặn mặc định. Điều này có nghĩa là tôi không cần form.submit(). Rất đẹp! –

+0

Tuyệt vời, vui vì nó hữu ích! Cho đến khi bạn thấy nó được thực hiện, đôi khi thật khó để nghĩ về cách "khác". –

3

Bạn có thể tùy chỉnh hành động của biểu mẫu để thêm khóa/giá trị nhận được; chẳng hạn như action="formhandle.php?formid=10"

+0

Alex Mcp có công thức tốt nhất. Nhưng tôi đồng ý đây là một cách nhanh chóng để chăm sóc mọi thứ. Khi tôi có tình huống này, tôi đã thử sử dụng GET như thế này; cuối cùng, tôi quyết định sẽ sạch hơn để giữ mọi thứ cho POST. – Smandoli

+0

Thật thú vị, tôi chỉ xem xét các khái niệm RESTful và đã học được rằng về nguyên tắc, GET là để 'xem xét' thông tin và POST là cho công việc tương tác hoặc 'chỉnh sửa'. Tôi không biết có bao nhiêu người đăng ký hoặc tuân theo nó. (Xin lỗi, không thể liên kết nguồn này vào lúc này.) – Smandoli

+0

Tôi thích điều này tốt hơn, bởi vì với giải pháp Alex Mcp, bạn vẫn thay đổi hành động, nhưng di chuyển mã của bạn xung quanh. Tại sao không chỉ giữ mã giống nhau và chỉ thay đổi hành động. +1 nếu GET là để xem xét. Cộng với điều này là đơn giản hơn và thẳng về phía trước. – b01

Các vấn đề liên quan