Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是一个好的PHP验证类?_Php_Html - Fatal编程技术网

什么是一个好的PHP验证类?

什么是一个好的PHP验证类?,php,html,Php,Html,我想了解您对创建验证类的最佳方法的看法。 下面我粘贴了我的版本,它还不是很广泛,但到目前为止它是正确的方法吗 我希望每个元素都可以以一种形式出现,并且应该验证它们有自己的属性,比如字符串的字符串长度或者图像或文件的文件大小(见下文) 另外,将这些规则声明为嵌套数组更好吗?还是将它们放在一个大字符串中,然后在过程中拆分? mb_internal_encoding("UTF-8"); class Phrase { //creates parts of sentences, not impo

我想了解您对创建验证类的最佳方法的看法。 下面我粘贴了我的版本,它还不是很广泛,但到目前为止它是正确的方法吗

我希望每个元素都可以以一种形式出现,并且应该验证它们有自己的属性,比如字符串的字符串长度或者图像或文件的文件大小(见下文)

另外,将这些规则声明为嵌套数组更好吗?还是将它们放在一个大字符串中,然后在过程中拆分?
mb_internal_encoding("UTF-8");

class Phrase {
    //creates parts of sentences, not important
    static function additive(array $limbs) {
        return implode(' and ', array_filter([implode(', ', array_slice($limbs, 0, -1)), end($limbs)], 'strlen'));
    }
}

class Text {
    static function validate($item) {
        $err = array();
        $value = $_POST[$item] ?? $_GET[$item];
        $criteria = FormProcess::$criteria[$item];
        foreach($criteria as $critKey => $critVal) {
            if($critKey === 'required' && empty($value)) {
                $err[] = "is required";
            } else if(!empty($value)) {
                switch($critKey) {
                    case 'length':
                        if(is_array($critVal)) {
                            //min and max set
                            if(mb_strlen($value) < $critVal[0] || mb_strlen($value) > $critVal[1]) {
                                $this->err[] = "must contain between {$critVal[0]} and {$critVal[1]} characters"; 
                            }
                        } else {
                            //max set only
                            if(mb_strlen($value) > $critVal) {
                                $err[] = "must contain a maximum of $critVal characters";
                            }
                        }
                    break;
                    case 'pattern':
                        if(!preg_match($critVal[0], $value)) {
                            $err[] = "may consist of {$critVal[1]} only";
                        }
                    break;
                    case 'function':
                        $result = static::$critVal($value);
                        if($result) {
                            $err[] = $result;
                        }
                    break;
                }
            }
        }
        if(!empty($err)) {
            return "{$criteria['name']} " . Phrase::additive($err) . "!";
        }
        return false;
    }

    private static function email($email) {
        //checks if given string is a valid email address
        if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            return "is invalid";
        }
        return false;
    }
}

class File {
    //checks for aspects like filesize...
    static function validate() {
        //...
    }   
}

class Image extends File {
    static function validate() {
        parent::validate(); //perform general file checks first
        //...checks for images specifically
    }
}

class Video extends File {
    static function validate() {
        parent::validate(); //perform general file checks first
        //...checks for videos specifically
    }
}

class FormProcess {
    public $errors;

    //declare, what kind of requirements the items must meet
    static $criteria = array(
        'email' => array(
            'type'     => 'Text',
            'required' => true,
            'name'     => 'Email',
            'length'   => 48,
            'function' => 'email', 
        ),

        'username' => array(
            'type'     => 'Text',
            'required' => true,
            'name'     => 'Username',
            'length'   => [4, 24],
            'pattern'  => ['/^[-\w]+$/', "alphanumeric characters, underscores and hyphens"],
        ),

        'password' => array(
            'type'     => 'Text',
            'required' => true,
            'name'     => 'Password',
            'length'   => [6, 100],
            'pattern'  => ['/^[\S]+$/', "non-whitespace characters"],
        ),
    );

    //runs the validate function on each item while storing occuring errors
    function __construct(array $items) {
        foreach($items as $item) {
            $class = self::$criteria[$item]['type'];
            $result = $class::validate($item);
            if($result) {
                $this->errors[] = $result;
            }
        }
    }
}
mb_内部编码(“UTF-8”);
类短语{
//创造句子的一部分,不重要
静态函数加法器(数组$frameds){
返回内爆('and',array_filter([introde(',','array_slice($fracts,0,-1)),end($fracts)],'strlen');
}
}
课文{
静态函数验证($item){
$err=array();
$value=$\发布[$item]??$\获取[$item];
$criteria=FormProcess::$criteria[$item];
foreach($critKey=>$critVal的标准){
如果($critKey=='required'&&empty($value)){
$err[]=“是必需的”;
}如果(!空($value)){
开关($critKey){
案例“长度”:
if(is_数组($critVal)){
//最小和最大集
如果(mb_strlen($value)<$critVal[0]| | mb_strlen($value)>$critVal[1]){
$this->err[]=“必须包含介于{$critVal[0]}和{$critVal[1]}个字符之间的字符”;
}
}否则{
//仅限最大值集
如果(mb_strlen($value)>$critVal){
$err[]=“最多必须包含$critVal字符”;
}
}
打破
案例“模式”:
如果(!preg_匹配($critVal[0],$value)){
$err[]=“只能由{$critVal[1]}组成”;
}
打破
案例“功能”:
$result=static::$critVal($value);
如果($结果){
$err[]=$result;
}
打破
}
}
}
如果(!empty($err)){
返回“{$criteria['name']}”。短语::加法($err)。“!”;
}
返回false;
}
专用静态功能电子邮件($email){
//检查给定字符串是否为有效的电子邮件地址
如果(!filter_var($email,filter_VALIDATE_email)){
返回“无效”;
}
返回false;
}
}
类文件{
//检查文件大小等方面。。。
静态函数validate(){
//...
}   
}
类图像扩展文件{
静态函数validate(){
parent::validate();//首先执行常规文件检查
//…专门检查图像
}
}
类视频扩展文件{
静态函数validate(){
parent::validate();//首先执行常规文件检查
//…专门检查视频
}
}
类窗体进程{
公共错误;
//声明,项目必须满足什么样的要求
静态$criteria=array(
'电子邮件'=>数组(
'类型'=>'文本',
“必需”=>true,
“名称”=>“电子邮件”,
“长度”=>48,
'功能'=>'电子邮件',
),
“用户名”=>数组(
'类型'=>'文本',
“必需”=>true,
“名称”=>“用户名”,
“长度”=>[4,24],
'模式'=>['/^[-\w]+$/',“字母数字字符、下划线和连字符”],
),
“密码”=>数组(
'类型'=>'文本',
“必需”=>true,
“名称”=>“密码”,
“长度”=>[6100],
'模式'=>['/^[\S]+$/',“非空白字符”],
),
);
//在存储发生的错误时,对每个项目运行验证函数
函数构造(数组$items){
foreach($items作为$item){
$class=self::$criteria[$item]['type'];
$result=$class::validate($item);
如果($结果){
$this->errors[]=$result;
}
}
}
}
然后,您所要做的就是在一个数组中命名所有预期项(通过表单中的html“name”属性),并将其传递给构造函数,然后构造函数将对每个项运行相应的验证函数

$expected = ['username', 'password'];
$signup = new FormProcess($expected);

if($signup->errors) { 
    ?>
    There was something wrong with your request:
    <ul>
        <?php foreach($signup->errors as $error) { ?>
            <li><?= $error ?></li>
        <?php } ?>
    </ul>
    <?php
}
$expected=['username','password'];
$signup=新的FormProcess(预期值);
如果($signup->errors){
?>
您的请求有问题:

许多好的问题都会根据专家经验产生一定程度的意见,但对这个问题的回答往往几乎完全基于意见,而不是事实、参考资料或特定的专业知识。你可能想找一个发展论坛(也许?)然后,当/如果你有具体的编码问题,回到StackOverflow,我们会很乐意提供帮助。如果你使用json字符串作为规则,你不需要自己序列化/反序列化,因为你可以依赖json_编码和json_解码。这也很容易手工编辑。谢谢你的回复,它们都是非常有帮助。我期待着询问quora并修复阵列。@nooby_web_developer-不客气。CodeProject是另一个适合进行扩展讨论的地方。:)许多好的问题都会根据专家经验产生一定程度的意见,但这个问题的答案几乎完全基于opini说明,而不是事实、参考资料或具体的