PageRenderTime 46ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/brophp/bases/validate.class.php

https://github.com/gakaki/fml-api-php
PHP | 281 lines | 214 code | 14 blank | 53 comment | 17 complexity | cec26acb4ae181d7a8108d1f844515b5 MD5 | raw file
  1. <?php
  2. /** ******************************************************************************
  3. * brophp.com 自动验证类,通过解析XML文件实现对表单在服务器端的自动验证。 *
  4. * *******************************************************************************
  5. * 许可声明:专为《细说PHP》读者及LAMP兄弟连学员提供的“学习型”超轻量级php框架。*
  6. * *******************************************************************************
  7. * 版权所有 (C) 2011-2013 北京易第优教育咨询有限公司,并保留所有权利。 *
  8. * 网站地址: http://www.lampbrother.net (LAMP兄弟连) *
  9. * *******************************************************************************
  10. * $Author: 高洛峰 (skygao@lampbrother.net) $ *
  11. * $Date: 2011-07-18 10:00:00 $ *
  12. * ******************************************************************************/
  13. class Validate {
  14. static $data;
  15. static $action;
  16. static $msg;
  17. static $flag=true;
  18. static $db=null;
  19. /**
  20. * 获取XML内标记的属性,并处理回调内部方法
  21. * @param resource $xml_parser XML的资源
  22. * @param string $tagName 数据表的名称
  23. * @param array $args XML标记的属性
  24. */
  25. static function start($xml_parser, $tagName, $args){
  26. if(isset($args["NAME"]) && isset($args["MSG"])) {
  27. if(empty($args["ACTION"]) || $args["ACTION"]=="both" || $args["ACTION"]==self::$action) {
  28. if (array_key_exists($args["NAME"],self::$data)) {
  29. if(empty($args["TYPE"])){
  30. $method="regex";
  31. }else{
  32. $method=strtolower($args["TYPE"]);
  33. }
  34. if(in_array($method, get_class_methods(__CLASS__))){
  35. self::$method(self::$data[$args["NAME"]],$args["MSG"],$args["VALUE"],$args["NAME"]);
  36. }else{
  37. self::$msg[]="验证的规则{$args["TYPE"]} 不存在,请检查!<br>";
  38. self::$flag=false;
  39. }
  40. }else{
  41. self::$msg[]="验证的字段 {$args["NAME"]} 和表单中的输出域名称不对应<br>";
  42. }
  43. }
  44. }
  45. }
  46. static function end($xml_parser, $tagName){
  47. return true;
  48. }
  49. /**
  50. * 解析XML文件
  51. * @param string $filename XML的文件名
  52. * @param mixed $data 表单中输出的数据
  53. * @param string $action 用户执行的操作add或mod,默认为both
  54. * @param object $db 数据表的连接对象
  55. */
  56. static function check($filename, $data, $action, $db){
  57. $file=substr($filename, strlen(TABPREFIX));
  58. $xmlfile=APP_PATH."models/".$file.".xml";
  59. if(file_exists($xmlfile)) {
  60. self::$data=$data;
  61. self::$action=$action;
  62. self::$db=$db;
  63. if(array_key_exists("code", $data)){
  64. self::vcode($data["code"], "验证码输入<font color='red'>".$data["code"]."</font>错误!");
  65. }
  66. //创建XML解析器
  67. $xml_parser = xml_parser_create();
  68. //使用大小写折叠来保证能在元素数组中找到这些元素名称
  69. xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true);
  70. xml_set_element_handler ($xml_parser, array(__CLASS__,"start"),array(__CLASS__, "end"));
  71. //读取XML文件
  72. if (!($fp = fopen($xmlfile, "r"))) {
  73. die("无法读取XML文件$xmlfile");
  74. }
  75. //解析XML文件
  76. $has_error = false; //标志位
  77. while ($data = fread($fp, 4096)) {
  78. //循环地读入XML文档,只到文档的EOF,同时停止解析
  79. if (!xml_parse($xml_parser, $data, feof($fp)))
  80. {
  81. $has_error = true;
  82. break;
  83. }
  84. }
  85. if($has_error) {
  86. //输出错误行,列及其错误信息
  87. $error_line = xml_get_current_line_number($xml_parser);
  88. $error_row = xml_get_current_column_number($xml_parser);
  89. $error_string = xml_error_string(xml_get_error_code($xml_parser));
  90. $message = sprintf("XML文件 {$xmlfile}[第%d行,%d列]有误:%s",
  91. $error_line,
  92. $error_row,
  93. $error_string);
  94. self::$msg[]= $message;
  95. self::$flag=false;
  96. }
  97. //关闭XML解析器指针,释放资源
  98. xml_parser_free($xml_parser);
  99. return self::$flag;
  100. }else{
  101. return true;
  102. }
  103. }
  104. /**
  105. * 使用自定义的正则表达式进行验证
  106. * @param string $value 需要验证的值
  107. * @param string $msg 验证失败的提示消息
  108. * @param string $rules 正则表达式
  109. */
  110. static function regex($value, $msg,$rules) {
  111. if(!preg_match($rules, $value)) {
  112. self::$msg[]=$msg;
  113. self::$flag=false;
  114. }
  115. }
  116. /**
  117. * 唯一性验证
  118. * @param string $value 需要验证的值
  119. * @param string $msg 验证失败的提示消息
  120. * @param string $name 需要验证的字段名称
  121. */
  122. static function unique($value, $msg, $rules, $name) {
  123. if(self::$db->where("$name='$value'")->total() > 0){
  124. self::$msg[]=$msg;
  125. self::$flag=false;
  126. }
  127. }
  128. /**
  129. *非空验证
  130. * @param string $value 需要验证的值
  131. * @param string $msg 验证失败的提示消息
  132. */
  133. static function notnull($value, $msg) {
  134. if(strlen(trim($value))==0) {
  135. self::$msg[]=$msg;
  136. self::$flag=false;
  137. }
  138. }
  139. /**
  140. *Email格式验证
  141. * @param string $value 需要验证的值
  142. * @param string $msg 验证失败的提示消息
  143. */
  144. static function email($value, $msg) {
  145. $rules= "/\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/";
  146. if(!preg_match($rules, $value)) {
  147. self::$msg[]=$msg;
  148. self::$flag=false;
  149. }
  150. }
  151. /**
  152. *URL格式验证
  153. * @param string $value 需要验证的值
  154. * @param string $msg 验证失败的提示消息
  155. */
  156. static function url($value, $msg) {
  157. $rules='/^http\:\/\/([\w-]+\.)+[\w-]+(\/[\w-.\/?%&=]*)?$/';
  158. if(!preg_match($rules, $value)) {
  159. self::$msg[]=$msg;
  160. self::$flag=false;
  161. }
  162. }
  163. /**
  164. *数字格式验证
  165. * @param string $value 需要验证的值
  166. * @param string $msg 验证失败的提示消息
  167. */
  168. static function number($value, $msg) {
  169. $rules='/^\d+$/';
  170. if(!preg_match($rules, $value)) {
  171. self::$msg[]=$msg;
  172. self::$flag=false;
  173. }
  174. }
  175. /**
  176. * 货币格式验证
  177. * @param string $value 需要验证的值
  178. * @param string $msg 验证失败的提示消息
  179. */
  180. static function currency($value, $msg) {
  181. $rules='/^\d+(\.\d+)?$/';
  182. if(!preg_match($rules, $value)) {
  183. self::$msg[]=$msg;
  184. self::$flag=false;
  185. }
  186. }
  187. /**
  188. *验证码自动验证
  189. * @param string $value 需要验证的值
  190. * @param string $msg 验证失败的提示消息
  191. */
  192. static function vcode($value, $msg){
  193. if(strtoupper($value)!=$_SESSION["code"]) {
  194. self::$msg[]=$msg;
  195. self::$flag=false;
  196. }
  197. }
  198. /**
  199. *使用回调用函数进行验证
  200. * @param string $value 需要验证的值
  201. * @param string $msg 验证失败的提示消息
  202. * @param string $rules 回调函数名称,回调用函数写在commons下的functions.inc.php
  203. */
  204. static function callback($value, $msg, $rules) {
  205. if(!$rules($value)){
  206. self::$msg[]=$msg;
  207. self::$flag=false;
  208. }
  209. }
  210. /**
  211. *验证两次输出是否一致
  212. * @param string $value 需要验证的值
  213. * @param string $msg 验证失败的提示消息
  214. * @param string $rules 对应的另一个表单名称
  215. */
  216. static function confirm($value, $msg, $rules) {
  217. if($value!=self::$data[$rules]){
  218. self::$msg[]=$msg;
  219. self::$flag=false;
  220. }
  221. }
  222. /**
  223. * 验证数据的值是否在一定的范围内
  224. * @param string $value 需要验证的值
  225. * @param string $msg 验证失败的提示消息
  226. * @param string $rules 一个值或多个值,或一个范围
  227. */
  228. static function in($value,$msg, $rules) {
  229. if(strstr($rules, ",")){
  230. if(!in_array($value, explode(",", $rules))){
  231. self::$msg[]=$msg;
  232. self::$flag=false;
  233. }
  234. }else if(strstr($rules, '-')){
  235. list($min, $mix)=explode("-", $rules);
  236. if(!($value>=$min && $value <=$mix) ){
  237. self::$msg[]=$msg;
  238. self::$flag=false;
  239. }
  240. }else{
  241. if($rules!=$value){
  242. self::$msg[]=$msg;
  243. self::$flag=false;
  244. }
  245. }
  246. }
  247. /**
  248. * 验证失败后的返回提示消息
  249. */
  250. static function getMsg(){
  251. $msg=self::$msg;
  252. self::$msg='';
  253. self::$data=null;
  254. self::$action='';
  255. self::$flag=true;
  256. self::$db=null;
  257. return $msg;
  258. }
  259. }