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>