2012-12-03 13 views
14

Próbuję dowiedzieć się, jak mogę użyć reguły is_unique z biblioteki sprawdzania poprawności formularza Codeigniter w następującej sytuacji.is_unique do sprawdzania poprawności kodu kodu

Próbuję złożyć formularz Edycja użytkownika i mają zasadę:

$this->form_validation->set_rules('user_name', 'User Name', 'required|trim|xss_clean|is_unique[users.user_name]'); 

Co jeśli inne wartości w formularzu są zmieniane, ale wartość ta pozostaje taka sama. Formularz zobaczy, że ta wartość już istnieje, więc w jaki sposób zabezpieczyć ją przed edycją, jeśli ta wartość nie zostanie zmieniona.

Odpowiedz

28

Stosowanie kodu jako przykładu, reguła sprawdzania zgodności is_unique działa, szukając pola o nazwie user_name w tabeli bazy danych users. Jeśli pole o tej samej wartości istnieje, sprawdza poprawność jako false.

Aby upewnić się, że działa tylko po przesłaniu przez użytkownika nowej wartości, można sprawdzić wystawioną wartość $this->input->post('user_name') na podstawie wartości pobranej z bazy danych, aby wypełnić formularz. Jeśli są takie same, nie sprawdzaj wartości is_unique;

if($this->input->post('user_name') != $original_value) { 
    $is_unique = '|is_unique[users.user_name]' 
} else { 
    $is_unique = '' 
} 

$this->form_validation->set_rules('user_name', 'User Name', 'required|trim|xss_clean'.$is_unique); 
+0

Co zdefiniowałbym oryginalną wartość jako? –

+1

To byłaby oryginalna wartość user_name użytkowników pobrana z bazy danych. Instrukcja if porównuje oryginalną nazwę użytkownika z danymi przesłanymi przez użytkownika. Jeśli użytkownik zmieni swoją nazwę użytkownika, sprawdzi, czy ta wartość jeszcze nie istnieje, w przeciwnym razie wykona zwykłą walidację. – Jeemusu

+0

Więc muszę ustawić inne zapytanie, aby dowiedzieć się, jaka była stara wartość? –

6

Nie ma lepszego sposobu, aby przejść wokół niego, jak sądzę, nadal używa sprawdzania biblioteki CodeIgniters' ... Używaj edit_unique gdzie można zdać dodatkowy parametr, który jest identyfikator wiersza jesteś edycji .. Zobacz poniżej .. używam go i działa całkiem dobrze dla mnie .. nadzieję, że pomoże

$this->form_validation->set_rules('user_name', 'User Name', 'required|trim|xss_clean|edit_unique[users.user_name.'.$id.']'); 
+4

Funkcja edit_unique() dostępna w [tej odpowiedzi] (http://stackoverflow.com/a/15930074/1356425). – Apostle

0

Oto prosty sposób, który pracował dla mnie i używa dobrze udokumentowany kod (dzięki https://github.com/ivantcholakov za dzielenie się nim!). I okazało się, że odniesione na https://github.com/bcit-ci/CodeIgniter/issues/3109#issuecomment-46346280

  1. Pobierz https://github.com/ivantcholakov/starter-public-edition-3/blob/master/platform/application/libraries/MY_Form_validation.php (MIT licencjonowany) i zapisać go do aplikacji w aplikacji \ biblioteki \ MY_Form_validation.php
  2. Usuń te dwie linie z __construct():

    $ this-> CI-> load-> helper ('checkbox'); $ this-> CI-> load-> helper ('email');

  3. Usuń wszystkie funkcje z wyjątkiem __construct() i unique().

  4. Pod koniec metody __construct() w kontrolerze dodać ten wiersz:

    $ this-> Load> Biblioteka ('form_validation');

  5. Zgodnie z dokumentacją unikalnej metody() zaktualizować regułę sprawdzania poprawności, aby dodać „unikalne” regułę tak (np jeśli masz już potrzebne i wykończenia zasad):

    ... | wymagany | wyjątkowa [ . tablename.fieldname, nazwatabeli (primaryKey używane-za-aktualizacjami)] | wykończenia ...

0
function check_unique_user_name($user_name) { 
      $query= $this->db->select('user_name') 
        ->from('emp') 
        ->where('id',$user_name); 

      $query = $this->db->get(); 
      if ($query->num_rows() > 0) { 
      return $query->row()->user_name; 
     } 
for $original_value you have to write function in model after Jeemusu code 
0

Extend biblioteka Form_validation.php utworzyć klasę wewnątrz aplikacji nazwa pliku MY_Form_validation/biblioteki.php

<?php 

class MY_Form_validation extends CI_Form_validation{ 
    protected $ci; 
    public function __construct($config = array()){ 
       parent::__construct($config); 
       $this->ci =& get_instance(); 
     } 

       public function is_unique_update($str, $field){ 
       $explode=explode('@', $field); 
       $field_name=$explode['0']; 
       $field_id_key=$explode['1']; 
       $field_id_value=$explode['2']; 
       sscanf($field_name, '%[^.].%[^.]', $table, $field_name); 

       if(isset($this->ci->db)){ 
         if($this->ci->db->limit(1)->get_where($table, array($field_name => $str,$field_id_key=>$field_id_value))->num_rows() === 0){ 
          $this->ci->form_validation->set_message('is_unique_update', 'The {field} field must contain a unique value.'); 
          return false; 
         } 
         return true; 
        } 


      } 
} 

Teraz w kontrolerze

$this->form_validation->set_rules('user_name', 'User Name', 'required|trim|xss_clean|is_unique_update[[email protected]@'.$id.']'); 

"@" użyłem do wybuchnąć ciąg
gdzie id jest klucz podstawowy tabeli użytkowników
i $ id jest wartością id. Teraz możesz użyć tej walidacji is_unique_update w dowolnym kontrolerze.

1
$something = $this->input->post('something'); 

$this->form->validation->set_rules('something','Something','xss_clean|is_unique['tbl'.users]'); 

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

} 
0

musimy dodać nazwę tabeli dla is_unique

dla Exp.

is_unique[users.email] 
Powiązane problemy