0

我想将 GUMP https://github.com/Wixel/GUMP合并到我的站点中以进行服务器端验证。但不幸的是,文档很简单,而且我是 PHP 新手。

这是我的验证码:

//Validation
$gump = new GUMP(); 
$rules = array(
    'dept'     => 'required|numeric',
    'hosp'     => 'required|numeric',
    'subhosp'  => 'required|numeric',
    'user'     => 'required|numeric',
    'gpo'      => 'required|boolean|exact_len,1',
    'clin'     => 'required|valid_name',
    'clinmail' => 'required|valid_email',
    'comp'     => 'required|alpha_dash',
    'cpt'      => 'required|alpha_dash',
    'past'     => 'required|boolean|exact_len,1',
    'latex'    => 'required|boolean|exact_len,1',   
);
$validated = $gump->validate($_POST,$rules);
print_r($validated); // Something went wrong

当我在 FireBug 中查看 AJAX 响应时,上述代码的输出给了我一个数组:

Array
(
    [0] => Array
        (
            [field] => clin
            [value] => .-0
            [rule] => validate_valid_name
        )

    [1] => Array
        (
            [field] => clinmail
            [value] => %$sd
            [rule] => validate_valid_email
        )

)

我需要的是这样的:

<div class="error-msg">You did not enter a valid email address</div><br>
<div class="error-msg">You did not enter a valid username</div><br>

从我得到的文档中:

    if($validated === TRUE)
{
    // Do something, everything went well
}
else
{   
    // This is where I am stuck. Do I have to loop through and put my <div> tags here?
}

我的问题是社区将如何处理使用此类输出错误消息?我唯一的想法是,我遍历上面的结果并根据字段和被破坏的规则输出不同的消息,但这似乎很乏味。有没有更好的方法或更好的类来使用独立的 PHP 输入验证?我正在使用另一个非常易于使用的类,但是当我从内联 PHP 转移到 AJAX 时它开始崩溃。

4

3 回答 3

4

将您的代码编辑为:

$gump = new GUMP(); 
$rules = array(
'dept'     => 'required|numeric',
'hosp'     => 'required|numeric',
'subhosp'  => 'required|numeric',
'user'     => 'required|numeric',
'gpo'      => 'required|boolean|exact_len,1',
'clin'     => 'required|valid_name',
'clinmail' => 'required|valid_email',
'comp'     => 'required|alpha_dash',
'cpt'      => 'required|alpha_dash',
'past'     => 'required|boolean|exact_len,1',
'latex'    => 'required|boolean|exact_len,1',   
);

$error_texts = array(
'dept'     => 'You must enter a numeric value',
'hosp'     => 'You must enter a numeric value',
'subhosp'  => 'You must enter a numeric value',
'user'     => 'You must enter a numeric value',
'gpo'      => 'You must enter a boolean value',
'clin'     => 'You must enter a valid name',
'clinmail' => 'You must enter a valid email',
'comp'     => 'You must enter a valid alpha dash',
'cpt'      => 'You must enter a valid alpha dash',
'past'     => 'You must enter 1 char',
'latex'    => 'You must enter 1 char',
);

$validated = $gump->validate($_POST,$rules);

if($validated === TRUE)
{
   echo "Every thing is ok";
}
else
{
    foreach($validated as $key=>$error)
    {
        echo '<div class="error-msg">' . $error_texts["{$error['field']}"] . '</div><br />';
    }
}
于 2012-05-07T23:59:28.597 回答
1

我想补充一点,如果验证失败两次,例如,如果需要一个值并且必须存在超过 10 个字符,那么@semsemsanswer 将为同一字段打印多行。

我更改了上面的代码并添加了:

$_validated = array();
foreach($validated as $key=>$error)
{
    if ( !in_array($error['field'], $_validated) )
    {
        print '<div class="error-msg">' . $error_texts["{$error['field']}"] . '</div>';
        $_validated[] = $error['field'];
    }
}
于 2012-06-11T22:03:27.520 回答
1

我知道这个问题已经有一年的历史并且已经得到解答,但是由于我自己基于已接受的答案并且在我看来使它变得更好(完全通用,区域设置为额外),我认为分享并获得一些会很好反馈...你们觉得我的代码怎么样?现在基于semsem 的回答......我喜欢他编写部分代码的方式,我从中派生出以下代码:
首先我用自己的类扩展了 GUMP,这样我就可以覆盖一些函数

<?php

require("gump.class.php");

class GumpValidator extends GUMP 
{
    private $locale;
    private $translator;

    public function GumpValidator($lang = "en")
    {
        $this->locale = $lang;
        $this->loadValidationLocales();
    }

    /** Overwrite the default validate() function of GUMP so that I can add an extra "message" property */
    public function validate(array $input, array $ruleset) 
    {
        $validated_data = GUMP::validate($input, $ruleset);
        if(is_array($validated_data)) {
            foreach($validated_data as $index=>$error) {
                $validation = str_replace(":attribute",  $error['field'], $this->translator[$error['rule']]);
                $validation = str_replace(":param",  $error['param'], $validation);
                $validated_data[$index++]['message'] = $validation;
            }
        }


        return $validated_data;
    }

    /** Depending on the language locale, load the proper set of validation messages */
    private function loadValidationLocales()
    {
        $this->translator = require "/lang/" . $this->locale . "/validation.php";
        return $this->translator;
    }  
} // EOC

然后正如您从扩展类中看到的那样,我为自己创建了一组用于验证的语言环境语言消息,并且我直接从 Github 上的 GUMP 代码中获取了可能的验证错误的完整列表,查看get_readable_errors()获取完整列表的函数的错误。Github 链接在这里...我创建的语言环境保存在单独的语言文件夹/lang/en/validation.php/lang/fr/validation.php等...您可以轻松创建任意数量...我从 Laravel 框架中获取概念...这些validation.php文件看起来像,像这样(每种语言/区域设置 1 个文件),这里是英文的:

<?php

return array(
    "validate_alpha"            => "The :attribute may only contain letters.",
    "validate_alpha_numeric"    => "The :attribute may only contain letters and numbers.",
    .....
);

然后最后在我的 POST 中验证代码,我只是这样称呼它:

// load my extended class with language locale I want to use
$gump = new GumpValidator("en");

// now validate the data 
$validated_data = $gump->validate( $_POST, $rules );

所以最后我得到了对象message内部的额外属性,$validated_data可以选择我选择显示错误消息的任何语言环境……瞧!!!在我的情况下,我阅读了 javascript 中的代码以显示错误Bootstrap alert,但如果你想要 PHP,你也可以查看 semsem 答案。所以最后,我知道它需要更多的代码,因为我有一个额外的类来包装它和额外的语言环境,但是首先让它通用(每个验证错误)然后轻松地拥有多种语言环境不是很好吗?

于 2014-02-01T04:50:19.987 回答