【问题标题】:Codeigniter return NULL from validation callbackCodeigniter 从验证回调返回 NULL
【发布时间】:2012-07-11 21:52:15
【问题描述】:

我正在使用回调来验证文本输入提交的 URL。如果文本输入为空(意味着用户删除了他/她的 URL 条目),我需要在数据库中插入 NULL。我正在尝试下面的代码,但它只是在数据库中插入一个空字符串。

$this->form_validation->set_rules('image_url', 'Image URL', 'trim|xss_clean|prep_url|callback__validate_url');

回调:

    function _validate_url($str)
    {
        if (isset($str))
        {
            $pattern = "/^(http|https):\/\/([A-Z0-9][A-Z0-9_-]*(?:\.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?\/?/i";
            if (!preg_match($pattern, $str))
            {
                $this->form_validation->set_message('_validate_url', 'URL is not valid');
                return FALSE;
            }
            else 
            {
                if (!isset($str)) //if input empty
                {
                    return NULL; //return NULL to input?
                }

                return TRUE;
            }
        }

        return TRUE; 
    }

如何通过回调向输入返回值?

更新:

上面的代码是错误的,我无法在输入中返回NULL(我猜是因为它返回一个字符串)所以我在回调之外做了它

   $image_url = $this->input->post('image_url');

    if (empty($image_url)) 
    { 
         $image_url = NULL; 
    }

    $data = array (
            'content' => $this->input->post('content'),
            'image_url' => $entry_image_url
    );

    //add to database 

【问题讨论】:

  • if (!isset($str)) //if input empty -- 这个条件永远不会是true$str 变量总是被设置
  • @zerkms - 如果变量设置为 nullisset() 返回 false。
  • @zerkms 如果是这样的话,我每次将 URL 输入留空时都会收到验证错误。注意第一个 isset($str) 似乎可以工作,因为当未设置 $str 时回调返回 TRUE
  • @Sam Dufel:哎呀,对。但它仍然不是语义的。如果目的是检查变量是否为空 - 有is_null()
  • 对,他可能应该检查strlenempty 或更有用的东西。自动回调确实不应该传递空值。

标签: php validation codeigniter


【解决方案1】:

看这段代码,有一个不可能的条件:

    if (isset($str)) // Everything in this block runs if $str is "set"
    {
        if (!preg_match($pattern, $str))
        {
            //
        }
        else 
        {
            if (!isset($str)) // But you're checking if $str is not set....
            {
                // This can never happen!
            }

        }
    }

用适当的方法替换该条件以检查输入是否为空,也许检查trim($str) === '' 甚至empty($str)

【讨论】:

  • 哇,我不敢相信我没有注意到这一点。我想我需要休息一下……谢谢!
  • 是的,如果你真的觉得你的数据库中需要 NULL,你应该明确地说出来,我认为依靠表单验证类将输入值正确转换为 NULL 是不安全的,即使它可能工作(POST 和 GET 等输入数据始终是字符串或字符串数​​组)。为什么空字符串不够用?
  • 在创建条目时,我将 image_url 列设置为 NULL 作为默认值,如果用户在更新条目时删除了 url,我想保留该结构。此外,当在网站上显示图像时,我使用isset() 检查图像是否存在,一个空字符串将显示损坏的图像图标。最后,如果他们上传图片而不是粘贴 URL,我也会设置 NULL,反之亦然。
  • 那么我猜你是在使用WHERE image_url IS NOT NULL 来抓取图像吗?我的观点是,你真的不应该 need 区分 NULL 和空字符串 - 但它当然是你的选择。我敢肯定,如果我们坐在同一张桌子上查看代码,我可以帮助让事情变得更简单,祝你的应用好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多