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 作为参数传递给视图 [重复]