下面是一个简单的留言板例子,包括创建mysql数据表与连接mysql数据库然后对数据表的查询,提交保存数据与数据删除功能,这其实就是一个最基本的留言板功能了,下面直接上例子。
首先数据库的SQL如下:
代码如下 |
复制代码 |
-- -- 表的结构 `message` --
CREATE TABLE `message` ( `id` int(10) NOT NULL auto_increment, `user` varchar(25) character set utf8 NOT NULL,
`title` varchar(50) character set utf8 NOT NULL, `content` tinytext character set utf8 NOT NULL, `lastdate` date NOT NULL,
PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=gbk AUTO_INCREMENT=11 ;
|
程序代码如下:
首先创建config.php,代码如下:
代码如下 |
复制代码 |
<?php $conn = @mysql_connect("localhost","root","") or die("数据库连接出错!");
mysql_select_db("lyb",$conn); mysql_query("set names utf8"); ?>
|
然后创建index.php,代码如下:
代码如下 |
复制代码 |
<form action="index.php" method="post"> <table border="1" align="center" > 用 www.111cn.net 户:<input type="text" name="user" /><br>
标题:<input type="text" name="title" /><br /> 内容:<textarea name="content"></textarea><br />
<input type="submit" name="submit" value="php教程" /></table> </form>
|
接受提交数据保存到数据表中
代码如下 |
复制代码 |
<?php include("config.php");
if($_POST['submit'] && !empty($_POST['title'])&& !empty($_POST['user'])&& !empty($_POST['content']))
{ $sql="insert into message (id,user,title,content,lastdate) values ('','$_POST[user]','$_POST[title]','$_POST[content]',now())";
mysql_query($sql); //echo "成功"; }?>
|
查询留言记录
代码如下 |
复制代码 |
<table width=500 border="1" align="left" cellpadding="5" cellspacing="1" bgcolor="#add3ef">
<?php $sql="select * from message order by id desc"; $query=mysql_query($sql); while($row=mysql_fetch_array($query)){ ?>
<tr bgcolor="#eff3ff"> <td>标题:<?php echo $row[title];?> 用户:<?php echo $row[user];?></td> </tr> <tr bgColor="#ffffff">
<td>内容:<?php echo $row[content];?></td> </tr>
<?php } ?>
|
原理分析
先来看看入库吧,这个就是最基础的没有进行任何数据判断处理了
代码如下 |
复制代码 |
if($_POST['submit'] && !empty($_POST['title'])&& !empty($_POST['user'])&& !empty($_POST['content']))
{ $sql="insert into message (id,user,title,content,lastdate) values ('','$_POST[user]','$_POST[title]','$_POST[content]',now())";
mysql_query($sql); //echo "成功"; }?>
|
判断用户提交过来的数据是不是不为空
$_POST['submit'] && !empty($_POST['title'] && !empty($_POST['user'])&& !empty($_POST['content'] (这里主要是介绍到所有需要填写的不为空了)
安全分析,这个很容易给大家实现sql注入了,因为没进行任何过滤处理了哦,只要网随便搜索一段注入代码就可以成功注入了,同时可以重复无限提交数据
代码如下 |
复制代码 |
{ $sql="insert into message (id,user,title,content,lastdate) values ('','$_POST[user]','$_POST[title]','$_POST[content]',now())";
|
这一是保存到数据库,但没进行任何安全处理,一般情况我们不提倡直接把$_POST[user]入库的,是需要经过处理之后再进入变量传递进行入库哦,
查询数据库
代码如下 |
复制代码 |
$sql="select * from message order by id desc";
$query=mysql_query($sql);
while($row=mysql_fetch_array($query))
|
这三句代码实现了数据库查询了,其实也是非常的简单的,我们只是处理了查询并没有任务一些技术处理,如判断是否有值或一次读取多少条记录。
php中遍历目录下文件函数有不少,下面本文章就来介绍dir(),readdir()函数遍历目录的例子,希望这些例子能给各位朋友带来帮助哦。
方法一:使用dir()遍历目录
dir()函数,成功时返回Directory类实例
PHP dir() 语法格式为:
dir(directory);//directory为需要显示文件名的目录名称,可包含路径信息
PHP dir() 用法举例:列出upload目录下的所有文件名:
代码如下 |
复制代码 |
<?php
$dir = @ dir("upload");//打开upload目录;“@”可屏蔽错误信息,因有时候需要显示文件的目录内并没有文件,此时可能会报出错误,用“@”隐藏掉错误
//列举upload目录中的所有文件
while (($file = $dir->read()) !== false)
{
echo "文件名: " . $file . "<br />";
}
$dir->close();
?> |
输出结果为:
文件名: .
文件名: ..
文件名: logo.gif
文件名: arrow.gif
文件名: bg.gif
例子
代码如下 |
复制代码 |
function tree($dir)
{
$mydir = dir($dir);
while($file = $mydir->read())
{
if($file != '.' && $file != '..')
{
if(is_dir("$dir/$file"))
{
echo '目录名:'.$dir.DIRECTORY_SEPARATOR.'<font color="red">'.$file.'</font><br />';
tree("$dir/$file");
}else{
echo '文件名:'.$dir.DIRECTORY_SEPARATOR.$file.'<br />';
}
}
}
$mydir->close();
}
tree('./phpmyadmin'); |
方法二 使用readir()遍历目录
定义和用法
readdir() 函数返回由 opendir() 打开的目录句柄中的条目。
若成功,则该函数返回一个文件名,否则返回 false。
语法
readdir(dir_stream)
例子
代码如下 |
复制代码 |
header('content-type:text/html;charset=utf-8');
function listDir($dir)
{
if(is_dir($dir))
{
if($handle = opendir($dir))
{
while($file = readdir($handle))
{
if($file != '.' && $file != '..')
{
if(is_dir($dir.DIRECTORY_SEPARATOR.$file))
{
echo '目录名:'.$dir.DIRECTORY_SEPARATOR.'<font color="red">'.$file.'</font><br />';
listDir($dir.DIRECTORY_SEPARATOR.$file);
}else{
echo '文件名:'.$dir.DIRECTORY_SEPARATOR.$file.'<br />';
}
}
}
}
closedir($handle);
}else{
echo '非有效目录!';
}
}
listDir('./phpmyadmin'); |
php中json中文处理功能对于初学者来说是一个比较好用的函数,如果我们直接使用json处理函数来做你会发现中文会变成了null了,如果我们转换在uft8之后会显示的是中文的字符编码了,下面我整理两个工作中用到的函数,希望对各位有帮助。
例子
代码如下 |
复制代码 |
function encodeConvert($str,$fromCode,$toCode)
{
if(strtoupper($toCode) == strtoupper($fromCode)) return $str;
if(is_string($str)){
if(function_exists('mb_convert_encoding')){
return mb_convert_encoding($str,$toCode,$fromCode);
}
else{
return iconv($fromCode,$toCode,$str);
}
}
elseif(is_array($str)){
foreach($str as $k=>$v){
$str[$k] = encodeConvert($v,$fromCode,$toCode);
}
return $str;
}
return $str;
}
|
例子
代码如下 |
复制代码 |
/**************************************************************
*
* 将数组转换为JSON字符串(兼容中文)
* @param array $array 要转换的数组
* @return string 转换得到的json字符串
* @access public
*
*************************************************************/
function JSON($array) {
arrayRecursive($array, 'urlencode', true);
$json = json_encode($array);
return urldecode($json);
}
/**************************************************************
*
* 使用特定function对数组中所有元素做处理
* @param string &$array 要处理的字符串
* @param string $function 要执行的函数
* @return boolean $apply_to_keys_also 是否也应用到key上
* @access public
*
*************************************************************/
function arrayRecursive(&$array, $function, $apply_to_keys_also = false){
static $recursive_counter = 0;
if (++$recursive_counter > 1000) {
die('possible deep recursion attack');
}
foreach ($array as $key => $value) {
if (is_array($value)) {
arrayRecursive($array[$key], $function, $apply_to_keys_also);
} else {
$array[$key] = $function($value);
}
if ($apply_to_keys_also && is_string($key)) {
$new_key = $function($key);
if ($new_key != $key) {
$array[$new_key] = $array[$key];
unset($array[$key]);
}
}
}
$recursive_counter--;
}
|
测试例子
代码如下 |
复制代码 |
$arr = array (
array (
'catid' => '4',
'catname' => '一聚教程网',
'meta_title' => '一聚教程网2'
),
array (
'catid' => '55',
'catname' => 'php教程',
'meta_title' => 'http://www.111cn.net',
)
);
echo JSON($arr);
echo json_encode(encodeConvert($arr,'gb2312','utf-8'));/* */
|
输出结果如下
[{"catid":"4","catname":"一聚教程网","meta_title":"一聚教程网2"},{"catid":"55","catname":"php教程","meta_title":"http://www.111cn.net"}]
[{"catid":"4","catname":"\u4e00\u805a\u6559\u7a0b\u7f51","meta_title":"\u4e00\u805a\u6559\u7a0b\u7f512"},{"catid":"55","catname":"php\u6559\u7a0b","meta_title":"http:\/\/www.111cn.net"}]
下面整理了一些关于PHP计算两个时间差的例子,希望这些例子能帮助你解决你在日期时间差之间的一些困扰哦,下面我们一起来看看吧。
例子1
代码如下 |
复制代码 |
<?php
//$startdate是开始时间,$enddate是结束时间
$startdate="2011-3-15 11:50:00";
$enddate="2012-12-12 12:12:12";
$date=floor((strtotime($enddate)-strtotime($startdate))/86400);
$hour=floor((strtotime($enddate)-strtotime($startdate))%86400/3600);
$minute=floor((strtotime($enddate)-strtotime($startdate))%86400/60);
$second=floor((strtotime($enddate)-strtotime($startdate))%86400%60);
echo $date."天<br>";
echo $hour."小时<br>";
echo $minute."分钟<br>";
echo $second."秒<br>";
?>
|
例子2
代码如下 |
复制代码 |
<?php
$one = strtotime('2011-05-08 07:02:40');//开始时间 时间戳
$tow = strtotime('2012-12-25 00:00:00');//结束时间 时间戳
$cle = $tow - $one; //得出时间戳差值
/* 这个只是提示
echo ceil($cle/60); //得出一共多少分钟
echo ceil($cle/3600); //得出一共多少小时
echo ceil($cle/3600/24); //得出一共多少天
*/
/*ceil()函数,即进一法取整*/
$d = cell($cle/3600/24);
$h = cell(($cle%(3600*24))/3600); //%取余
$m = cell(($cle%(3600*24))/60);
echo "两个时间相差 $d 天 $h 小时 $m 分"
?>
|
总结,两个例子都使用到了strtotime函数把日期转换在时间戳之后再除以86400等操作来算出两个日期之间相差多少时间,从天数据到秒都计算机出来了。
下面转一站长写的PHP mysql备份与恢复的类实例了,这里面主要用到的是一个数据备份类与一个文件上传类了,我们结合它们两个就可以实现数据备份与文件恢复上传功能了,具体方法如下图所示。
今天推荐的精品PHP代码就是mysql备份与恢复的类了,在一般的PHP网站中都会有在线mysql备份与恢复,这样做的好处是不用每次备份都要使用 phpmyadmin 或者是客户端的工具了,使用时将备份恢复的类 dbback.class.php 进行实例化就可以使用了。
这里直接附上该类作者的说明了:该类适用于小型的网站的数据库备份,内置MYSQL连接,只需要简单的配置数据库连接及存贮备份的位置即可,类实例化并且连接数据库以后可执行以下操作:
代码如下 |
复制代码 |
* get_db_table($database) 取得所有数据表
* export_sql($table,$subsection=0)) 生成sql文件,注意生成sql文件只保存到服务器目录,不提供下载
* import_sql($dir) 恢复数据只导入服务器目录下的sql文件
|
包里作者文件的说明如下:
一、之前有发过一个mysql的备份类,但是只有备份功能,今天花了点时间,对该类进行重写, 1.新增读取数据库内所有表格 2.新增mysql在线恢复 3.修改了mysql的下载试为保存到服务器,该类具有很强的灵活性与易用性,附上两张实际开发中的应用效果.
二、另外附加前几天写的一个文件上传类,类中有附说明
代码如下 |
复制代码 |
<?php
/**
* 类名:upfile
* 作用:处理文件上传
* 说明,该类处理单个或者多个文件上传,使用该类时,只需要实列化该类
* 例:
* $up = upfile()
* $up->update_file($_FILE['filename'])
*
* $up->update_file 函数返回一个数组,如果是多文件上传,则为多维数据。
* 数组的内容:
* $fileInfo['file_size'] 上传文件的大小
* $fileInfo['file_suffix'] 上传文件的类型
* $fileInfo['file_name'] 上传文件的名字
* $fileInfo['error'] 上传文件产生的错误
*
* @author 赵红健[游天小虾]
* email:328742379@qq.com
* qq交流群:69574955 聚义堂-网页制作交
*/
class upfile {
public $fCount = 1; //上传文件的数量
public $fType = array('jpg','jpeg','gif','png'); //文件格式
public $fSize = 1024; //文www.111cn.Net件大小单位kb
public $fDir = 'test/'; //文件存放目录
public $errorMsg = ''; //产生的临时错误信息�ļ��ϴ�����Ĵ���
/**
*函数名:get_tmp_file($putFile)
*作用:取得上传的临时文件名
*@param array $putFile
*@return string $upImg 返回临时文件名
*/
function get_tmp_file($putFile){
if($this->fCount == 1){
$tmpFile = $putFile['tmp_name'];
}else{
for($i=0;$i<$this->fCount;$i++){
$tmpFile[] = $putFile['tmp_name'][$i];
}
}
return $tmpFile;
}
/**
*函数名:get_suffix($fileName)
*作用:取得文件的后缀名
*@param file $fileName
*@return string $suffixName 返回后缀名
*/
function get_suffix($fileName){
$link = pathinfo($fileName);
$suffixName = strtolower($link['extension']);
return $suffixName;
}
/**
*验证文件大小
*@author 赵红健
*@param $fileSize
*@return booln
*/
function check_file_size($fileSize){
$this->errorMsg = '';
if($fileSize/1000 > $this->fSize){
$this->errorMsg = '警告:文件超出大小!';
return false;
}else{
return true;
}
}
/**
*验证文件类型是否合法
*@author 赵红健
*@param $fileSuffix
*@return booln
*/
function check_file_suffix($fileSuffix){
$this->errorMsg = '';
if(!in_array($fileSuffix,$this->fType)){
$this->errorMsg = '警告:文件类型不在允许范围内!';
return false;
}else{
return true;
}
}
/**
*移动临时文件
*@author 赵红健
*@param $fileSuffix
*@return booln
*/
function move_temp_file($tmpFile,$targetFile){
$this->errorMsg = '';
if(!move_uploaded_file($tmpFile,$targetFile)){
$this->errorMsg = '警告:文件移动失败!';
return false;
}else{
return true;
}
}
/**
*函数名:update_file($putFile)
*作用:上传文件
*@param array $putFile
*@return array 文件信息
*/
function update_file($putFile){
$tmpFile = $this->get_tmp_file($putFile);
if(!file_exists($this->fDir)){
$this->errorMsg[] = '错误:目录'.$this->fDir.'不存在';
return $this->errorMsg;
}
$this->fDir = substr($this->fDir,strlen($this->fDir)-1,1)=='/'?$this->fDir:$this->fDir.'/';
if(!is_array($putFile['size'])){
$fileInfo['file_size'] = $putFile['size'];
if(!$this->check_file_size($fileInfo['file_size'])){
$fileInfo['error'] = $this->errorMsg;
return $fileInfo;
}
$fileInfo['file_suffix'] = $this->get_suffix($putFile['name']);
if(!$this->check_file_suffix($fileInfo['file_suffix'])){
$fileInfo['error'] = $this->errorMsg;
return $fileInfo;
}
$fileInfo['file_name'] = date('ymdhms').'.'.$fileInfo['file_suffix'];
if(!$this->move_temp_file($tmpFile,$this->fDir.$fileInfo['file_name'])){
$fileInfo['error'] = $this->errorMsg;
return $fileInfo;
}
return $fileInfo;
}else{
for($i=0;$i<$this->fCount;$i++){
$fileInfo[$i]['file_size'] = $putFile['size'][$i];
if(!$this->check_file_size($fileInfo[$i]['file_size'])){
$fileInfo[$i]['error'] = $this->errorMsg;
continue;
}
$fileInfo[$i]['file_suffix'] = $this->get_suffix($putFile['name'][$i]);
if(!$this->check_file_suffix($fileInfo[$i]['file_suffix'])){
$fileInfo[$i]['error'] = $this->errorMsg;
continue;
}
$fileInfo[$i]['file_name'] = date('ymdhms').rand().'.'.$fileInfo[$i]['file_suffix'];
if(!$this->move_temp_file($tmpFile[$i],$this->fDir.$fileInfo[$i]['file_name'])){
$fileInfo[$i]['error'] = $this->errorMsg;
continue;
}
}
return $fileInfo;
}
}
}
?>
|
备份类
代码如下 |
复制代码 |
<?php
/**
* 说明,该类适用于小型的网站的数据库备份,内置MYSQL连接,只需要简单配置数据连接
* 及存贮备份的位置即可。
* 类实列化并且连接数据库以后可执行以下操作
* get_db_table($database) 取得所有数据表
* export_sql($table,$subsection=0)) 生成sql文件,注意生成sql文件只保存到服务器目录,不提供下载
* import_sql($dir) 恢复数据只导入服务器目录下的sql文件
* 该类制作简单,可任意传播,如何您对该类有什么提议,请发送邮件给小虾
* @author 赵红健[游天小虾]
* email:328742379@qq.com
* qq交流群:69574955 聚义堂-网页制作交
*/
class data {
public $data_dir = "class/"; //备份文件存放的路径
public $transfer =""; //临时存放sql[切勿不要对该属性赋值,否则会生成错误的sql语句]
/**
*数据库连接
*@param string $host 数据库主机名
*@param string $user 用户名
*@param string $pwd 密码
*@param string $db 选择数据库名
*@param string $charset 编码方式
*/
function connect_db($host,$user,$pwd,$db,$charset='gbk'){
if(!$conn = mysql_connect($host,$user,$pwd)){
return false;
}
mysql_select_db($db);
mysql_query("set names $charset");
return true;
}
/**
* 生成sql语句
* @param $table 要备份的表
* @return $tabledump 生成的sql语句
*/
public function set_sql($table,$subsection=0,&$tableDom=''){
$tableDom .= "DROP TABLE IF EXISTS $tablen";
$createtable = mysql_query("SHOW CREATE TABLE $table");
$create = mysql_fetch_row($createtable);
$create[1] = str_replace("n","",$create[1]);
$create[1] = str_replace("t","",$create[1]);
$tableDom .= $create[1].";n";
$rows = mysql_query("SELECT * FROM $table");
$numfields = mysql_num_fields($rows);
$numrows = mysql_num_rows($rows);
$n = 1;
$sqlArry = array();
while ($row = mysql_fetch_row($rows)){
$comma = "";
$tableDom .= "INSERT INTO $table VALUES(";
for($i = 0; $i < $numfields; $i++)
{
$tableDom .= $comma."'".mysql_escape_string($row[$i])."'";
$comma = ",";
}
$tableDom .= ")n";
if($subsection != 0 && strlen($this->transfer )>=$subsection*1000){
$sqlArry[$n]= $tableDom;
$tableDom = ''; $n++;
}
}
return $sqlArry;
}
/**
*列表数据库中的表
*@param database $database 要操作的数据库名
*@return array $dbArray 所列表的数据库表
*/
public function get_db_table($database){
$result = mysql_list_tables($database);
while($tmpArry = mysql_fetch_row($result)){
$dbArry[] = $tmpArry[0];
}
return $dbArry;
}
/**
*验证目录是否有效
*@param diretory $dir
*@return booln
*/
function check_write_dir($dir){
if(!is_dir($dir)) {@mkdir($dir, 0777);}
if(is_dir($dir)){
if($link = opendir($dir)){
$fileArry = scandir($dir);
for($i=0;$i<count($fileArry);$i++){
if($fileArry[$i]!='.' || $fileArry != '..'){
@unlink($dir.$fileArry[$i]);
}
}
}
}
return true;
}
/**
*将数据写入到文件中
*@param file $fileName 文件名
*@param string $str 要写入的信息
*@return booln 写入成功则返回true,否则false
*/
private function write_sql($fileName,$str){
$re= true;
if(!@$fp=fopen($fileName,"w+")) {$re=false; echo "在打开文件时遇到错误,备份失败!";}
if(!@fwrite($fp,$str)) {$re=false; echo "在写入信息时遇到错误,备份失败!";}
if(!@fclose($fp)) {$re=false; echo "在关闭文件 时遇到错误,备份失败!";}
return $re;
}
/**
*生成www.111cn.net sql文件
*@param string $sql sql 语句
*@param number $subsection 分卷大小,以KB为单位,为0表示不分卷
*/
public function export_sql($table,$subsection=0){
if(!$this->check_write_dir($this->data_dir)){echo '您没有权限操作目录,备份失败';return false;}
if($subsection == 0){
if(!is_array($table)){
$this->set_sql($table,0,$this->transfer);
}else{
for($i=0;$i<count($table);$i++){
$this->set_sql($table[$i],0,$this->transfer);
}
}
$fileName = $this->data_dir.date("Ymd",time()).'_all.sql';
if(!$this->write_sql($fileName,$this->transfer)){return false;}
}else{
if(!is_array($table)){
$sqlArry = $this->set_sql($table,$subsection,$this->transfer);
$sqlArry[] = $this->transfer;
}else{
$sqlArry = array();
for($i=0;$i<count($table);$i++){
$tmpArry = $this->set_sql($table[$i],$subsection,$this->transfer);
$sqlArry = array_merge($sqlArry,$tmpArry);
}
$sqlArry[] = $this->transfer;
}
for($i=0;$i<count($sqlArry);$i++){
$fileName = $this->data_dir.date("Ymd",time()).'_part'.$i.'.sql';
if(!$this->write_sql($fileName,$sqlArry[$i])){return false;}
}
}
return true;
}
/**
*载入sql文件
*@param diretory $dir
*@return booln
*注意:请不在目录下面存放其它文件,或者目录
*以节省恢复时间
*/
public function import_sql($dir){
if($link = opendir($dir)){
$fileArry = scandir($dir);
$pattern = "_part[0-9]+.sql$|_all.sql$";
for($i=0;$i<count($fileArry);$i++){
if(eregi($pattern,$fileArry[$i])){
$sqls=file($dir.$fileArry[$i]);
foreach($sqls as $sql){
str_replace("r","",$sql);
str_replace("n","",$sql);
if(!mysql_query(trim($sql))) return false;
}
}
}
return true;
}
}
}
//$d = new data();
//连接数据库
//if(!$d->connect_db('localhost','root','','guestbook','gbk')){
// echo '数据库连接失败';
//}
//查找数据库内所有数据表
//$tableArry = $d->get_db_table('guestbook');
//备份并生成sql文件
//if(!$d->export_sql($tableArry)){
// echo '备份失败';
//}else{
// echo '备份成功';
//}
//恢复导入sql文件夹
//if($d->import_sql($d->data_dir)){
// echo '恢复成功';
//}else{
// echo '恢复失败';
//}
?>
|