所以我有这个问题。我正在进行服务器端验证和jquery验证。
在服务器端验证中,我所做的是使用codeigniter的form_validation库,更具体地说:
$this->form_validation->set_rules('documentn', 'Passport number', 'required|min_length[7]|max_length[20]|is_natural|callback_checkDocAndUser');
需要返回true或返回false。
我有这个用户编辑表单,用于更改用户数据。但是存在一些限制......存储在数据库中的用户具有唯一的护照号码。如果错误,我需要能够更改这个护照号码......但不应该在数据库上重复护照号码。
这是从callback_checkDocAndUser调用的php函数:
public function checkDocAndUser(){
if ((isset($_POST['documentn'])) && (isset($_POST['id']))) {
$dn = UserManager::getInstance()->checkUserDocument($_POST['documentn'],$_POST['id']);
if ($dn) {
//passport belongs to the user
echo "true";
// return true;
}else{
//does the passport entered belong to another user?
$exists = UserManager::getInstance()->getByDocument($_POST['documentn']);
if (!$exists) {
//passport belongs to another user
echo "true";
// return true;
}else{
//passport number is free to use
echo "false";
// return false;
}
}
}
}
正如你所看到的,我把一些" echo"在功能上。这是因为我想使用相同的函数进行jQuery验证(需要echo,不能使用" return")。
documentn: {
required: true,
minlength: 7,
maxlength: 20,
remote: {
url: '/admin/checkDocAndUser',
type: 'POST',
data: {
id: function(){
return $('#id').val();
}
}
}
},
那么如何才能对两种验证使用相同的功能......?有没有办法让jquery函数接收return..or codeigniter函数来接收回声?
答案 0 :(得分:0)
我在CodeIgniter项目中做同样的事情,解决方案非常简单。以下答案通常命名为您只需要添加验证逻辑的地方。
此答案遵循the DRY principle,其中不重复验证代码,以及CodeIgniter结构。
MODEL 对 CodeIgniter(服务器端)验证和jQuery验证(客户端)remote
进行实际验证...
// file name 'models/demo_model.php'
class Demo_model extends CI_Model {
public function check_demo($params)
{
// insert your validation logic here...
// the entirety of your validation logic, check the DB, etc.
// if it passes validation
return TRUE;
// if it fails validation
return FALSE;
}
}
此 CONTROLLER 仅 客户端 remote
为jQuery验证调用
// file name 'controllers/demo.php'
class Demo extends CI_Controller {
public function remote_demo($params = FALSE)
{
// call the Model to do the actual validation
$valid = $this->demo_model->check_demo($params);
if ($valid)
{
echo 'true'; // passes validation
}
else
{
echo 'false'; // fails validation
}
}
}
这个 LIBRARY 仅用于CodeIgniter的服务器端验证......
// file name 'libraries/MY_Form_validation.php'
class MY_Form_validation extends CI_Form_validation {
public function __construct()
{
parent::__construct();
$this->ci =& get_instance();
}
public function demo_check($params)
{
$this->ci->form_validation->set_message('demo_check', 'The %s is incorrect.');
// call the Model to do the actual validation
return $this->ci->demo_model->check_demo($params);
}
}
它的组织方式,您将拥有一个位于中心的验证功能,与您的CodeIgniter模型一起使用。我选择模型作为中心位置,因为代码主要与数据库交互。
以下使用相同的模型函数进行两种验证。
服务器端CodeIgniter验证:从MY_Form_validation
调用模型,模型将return
TRUE
或FALSE
返回您的其他CodeIgniter控制器根据您的CodeIgniter验证规则。
客户端jQuery验证remote
:从Controller调用模型,模型将return
TRUE
或FALSE
回到控制器。然后,Controller函数将基于模型中的布尔响应echo
true
或false
。
答案 1 :(得分:-1)
Put an exit at the end of your function.
EDIT:
If you want to use the same set of validations for both client and server side validation, divide your call to two functions, one which handles client and the another which handles server. check the following code:
In you jquery function call url - admin/validate_form_client
function validate_form_client(){
$op = $this->checkDocAndUser($_POST['documentn'],$_POST['id']);
echo $op;
exit;
}
function validate_form_server(){
if ((isset($_POST['documentn'])) && (isset($_POST['id']))) {
return $this->checkDocAndUser($_POST['documentn'],$_POST['id']);
}
}
public function checkDocAndUser($documentn,$id){
$dn = UserManager::getInstance()->checkUserDocument($documentn,$id);
if ($dn) {
//id belongs to the user
return true;
}else{
//does the id entered belong to another user?
$exists = UserManager::getInstance()->getByDocument($documentn);
if (!$exists) {
// id number belongs to another user
return "true";
}else{
//id number is free to use
return "false";
}
}
}
}
Note: the given function names are just for example. please follow standard practice in the variable and function naming conventions.
答案 2 :(得分:-1)
验证函数始终需要返回boolean
值。
在你的控制器中,尝试检索验证方法的返回值,并在那里回显“true”或“false”。