2012-05-09 24 views
7

Tôi có một biểu mẫu hoạt động hoàn hảo cho đến khi tôi chuyển biểu mẫu thành method="get". Bây giờ tôi không thể nhận được form_validation->run() để đánh giá TRUE.Làm cách nào để xác thực trường biểu mẫu trong Codeigniter khi sử dụng Nhận thông số?

Đây là cách tôi mở biểu mẫu:

echo form_open('', array('method' => 'get')); 

Đây là mảnh duy nhất cần để xác nhận:

$this->form_validation->set_rules('states', 'states', 'required'); 

Đây là cách tôi kiểm tra để xem nếu các hình thức được xác nhận:

if($this->form_validation->run() == FALSE) 

Có điều gì khác tôi cần làm để sử dụng Nhận thông số không? Tôi đã nhận được các thông số được bật trong cấu hình ($config['allow_get_array'] = TRUE;). Các hình thức hoạt động ok nếu tôi bỏ qua xác nhận, vì vậy tôi biết hệ thống CI đang đọc url tốt.

Trả lời

5

Bài đăng này trên Diễn đàn Codeigniter gợi ý rằng form validation does not work with Get Parameters và đó chỉ là cách Codeigniter.

+0

Chỉ cần bước vào và làm xác nhận của riêng bạn trên các yêu cầu GET. XSS có thể được quan tâm ở mức thấp nhất với htmlspecialchars (GET, ENT_QUOTES, 'encoding') tùy thuộc vào dữ liệu được xuất ra. Xác nhận biểu mẫu chỉ là trợ giúp. Làm việc ra cấu trúc ứng dụng của bạn trước khi bàn tay, xem những gì CI có thể cung cấp liên quan đến người giúp việc/thư viện và sau đó khuôn công việc của riêng bạn. – Philip

+0

FYI ... Xác thực biểu mẫu Codeigniter sẽ thất bại nếu có tham số GET trong URI của trang đang chạy xác thực biểu mẫu trên các tham số POST. –

1

Như bạn có thể nhìn thấy trên các tập tin Form_validation.php, họ đã hardcoded $ _POST ở khắp mọi nơi trong lớp ;-(

Nếu bạn muốn hỗ trợ $ _GET là tốt, nó khá dễ dàng (và Oooo bẩn), bạn có thể tạo một tài sản mới:

public function __construct($rules = array()) 
{ 
    $this->inputData = array_merge($_POST, $_GET); 
    ... 
} 

Và thay thế $ _POST bởi $ this-> inputData ở khắp mọi nơi trong lớp học này vì không có phương pháp tĩnh

tôi biết nó không recommenced để chỉnh sửa file nhà cung cấp, nhưng. thực sự, bạn cần nó, làm điều đó ;-)

3

Chỉ cần thêm:

$_POST['states'] = $this->input->get('states'); 

cho lĩnh vực bang validate trong hình thức xác nhận ngay trước

$this->form_validation->set_rules('states', 'states', 'required|trim'); 
+0

Đó là một giải pháp tuyệt vời! –

9

Đối với CodeIgniter 3, bạn có thể vượt qua các mảng GET vào set_data chức năng. Ví dụ:
$this->form_validation->set_data($this->input->get());

+0

Tôi không nghĩ rằng đó là sự thật, tôi đã sử dụng bản thân mình. Ngoài ra, họ đã cập nhật tài liệu của họ ngay bây giờ: https://www.codeigniter.com/userguide3/libraries/form_validation.html –

+0

cảm ơn nó đã làm việc cho tôi. http://www.codeigniter.com/userguide3/libraries/form_validation.html#validating-an-array-other-than-post –

0

Đã cố gắng thực hiện chính xác điều gì đó tương tự nhưng nó sẽ chuyển thành cấu trúc mã của bạn.

  1. Gửi biểu mẫu của bạn bằng phương thức đăng thông thường. Điều này sẽ cho phép bạn thực hiện tất cả các xác nhận bài đăng.
  2. Sau đó, sử dụng chuyển hướng() để gửi tất cả dữ liệu của bạn đến một phương pháp khác trong hoặc ngoài bộ điều khiển của bạn bằng cách sử dụng '/'.
  3. Cuối cùng, phương thức nhận tất cả các tham số sẽ xử lý các giao dịch cơ sở dữ liệu và trình bày nó cho khung nhìn.

Hy vọng điều đó sẽ hữu ích.

2

Trình ký hiệu đã thay đổi kể từ một số bài đăng này. Tôi nghĩ câu trả lời của gX là chính xác.

Hướng dẫn trong sách hướng dẫn sử dụng, cụ thể là phần Validating an Array (other than $POST), đã làm việc tuyệt vời cho tôi (tính đến hôm nay) và nó rất đơn giản.

Trước khi bạn $ this-> form_validation-> set_rules dòng, bạn chỉ định mảng để được xác nhận:

$data = array(
    'username' => 'johndoe', 
    'password' => 'mypassword', 
    'passconf' => 'mypassword'); 

$this->form_validation->set_data($data); 
Các vấn đề liên quan