标签归档 PHP开发

通过清心醉

PHP实现翻页

PHP-翻页

来个简单的类文件:

class.php

<?php
class Page
{
function Page_num($numrow,$default) #页面统计
{
$num=$numrow/$default;
return ceil($num);
/*
判断SQL总行数除默认一页的行数,得出有多少个页面
但就有一个问题,比如是10行,一行3个,那么得到的结果是3.33
所以使用ceil函数,将浮点类型转整型并+1,用ceil()的方法.
*/
}
function Page_on($page_on) #上一页
{
if($page_on!=0) #上一页不能=0
{
return $page_on-1; //$page的参数减1表示往回一页
}
else
{
return $page_on=0; //否则返回到第一页
}
}
function Page_next($page_next,$pagenum)
{
if($page_next<$pagenum)#后一页的数字必须小于最大值.==的话也不行.
{
return $page_next+1;
}
else
{
return $page_next=0;
}
}
}

然后是页面的文件

page.php

<?php
header(“Content-Type:text/html;charset=utf-8”); #页面编码
date_default_timezone_set(‘Asia/Shanghai’); #时区
/***********************************************/
/*
由于各人的SQL配置不一样,直接修改下面4个参数即可.
同时表内必须有name,time,text,ip这4个字段或者修改
foreach ( $pdo->query($sql1) as $row)里面的$row[“”]参数
*/
$dbname=”数据库名称”; #数据名
$dbtable=”数据表名称”; #表名
$dbuser=”root”; #MYSQL用户
$dbpassword=””; #MYSQL密码
/***********************************************/

$pdo=new PDO (“mysql:host=localhost;dbname=$dbname;charset=utf8″,$dbuser,$dbpassword);
require_once ‘class.php’; #包含所有类文件
$classpage=new Page(); #实例化页面类
$default=3; //默认页显示数量
$page=0; //页面控制
$pagecolor=1;
$sql=”SELECT *FROM $dbtable”; #获取sql行总数语句
$echotext=$pdo->prepare($sql);
$echotext->execute();
$numrow=$echotext->rowCount(); //获取数据集的行数

$pagenum=$classpage->Page_num($numrow,$default); #计算出有多少页
if (is_array($_GET)&&count($_GET)>0)//先判断是否通过GET传值了
{
if(isset($_GET[“page”])&&!empty($_GET[“page”]))
{
if(is_numeric($_GET[“page”]))#判断是否为整数或整数字符串
{
if($page<=$pagenum)
{
$pagecolor=$_GET[“page”];
$page=($pagecolor-1)*$default;
/*把值重新赋予给页面数
获取的页面为什么要-1?
比如页面是2,数据库是从第4行开始,+3,即4-6行的数据
如果值是(2-1)*3=3;(3-1)*3=6
即一页3个的话
page=2即读取第四行开始
page=3即读取第七行开始
*/
}
}
}
}
$sql1=”SELECT *FROM $dbtable limit $page,$default “;
#如果if (is_array($_GET)&&count($_GET)>0)语句里的没被执行,那么将会执行初始值$page=0,$default=3;
foreach ( $pdo->query($sql1) as $row)
{
#如果不设置字段,这修改字段参数
echo $row[“name”].”</br>”;    echo $row[“time”].”</br>”;
echo $row[“text”].”</br>”;    echo $row[“ip”].”</br>”;
echo “—————–我是分割线哦—————–</br>”;
}
//$page_on=$classpage->Page_on($pagecolor,$pagenum);
//将页面的pagecolor参数传值-1,根据颜色来判断页面

echo “<a href=?page=1>首页</a> “;
if(($page_on=$classpage->Page_on($pagecolor))!=0)
{ #如果返回的结果=0(比如第一页-1=0,那么不输出前一页)
echo “<a href=?page=”.$page_on.”>前一页</a> “;
}

for($o=0;$o<$pagenum;$o++)
{
$i=$o+1; //实现0页不存在即第一页起步.
if($i==$pagecolor) #获取页面的颜色
{
echo “<a href=?page=”.$i.”><font  color=’red’>第”.$i.”页</font></a>  “;
}
else
{
echo “<a href=?page=”.$i.”>第”.$i.”页</a>  “;
}
}
if(($page_next=$classpage->Page_next($pagecolor,$pagenum))!=0)
{
echo “<a href=?page=”.$page_next.”>后一页</a> “;
}
echo “<a href=?page=”.$pagenum.”>尾页</a> “;

 

 

通过清心醉

PHP小留言板(未编写后台进行数据删除,只为练习数据安全)

新手需要源码的可以下载htdocs

首先,对于SQL的操作方式,使用的是PDO方式;

其次,转义HTML的符号.使用htmlspecialchars()方法.(也可以使用htmlentities()的方法,但该方法会把htmlentities()里面的中文乱码化.)

首先是首页:index.php

<?php
$config=”config.php”;
if(file_exists($config))
{
require_once ‘main.php’;
}
else
{
echo “<script>setTimeout(\”this.location=’install.php’\”,0);</script>”;
}

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

接着进入安装的表单install.php

<?php
header(“Content-Type:text/html;charset=utf-8”);
$config=’config.php’;
if(file_exists($config))
//如果配置文件存在,表示已经安装成功
//如果要重新安装,删除config.php文件即可.
{
echo “配置文件已存在,请删除删除config.php文件进行重新安装.”;
echo “<script>setTimeout(\”this.location=’index.php’\”,2000);</script>”;
exit;
}
$os = (DIRECTORY_SEPARATOR==’\\’)?”windows”:”linux”;
if($os==’linux’)
{
echo “<center>您的系统为linux请开启777权限,否则无法写入配置文件.</center>”;
}
?>
<html>
<title>数据库配置向导</title>
<body>
<form method=”post” action=”installsql.php”>
<table width=”400″ align=”center”>
<tr>
<td>MYSQL数据库地址:</td>
<td><input name=”adder” type=”text” size=”30″ maxlength=”500″ value=”localhost”></td>
</tr>
<tr>
<td>MYSQL数据库帐号:</td>
<td><input name=”user” type=”text” size=”30″ maxlength=”500″ value=”root”></td>
</tr>
<tr>
<td>MYSQL数据库密码:</td>
<td><input name=”password” type=”password” size=”30″ maxlength=”500″></td>
</tr>
<tr>
<td>数据库名称:</td>
<td><input name=”dbname” type=”text” size=”30″ maxlength=”500″ value=”数据库名称”></td>
</tr>
<tr>
<td>数据表名称:</td>
<td><input name=”dbtable” type=”text” size=”30″ maxlength=”500″ value=”数据表名称”></td>
</tr>
</table>
<div align=”center”>
<input type=”submit” value=”安装”>
</div>
</form>
</body>
</html>

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

进行SQL写入:

installsql.php

<?php
header(“Content-Type:text/html;charset=utf-8”);
date_default_timezone_set(‘Asia/Shanghai’);
$config=’config.php’;
if(file_exists($config))
{
echo “配置文件已存在,程序已成功安装.”;
echo “<script>setTimeout(\”this.location=’index.php’\”,2000);</script>”;
exit;
}
$hostname=$_POST[“adder”];
$sqluser=$_POST[“user”];
$sqlpassword=$_POST[“password”];
$con = mysql_connect($hostname,$sqluser,$sqlpassword);
if(!$con)
{
die(‘无法连接: ‘ .mysql_error());
exit;
}
$dbname=$_POST[“dbname”];
$dbtable=$_POST[“dbtable”];
if(!mysql_select_db($dbname,$con))
{
mysql_query(“set character set ‘utf8′”);
mysql_query(“set names ‘utf8′”);
$newdbname=”CREATE DATABASE $dbname”;
mysql_query($newdbname);
$ip=$_SERVER[“REMOTE_ADDR”];
$time=date(“Y-m-d H:i:s”);
mysql_select_db($dbname,$con);
mysql_query(“CREATE TABLE $dbtable(id int primary key auto_increment,text text(1024),name varchar(128),time varchar(64),ip varchar(32))”);
mysql_query(“INSERT INTO $dbtable (text,name,time,ip)VALUES(‘我是内容我是内容哦’,’管理员’,’$time’,’$ip’)”);
$f1='”‘;$f2=’;’;
$counter_file = ‘config.php’;
$fopen=fopen($counter_file,’wb’);
fputs($fopen,”<?php”.”\n”);
fputs($fopen,”\$dbtable=”.$f1.”$dbtable”.$f1.$f2.”\n”);
fputs($fopen,”\$pdo=new PDO (“.$f1.”mysql:host=”.$hostname.$f2.”dbname=”.”$dbname”.$f2.”charset=utf8″.$f1.”,”.$f1.$sqluser.$f1.”,”.$f1.$sqlpassword.$f1.”)”.$f2.”\n”);
fputs($fopen,”?>”);
fclose($fopen);
echo “<script>setTimeout(\”this.location=’index.php’\”,0);</script>”;
}
else
{
echo “数据库 $dbname 已存在”;
echo “</br>”;
echo “<a href=’install.php’>返回</a>”;
exit;
}

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

在看安装好后生成的PDO连接

config.php

<?php
$dbtable=”数据表名称”;
$pdo=new PDO (“mysql:host=localhost;dbname=数据库名称;charset=utf8″,”root”,””);
?>

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

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

到此基本就配置完成了,接着是前端,首页包含了require_once ‘main.php’;

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

我们看看main.php文件获取内容的方法及写入的表单

<?php
require_once ‘header.php’;
#require_once ‘footer.php’;

$sql=”SELECT *FROM $dbtable”;
$echotext=$pdo->prepare($sql);
$echotext->execute();
/*
while ($row=$echotext->fetch(PDO::FETCH_ASSOC))
{
echo $row[“id”].”</br>”;    echo $row[“name”].”</br>”;
echo $row[“time”].”</br>”;    echo $row[“text”].”</br>”;
echo $row[“ip”].”</br>”;
}
*/
?>
<table align=”center” width=”80%” border=”2″>
<?php
$o=0;
foreach ( $pdo->query($sql) as $row)
{
$o++;
?>
<tr height=”30xp”><td style=”height:80px;width:20%;” >留言内容</td><td colspan=”3″ width=”60%”><?php echo $row[“text”] ?></td></tr>
<tr><td width=”20%”>楼层</td><td width=”20%”>名字</td><td width=”20%”>时间</td><td width=”20%”>IP</td></tr>
<tr><td>第<?php echo $o; ?>楼<td><?php echo $row[“name”] ?></td><td><?php echo $row[“time”] ?></td><td><?php echo $row[“ip”]?></td></tr>
<tr><td colspan=”4″ width=”60%”><center><?php echo “*****我是分割线*****”;?></center></td></tr>
<?php
};
?>
<form method=”post” action=”wordtext.php”>
<tr><td>请输入名字</br><input name=’username’ type=’text’ size=’30’style=”width:100%;height:30px;” maxlength=’100′ value=”></td><td colspan=”3″>
<textarea  name=”word” style=”height:80px;width:100%;resize: none;” maxlength=’3000′>
</textarea></td></tr>
<tr><td colspan=”4″ align=”center”><input type=”submit” value=”我也要留言”></td></tr>
</form>
</table>

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

这里包含了一个header.php文件,其实这不需要起用sission

<?php
header(“Content-Type:text/html;charset=utf-8″);
date_default_timezone_set(‘Asia/Shanghai’);
require_once ‘config.php’;
require_once ‘class.php’; #包含所有类文件
$gotoindex=”<script>setTimeout(\”this.location=’index.php’\”,2000);</script>”;
if(!isset($_SESSION))
{
session_start(); //启用SESSION
}
?>
<marquee scrollAmount=2 width=100% onmouseover=stop() onmouseout=start()>
我的留言板</marquee></br>

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

然后看留言POST的页面:wordtext.php

<?php
require_once ‘header.php’;
if(is_array($_POST)&&count($_POST)>0)
{
if((isset($_POST[“username”])&&!empty($_POST[“username”]))&&(isset($_POST[“word”])&&!empty($_POST[“word”])))
{
$name=$_POST[“username”];    $text=$_POST[“word”];
$newword=new New_Word; #实例化留言插入数据类
if(($newword->new_word_sql($name,$text))==0) //给new_word_sql函数传值,判断返回值是否为0;
{
echo “留言成功”;echo $gotoindex;
}
else
{echo “错误!”;}
}
else
{
echo “请完整填写”;echo $gotoindex;
}
}
else
{
echo “存在空值”;
echo $gotoindex;
};
/******************************************************************/

接下来就是重点了,class.php文件是如何做安全的.

<?php
require_once ‘config.php’;
class New_Word
{
    private $username;
    private $usertext;
    function new_word_sql($name,$text) #新增留言名字和内容处理
    {
        global $pdo;
        global $dbtable;
        /*获取config.php文件里的PDO配置*/
        $ip=$_SERVER[“REMOTE_ADDR”];
        $time=date(“Y-m-d H:i:s”);
        $this->username=htmlspecialchars($name);$this->usertext=htmlspecialchars($text);
        #私有名字和留言内容进行html转义,以防出现XSS攻击漏洞.
        if((strlen($this->username)>=6&&strlen($this->username)<=20)&&(strlen($this->usertext)>=10&&strlen($this->usertext)<=200))#判断长度
           {
            $sql=”insert into $dbtable(text,name,time,ip)values(‘$this->usertext’,’$this->username’,’$time’,’$ip’)”;
               $intosql=$pdo->prepare($sql);    #sql预处理
            $intosql->execute();  #执行插入sql语句
            return 0;            
           }
           else
           {
               echo “名字要求>6,<20字符;留言要求>10,<200字符”;
            echo “<script>setTimeout(\”this.location=’index.php’\”,2000);</script>”;//exit;
           }
    }
}

通过清心醉

PHP 返回值

该方法对C++相同,只是定义变量和函数方法不同

如果用面向过程的方式写小程序,返回值可能不常用上.(起码作者自学的时候,没用过返回值.)但如果要涉及到了面向对象,程序返回值的使用是一门必须掌握的.

上一段简单的返回值介绍.(作者自学的时候也有看,网上的大部分只说返回一个值,可是却没说返回值怎么用?有什么好处?)

<?php
function myreturn($max,$min)
{
$myreturn=($max>$min)?$max:$min;
//三元运算判断最大
return $myreturn;
//返回一个最大值
}
//定义两个变量
$a=100;
$b=991;
echo “a=”.$a.”</br>”;
echo “b=”.$b.”</br>”;
echo “最大值是”.$c=myreturn($a,$b);
//这就是关键了,$c的参数=myreturn函数,同时把$a,$b两个传值进去进行比较
//然后通过return $myreturn返回的最大值赋值回给$c

通过清心醉

PHP上传图片文件方法

function uploadfile()
{
?>
<form action=”” method=”post” name=”uploadfile” enctype=”multipart/form-data”>
<center>上传文件:<input type=”file” name=”upfile” /></center><br>
<center><input type=”submit” value=”上传” /></center></form>
<?php
if(is_uploaded_file(@$_FILES[“upfile”][“tmp_name”]))
{
$upfile=$_FILES[“upfile”];    //获取上传文件数组里面的值
$name=$upfile[“name”];//获取上传文件数组里面的文件名
$type=$upfile[“type”];//获取上传文件数组里面的类型
$size=$upfile[“size”];//获取上传文件数组里面的大小
$tmp_name=$upfile[“tmp_name”];//获取上传文件数组里面的临时存放路径
switch ($type)
{//判断type类型
case ‘image/pjpeg’:$fileok=true; //$fileok的值为true(真)
break;
case ‘image/jpeg’:$fileok=true;        break;
case ‘image/gif’:$fileok=true;        break;
case ‘image/png’:$fileok=true;        break;
}
if($size>500000)
{
echo “文件过大”;echo “<script>setTimeout(\”this.location=’index.php’\”,2000);</script>”;;
exit;
}
if($fileok) //如果返回为真,执行下面代码:
{
$error=$upfile[“error”];//上传后系统返回的值
//把上传的临时文件移动到image目录下面
move_uploaded_file($tmp_name,’img/’.$name);
$destination=”img/”.$name;
echo “上传信息:<br/>”;
switch($error)
{
case 0:
echo “文件上传成功啦!”;
//如果做幻灯因为有多图片的处理,到时修改幻灯片就要根据图片的ID来WHERE指定
mysql_query(“UPDATE bbs SET bbslogo= ‘$name'”); //写入sql
echo “<script>setTimeout(\”this.location=’index.php’\”,2000);</script>”;break;
case 1:echo “超过了文件大小,在php.ini文件中设置”;echo “<script>setTimeout(\”this.location=’index.php’\”,2000);</script>”;break;
case 2:echo “超过了文件的大小MAX_FILE_SIZE选项指定的值”;echo “<script>setTimeout(\”this.location=’index.php’\”,2000);</script>”;break;
case 3:echo “文件只有部分被上传”;echo “<script>setTimeout(\”this.location=’index.php’\”,2000);</script>”;break;
case 4:echo “没有文件被上传”;echo “<script>setTimeout(\”this.location=’index.php’\”,2000);</script>”;break;
default:echo “上传文件大小为0”;echo “<script>setTimeout(\”this.location=’index.php’\”,2000);</script>”;break;
}
}
else
{echo “请上传jpg,gif,png等格式的图片!”;exit;echo “<script>setTimeout(\”this.location=’index.php’\”,2000);</script>”;}
}

}

通过清心醉

php正则表达式判断邮箱格式

class EmailType
{
private $mailtype;
function mailtype($mail)
{
$this->mailtype=$mail;
//PHP5.3版本前使用以下IF
//if(!ereg(“^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+”,$this->mailtype))
if(!preg_match(“/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/”,$this->mailtype))
//PHP5.3以后版本方法
{
echo “<script language=\”JavaScript\”>alert(\”邮箱格式不对\”);</script>”;
echo “<script>setTimeout(\”this.location=’index.php’\”,0);</script>”;exit;
}

}
}

ereg和preg_match函数的差别其实就是头尾多个/

通过清心醉

ZEND认识篇->为数据库里某个表里增加数据(未过滤及判断重复)

还是在上一篇的控制器内增加新的方法;

public function adduserAction() //添加用户
{
$user=$this->getRequest()->getParam(‘user’);
$password=$this->getRequest()->getParam(‘password’);
$adduser=array(
‘user’=>$user,
‘password’=>$password
); //为SQL的字段指定参数.
$userModel=new user();
$userModel->insert($adduser);
//将数组交给insert处理获取返回值,insert是进行写入操作.
$this->render(‘addok’);
}

因为包含有模板文件:

require_once APPLICATION_PATH.’/models/IndexModel.php’;

所以直接调用ZEND封装的Zend_Db_Table里面的方法.

更多的可以参考ZEND手册.

通过清心醉

ZEND认识篇->获取数据库里某个表里的所有数据

#测试使用ZEND框架读取MYSQL某表内的所有数据

#首先我们创建个数据库,名为qingxinzui
#然后创建user表,表内有3个字段
CREATE TABLE user(id int primary key auto_increment,name varchar(64)not null,password varchar(64)not null);
#创建自增ID(建议使用),名字,密码
然后我们配置下配置文件的MYSQL
/configs/application.ini
[mysql]
db.adapter=PDO_MYSQL
db.params.host=localhost
db.params.username=root
db.params.password=
db.params.dbname=qingxinzui

#[mysql] mysql节点开始
#db.adapter=选择PDO类型的MYSQL
#db.params.host 数据库地址
#db.params.username 用户名
#db.params.password 密码(为空即不填写)
#db.params.dbname 数据库名称

我们默认使用index控制器来操作.

既然是使用框架,那么模板也就必须有那么一个对index控制器进行数据动作的文件
models目录下创建个IndexModel.php文件
写入以下代码:
class user extends Zend_Db_Table
{
#类的名字对应user数据库的user表名
#可以使用对该表的所有操作(由于继承了Zend_DB_Table)
protected $_name=’user’; //关联的表名
//protected $_primary=’id’;
//主键为id,如果创建表的时候有设置id为主键,可以不写
}
require_once APPLICATION_PATH.’/models/IndexModel.php’;
#在index控制器内别忘记了包含模板文件

同时:
init()函数是调用该控制器时自动执行,为了以后我们能更方便的管理
我们可以新增一个控制器,命名为:DbmysqlController.php(记得在controllers目录下创建)

class DbmysqlController extends Zend_Controller_Action
{
public function init()
{
/* Initialize action controller here */
$url=constant(“APPLICATION_PATH”).DIRECTORY_SEPARATOR.’configs’.DIRECTORY_SEPARATOR.’application.ini’;
$dbconfig=new Zend_Config_Ini($url,”mysql”); //读取mysql开始的节点
$db=Zend_Db::factory($dbconfig->db);//
$db->query(‘SET NAMES UTF8’);
Zend_Db_Table::setDefaultAdapter($db);
}
}
#然后在index控制器里面包含进来,这样我们其他需要用到数据连接的控制器
#直接把DbmysqlController.php包含进来就可以了.
require_once ‘DbmysqlController.php’;
#同时修改下Index控制器继承的类为 DbmysqlController
class IndexController extends DbmysqlController
{
#DbmysqlController已经继承Zend_Controller_Action控制器的方法
public function indexAction()
{
$userModel=new user(); //模板文件里已经定义要操作的表名了.
$rs=$userModel->fetchall()->toArray(); //返回数组
/*
在这里可能会很奇怪,系统怎么会知道我们要操作哪个数据库呢
其实在DbmysqlController里,读取了配置文件,已经知道哪一个
然后我们在模板里设置了一个protected $_name=’user’; //关联的表名
所以直接提取的是当前表的所有数据
ZEND框架已经封装好了这些属性.
*/
$this->view->rs=$rs;
#给当前对象的view视图生成一个属性rs,参数为数据库返回的数组
$this->render(‘index’);
}
}
#到此为止,已经获取了数据名,表名及把每行记录返回到数组$rs里了.
#我们在index.phtml视图文件中显示出来.
<?php
foreach ($this->rs as $user)
{
echo $user[‘id’].$user[‘user’].$user[‘password’].”</br>”;
}
?>

#rs数组属性的变量名取为user
输出数组属性的id,user,password数值.

到此,一个简单的使用ZEND框架获取数据库某表内的数据就简单完成了.

#注layouts里面为布局文件,别把layout.phtml文件删除,否则将不能正常显示.

通过清心醉

ZEND框架设置字符编码

ZEND框架默认的字符集是GBK,这样在测试中文的时候就会显示乱码

菜单栏里设置下

编辑->设置编码

Edit->set encoding

修改为UTF-8就可以了.

但这样只是当前的页面为UTF-8,我们需要以后新增的文件全部为UTF-8格式.

窗口->首选项->常规->工作空间里面有个文本文件编码,缺省值是GBK,修改为UTF-8即可.

window->preference->General->workspace

通过清心醉

ZEND认识篇->MVC的执行结构及编写自己的一个简单控制器

首 先必须开启apache的riterule功能,具体的可以GOOGLE。

比如作者的测试环境,默认目录为C:\xampp\htdocs 做为ZEND框架的主目录(同时也为apache的WEB根目录)

创建好了ZEND框架并且复制了ZEND库文件到library.

由于访问的是htdocs目录,但这目录内并没有index.php等引导文件。我们自己新建一个index.php文件

写入以下代码:

<?php

Header(“Location: /public/index.php”); #实现跳转到public目录下的index.php

?>

上一篇作者已经说了如何的创建自己的ZEND框架环境。

现在我们要来实现一个自己的MVC的简单功能。(其实只是VC视图和控制器,简单开始嘛)

基本执行流程:

通过riterule机制,给予访问的页面转到index.php

#htodcs/public/index.php

index.php里执行了一些基本的初始化工作之后

实例化了一个$application = new Zend_Applicatio

在这里包含了配置文件APPLICATION_PATH . ‘/configs/application.ini’

$application调用bootstrap()->run();

跳转到了Bootstrap.php

然后交给控制器IndexController.php

执行了indexAction()函数 #默认被执行了

调用/viesw/scripts/index.phtml视图

控制器的命名方法及规法:

比如要新增一个控制器text

Controllers文件夹里增加一个textController.php 文件

#在这主意,控制器的命名为<名称>+<Controller>

然后我们来编写text控制器的方法:

<?php

#在这里必须继承Zend_Controller_Action,否则该类就会被认为只是一个普通的类而不是控制器

class textController extends Zend_Controller_Action

{

public function init(){

#默认自动调用方法   可以写一个MYSQL连接类继承  Zend_Controller_Action来实现MYSQL连接的初始化等工作。

}

public function loginAction() #后面的Action不可少。

{

#自己的登录函数

$this->render(“login”);

#找到当前text控制器视图=text里文件为login的文件

#说白点就是include””;只是不需要自己加后缀和路径

#具体render函数可以选择后按F3查看

}

}

?>

然后我们还要有个视图,用来显示登录成功。

views/scripts加个文件夹,取名为text#必须和控制器名相同

在这text文件夹里面就是专门放text+Controller这个控制器对应的视图

我们在/views/scripts/text目录下增加个login.phtml视图文件(视图文件可以为php.html等)

我们来增加内容:

<h1>登录成功</h1>

如果没配置根目录index.php跳转,可以使用

127.0.0.1:88/public/text/login方式来访问。是可以正确的打开的。

这样,一个属于我们自己的简单控制器就起来了。

通过清心醉

ZEND开山篇->创建一个ZEND框架

作者以Zend Studio 10.6.2版本为例

文件->新建->示例

1

2

完成之后,在E:\XAMPP\HTDOCS\会多一个ZEND的目录(根据自己的情况而定项目路径)

左边会出现项目所有文件

3

然后我们把ZEND库文件放进来.

直接把ZendFramework\library\zend目录拷贝到

当前ZEND框架项目里的library

如作者的目录是在E:\xampp\htdocs\zend\library

 

4

 

这时候如果我们直接访问127.0.0.7/zend

注:因为zend是在htdocs目录下,本机的APACHE主目录为htdocs

5

因为在目录内没有index.php文件,所以是没有经过控制器等跳转.

好了,到此一个简单的ZEND框架就基本上算构建成功了.

由于版本不同,为了能适应不同版本的Zend Studio

也可以执行命令来创建 #注: 需要添加PHP到环境变量

不懂的可以参考

Windows添加php环境变量

Linux添加php环境变量

当然大家不同的php目录,根据自己的来做小修改即可.

命令 进入ZendFramework\bin目录

执行:

zf.bat create project E:/xampp/htdocs/zend

用命令创建一个zend项目,由于作者使用的仍是1.12版本,ZEND现在已经出了2.x的版本了,建议下载新版来使用.

 

通过清心醉

php-mysql 创建自增ID字段

<?php
$conn=mysql_connect(“127.0.0.1″,”root”,””); //连接MYSQL数据库变量
mysql_select_db(“bdname”); //选择数据库
$sql=”CREATE TABLE user(id int primary key auto_increment,name varchar(64)not null,password varchar(64)not null,text varvhar(256) not null)”;
//创建字段,id int primary key auto_increment就是创建一个主键自增的ID字段
mysql_query($sql,$conn);
$sql1=”INSERT INTO user(name,password,text)VALUES(‘name’,’password’,’mytext’)”;
//增加一行数据,这就不再需要进行ID值的设置了.
mysql_query($sql1,$conn);
?>

通过清心醉

SMTP密码找回使用之URL格式邮件发送思路

上文作者说了
生成随机数进行MD5加密后变成验证码发送给申请找回密码的邮箱
这样用户又要进入找回密码的地方输入,其实还有一个比较实用,也是现在比较多在用的
当然作者只是小猜测,安全系数未知
先来说说思路吧:
同样,用户申请找回密码的时候
生存随机数,一样可以进行MD加密,不过这个公式自己考虑哦
比如生成3组随机数,头尾两组进行MD5加取前6位(或者更多,建议别太长,因为是GET方式),中间的为随机的默认值
然后把这3组随机数合并成一个字符串变量保存到SQL;
至于判断是否重复和上面的方法是一样的.
然后把这3组随机数合并的变量字符串发送到用户邮箱
注:URL的获取,比如本地测试是127.0.0.1/
可以在系统的时候截获URL参数,比如是用域名形式http://www.qingxinzui.com 这种形式安装的
截获该URL保存到数据库的BBS表的某字段(自行添加)

格式比如为:
你在清心论坛申请找回密码功能,请点击此URL来进行密码修改
“http://”.$url.”/”.”password=”.$randid; //URL为截获的,RANDID为验证码
在这里是实现了验证码为URL 直接就可以修改了.所以加密形式要多多考虑
这很明显,GET的方式传递password=$randid,在首页(主要在MAIN.PHP页面)
增加一个if判断是否存在$_GET[“password”]
然后执行下SQL语句
查看找回密码申请的字段里是否存在和$_GET[“password”]一样的验证码
如果有就输出修改新密码的表单
如果不存在,即可以返回个404错误页面或者直接返回主页.

由于邮件中带URL容易被过滤,所以作者就没去写实际代码了,思路就在这,有需要的朋友不懂的朋友可以留言

通过清心醉

自写小论坛更新: 增加邮件申请密码找回功能

#VER 2.0 htdocs
更新功能:
1:增加邮件找回密码功能,同时修改注册邮箱为唯一参数;
2:增加过滤函数,用户可自定过滤的文字,下次改版将修改为MYSQL保存敏感字符,因为放在TXT文件可被直接访问.
而且如果放PHP文件里修改比较麻烦.

首先增加两个表:
forgotpassword //找回密码数据表
adminforgotpassword //SMTP服务器连接参数 //忘记把表名取名SMTP了,不管了先

adminforgotpassword表字段包含:
ID,SMTP服务器,SMTP端口,SMTP邮箱,SMTP用户(部分可能就是邮箱),SMTP用户密码

forgotpassword表字段包含:
ID,需要找回密码的EMAIL,验证码RANDID,找回时间:TIME,操作IP

首先说说后端设置SMTP服务器::
admin_shell_table()函数里增加一个操作选择.
<td><a href=”admin_shell.php?adminshellid=5″>SMTP管理</a></td>
这里可以看到,GET请求到admin_shell.php并且adminshellid的参数为5

我们来看admin_shell.php:
case 5: //进入SMTP管理
$shell=$bbs_system->admin_smtp(); //调用了ADMIN_SMTP函数,其实就是一个表单
/**********SMTP控制实现**********/
function admin_smtp()
{
$smtp=”SELECT *FROM adminforgotpassword”;
$tempsmtp=mysql_query($smtp);
while($row=mysql_fetch_object($tempsmtp))
{
?>
<div class=”contacts”>
<form method=”post” action=””>
<table>
<tr>
<td>SMTP服务器:</td>
<td><input name=”smtpserver” type=”text” size=”30″ maxlength=”500″ value=”<?php echo $row->smtpserver;?>”></td>
</tr>
<tr>
<td>SMTP端口:</td>
<td><input name=”smtpserverport” type=”text” size=”30″ maxlength=”500″ value=”<?php echo $row->smtpserverport;?>”></td>
</tr>
<tr>
<td>SMTP邮箱:</td>
<td><input name=”smtpusermail” type=”text” size=”30″ maxlength=”500″ value=”<?php echo $row->smtpusermail;?>”></td>
</tr>
<tr>
<td>SMTP用户(可为邮箱):</td>
<td><input name=”smtpuser” type=”text” size=”30″ maxlength=”500″ value=”<?php echo $row->smtpuser;?>”></td>
</tr>
<tr>
<td>SMTP密码:</td>
<td><input name=”smtppass” type=”password” size=”30″ maxlength=”500″ value=”<?php echo $row->smtppass;?>”></td>
</tr>
</table>
<div align=”center”><input type=”submit” name=”admin_smtp” value=”修改”></div>
</form>
<?php
}
}
因为这时候我们是在admin_shell.php把表单调用了出来,所以当填写了之后,POST的数据在admin_shell.php文件里再一次提取
if(isset($_POST[“admin_smtp”])&&isset($_POST[“admin_smtp”])) //接收的如果是admin_smtp函数
{
$smtppost=array($_POST[“smtpserver”],$_POST[“smtpserverport”],$_POST[“smtpusermail”],$_POST[“smtpuser”],$_POST[“smtppass”]); //数组化SMTP的所有参数
$filtration->filtration($smtppost); //判断是否存在过滤字符
$bbs_system->textlong($smtppost); //判断所有参数的长度.
$bbs_system->mailtype($_POST[“smtpusermail”]); //独立判断邮箱格式//用户名也可以为邮箱,暂不做判断了.
$bbs_system->admin_smtp_sql($_POST[“smtpserver”],$_POST[“smtpserverport”],$_POST[“smtpusermail”],$_POST[“smtpuser”],$_POST[“smtppass”]);//传值 //其实SMTP应该放一个文件里,但懒的改了.
}
在这里我们主要看看admin_smtp_sql函数,前面的几个只是判断的函数,具体的可在CLASS.PHP文件里查看.
function admin_smtp_sql($smtpserver,$smtpport,$smtpmail,$smtpuser,$smtppass)
{ //接受SMTP数据
$server=$smtpserver;$port=$smtpport;$mail=$smtpmail;
$user=$smtpuser;$pass=$smtppass;
$sql=”UPDATE adminforgotpassword SET smtpserver=’$server’,smtpserverport=’$port’,smtpusermail=’$mail’,smtpuser=’$user’,smtppass=’$pass'”;
mysql_query($sql);
echo “<script language=\”JavaScript\”>alert(\”修改成功\”);</script>”;
echo “<script>setTimeout(\”this.location=’admin_shell.php?adminshellid=5’\”,0);</script>”;
}
至于更多判断端口是否为25,465等等,只需要自己写个小函数然后对POST的参数判断是否放行就可以了,
作者就不再一一写出,当然,后期会加上.

这样一来,后端修改SMTP服务参数的后端控方法就有了
我们再来看看前端,当用户在登陆的时候忘记了密码,点找回密码
会跳转到forgot_password.php文件.

 

<?php

//首先肯定是要判断有无$_POST的数据,如果存在这3个参数,表示用户是在修改新密码,(已获取验证代码)

if(isset($_POST[“email”])&&!empty($_POST[“email”])&&isset($_POST[“randid”])&&!empty($_POST[“randid”])&&isset($_POST[“newpassword”])&&!empty($_POST[“newpassword”])) //如果存在以上3个参数表示为忘记密码修改.
{
$textlong1=array($_POST[“email”],$_POST[“randid”],$_POST[“newpassword”]); //数组化
$filtration->filtration($textlong1);//判断是否包含非法文字
$bbs_system->mailtype($_POST[“email”]); //单一验证email格式
$bbs_system->textlong($textlong1); //把数组传递给textlong函数判断字符是否过长
//本想在该函数里返回数组给其他函数执行判断的,但考虑文本还是留给其他文本判断吧,
$bbs_system->email_password($_POST[“email”],$_POST[“randid”],$_POST[“newpassword”]);
//把过滤了非法文字和验证邮箱格式的3个POST参数交给email_password函数处理.
}

if(isset($_POST[“email”])&&!empty($_POST[“email”])&&!isset($_POST[“randid”])) //否则获取验证代码.
{
//如果只有一个EMAIL的参数,因为上面也会有,避免被调用出来,所以判断必须没有RANDID的验证码
$forgotpassword=array($_POST[“email”],$_POST[“submit”]);
$bbs_system->mailtype($_POST[“email”]); //单一验证email格式
$filtration->filtration($forgotpassword); //验证是否包含非法文字
$emailrand=$bbs_forgotpassword->forgotpass($_POST[“email”]); //获取邮箱数据库验证的随机验证码
echo “<script>setTimeout(\”this.location=’index.php’\”,0);</script>”;
}
else
{
//如果以上两条件不存在,输出表单
?>
<form method=”post” action=””>
<table width=”400″ align=”center”>
<tr>
<td>如果没有验证码请先输入您的邮箱::</td>
<td><input name=”email” type=”text” size=”30″ maxlength=”500″></td>
</tr>
</table>
<div align=”center”><input type=”submit” name=”submit” value=”获取验证码”></div>
</table>
</form>

</br></br></br>
<form method=”post” action=””>
<table width=”400″ align=”center”>
<tr><td>如果有验证码请在以下表单填写(暂时不进行代码简写了.)</td></tr>
<tr>
<td>请输入您的邮箱::</td>
<td><input name=”email” type=”text” size=”30″ maxlength=”500″></td>
</tr>
<tr>
<td>请输入您的验证码::</td>
<td><input name=”randid” type=”text” size=”30″ maxlength=”500″></td>
</tr>
<tr>
<td>请输入您的新密码::</td>
<td><input name=”newpassword” type=”text” size=”30″ maxlength=”500″></td>
</tr>
</table>
<div align=”center”><input type=”submit” name=”submit” value=”修改密码”></div>
</table>
</form>
</div>
<?php
}
?>

上面的代码有两个方法:1是生成验证码,2是通过验证码修改密码.
我们先看看验证代码是如何生成的:
$emailrand=$bbs_forgotpassword->forgotpass($_POST[“email”]);我们把值传递给forgotpass函数
其原型是:

private $email;
private $randid;
function forgotpass($email) //在这接收了用户的邮件,
{
$this->email=$email; //邮件赋值
$sql=”select * from admin where mail=’$this->email’ and yesno=’1′”;
//找回密码的时候,必须验证用户是否是为通过审核的.
$rs=mysql_query($sql);
if(mysql_num_rows($rs)!=0)
{//如果存在找回的邮箱并且是通过审核的,
//开始创建随机数
$temprandid=md5(rand(1,1000000)); //随机数=md5过后的1~1000000
//在这特别说下,使用MD5之后的随机数,就算别人想暴力破解,也需要很大的难度,1-1000000的MD5码前6位,挺复杂的.
$this->randid=substr($temprandid,0,6); //提取MD加密后的字符串的前6位赋值给$randid
#这里增加一个方法,判断找回密码邮件里是否存在当前要找回密码的邮箱字段,有则提示重复.
$sql1=”SELECT * FROM forgotpassword where email=’$this->email'”;
$rs1=mysql_query($sql1);
if(mysql_num_rows($rs1)!=0)
{//如果找回密码里的确存在,那么判断时间的大小,超过30分钟的话删除旧的,并且重新生成.
$time=date(“Y-m-d H:i:s”);
$tempemail=mysql_query($sql1); //提取当前找回邮件的时间
while($row=mysql_fetch_object($tempemail))
{
$t=$row->time; //获得验证码生成时间.
}
$o=strtotime($time)-strtotime($t);
//strtotime()函数将任何英文文本的日期时间描述解析为 Unix 时间戳
if($o>1800) //如果SQL找回密码里的当前用户时间大于半小时,自动清除并跳出.
{
$delsql=”delete from forgotpassword where email=’$this->email'”;
mysql_query($delsql); //删除当前密码找回记录并跳出,执行后面的重新创建
}
else
{
//时间还没超过1800秒,重复提交禁止通过
echo “<script language=\”JavaScript\”>alert(\”错误::\\n重复找回\\n\”);</script>”;
echo “<script>setTimeout(\”this.location=’index.php’\”,0);</script>”;
exit;
}
}
$sql1 = mysql_query(“select max(id) sqlmaxid from forgotpassword”);
while($sqlmaxid = mysql_fetch_object($sql1)) //读取最大userid值得
$tempmaxid = $sqlmaxid->sqlmaxid; //提取最大id
$insqlmaxid=$tempmaxid+1; //最大id+1
$time=date(“Y-m-d H:i:s”);$ip=$_SERVER[“REMOTE_ADDR”];
mysql_query(“INSERT INTO forgotpassword(id,email,randid,time,ip)
VALUES(‘$insqlmaxid’,’$this->email’,’$this->randid’,’$time’,’$ip’)”);
return $this->sendmailto($this->email,$this->randid);//返回收信人和随机数(邮件内容)给sendmailto函数
}
else
{
//否则输出该邮箱不存在
echo “<script language=\”JavaScript\”>alert(\”邮箱不存在\”);</script>”;
echo “<script>setTimeout(\”this.location=’index.php’\”,0);</script>”;exit;
}
}

到这里,如果用户找回密码申请成功,SQL里就有了验证码,申请的邮箱等记录了
接下来要做的,就是要把验证码发送到申请的邮箱
所以有上面的代码有这么一句:
return $this->sendmailto($this->email,$this->randid); //把申请邮箱和验证码返回给sendmailto函数
我们看看该函数:

function sendmailto($mailto,$mailbody) //接受教育收件人和验证码
{
$sql=”SELECT *FROM adminforgotpassword”;
$tempsql=mysql_query($sql); //sql语句
while($row=mysql_fetch_object($tempsql)) //提出后端设置的SMTP服务器参数
{
$smtpserver=$row->smtpserver; //SMTP服务器
$smtpserverport=$row->smtpserverport; //SMTP服务器端口
$smtpusermail=$row->smtpusermail; //SMTP服务器的用户邮箱
$smtpuser=$row->smtpuser; //SMTP服务器的用户帐号
$smtppass=$row->smtppass; //SMTP服务器的用户密码
}
$mailsubject=”修改密码验证码”; //邮件主题
$this->smtpemailto=$mailto; //收件人
$this->mailbody=”请在网站找回密码处输入该验证码:”.$mailbody; //邮件内容,在这里加上了验证代码
$mailsubject=”=?UTF-8?B?” . base64_encode($mailsubject) . “?=”; //防止乱码
$mailtype=”HTML”; //邮件格式为HTML.建议不用TXT,部分邮箱不支持.
echo “<script language=\”JavaScript\”>alert(\”验证码已发送\\n请在30分内修改密码\\n\”);</script>”;
require_once (“sendmail.php”);
//提示发送成功,本来这个要放在SENDMAIL文件里的,但由于SMTP是别人写的,作者只保证能正常调用就是
//不再进行他人的SMTP类进行修改
$smtp = new smtp($smtpserver, $smtpserverport, true, $smtpuser, $smtppass);
//这里面的一个true是表示使用身份验证,否则不使用身份验证.
$smtp->debug= true; //是否显示发送的调试信息
$smtp->sendmail($this->smtpemailto, $smtpusermail, $mailsubject, $this->mailbody, $mailtype);
//把参数返回给sendmail函数处理.
}

前面说了:
//首先肯定是要判断有无$_POST的数据,如果存在这3个参数,表示用户是在修改新密码,(已获取验证代码)
回看这一句:
$bbs_system->email_password($_POST[“email”],$_POST[“randid”],$_POST[“newpassword”]);
用户输入邮箱,验证码,新密码的时候,提交给email_password函数处理

private $email_password_mail;
private $email_password_randid;
private $email_password_newpassword;
//作者定义了三个私有的数据成员来接收参数
function email_password($mail,$randid,$newpassword)
{
$this->email_password_mail=$mail;
$this->email_password_randid=$randid;
$this->email_password_newpassword=$newpassword;
$sql=”select * from forgotpassword where email=’$this->email_password_mail'”;
//首先判断输入的EMAIL在找回密码字段是否存在
$rs=mysql_query($sql);
if(mysql_num_rows($rs)!=0) //如果存在表示的确有收到用户申请找回密码的申请
{
$time=date(“Y-m-d H:i:s”); //获得当前时间
$tempemail=mysql_query($sql); //再一次执行SQL,不过现在是要提取出数据
while($row=mysql_fetch_object($tempemail))
{
$e=$row->email;$i=$row->randid;$t=$row->time; //获得邮件用户,验证码,时间.
}
$o=strtotime($time)-strtotime($t); //判断找回的时间差
//strtotime为计算时间,具体GOOGLE
if($o>1800) //由于时间是以秒计算,判断是否超时
{
//如果时间超过30分钟,达到找回密码的最大时间,删除该条找回密码申请
$delsql=”delete from forgotpassword where email=’$this->email_password_mail'”;
mysql_query($delsql); //删除当前密码找回记录
echo “<script language=\”JavaScript\”>alert(\”超过时间限制\”);</script>”;
echo “<script>setTimeout(\”this.location=’index.php’\”,0);</script>”;
exit; //退出脚本
}
if($i!=$this->email_password_randid) //判断验证码是否正确.
{ //如果还在时间内,判断用户输入的验证码和数据库里的是否不相同
echo “<script language=\”JavaScript\”>alert(\”验证码出错\”);</script>”;
echo “<script>setTimeout(\”this.location=’index.php’\”,0);</script>”;
exit; //退出
}
//如果时间在范围内,验证码为真
$newpassword=md5($this->email_password_newpassword);//将用户输入的新密码进行MD5加密
$sql=”UPDATE admin SET password=’$newpassword’ WHERE mail=’$this->email_password_mail'”;
//指定用户的邮箱更新用户的密码SQL
mysql_query($sql);//执行修改当前邮箱的用户的密码,切记要使用MD5
$delsql=”delete from forgotpassword where email=’$this->email_password_mail'”;
//同时删除该用户申请找回密码的记录
mysql_query($delsql);
echo “<script language=\”JavaScript\”>alert(\”密码修改成功\”);</script>”;
echo “<script>setTimeout(\”this.location=’index.php’\”,0);</script>”;

}
else
{
echo “<script language=\”JavaScript\”>alert(\”您输入错误或者不存在\”);</script>”;
echo “<script>setTimeout(\”this.location=’index.php’\”,0);</script>”;exit;
}
}

很多SQL语句作者没用IF来判断是否会出错,如果是自学的问题多了,可以先用IF判断MYSQL_QUERY()是否正常执行
作者自学就是这么起来的,当更了解PHP+MYSQL之后,基本只需要查看传递的参数和语句命令就可以了.

好了,到此,一个简单的邮件找回就可以了.

通过清心醉

PHP静态方法使用实例

<?php
class Max_if
{
public static function Max($num1, $num2) {
return $num1 > $num2 ? $num1 : $num2; //判断大小
} //静态方法MAX
public static function Max2($num1, $num2, $num3) {
$a = self::Max($num1, $num2); //判断12的参数大小 self为调用静态方法/成员.
$b = self::Max($num2, $num3); //判断23的参数大小
$c = self::Max($a, $b); //在判断上面两句的$
return $c; //判断的最大值返回
} //静态方法MAX2
}
/*赋值*/
$a = 100; $b = 101;$c = 99;
echo “显示 $a $b $c 中的最大值是<br />”;
echo Max_if::Max2($a, $b, $c); //对静态方法直接调用,方法格式为类名::方法/成员
//对应传值给$num1 2 3
?>

通过清心醉

PHP过滤所有$_POST数据

过滤所有$_POST

首先假设我们有个form表单,并且以POST的类型把数据提交到服务器,比如接收form表单数据的PHP页面

if(is_array($_POST)&&count($_POST)>0)
{
if((isset($_POST[“user”])&&!empty($_POST[“user”]))&&(isset($_POST[“password”])&&!empty($_POST[“password”])))
{
$i=$_POST[“user”];$o=$_POST[“password”]; //我们假设POST过来user和password两个参数,然后下面是作者写的小函数,可以在接收有POST的数据上增加
/***************调用开始*******************/
$login=array($i,$o,);//把POST的数据数组化,你有多少POST的数据要过滤就增加多少个.
require_once(“filtration.php”); //包含过滤文件
$filtration->filtration($login);  //调用过滤函数,并且把数组传递给filtration的数组参数.
/***************调用结束*******************/
echo “无过滤字符号,成功登陆”; //过滤之后的响应方法
}
else
{
echo “请完整输出”;exit;
}
}

让我们来看看filtration.php的文件:

<?php
header(“Content-Type:text/html;charset=utf-8”);
error_reporting( E_ALL&~E_NOTICE ); //除去 E_NOTICE 之外的所有错误信息
class Filtration
{
private $str=array();//私有数组成员,用于接收POST的数组
function filtration($arrayfiltration=array()) //过滤函数,带一个数组变量$arrayfiltration,
{
$this->str=$arrayfiltration; //函数的$arrayfiltration数组接收POST的数组传值给私有数组$str
$str1=array(
‘过滤1′,’过滤2’,
‘过滤3′,’过滤4’,
‘过滤5′); //需要过滤的数值
$arraystr=count($this->str); //判断POST过来的数组有多少个元素
for($o=0;$o<$arraystr;$o++) //根据POST过来的数组数量进行循环判断
{
for($i=0;$i<count($str1);$i++) //根据预定义的过滤数组进行循环
{
$j=substr_count($this->str[$o],$str1[$i]); //根据POST的数组元素数量执行$this->str和预定义的过滤数组$str1
/*
这比等于for一次循环是根据POST的元素数量来执行,POST多少个执行多少次
然后$o++表示执行的次数字+1,一直到等于POST的元素数量的时候中指。
然后,每执行一次$this->str[$o],调用一次POST过来的数组的数据,然后在进行for二次循环
对定义的过滤数组循环判断。直到所有的过滤数组都完成,跳出for二次循环
在判断一次循环的for条件(即POST的数组数量是否达),如果还有次数,对POST过来的数组的其他元素
以+1的方式,再一次进行二次for循环。直到一次循环完成。
*/
if($j>0) //只要有一条如果条件为真
{
echo “出现非法字符”;exit; //中止脚本。
}
}
}
}
}
$filtration=new Filtration(); //实例化对象。
?>

 

如果是用文件来过滤的话: 新增一个文件filtration.txt,写入要过滤的内容,以行为单位,然后PHP修改为:

<?php
header(“Content-Type:text/html;charset=utf-8”);
error_reporting( E_ALL&~E_NOTICE ); //除去 E_NOTICE 之外的所有错误信息
class Filtration
{
private $str=array();//私有数组成员,用于接收POST的数组
function filtration($arrayfiltration=array()) //过滤函数,带一个数组变量$arrayfiltration,
{
$this->str=$arrayfiltration; //函数的$arrayfiltration数组接收POST的数组传值给私有数组$str
$file=’filtration.txt’;//过滤文件
$openfile=file_get_contents($file); //执行打开文件并读入到字符串
$str1=explode(“\r\n”,$openfile); //获取数组”\r\n”表示是换行
$arraystr=count($this->str); //判断POST过来的数组有多少个元素
for($o=0;$o<$arraystr;$o++) //根据POST过来的数组数量进行循环判断
{
for($i=0;$i<count($str1);$i++) //根据预定义的过滤数组进行循环
{
$j=substr_count($this->str[$o],$str1[$i]); //根据POST的数组元素数量执行$this->str和预定义的过滤数组$str1
if($j>0) //只要有一条如果条件为真
{
echo “出现非法字符”;exit; //中止脚本。
}
}
}
}
}
$filtration=new Filtration(); //实例化对象。
?>

如果是从文本读入,第一行请留空,否则第一行是无法过滤的.

如果是MYSQL里存放过滤数据的话,一样循环读入到数组

并且修改$str1的值=mysql里获取的数组数据.就可以进行判断了.

通过清心醉

PHP $this传递对象

<?php
class B_
{
private $a; //定义私有$a
function cout()
{
$this->a=new A_(); //$this->a//也就是$a对象=A_类
$this->a->main1(); //调用A_类的main1()函数
}
}
class A_
{
function main1()
{
echo “mail1”;
}
}
$b=new B_(); //实例B_类
$b->cout(); //调用B_类的cout函数
?>

通过清心醉

PHP自写论坛检测结果

小论坛文章介绍:http://www.qingxinzui.com/?p=1162

拿去安全检测了下,发现不安全的还蛮多的.

具体看图.

jiance

[高危]跨站脚本攻击漏洞::

xiufu1

[高危]SQL注入漏洞(盲注)1::2::

xiufu2

[警告]页面异常导致本地路径泄漏1::2::3::

xiufu3

[轻微]SQL注入漏洞1::2::

xiufu4

[轻微]发现服务器启用了TRACE Method

这个就是比较简单的了.也是比较容易见的.

xiufu5

至于前面的,都是对POST的数据未进行过滤的关系,由于作者都是自编自写,疏忽造成.

方法思路其实也很简单,

新建个php文件,包含在有表单的地方,在这文件里对所有POST和GET的数据进行判断过滤.

我们看看论坛放线上服务器的效果吧.

xiufu

 

[警告]页面异常导致本地路径泄漏
如果是PHP应用程序/Apache服务器,可以通过修改php脚本、配置php.ini以及httpd.conf中的配置项来禁止显示错误信息:
修改php.ini中的配置行: display_errors = off
修改httpd.conf/apache2.conf中的配置行: php_flag display_errors off
修改php脚本,增加代码行: ini_set(‘display_errors’, false);[高危]跨站脚本攻击漏洞
避免XSS的方法之一主要是将用户所提供的内容输入输出进行过滤,许多语言都有提供对HTML的过滤:
可以利用下面这些函数对出现xss漏洞的参数进行过滤
PHP的htmlentities()或是htmlspecialchars()。

[高危]SQL注入漏洞(盲注)

1.在网页代码中需要对用户输入的数据进行严格过滤。
2.部署Web应用防火墙
3.对数据库操作进行监控

建议过滤用户输入的数据,切记用户的所有输入都要认为是不安全的。

[轻微]SQL注入漏洞
如下一些方法能够防止注入攻击:
1.在网页代码中需要对用户输入的数据进行严格过滤。
2.部署Web应用防火墙
3.对数据库操作进行监控

作者这几天抽个时间,写个字符过滤吧.到时一并附上.

 

 

 

通过清心醉

PHP类和对象类的继承及重写(方法重写)

<?php
class  A_class //基类A_class
{
protected  $Number = 2; //定义个保护的成员.
//封装的属性
public function getNumber()
{
return $this->Number; //返回值=protected  $Number的参数
}
public function  main1()
{
return  “基类的方法1”;
}
public function  main2()
{
return  “基类的方法2”;
}
}
$classa = new A_class(); //实例化
echo “A_class基类有”.$classa->getNumber().”个方法 </br>”; //这时会调用return $this->Number;
echo $classa->main1().”</br>”.$classa->main2();echo “</br></br>”;

class B_class extends A_class //A_class的派生类B_class
{
private $name = “子类专有::”; //定义私有成员
public function getName()
{
return $this->name;
}
public function main1() //对main1()函数进行重写.
{
return  $this->name.”子类对基类的方法重写”;
}
public function text()
{
return  “子类自己的方法”;
}
}
$classb = new B_class();//实例化
echo $classb->getName().”B_class子类有”.$classb->getNumber().”个方法</br>”;
//调用派生类的getName()和基类的getNumber()
echo $classb->main1().”</br>” ;
//调用派生类的main1()
echo $classb->main2().”</br>”;
//调用基类的main2()
echo $classb->text();
//调用派生类自己的函数text()

/*
可以这么说:子类可以继承基类的protected保护和public公有的类型,
同时可以自己有新的方法.至于重写:比如文中所说的main1()
基类已经有了,可派生类重写这个函数,
所以当$classb->main1()调用的时候,调用的是派生类的main1()函数

重写方法与访问权限
子类中的覆盖方法不能使用比父类中被覆盖方法更严格的访问权限。
*/
?>

通过清心醉

PHP自写论坛

这一个星期闲着无聊没事做,故以自己的一套思路开发了一个小论坛程序.

先来说说功能吧

一::后台安装后,自动生成admin管理员帐号密码.

二::前端用户注册,进入审核状态,MYSQL里有个yesno的字段,用于判断是否审核通过,登陆时必须验证mysql的yesno.同时增加用户注册时间,注册IP获取写入MYSQL;

三::在用户登陆后,生成$_SESSION[“add”],参数为用户名,(注册的时候对名字进行了重复判断,所以不会重复)而且,在登陆的时候,除了判断用户名和md5的密码,还同时判断competence字段里是否=1,如果没有,输出普通用户登陆成功的信息,如果=1,表示是管理员,除了生成$_SESSION[“add”],还要生成一个$_SESSION[“competence”];用于记忆管理员的登陆参数.

四::后台管理员功能:基本控制文件在admin_shell.php文件里,而且做了$_SESSION[“competence”];管理员权限的验证,如果不存在该值,直接返回主页.管理员的验证函数在class.php里可以查找到.

1:前端功能:新用户注册提醒\用户发表文章提醒\用户评论提醒;因为这些都是需要验证的.

2:后端功能:

A:修改系统LOGO大图,修改页头TITLE,修改页头论坛名字URL,修改页脚名字(可以附加URL);

B:修改用户的状态:审核/未审核及删除用户.

C:修改文章的状态:修改文章名字(SQL进行了文章名字重复中止),修改文章分类(同时修改评论),修改文章审核状态,删除文章;

D:修改分类的状态:修改分类名字(更新文章所指向的分类及评论指向文章的分类,后面删除会说),新增分类(SQL防重复),删除分类(同时删除当前分类内所有的文章及评论,所以作者在文章和评论的字段里都加有分类的字段,同步删除.),删除分类但移动该分类内所有文章到其他分类;

五::用户权限:发布文章,发布评论(都会进入审核状态并在管理员的前端显示提醒),审核之后正式SQL调用显示.

六::分类,文章,默认显示8个,如果有更多,需点更多进入查看(该方法未进行翻页实现,写的好累.)

七::文章的显示顺序,按SQL里的倒序读取,保证显示在前面的是最新的文章,如果用户没点分类,就显示所有文章最新的,如果用户有查看某一分类的文章,就调用当前分类所有最新的文章优先显示.

八::该代码基于PHP+MYSQL为主,字符集为UTF-8,如果有不懂设置UTF-8的,可以参考作者前面写的文章,LINUX和WINDOWS版都有写出来. 同时该论坛的传值方式都是基于GET和POST进行,没有通过return的返回值操作.原因很简单,作者也是刚自学PHP不久,只是有些C++的小基础上进行思维上的编写,并不保证程序的安全运行.同时界面基于table形式,未进行太多的DIV+CSS处理.

好了,以下是作者写的小论坛的所有源码:自写论坛

欢迎自学的朋友们下载来玩玩,如果有更多好的意见,可以反馈给作者

admin@qingxinzui.com

清心醉

通过清心醉

PHP实例-编写自己的PHP通讯录7-多用户注册审核及权限设置

#先写个用户注册先. login登陆的时候根据yesno的值得来判断是否允许登陆.
#1为已允许注册可登陆,0为审核状态.用户登陆时返回审核状态.
#注册文件代码:registration.php
echo “</br></br></br></br></br>”;
echo ‘<html>’;
echo ‘<title>注册</title>’;
echo ‘<body>’;
echo ‘</br></br></br></br></br>’;
echo ‘<form method=”post” action=”registrationsql.php”>’;
echo ‘<table width=”400″ align=”center”>’;
echo ‘<tr>’;
echo ‘<td>注册帐号:</td>’;
echo ‘<td><input name=”userregistration” type=”text” size=”30″ maxlength=”500″></td>’;
echo ‘</tr>’;
echo ‘<tr>’;
echo ‘<td>注册密码:</td>’;
echo ‘<td><input name=”registrationpassword” type=”text” size=”30″ maxlength=”500″></td>’;
echo ‘</tr>’;
echo ‘<td>备注:</td>’;
echo ‘<td><input name=”text1″ type=”text” size=”30″ maxlength=”500″></td>’;
echo ‘</tr>’;
echo ‘</table>’;
echo ‘<div align=”center”><input type=”submit” value=”注册”></div>’;
echo ‘</form>’;
echo ‘</body>’;
echo ‘</html>’
#然后是注册registrationsql.php执行代码
if (is_array($_POST)&&count($_POST)>0)//先判断是否通过POST传值了
{
if(!empty($_POST[“userregistration”])&&!empty($_POST[“registrationpassword”]))//是否存在参数
{
$i=$_POST[“userregistration”];
$o=md5($_POST[“registrationpassword”]); //密码实现md5加密后在对比
$j=$_POST[“text1″];//备注信息
//数据库里获取出来的帐号密码
$sql=”select * from admin where user=’$i'”;
$rs=mysql_query($sql,$con);        //连接读取表并且执行$sql里的SQL语句.
if(mysql_num_rows($rs)!=0) //如果有相等的数据.
{
echo “帐号已存在</br>”;
echo “<script>setTimeout(\”this.location=’registration.php’\”,3000);</script>”;
}
else
{
$sql1 = mysql_query(“select max(userid) sqlmaxuserid from admin”);
//定义一个查询contacts表,列为id的变量,输入的名字为sqlmaxuserid;
while($sqlmaxid = mysql_fetch_object($sql1)) //循环读取
$tempmaxid = $sqlmaxid->sqlmaxuserid; //提取出sqlmaxuserid.即管理员ID主键的最大值
$insqlmaxid=$tempmaxid+1;//注册的用户id=最大的+1
mysql_query(“INSERT INTO admin(userid,user,password,competence,yesno,text)VALUES(‘$insqlmaxid’,’$i’,'”.md5($o).”‘,’100′,’0′,’$j’)”);
//执行插入语句,id为最大的id+1,最后一个yesno默认为0,即等审核状态.competence为100,默认非管理员,因为管理员是1,以后可以通过后台对该值进行修改.
echo “注册成功,等待管理员审核</br>”;
echo “<script>setTimeout(\”this.location=’index.php’\”,2000);</script>”;
}
}
else
{
echo “请填写完整数据”;
echo “<script>setTimeout(\”this.location=’registration.php’\”,3000);</script>”;
}
}
else
{
echo “非法访问”;
echo “<script>setTimeout(\”this.location=’index.php’\”,3000);</script>”;
exit;
}

#注册好了,在contacts.php显示页面里,增加个判断是否有用户注册的功能:
#找个合适的位置加上:
/************判断是否有等待审核的用户,适用于管理员权限************/
$sql=”select * from admin where yesno=’0′”; //sql读取admin表的yesno审核列
$rso=mysql_query($sql,$con);
if(mysql_num_rows($rso)!=0)
{
echo “<a href=’useryesno.php’>有需要审核的用户</a>”;
}
/************************/

#然后实现注册的表单useryesno.php:
$sql=”select * from admin where yesno=’0′”;  //SQL读遍admin表yesno列的值为0的所有数据
$rsosql=mysql_query($sql,$con);
echo ‘<link rel=”stylesheet” type=”text/css” href=”style.css” />’;
echo ‘<div>’;
echo “<table>”;
echo ‘<tr><td>姓名</td><td>备注</td><td>操作</td></tr>’;
while($row=mysql_fetch_object($rsosql))
{
echo “<tr><td>$row->user</td><td>$row->text</td>”;
echo “<td><a href=’useryessql.php?user=$row->user’>允许</a> / <a href=’usernosql.php?user=$row->user’>禁止并删除</a></td></tr>”;
}
//其实只传递ID值也可以,然后从新从SQL里获取数据显示在表里。
echo “</table>”; //输出表格结束
echo “</div>”;
echo “<a href=’index.php’>返回主页</a>”
#表单里循环读取admin表yesno列为0的数据并显示.
#并且允许的释放yesno值=1即可以登陆,禁止就删除掉当前数据.

#先来看看useryessql.php允许的实现代码.
$o=$_GET[“user”];
$sql=”UPDATE admin SET yesno=’1′ where user=’$o’ “;//update更新指定$o的用户名并将yesno的值=1即审核通过
$yessqluser=mysql_query($sql,$con);
if($yessqluser)
{
echo “用户:”.$o.”审核通过</br>”;
echo “正在为您返回用户管理页面,请稍后”;
echo “<script>setTimeout(\”this.location=’useryesno.php’\”,2000);</script>”;
}
else
{
echo “审核通过用户:”.$o.”失败”;
echo “<script>setTimeout(\”this.location=’useryesno.php’\”,2000);</script>”;
}
/*
如果需要修改用户权限,把compentence的值由100改为1即可.方法上面的即可实现
$sql=”UPDATE admin SET compentence=’1′ where user=’$o’ “;
*/

#再来看usernosql.php禁止并删除的代码.
$o=@$_GET[“user”];
$sql = “delete from admin where user = ‘$o’ “; //禁止通过审核并且删除当前GET过来的user在admin表user列
$delsqluser=mysql_query($sql,$con);
if($delsqluser)
{
echo “用户:”.$o.”审核禁止通过</br>”;
echo “删除用户:”.$o.”成功”;
echo “<script>setTimeout(\”this.location=’useryesno.php’\”,2000);</script>”;
}
else
{
echo “删除用户:”.$o.”失败”;
echo “<script>setTimeout(\”this.location=’useryesno.php’\”,2000);</script>”;
}
#这样 简单的注册,并且管理员审核的功能就已经实现
#接下来就是要实现用户在登陆的时候,如果登陆成功,判断是否具备管理权限及是否已注册.
#在loginsql.php文件里,如果帐号密码审核正确的话,再进行一次状态和权限的审核
#实现代码:

$sql2=”select * from admin where user=’$i’ and yesno=’1′”; //SQL语句查询登陆的用户是否审核通过并且值为1了。
$rs2=mysql_query($sql2,$con);
if(mysql_num_rows($rs2)==0)
{
echo “您的帐号还在审核中”;
exit;
echo “<script>setTimeout(\”this.location=’index.php’\”,2000);</script>”;
}
#同时因为有权限字段competence,1为管理员,100为普通用户,默认注册的全部为100;
$sql1=”select * from admin where user=’$i’ and competence=’1′”; //用户名字和权限参数
$rs1=mysql_query($sql1,$con);
if(mysql_num_rows($rs1)!=0)
{
echo “欢迎您,管理员</br>”;
$_SESSION[“compectece”]=$i;
/*
如果数据库里的compectece的为1表示管理员,创建$_SESSION
*/
}现在完整的数据包:需要的可以下载测试玩玩.

htdocs20141117