Codeigniter 将 2 个参数传递给回调

Posted

技术标签:

【中文标题】Codeigniter 将 2 个参数传递给回调【英文标题】:Codeigniter passing 2 arguments to callback 【发布时间】:2011-06-16 21:35:37 【问题描述】:

在发布一个包含两个字段“id”和“url”的表单后,我有以下代码:

$this->load->library('form_validation');
$this->form_validation->set_rules('id', 'id', 'trim|xss_clean');
$this->form_validation->set_rules('url', 'url|id', 'trim|xss_clean|callback_url_check');

数据库查询需要这两个字段。

函数 url_check($str, $id) 被调用,但在这种情况下,'id' 的值始终为 0。

如果我这样做:

$this->form_validation->set_rules('url', 'url', 'trim|xss_clean|callback_url_check');

然后致电url_check($str) 一切正常。

问题是如何将两个值传递给url_check($str, $id)

【问题讨论】:

你不能仅仅连接 $str.$id; 并以这种方式传递它以进行验证。 【参考方案1】:

你可以直接使用$this->input->post:

function check_url() 
   $url = $this->input->post('url');
   $id = $this->input->post('id');

   // do some database things you need to do e.g.
   if ($url_check = $this->user_model->check_url($url, $id) 
       return TRUE;
   
   $this->form_validation->set_message('Url check is invalid');
   return FALSE;

【讨论】:

索普,真是天才。很好的建议,这将完全有效。 我没有看到这个线程就这样做了,现在我正在搜索如何在没有 de 回调函数中的 post 的情况下执行此操作,因为这不够通用(至少在我的函数中)【参考方案2】:

按照in the docs 所述,以正确的方式进行操作(至少对于 CI 2.1+):

$this->form_validation->set_rules('uri', 'URI', 'callback_check_uri['.$this->input->post('id').']');
// Later:
function check_uri($field, $id)
    // your callback code here

【讨论】:

回调参数至少需要 CI 2.1.0。 这就是我在帖子中提到它的原因 ;) 应该指出这是危险的,如果 "id" = "] is_numeric callback_check_uri[123" 现在他们刚刚改变了验证的规则,可以随意执行函数【参考方案3】:

这似乎也有效。

$id = 1;

$this->form_validation->set_rules('username', 'Human Username', 'callback_username_check['.$id.']');

function username_check($str, $id) 
    echo $id;
    if ($str == 'test') 
         $this->form_validation->set_message('username_check', 'The %s field can not be the word "test"');
         return FALSE;
    
    else 
    return TRUE;
    

【讨论】:

Jatin,回调参数至少需要CI 2.1.0。【参考方案4】:

如果我正确理解了 form_validation,则每条规则 (set_rules) 都适用于表单的一个字段,而您的回调将只检查一个字段。在您的情况下,“id”似乎超出了范围。相反,可以将一个数组传递给 set_rules 函数并进行回调。我还没有尝试过。 http://codeigniter.com/user_guide/libraries/form_validation.html#validationrulesasarray

【讨论】:

+1 这是正确的,CI 的 set_rules 仅适用于每个规则的一个字段。您可以使用辅助函数或类似函数(或按照模型中的建议)_,这并不理想,但这里就是这种情况。 谢谢!你验证了我的想法。【参考方案5】:

只是注意使用其他答案中建议的回调参数。如果您使用app/config/form_validation.php 创建您的验证规则,$this->input->post('parameter') 语法将不起作用,因为该对象在读取该文件内容的执行时在 CI 加载器中不可用。您必须在回调例程中进行调用,例如:

public function _validate_user_signup($username, $password) 
  $var = $this->input->post('password');

在这种情况下,传递给方法的第二个参数将不包含密码,但 $var 会在调用之后。

我希望这很清楚。 马特

【讨论】:

您可以使用get_instance() 访问控制器、模型或视图之外的主要 CI 对象,例如:$CI =& get_instance();,查看更多 Creating Ancillary Classes【参考方案6】:

最好使用表单验证库来获取正在验证的数据。

您的数据并非总是在 $_GET 或 $_POST 中(请参阅https://www.codeigniter.com/userguide3/libraries/form_validation.html#validating-an-array-other-than-post)。

在验证回调中访问数据的最佳方式是:

$this->form_validation->validation_data

“validation_data”是 CI_Form_validation 类中的公共属性。

【讨论】:

以上是关于Codeigniter 将 2 个参数传递给回调的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter - 如何将 JSON 作为参数传递给视图 [重复]

codeIgniter:将参数传递给上一个查询中的选择查询

有没有办法在 CodeIgniter *不*使用 ActiveRecord 的情况下将参数传递给查询?

Prettyphoto - 如何将唯一参数传递给回调函数

将数组作为参数传递给PHP CodeIgniter中的模型

JavaScript:将参数传递给回调函数