thinkphp Tp5自动验证 自动生成验证器

<?php

class DB

{
    private $address = 'localhost';

    private $username = 'root';

    private $password = 'root';

    private $db = 'sanbao';

    private $table = 'card';

    private $con;


    public function __construct()

    {

        $con = mysqli_connect($this->address, $this->username, $this->password, $this->db, '3306');

        if (mysqli_connect_errno()) {

            die('Could not connect: ' . mysql_error());
        } else {

            $con->set_charset('utf8');

            $this->con = $con;
        }
    }


    public function index()
    {

        //2 创建sql

        $_sql = "show full columns from " . $this->table;

        $_result = $this->con->query($_sql);


        while ($access = $_result->fetch_assoc()) {

            // echo "<pre>";

            // dump($access);

            $data[] = self::HandleArr($access);
        }

        $data = array_filter($data);

        // return view('index',['data'=>$data]);

        return $data;
    }

    static public function HandleArr($arr)

    {

        if ($arr['Field'] == 'id')

            return [];

        $preg = '/^([a-z]+)\((\d+)(,?\d+)?\)/';

        preg_match($preg, $arr['Type'], $e);

        @$len = ['type' => $e[1], 'leng' => $e[2]];


        if ($arr['Key'] == 'PRI') {

            $arr['Null'] = 'YES';
        }


        $must = $arr['Null'] == 'YES' ? 0 : 1;

        return ['field' => $arr['Field'], 'leng' => $len, 'must' => $must, 'comment' => $arr['Comment']];
    }

    public function data()
    {

        $html = "<?php\nnamespace app\对应的控制器\\validate;\n\nuse think\Validate;\n\nclass 模型 extends Validate\n{\n\tprotected \$rule = [%s];\n\tprotected \$message = [%s];\n\tprotected function float2(\$val,\$msg,\$data){\n\t\tif (preg_match('/^[0-9]+(.[0-9]{1,2})?$/', \$val)) {\n\t\treturn true;\n\t}\n\t\treturn \$msg;\n\t}\t\n}";
        $arr = $_POST;
        $res = array_map(function ($val) {

            return array_filter($val);
        }, $arr);
        $res = array_filter($res);
        $rule = "\n\t\t";

        $message = "\n\t\t";

        foreach ($res as $key => $value) {

            $rule .= "'${key}' => '";

            foreach ($value as $k => $v) {

                //添加条件理由

                if (strpos($k, '_' . md5(1))) {

                    if (strpos($v, '@@')) {

                        $valmsg = explode('@@', $v);

                        $v = $valmsg[0];

                        $msg = $valmsg[1];
                    } else {

                        $msg = $k . '的提示信息';
                    }

                    $rule .= str_replace('_' . md5(1), '', $k) . ":${v}|";

                    $message .= "'${key}." . str_replace('_' . md5(1), '', $k) . "' => '${msg}',\n\t\t";
                } elseif (strpos($k, '_' . md5(2))) {

                    $rule .= str_replace('_' . md5(2), '', $k) . ":${v}|";
                } else {

                    $rule .= "${k}|";

                    $message .= "'${key}.${k}' => '$v',\n\t\t";
                }
            }

            $rule = trim($rule, '|') . "',\n\t\t";
        }

        $txt = sprintf($html, $rule, $message);

        // print($rule);
        // print($message);
        if (file_put_contents('cheng.php', $txt, FILE_APPEND)) {
            echo 'success';
        } else {
            echo 'error';
        }

        die;
    }
}

if (isset($_GET['type'])) {

    $obj = new DB();

    $data = $obj->data();
} else {

    $obj = new DB();

    $data = $obj->index();
}

?>

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Document</title>

    <style>
        @charset "UTF-8";

        /*css 初始化 */

        html,
        body,
        ul,
        li,
        ol,
        dl,
        dd,
        dt,
        p,
        h1,
        h2,
        h3,
        h4,
        h5,
        h6,
        form,
        fieldset,
        legend,
        img {
            margin: 0;
            padding: 0;
        }

        fieldset,
        img,
        input,
        button {
            border: none;
            padding: 0;
            margin: 0;
            outline-style: none;
        }

        /*去掉input等聚焦时的蓝色边框*/

        ul,
        ol {
            list-style: none;
        }

        input {
            padding-top: 0;
            padding-bottom: 0;
            font-family: "SimSun", "宋体";
        }

        select,
        input {
            vertical-align: middle;
        }

        select,
        input,
        textarea {
            font-size: 12px;
            margin: 0;
        }

        textarea {
            resize: none;
        }

        /*防止拖动*/

        img {
            border: 0;
            vertical-align: middle;
        }

        /* 去掉图片低测默认的3像素空白缝隙,或者用display:block也可以*/

        table {
            border-collapse: collapse;
        }

        body {

            font: 12px/150% Arial, Verdana, "\5b8b\4f53";

            color: #666;

            background: #fff
        }

        .clearfix:before,
        .clearfix:after {
            /*清楚浮动*/

            content: "";

            display: table;

        }

        .clearfix:after {
            clear: both;
        }

        .clearfix {

            *zoom: 1;
            /*IE/7/6*/

        }

        a {
            color: #666;
            text-decoration: none;
        }

        a:hover {
            color: #C81623;
        }

        h1,
        h2,
        h3,
        h4,
        h5,
        h6 {
            text-decoration: none;
            font-weight: normal;
            font-size: 100%;
        }

        /*设置h标签的大小,设置跟父亲一样大的字体font-size:100%;*/

        s,
        i,
        em {
            font-style: normal;
            text-decoration: none;
        }

        .col-red {
            color: #C81623 !important;
        }


        /*公共类*/

        .w {
            /*版心 提取 */

            width: 1210px;
            margin: 0 auto;

        }

        .fl {

            float: left
        }

        .fr {

            float: right
        }

        .al {

            text-align: left
        }

        .ac {

            text-align: center
        }

        .ar {

            text-align: right
        }

        .hide {

            display: none
        }

        .addv {

            height: 30px;

            border-radius: 15px;

            outline: none;

        }


        .font12 {
            font-size: 12px;
        }

        .font14 {
            font-size: 14px;
        }

        .font16 {
            font-size: 16px;
        }

        body {

            background: #D9D7D7FF;

        }

        div {

            margin-top: 10px;

        }

        .header {

            text-align: center;

            font-size: 40px;

            height: 44px;

            width: 80%;

            margin: 0 auto;

            line-height: 44px;

        }

        .content {

            padding-left: 32%;

            width: 80%;

            font-size: 20px;

        }

        #title {

            font-size: 25px;

            padding-left: 30%;

        }

        .g {

            color: #f40;

        }

        .c {

            color: #4FF458FF;

        }

        .block {

            line-height: 25px;

            font-size: 22px;

        }
    </style>

    <script src="https://lib.sinaapp.com/js/jquery/2.0.2/jquery-2.0.2.min.js"></script>
</head>

<body>

<form action="?type=1" method="post">

    <div class="header">

        TP5自动验证

    </div>

    <?php

    foreach ($data as $key => $vo) {

        # code...

        ?>

        <div id="title"><?php echo $vo['comment'] ?: $vo['field']; ?></div>

        <div class="content" data="<?php echo $vo['field']; ?>">

            <span class="c">必选:</span><input type="radio" name="<?php echo $vo['field']; ?>[require]"
                <?php if ($vo['must'] == 1) echo 'checked'; ?> value="<?php echo $vo['comment']; ?>不可为空">

            <span class="g">可选:</span><input type="radio" name="<?php echo $vo['field']; ?>[require]"
                <?php if ($vo['must'] == 0) echo 'checked'; ?> value="">

            <select name="" class="addv">

                <option value="">请选择</option>

                <option value="number">整型</option>

                <option value="float2" msg="2">浮点型最多两位小数点</option>

                <option value="email">邮箱</option>

                <option value="mobile">手机号</option>

                <option value="array">数组</option>

                <option value="date">日期</option>

                <option value="alpha">字母</option>

                <option value="phonenumber" msg="2">验证手机号</option>

                <option value="alphaNum">字母和数字</option>

                <option value="alphaDash">字母和数字_</option>

                <option value="chs">汉字</option>

                <option value="chsAlpha">汉字和字母</option>

                <option value="chsDash">汉字字母数字和下划线_-</option>

                <option value="url">URL地址</option>

                <option value="dateFormat:y-m-d">dateFormat:y-m-d</option>

                <option value="in" msg="1">在指定几个值内</option>

                <option value="notIn" msg="1">不在在指定几个值内</option>

                <option value="notBetween" msg="1">在某个范围</option>

                <option value="length" msg="1">字符长度或指定长度</option>

                <option value="max" msg="1">最大长度</option>

                <option value="min" msg="1">最小长度</option>

                <option value="begin_time" msg="1">证某个字段的值是否在某个日期之前before:2016-10-01</option>

                <option value="expire_time" msg="1">expire:2016-2-1,2016-10-01</option>

                <option value="allowIp" msg="1">允许allowIp:114.45.4.55</option>

                <option value="denyIp" msg="1">禁用denyIp:114.45.4.55</option>

                <option value="confirm" msg="1">验证某个字段是否和另外一个字段的值一致</option>

                <option value="different" msg="1">验证某个字段是否和另外一个字段的值不一致</option>

                <option value="eq" msg="1">等于某值</option>

                <option value="egt" msg="1">大于等于某值</option>

                <option value="gt" msg="1">大于某值</option>

                <option value="elt" msg="1">小于等于某值</option>

                <option value="lt" msg="1">小于某值</option>

                <option value="regex" msg="1">正则</option>

                <option value="ip">IP地址</option>

                <option value="activeUrl">域名或IP</option>


            </select>

        </div>

        <?php

    }

    ?>

    <input type="submit" value="提交">

</form>

</body>

<script>
    $('.addv').change(function () {

        var name = $(this).parents('.content').attr('data')

        var val = $(this).val();

        if (val == '') {

            return

        }

        var text = $(this).find("option:selected").text()

        switch ($(this).find("option:selected").attr('msg')) {

            case '1':

                var html = '<div><input type="text" name="' + name + '[' + val +
                    '_<?php echo md5(1); ?>]" value="" placeholder="添加所需内容@@错误提示"><span class="del">X</span></div>';

                break;

            case '2':

                var html = '<div><input type="text" name="' + name + '[' + val +
                    '_<?php echo md5(2); ?>]" value="请填写正确填写' + text + '"><span class="del">X</span></div>';

                break;


            default:

                var html = '<div><input type="text" name="' + name + '[' + val + ']" value="请填写正确填写' + text +
                    '" placeholder=""><span class="del">X</span></div>'

                break;

        }

        $(this).parents('.content').append(html)

    })

    $("body").delegate(".del", "click", function () {

        $(this).parent().remove()

    });
</script>

</html>

 

posted @ 2018-11-05 10:19  酷酷的城池  阅读(361)  评论(0编辑  收藏  举报