Zhu Jinhui 7 роки тому
батько
коміт
bef5e60b80
3 змінених файлів з 171 додано та 7 видалено
  1. 51 1
      Qii/Base/Rules.php
  2. 109 6
      Qii/Driver/Base.php
  3. 11 0
      Qii/Library/Validate.php

+ 51 - 1
Qii/Base/Rules.php

@@ -22,6 +22,10 @@ class Rules
      * 选择其中一个去验证
      */
     private $optionValidKey = array();
+    /**
+     * 字段名称
+     */
+    private $files = array();
 
     public function __construct()
     {
@@ -46,7 +50,22 @@ class Rules
      */
     public function fields()
     {
-        return array();
+        return $this->fields;
+    }
+    /**
+     * 添加字段
+     * @param string | array $fields 字段名
+     */
+    public function addFields($fields)
+    {
+        if(empty($fields)) return;
+        if(is_array($fields))
+        {
+            return array_map(function ($n) {
+                return $this->addFields($n);
+            }, $fields);
+        }
+        $this->fields[] = $fields;
     }
     /**
      * 定义规则
@@ -83,6 +102,7 @@ class Rules
     public function clean()
     {
         $this->data = array();
+        $this->fields = array();
         $this->forceValidKey = array();
     }
     /**
@@ -123,6 +143,25 @@ class Rules
         $this->rules[$field][$key] = $isValid;
         $this->message[$field][$key] = $message;
     }
+    /**
+     * 移除规则
+     * @param string $fields 字段名
+     */
+    public function removeRules($fields)
+    {
+        if(!$fields) return;
+        if(is_array($fields))
+        {
+            return array_map(function ($n) {
+                return $this->removeRules($n);
+            }, $fields);
+        }
+        if(isset($this->rules[$fields])) 
+        {
+            unset($this->rules[$fields]);
+            unset($this->message[$fields]);
+        }
+    }
     /**
      * 添加必须验证用的字段
      * @param string $key 字段名
@@ -145,6 +184,17 @@ class Rules
             }
         }
     }
+
+    public function removeForceValidKey($key)
+    {
+        foreach ($this->forceValidKey as $key => $value) 
+        {
+            if($value == $key)
+            {
+                unset($this->forceValidKey);
+            }
+        }
+    }
     /**
      * 添加必须其中某一个字段,选择不为空的字段去验证
      * 

+ 109 - 6
Qii/Driver/Base.php

@@ -110,30 +110,95 @@ class Base
 	{
 		if(!$database) $database = $this->currentDB;
 		$sql = "SELECT * from information_schema.COLUMNS where table_name = '".$table."' and table_schema = '".$database."'";
-		$data = ['fields' => [], 'pri' => [], 'maxlen' => []];
+		$data = ['fields' => [], 
+					'rules' => [
+						'pri' => [], 'required' => []
+					]
+				];
 		
 		$rs = $this->setQuery($sql);
 		while($row = $rs->fetch())
 		{
 			$data['fields'][] = $row['COLUMN_NAME'];
-			if($row['COLUMN_KEY'] == 'PRI') $data['pri'][] = $row['COLUMN_NAME'];
+			if($row['EXTRA'])
+			{
+				$data['rules']['extra'][$row['EXTRA']][] = $row['COLUMN_NAME'];
+			}
+			if($row['COLUMN_KEY'] == 'PRI') 
+			{
+				$data['rules']['pri'][] = $row['COLUMN_NAME'];
+				$data['rules']['required'][] = $row['COLUMN_NAME'];
+			}
+			if($row['IS_NULLABLE'] == 'NO')
+			{
+				$data['rules']['required'][] = $row['COLUMN_NAME'];
+			}
 			if(in_array($row['DATA_TYPE'], ['varchar', 'char']))
 			{
-				$data['maxlen'][$row['COLUMN_NAME']] = $row['CHARACTER_MAXIMUM_LENGTH'];
+				$data['rules']['maxlength'][$row['COLUMN_NAME']] = $row['CHARACTER_MAXIMUM_LENGTH'];
 			}
-			if(in_array($row['DATA_TYPE'], ['int', 'bigint', 'smallint', 'tinyint']))
+			if(in_array($row['DATA_TYPE'], ['mediumtext', 'TINYTEXT', 'text', 'longtext']))
+			{
+				$data['rules']['text'][] = $row['COLUMN_NAME'];
+			}
+			if(in_array($row['DATA_TYPE'], ['bigint', 'int', 'smallint', 'tinyint', 'integer']))
 			{
 				preg_match('/[\d]{1,}/', $row['COLUMN_TYPE'], $matches);
-				$data['int'][$row['COLUMN_NAME']] = $matches[0];
+				$data['rules']['int'][$row['COLUMN_NAME']] = $matches[0];
+				$data['rules']['number'][] = $row['COLUMN_NAME'];
+			}
+			if(in_array($row['DATA_TYPE'], ['float', 'double', 'decimal']))
+			{
+				$data['rules']['float'][$row['COLUMN_NAME']] = $this->getValueFromBrackets($row['COLUMN_TYPE']);
 			}
 			if(in_array($row['DATA_TYPE'], ['timestamp', 'datatime']))
 			{
-				$data['timestamp'][] = $row['COLUMN_NAME'];
+				$data['rules']['timestamp'][] = $row['COLUMN_NAME'];
+			}
+			if(in_array($row['DATA_TYPE'], ['enum', 'set']))
+			{
+				$data['rules']['sets'][$row['COLUMN_NAME']] = $this->getValueFromBrackets($row['COLUMN_TYPE']);
+			}
+			if(isset($row['COLUMN_DEFAULT']))
+			{
+				$data['rules']['default'][$row['COLUMN_NAME']] = $row['COLUMN_DEFAULT'];
 			}
 		}
 		$data['sql'] = $this->getTableSQL($table, $database);
 		return $data;
 	}
+	/**
+	 * 从括号中获取指定的值
+	 * @param string $str 需要获取的内容
+	 * @return array
+	 */
+	public function getValueFromBrackets($str)
+	{
+		preg_match("/(?:\()(.*)(?:\))/i", $str, $matches);
+		$str = $matches[1];
+		$a = explode(",", $str);
+		for($i=0; $i<count($a); $i++)
+		{
+			$this->removeQuote($a[$i]);//从字符串中去除单引号
+		}
+		return $a;
+	}
+	/**
+	 * 去除双引号
+	 * @param string $str 去除双引号 
+	 */
+	public function removeQuote(&$str) 
+	{
+		if(preg_match("/^\'/",$str))
+		{
+			$str = substr($str, 1, strlen($str)-1);
+		}
+		if(preg_match("/\'$/",$str))
+		{
+			$str = substr($str, 0, strlen($str)-1);
+		}
+		return $str;
+	}
 	/**
 	 * 查询数据库中是否有指定的表
 	 * @param string $tableName 表名
@@ -183,6 +248,44 @@ class Base
 		}
 		return preg_replace("/AUTO_INCREMENT=[\d]{1,}/", "AUTO_INCREMENT=". intval($autoIncr), $sql);
 	}
+	/**
+	 * 通过数据表名称获取规则
+	 * @param string $table 表名
+	 * @param string $database 数据库名 
+	 */
+	public function buildRulesForTable($table, $database = null)
+	{
+		if(!$database) $database = $this->currentDB;
+		$tableInfo = $this->getTableInfo($table, $database);
+		$rules = new \Qii\Base\Rules();
+		$rules->addFields($tableInfo['fields']);
+		if($tableInfo['rules']['required'])
+		{
+			$rules->addForceValidKey($tableInfo['rules']['required']);
+		}
+		if(isset($tableInfo['rules']['number']))
+		{
+			foreach ($tableInfo['rules']['number'] as $key => $value) 
+			{
+				$rules->addRules($value, 'number', true, $value . '字段必须是数字');
+			}
+		}
+		if(isset($tableInfo['rules']['maxlength']))
+		{
+			foreach ($tableInfo['rules']['maxlength'] as $key => $value) 
+			{
+				$rules->addRules($key, 'maxlength', $value, $key . '字段内容长度不能大于'. $value .'个字符');
+			}
+		}
+		if(isset($tableInfo['rules']['timestamp']))
+		{
+			foreach ($tableInfo['rules']['timestamp'] as $key => $value) 
+			{
+				$rules->addRules($value, 'datetime', true, $value . '字段必须为日期格式');
+			}
+		}
+		return $rules;
+	}
 	
 	final public function getAlias($alias)
 	{

+ 11 - 0
Qii/Library/Validate.php

@@ -67,6 +67,7 @@ class Validate
 		'cn' => '中文',
 		'account' => '账户',
 		'date' => '日期',
+		'datetime' => '日期',
 		'safe' => '安全字符',
 		'password' => '密码',
 		'maxlength' => '最大长度',
@@ -352,6 +353,16 @@ class Validate
 	{
 		return preg_match("/^[\d]{4}\-[\d]{2}\-[\d]{2}/", $str);
 	}
+	/**
+	 * 验证日期
+	 * Y-m-d H:i:s
+	 * @param string $str
+	 * @return bool
+	 */
+	public function datetime($str)
+	{
+		return date('Y-m-d H:i:s', strtotime($str)) == $str;
+	}
 
 	/**
 	 * 验证字符串中,不允许包含怪字符