J'essaie de comprendre comment utiliser la règle is_unique
à partir de la bibliothèque de validation de formulaire Codeigniter dans la situation suivante.
J'essaie de soumettre un formulaire d'utilisateur de modification et avoir la règle:
$this->form_validation->set_rules('user_name', 'User Name', 'required|trim|xss_clean|is_unique[users.user_name]');
Que se passe-t-il si d'autres valeurs du formulaire sont modifiées mais que cette valeur reste la même? Le formulaire va voir que cette valeur existe déjà, alors comment pourrais-je le protéger contre la modification si cette valeur n'est pas modifiée.
En utilisant votre code comme exemple, la règle de validation is_unique
fonctionne en recherchant un champ appelé user_name
dans votre table de base de données users
. Si le champ avec la même valeur existe, il est validé comme faux.
Pour vous assurer qu'il ne s'exécute que lorsque l'utilisateur soumet une nouvelle valeur, vous pouvez comparer la valeur publiée $this->input->post('user_name')
à la valeur extraite de la base de données pour remplir votre formulaire. S'ils sont identiques, ne validez pas 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);
Je pense qu'il y a une meilleure façon de contourner le problème, toujours en utilisant la bibliothèque de validation de CodeIgniters .... Utilisez edit_unique où vous transmettez un paramètre supplémentaire, qui est l'identifiant de la ligne que vous modifiez. utilisez-le et fonctionne assez bien pour moi .. espérons que cela aide
$this->form_validation->set_rules('user_name', 'User Name', 'required|trim|xss_clean|edit_unique[users.user_name.'.$id.']');
$something = $this->input->post('something');
$this->form->validation->set_rules('something','Something','xss_clean|is_unique['tbl'.users]');
if($this->form_validation->run()== FALSE){
}
il faut obligatoirement ajouter le nom de la table pour is_unique
pour Exp.
is_unique[users.email]
Extension de la classe create class_validation.php à l'intérieur du nom de fichier application/libraries MY_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;
}
}
}
Maintenant dans votre contrôleur
$this->form_validation->set_rules('user_name', 'User Name', 'required|trim|xss_clean|is_unique_update[users.user_name@id@'.$id.']');
"@" J'ai utilisé pour exploser la chaîne
où id est la clé primaire de la table users
et $ id est la valeur de id . Vous pouvez maintenant utiliser cette validation is_unique_update dans n’importe quel contrôleur.
Simple Way
Il suffit de changer isset en is_object dans 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;
}
Cette question est très ancienne, mais peut-être que de nouvelles personnes rencontrent ce problème et qu’il s’agit de la solution. Je parie que vous utilisez Modular Extensions (HMVC) et que vous avez créé une nouvelle bibliothèque, MY_Form_validation. Vous avez utilisé id pour les rappels, vous avez donc cette ligne de code sur votre classe pour pouvoir les utiliser:
$this->form_validation->CI =& $this;
Eh bien, la solution à cela est que chaque fois que vous voulez utiliser "is_unique", vous devez supprimer cette ligne de code "$ this-> form_validation-> CI = & $ this;" de la classe. J'ai rencontré ce problème et je le répare de cette façon, cela fonctionne bien maintenant.
Si vous voulez vraiment utiliser les rappels "$ this-> form_validation-> CI = & $ this;", faites-le uniquement avec les "méthodes"/"fonctions" requises pour lesquelles vous ne voulez pas utiliser is_unique.
Voici une méthode facile qui a fonctionné pour moi et utilise du code bien documenté (merci à https://github.com/ivantcholakov pour le partage!). Je l'ai trouvé référencé à https://github.com/bcit-ci/CodeIgniter/issues/3109#issuecomment-46346280
Supprimez ces deux lignes de __construct ():
$ this-> CI-> load-> helper ('case à cocher'); $ this-> CI-> load-> helper ('email');
Supprimez toutes les fonctions sauf __construct () et unique ().
A la fin de la méthode __construct () de votre contrôleur, ajoutez cette ligne:
$ this-> load-> library ('form_validation');
Conformément à la documentation de la méthode unique (), mettez à jour votre règle de validation pour ajouter une règle "unique" comme celle-ci (par exemple, si vous avez déjà des règles obligatoires et des règles de coupe):
… | Required | unique [nom_table.nom, nom_table. (PrimaryKey-used-for-updates)] | trim ...