webentwicklung-frage-antwort-db.com.de

is_unique für die Validierung von Codeigniter-Formularen

Ich versuche herauszufinden, wie ich die is_unique-Regel aus der Codeigniter-Formularvalidierungsbibliothek in folgender Situation verwenden kann.

Ich versuche ein Formular zum Bearbeiten von Benutzern einzureichen und habe die Regel:

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

Was ist, wenn andere Werte im Formular geändert werden, dieser Wert jedoch gleich bleibt. Das Formular wird feststellen, dass dieser Wert bereits vorhanden ist. Wie kann ich ihn also vor einer Bearbeitung schützen, wenn dieser Wert nicht geändert wird.

19
Kevin Smith

Anhand Ihres Codes als Beispiel sucht die Validierungsregel is_unique nach einem Feld mit dem Namen user_name in Ihrer users-Datenbanktabelle. Wenn das Feld mit demselben Wert vorhanden ist, wird es als falsch bestätigt.

Um sicherzustellen, dass es nur ausgeführt wird, wenn der Benutzer einen neuen Wert übergibt, können Sie den veröffentlichten Wert $this->input->post('user_name') mit dem Wert vergleichen, den Sie aus der Datenbank abgerufen haben, um das Formular mit Daten zu füllen. Wenn sie gleich sind, validieren Sie nicht 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);
33
Jeemusu

Ich denke, es gibt einen besseren Weg, um es zu umgehen, ich denke immer noch, verwenden Sie CodeIgniters 'Validierungsbibliothek ... Verwenden Sie edit_unique, wo Sie einen zusätzlichen Parameter übergeben, der die ID der Zeile ist, die Sie bearbeiten. Siehe unten .. I Verwenden Sie es und funktioniert ziemlich gut für mich .. hoffe es hilft

$this->form_validation->set_rules('user_name', 'User Name', 'required|trim|xss_clean|edit_unique[users.user_name.'.$id.']');
7
Anthony Mutisya
$something = $this->input->post('something');

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

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

}
1
user6580356

wir müssen den Tabellennamen für is_unique hinzufügen.

für Exp.

 is_unique[users.email]
0
sandeep kumar

Erweitern Sie die Bibliothek Form_validation.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;
                    }


            }
}  

Jetzt in deinem Controller 

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

"@" Ich habe die Zeichenfolge explodiert
Dabei ist ID der Primärschlüssel der Benutzertabelle
und $ id ist der Wert von id . Jetzt können Sie diese is_unique_update-Überprüfung in einem beliebigen Controller verwenden.

0
daulat

Einfacher Weg

Ändern Sie einfach isset in is_object in system/libraries/form_validation.php.

public function is_unique($str, $field)
{
    sscanf($field, '%[^.].%[^.]', $table, $field);
    return is_object($this->CI->db) //default isset
        ? ($this->CI->db->limit(1)->get_where($table, array($field => $str))->num_rows() === 0)
        : FALSE;
}
0
Nirav Rathod

Dieser Code ist hilfreich für die eindeutige Validierung, um Funktionen zu erstellen und zu aktualisieren ...

In der Steuerung

Fügen Sie diesen Formularvalidierungscode sowohl in die Erstellungs- als auch in die Aktualisierungsfunktion ein

$this->form_validation->set_rules('order_no', 'Order no', 'required|callback_check_order_no');

Fügen Sie diese Rückruffunktion in die Steuerung ein

function check_order_no($order_no) {        
        if($this->input->post('id'))
            $id = $this->input->post('id');
        else
            $id = '';
        $result = $this->Data_model->check_unique_order_no($id, $order_no);
        if($result == 0)
            $response = true;
        else {
            $this->form_validation->set_message('check_order_no', 'Order no already exist');
            $response = false;
        }
        return $response;
    }

Im Modell

function check_unique_order_no($id = '', $order_no) {
        $this->db->where('order_no', $order_no);
        $this->db->where('status', "A");

        if($id) {
            $this->db->where_not_in('id', $id);
        }
        return $this->db->get('delivery_order')->num_rows();
    }
0
Mani

Diese Frage ist sehr alt, aber vielleicht haben einige neue Leute dieses Problem und dies ist die Lösung dafür. Ich wette, Sie verwenden Modular Extensions (HMVC) und haben eine neue Bibliothek erstellt, MY_Form_validation. Sie haben eine ID für Rückrufe angegeben, daher haben Sie diese Codezeile in Ihrer Klasse, um Rückrufe zu verwenden:

$this->form_validation->CI =& $this;

Nun, wenn Sie "is_unique" verwenden möchten, müssen Sie diese Codezeile "$ this-> form_validation-> CI = & $ this;" löschen. aus der Klasse. Ich habe dieses Problem erlebt und ich behebe es so, es funktioniert jetzt gut.

Wenn Sie wirklich Callbacks "$ this-> form_validation-> CI = & $ this;" verwenden möchten, dann tun Sie dies nur für erforderliche "Methoden"/"Funktionen", bei denen Sie is_unique nicht verwenden möchten.

0
xttrust

Hier ist eine einfache Methode, die für mich funktioniert hat und gut dokumentierten Code verwendet (Dank an https://github.com/ivantcholakov für die Freigabe!). Ich fand es unter https://github.com/bcit-ci/CodeIgniter/issues/3109#issuecomment-46346280 verwiesen.

  1. Laden Sie https://github.com/ivantcholakov/starter-public-edition-3/blob/master/platform/application/libraries/MY_Form_validation.php herunter (MIT lizenziert) und speichern Sie es unter application\libraries in Ihrer Anwendung\MY_Form_validation.php
  2. Löschen Sie diese beiden Zeilen aus __construct ():

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

  3. Löschen Sie alle Funktionen außer __construct () und unique ().

  4. Fügen Sie am Ende der __construct () -Methode Ihres Controllers folgende Zeile hinzu:

    $ this-> load-> library ('form_validation');

  5. Aktualisieren Sie Ihre Validierungsregel gemäß der Dokumentation der unique () -Methode, um eine "eindeutige" Regel wie diese hinzuzufügen (z. B. wenn Sie bereits Regeln für das Anpassen und Trimmen haben)

    … | Required | unique [Tabellenname.Feldname, Tabellenname. (PrimaryKey-für-Updates verwendet)] | trim ...

0
Elijah Lofgren