PHP1+MySQL 数据库编程的步骤(七步骤, mysql_query() 执行语句,处理语句)
第一剑:PHP连接MySQL服务器
语法:resource mysql_connect ([ string $server [, string $username [, string $password ]]] )
例:$link=@mysql_connect("localhost","root","$zpass"); //echo $link: Resource id #3
提示:@不能用在函数定义前,也不能用在类定义前,也不能用在结构语法前(for、while、foreach、if)
mysql_error(): 返回上一个 MySQL 操作产生的文本错误信息
第二剑:选择自己的数据库
语法:
bool mysql_select_db ( string $database_name [, resource $link ] )
$rdb = mysql_select_db(DBNAME);或
$rdb = mysql_query('use '.DBNAME); echo $rdb;//1或0
第三剑:设置请求或返回数据的字符集
define('ZHOST','localhost');
define('ZUSER','root');
$zpass='123456';
$db_name='whereit';
($link=@mysql_connect(ZHOST,ZUSER,$zpass))or exit('数据库'.ZHOST.'连接失败');
mysql_select_db($db_name)or exit('数据库'.$db_name.'选择失败');
mysql_query('set names utf8');
第四剑:编写各种的SQL语句。
插入数据:INSERT INTO table_name(字段列表) VALUES(值的列表)
更新数据:UPDATE student SET hits = hits+1 WHERE id=5
删除数据:DELETE FROM student WHERE id=5
查询数据:SELECT * FROM student WHERE id>(SELECT id FROM student WHERE id=5)
创建数据表:CREATE TABLE student(id int not null) CHARSET utf8 ENGINE myisam
第五剑: 执行 SQL 语句: mysql_query()
描述:发送一条 MySQL 查询
语法:resource mysql_query ( string $query [, resource $link = NULL ] )
参数:$query ,执行的各种SQL语句。
插入的SQL语句:$sql = “INSERT INTO news(title,content) VALUES(‘标题’ , ‘内容’)”
删除的SQL语句:$sql = “DELETE FROM news WHERE id=5”
更新的SQL语句:$sql = “UPDATE news SET title = ‘新标题’ , content = ‘新内容’ WHERE id=5”
查询的SQL语句:$sql = “SELECT * FROM news ORDER BY id DESC LIMIT 10,20”
$link 可选 。如果省略,则认为是上一个打开的活动链接。
执行:$result =mysql_query( $sql); 返回值:
如果执行的是select、show、describe命令,成功返回资源(结果集),失败返回FALSE;
如果执行其它(增删改)的SQL语句,成功返回TRUE,失败返回FALSE。
第六剑: 处理结果集
1
、
mysql_fetch_row(),执行完一句指针自动下移,非法区域,FALSE
描述:从结果集中取得一行 作为枚举数组
语法:array mysql_fetch_row ( resource $result )
参数:$result,结果集变量。是由mysql_query()执行的SELECT语句得到的。
返回:返回一个枚举数组(整型下标)。$row = mysql_fetch_row($result);
2、mysql_fetch_assoc()
3
、
mysql_fetch_array()
从结果集中取得一行作为关联数组,或数字数组,或二者兼有
MYSQL_BOTH(默认):既有整型下标(相当于fetch_row),也有字符串下标(字段名)
MYSQL_NUM:只有整型下标,与mysql_fetch_row()效果一样。
MYSQL_ASSOC;只有字符串下标(字段名),与mysql_fetch_assoc()效果一样。
例:$rows = mysql_num_rows($result);或
$sql = "SELECT count(*) FROM student";
第七剑:释放资源---
函数:bool mysql_close($link) 一般网页关闭时数据库自动断开连接
一、 连接数据库zzztest.php
//(0)数据库配置信息
$db_host = 'localhost';
$db_user = 'root';
$db_pwd = '123456';
$db_name = ' whereit
';
//(1)PHP连接MySQL服务器
$link = @mysql_connect($db_host,$db_user,$db_pwd);
if(!$link) exit("PHP连接MySQL失败了!");
//(2)选择当前数据库
if(!mysql_select_db($db_name)) exit("选择数据库{$db_name}失败了!");
//(3)设置请求或返回数据的字符集
mysql_query("set names utf8");
?>
二、 ptest.php代码,表格显示 数据库所有数据记录(注意php,html,js嵌套 )
header("Content-type:text/html;charset=utf-8");
require_once("./zzztest.php"); //包含连接数据库文件
$sql="select * from student order by id";
$result=mysql_query($sql);//执行MySQL语句
var_dump($result); //resource(4) of type (mysql result)
// $arr=mysql_fetch_assoc($result); //从结果集中取出一行作为关联数组
echo " ";
$sql="select * from student order by id";
$result=mysql_query($sql); //4执行MySQL语句
var_dump($result); //resource(4) of type (mysql result)
echo " ";
while ($arr=mysql_fetch_assoc($result)) {//使用定界符<<<很方便 ,但是注意定界符第一个DING后不能有空格或Tab或其他字符
$str=<<
{$arr['id']}
{$arr['name']}
{$arr['sex']}
{$arr['edu']}
{$arr['salary']}
{$arr['bonus']}
{$arr['city']}
DING;
echo $str;//注意要顶格写,且定界符最后一个DING后不能有空格或Tab,必须单独占一行(注意分号;)
}
mysql_close($link);//关闭数据库释放资源(建议添加,节约内存资源)
?>
function jump(id){
if (window.confirm("你确定要删除吗?")) {
location.href="sdel.php?id="+id;
}
}
三、 1求得数据库记录行总数2更新数据库记录3删除数据库记录
header("Content-type:text/html;charset=utf-8");
require_once("./zzztest.php");
$sql="select * from student order by id";
$result=mysql_query($sql); //1执行MySQL语句
// $records=mysql_num_rows($result);//4取得结果集中行的
总数目
// echo $records;
$id=$_GET['id'];//2获取地址栏传递过来的id值
// $sql3="update student set id=50 where id=$id";
// mysql_query($sql3); //6执行
更新 数据库数据
$sql2="delete from student where id=$id";
if (mysql_query($sql2)) { //3执行SQL
删除 语句
echo "";
exit();
} else {
echo "";
exit();
}
?>
PHP2filel(PHP目录操作,文件操作)
一、目录操作
1
、创建目录
mkdir('../../hhh');//创建单个目录
if (
mkdir($dir,0444,true)
) {//创建多层目录要加true
echo "创建成功";
} else {
echo "创建失败";
}
5
、更改目录的访问权限
描述:改变文件模式
语法:bool chmod ( string $filename , int $mode )
参数:$filename,文件名称;$mode,八进制的权限值。chmod($dir,0444);
$int=fileperms("./image/abc/def/wang/text.txt"); //获取一个文件的权限(八进制)
$int=decoct($int); //八进制转十进制---也可以写成$int=base_convert($int,10,8);
echo substr($int,-4); //0666,其中-4是取后四位数
7
、目录重命名或移动目录
rename('text.txt','tmp.txt');//重命名文件
rename('./tmp.txt','./linshi/tmp.txt');//
目录移到:位于不同目录下
8
、打开目录
描述:打开目录句柄
语法:
resource opendir ( string $path ) 例:$handle =opendir($dir);
返回:打开目录成功返回 一个
句柄
(
资源
)
,打开失败返回
FALSE
。
提示:
文件系统是
Windows
的内容,不是
PHP
的内容
。
9
、读取目录中的条目
语法:
string readdir ([ resource $dir_handle ] )
echo readdir($handle);//.
echo readdir($handle);//..
echo readdir($handle);//text.txt
var_dump(readdir($handle));//bool(false)
$handle=opendir($dir,'ab');
while ($file=readdir($handle)) {
echo iconv ("gbk", "utf-8", $file)." ";
}//. .. text.txt 新建文本文档.txt
11 、关闭目录
语法:
void closedir ( resource $dir_handle )
二、文件操作
1、打开文件
2、关闭文件
描述:关闭一个已打开的文件指针
语法:bool fclose ( resource $handle )
3、读取文件内容
3.1读取指定大小的内容
描述:读取文件(可安全用于二进制文件)
语法:string fread ( resource $handle , int $length )例:echo fread($handle,filesize('./test.txt'));
描述:把整个文件读入一个数组中
$flags,附加选项。
FILE_USE_INCLUDE_PATH(1),在 include_path 中查找文件。
FILE_IGNORE_NEW_LINES(2),在数组每个元素的末尾不要添加换行符
FILE_SKIP_EMPTY_LINES(4),跳过空行
语法:
array file ( string $filename [, int $flags = 0 ] );
$filename="http://www.sina.cn";例:$arr=file($filename,2|4);
4、写入文件
$handle=fopen('./shi.txt','ab'); fwrite($handle,'---牡丹亭'); fclose($handle);
描述:将一个字符串写入文件---例:file_put_contents('./text.txt', '牡丹亭',FILE_APPEND); //追加方式写入
语法:
int file_put_contents ( string $filename , mixed $data );//默认是wb覆盖写入模式
4.3拷贝文件
语法:bool copy ( string $source , string $dest )
例$source="./yao.txt"; $dest="./whereit.doc"; copy($source,$dest);
4.4删除文件
语法:bool unlink ( string $filename )
4.5取得文件属性
文件大小:filesize($filename)
创建时间:filectime($filename)
访问时间:fileatime($filename)
修改时间:filemtime($filename)
文件权限:fileperms($filename)
//实例:递归删除指定目录及所有文件
function delFile($dirf){
$handle=opendir($dirf);//打开句柄
//循环读取所有文件 ,当文件夹为0,0!==false是true,0文件名可读,括号 不能少:=号赋值优先级最低
while (
( $fileName
= readdir($handle)
) ||$fileName!==false) {
//!如果目录为“.”和“..”则跳过,这里不要写错,符号或“||”不要弄错,否则很危险 !!!!!!!
//今天就因为把||写成&&,差点将e盘清空,所以一定要慎之又慎!
if($fileName=='.'||$fileName=='..')continue;
$fielzuhe="$dirf/$fileName";
if (is_dir($fielzuhe)) {//如果是目录则递归删除,如果是普通文件,直接删除
delFile($fielzuhe);//递归调用
} else {
unlink($fielzuhe);//删除文件
}
}
closedir($handle);//关闭句柄
return rmdir($dirf);//删除目录
}
delFile("./images");
PHP3-http(HTTP请求响应、文件下载)
一、B/S
网络结构
Browser->HTTP请求>-------<
HTTP响应<-
-Server
-->SQL请求>-------<
SQL响应<数据库服务器
二、HTTP 超文本传输协议 。
HTTP
是浏览网络资源的一种
标准
。一种上网的标准
特点:简单(
HTTP
发送的内容主要是
请求方法
和
请求资源的地址 ),无连接、无状态(没有记忆状态)
三、URL (Uniform Resource Locator)
统一资源定位符。 对互联网上文件访问的一种方式。
1 、 URL 的构成
语法:
protocol://host[:port]/directory/filename?name=value#anchor
协议 主机名 端口号 目录名 文件名 传参 锚点名(#top,#red)
2、HTTP 请求 由三个部分构成:请求行 、 请求头信息 、 请求的主体
2.1请求行的格式
格式:请求方法 请求资源的URI HTTP协议版本号-----例GET/yao.php HTTP/1.1
1、GET/POST 2、URI (统一资源标识符)3、版本
注意 URL(统一资源定位符):http://www.2016.cn
/abc/yao.htm l和
URI (统一资源标识符)/abc/yao.html 区别
2.1.1
GET
和
POST
区别(补充):
HTTP
协议本身,
GET
方式和
POST
方式
都没有大小限制
,但浏览器本身对GET有限制大小
(2083b)
,
POST
方式
没有大小限制
2.2 请求头含义
Response Headers
Host: www.2016.cn ------》 请求的
主机名称
//用户代理:将你的机器告诉服务器
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0
//告诉服务器,浏览器可以接收什么类型的文件
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
//告诉服务器,你可以接收什么语言
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
//告诉服务器,可以接收什么样的压缩格式
Accept-Encoding: gzip, deflate
//连接类型:长连接和短连接。
Connection: keep-alive
GET
方式没有请求的主体,只有
POST
方式才有主体数据
2.4 带有附件的
http
请求头
action="">
在一个网页有两张图片,需要几次
HTTP
请求?3次
// 获取一个GMT格式的时间
echo gmstrftime("%b %d %Y %H:%M:%S", time()).' GMT';
防盗链
1
、
Refrerer
的概述
Refrerer
是一个
请求的头
信息,记录了当前用户,是从
哪个页面链接过来
的。
--
注意就是要判断跳转前网站是不是自己的
文件下载的防盗,电商安全验证,统计网站路由
什么情况下获取不到Referer
1、直接在地址栏输入网址,浏览器不会发送Referer
2、从收藏夹打开网址,浏览器不会发送Referer
3、从HTTPS的网站跳转到HTTP的网站时,浏览器是不会发送Referrer的。
if (isset($_SERVER['HTTP_REFERER'] )) {
if(strpos($_SERVER['HTTP_REFERER'], "http://www.wdc.com/PHPlianxi")===0)
{ echo "可以下载";
}else{ echo "非法盗链"; }
} else { echo "非法操作"; }
四、HTTP 协议详解之响应篇
1
、
HTTP
响应的构成
语法:状态行
响应头部
响应体
2
、状态行的格式
语法:协议版本
状态码
状态文本描述---例HTTP/1.1 200 OK
3
、状态码的含义
状态码是由
三位数字
构成,第一位数字定义了响应的类型。
4
、响应报头含义
HTTP/1.1 200 OK //响应状态行
Date: Mon, 30 May 2016 08:04:07 GMT //请求的时间
Server: Apache/2.2.22 (Win32) PHP/5.3.13 //告诉客户端服务器的相关信息
X-Powered-By: PHP/5.3.13
Content-Length: 25 //内容的长度
Keep-Alive: timeout=5, max=100 //连接保持多长时间后断后
Connection: Keep-Alive //连接类型:保持连接
Content-Type: text/html //返回客户端文件类型
5
、响应头域
Refresh
header("refresh:5;url=test.html");定时跳转header("refresh:5);//服务端刷新
header('location:test.html');
//客户端刷新
6、使用 header() 函数禁用缓存
Expires
:设置网页缓存的过期时间,格式是
GMT
。
Cache-Control
:
HTTP/1.1
提供的。
Pragma
:兼容
HTTP/1.0
。不同浏览器支持不同的选项。
为了所有浏览器都能生效,这两个选项都使用
。
$gmt=gmstrftime("%b %d %Y %H:%M:%S ",time()+30).'GMT';//
获取一个GMT格式的时间
header("Expires:$gmt);
禁用浏览器缓存
header("Expires:-1");
header("Cache-Control:no-cache");
header("Pragma:no-cache");
五、下载文件的
HTTP
响应头
1
、
Cotent-Type:application/octet-stream//例: header("Content-Disposition:attachment;filename=文件名");
描述:设置响应头为八进制的数据流。
header("Content-Type:application/octet-stream");//声明响应头为:八进制数据流(进制数据)
2
、
Accept-Ranges:bytes断点续传---
提示:服务器首先要配置断点续传的功能。
3
、
Accept-Length:filesize
描述:告诉客户端文件的大小。如果客户端数据下载完成,要进行数据大小的比对。
4
、
Content-Disposition:attachment;filename=
文件名 //告诉浏览器文件下载方式,以及下载的文件名
//下载函数七步骤
function doDownload($fileName){
header('Expires:-1'); // 禁止缓存
header('Cache-Control:no-cache');//禁止缓存兼容旧版本
header('Pragma:no-cache'); //禁止缓存兼容旧版本
header('Content-type:application/octet-stream'); //1、设置响应头为八进制数据流
header('Content-Transfer-Encoding: binary'); //2、告诉浏览器传送数据编码方式为2进制
header('Accept-Ranges:bytes'); //3、支持断点续传 需要服务器支持断点续传功能
$fileSize = filesize($fileName);
header("Accept-Length:$fileSize"); //4、告诉客户端文件大小
// 取出文件名中的空格
$tmpName = str_replace(' ', '-', $fileName);
$tmpName = str_replace(' ', '-', $tmpName);
$tmpName = explode('/', $tmpName);
$tmpName = array_pop($tmpName);
header("Content-Disposition:attachment;filename=$tmpName"); // 5、告诉浏览器文件下载方式,以及下载的文件名
ob_end_clean(); // 清空前面的输出(这一步不可忘)
$handle = fopen($fileName, 'rb'); //6、输出文件流
while($con = fread($handle, 1024)){
echo $con;
}
fclose($handle); //7、关闭文件流
}
PHP4http(GD2、文件上传)
一、GD2
1、开启GD2----------extension=php_gd2.dll
2、创建图像的大致步骤
3、画布坐标系说明:Y轴向下
1创建图像画布和空画布
1.1创建画布 ( 基于现有图像创建 )
描述:由文件或
URL
创建一个新图象,
返回:执行成功返回
资源
(
画布
)
,执行失败返回
FALSE
。
resource imagecreatefromjpeg ( string $filename ) ;,与imagecreatefromgif( ) 、imagecreatefrompng( )语法一模一样
1.2
创建
真彩色
空画布:
新建一个真彩色图像,是
24
位颜色,
1677
万种颜色。如:
RGB(255,0,0)
1.3
创建基于
windows
调色板
的空画布
$filename="./images/01.jpg"; $img=imagecreatefromjpeg($filename);
#var_dump($img);//resource(3) of type (gd)
header('Content-type:image/jpeg');//告诉浏览器以图片形式打开
imagejpeg($img);
2、销毁图像:释放资源、释放内存
3、为图像分配颜色(调色)
参数:
$image
是画布。
颜色:可以用
10
进制或
16
进制表示每一位取值
,如:红色:
(255,0,0),
红色: (0xFF,0x00,0x00)
$alpha为透明度,范围是0-127, 127为全透明。
3.1
分配普通颜色
int imagecolorallocate
3.2 为一幅图像分配颜色和透明度
imagecolorallocatealpha
语法:
int imagecolorallocatealpha ( resource $image , int $red , int $green , int $blue , int $alpha );
4、区域填充颜色
描述:区域填充
(
封闭的空间
)
,如:矩形、圆、多边形等。 imagefill($img,0,0,$reD);//给真彩色画布填充 颜色
语法:
bool imagefill ( resource $image , int $x , int $y , int $color )
参数:、
$x
、
$y
填充的起点坐标。画布坐标只要不超出画布大小都可。
5、输出图像
描述:输出图象到浏览器或文件,两者区别1是否屏蔽浏览器输出图像格式声明header('Content-type:image/jpeg');2imagejpeg第二参数有没有
语法:
bool image jpeg ( resource $image [, string $filename [, int $quality ]] );
提示:imagegif()、imagepng()语法类似,但只有imagejpeg()才有第3个参数。想用第3个参数,则$filename用null代替。
6、水平画一行字符串--例
$font=5;
$str="hangzhou";
imagestring($img, $font, 50, 50, $str, $reD);
语法:
bool imagestring ( resource $image , int $font , int $x , int $y , string $s , int $col );
7、在图像上写入一行TTF字体的文本
语法:
array imagettftext ( resource $image,float $size,float $angle,int $x,int $y,int $color,string $fontfile,string $text )
$filename="./images/a.png"; //图片上加元宵节快乐
$img=imagecreatefrompng($filename);
// var_dump($img);//resource(3) of type (gd)
$color = imagecolorallocate($img, 255, 0, 0);
$font=50;
$fontWidth=imagefontwidth($font);
$fontHeight=imagefontwidth($font);
$str='元宵节快乐';
$c=$fontWidth*strlen($str);
$x=(imagesx($img)-$c-100)*0.5;
$y=(imagesy($img)-$fontHeight)*0.5;
imagettftext($img, $font, 25, $x, $y, $color, './images/STXINGKA.ttf', $str);
imagepng($img,"./b.png");
header('Content-type:image/jpeg');//告诉浏览器以图片形式打开
imagejpeg($img);
imagedestroy($img);
8、获取图像相关信息
8.1取得画布宽度和高度
int imagesx ( resource $image ) 或 int imagesy( resource $image )5,6,7,8,9
8.2取得字体宽度和高度
int imagefontwidth ( int $font ) 或
int imagefontheight( int $font ) 其中
$font
就是
1-5
号字。8,13,13,16,15
8.3
取得图像相关信息
getimagesize:
语法:array getimagesize ( string $filename )
返回值Array([0] => 1024宽px [1] => 685高 [2] => 2…… // 图像类型的标记:1 = GIF,2 = JPG,3 = PNG……
9、重新采样拷贝部分图像并调整大小
语法:
bool imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h );目标图像,原图像
10、随机验证码
$arr=range('A','z'); shuffle($arr);打乱排序 echo mt_rand(0,2);随机 array_rand() $arr=array_merge($arr1,$arr2);合并
画直线imageline(image, x1, y1, x2, y2, color);
画曲线imagearc(image, cx, cy, width, height, start, end, color);
//实现图像的等比缩放
function getImagecopyresampled($fileName, $dst_w=100, $dst_h=false){
$imgFun = array('', 'gif', 'jpeg', 'png');
$imageInfo = getimagesize( $fileName) ;// 获取旧图像的宽高
$src_w = $imageInfo[0];
$src_h = $imageInfo[1]; // 旧图像高度
if(!$dst_h) $dst_h = $src_h/$src_w*$dst_w;// 新图像高度,如果$dst_h没有被赋值,则按照$dst_w进行等比缩放
$funName = 'imagecreatefrom'.$imgFun[$imageInfo[2]];// 基于旧图像创建画布
$src_image = $funName($fileName);// 生成对应的函数名
$dst_image = imagecreatetruecolor($dst_w, $dst_h); // 创建目标图像
imagecopyresampled($dst_image, $src_image, 0, 0, 0, 0, $dst_w, $dst_h, $src_w, $src_h);
$tmpName = explode('/', $fileName);// 将旧图像的路径按照/分解
$newName = array_pop($tmpName);// 弹出图像的名称并赋值给$newName
$newName = $dst_w.'_'.$newName;// 给$newName 拼接倍率
array_push($tmpName, $newName); // 拼接新的路径
$tmpName = implode('/', $tmpName);
$funName = 'image'.$imgFun[$imageInfo[2]];// 生成对应的函数名
$funName($dst_image, $tmpName, 100);// 保存新图像
imagedestroy($dst_image);
imagedestroy($src_image);
return $tmpName;
}
二、上传文件原理
超全局数组$_FILES
Array
( [img] => Array
( [name] => img01.jpg
[type] => image/jpeg //
上传文件的
MIME
类型,易被伪造;
[tmp_name]=> C:\Windows\Temp\php7583.tmp //
上传到服务器的临时二进制
文件
数据
[error]=> 0 //
上传文件的错误编号。
[size]=> 93634
)
)
上传文件的信息和数据,都保存在
$_FILES
全局数组中,不在
$_POST
中。
$_POST
中是普通表单元素的信息。
2 、修改上传文件的临时目录upload_tmp_dir=绝对路径
3 、判断文件是否是通过 HTTP POST 上传的 语法: bool is_uploaded_file ( string $filename )
4、 将上传的文件移动到新位置语法: bool move_uploaded_file ( string $filename , string $destination )
5、生成唯一 ID 目标文件名
语法:
string uniqid ([ string $prefix = "" [, bool $more_entropy = false ]] )前缀或子随机数,
省略则为13位随机数。例:echo " 带后缀:".unique("S_",true);//S_574ea2066121c6.92922561
6、上传文件大小判断:
(1)修改php.ini单个文件大小upload_max_filesize=80M
(2)在表单准中使用隐藏域来存储文件最大允许上传的值 提示:要写在 这行前才有效。
例:
(3)在服务器端也要进行大小判断:以防绕过客户端限制上传文件
例:if ($_FILES['uploadFile']['size']>50*1024) {exit("上传文件不能超过50kb");}
7、利用 php_fileinfo.dll 对文件 MIME 类型进行严格检查
可以使用第三方扩展
php_fileinfo.dll
来对上传文件进的
MIME
类型进行检查。
1
、开启
php_fileinfo.dll
---》extension=php_fileinfo.dll
2
、
finfo_open()
:创建一个检查
MIME
类型的资源
.
3
、
finfo_file()
:返回指定文件的信息(字符集、
MIME
类型)
上传文件八步骤:
第一步:制作HTML 表单
上传方式method 的值必须为 post
表单编码格式:如果要上传附件,表单编码格式必须为enctype="multipart/form-data"
MAX_FILE_SIZE 的值用来限制用户上传文件的大小。
它可以避免我们在花时间等待上传文件之后才发现该文件太大。
1、该值必须设置在file控件之前才会起作用。
2、该值必须是一个最终值,不能是个运算式,因为表单数据都是字符串。例如:可以是1024,不可以是512*2
表单控件:
第二步:接收上传数据$_FILES
上传文件应该使用$_FILES来接收,接收到的数据如下:
[name]、[type]、[tmp_name]、[error]、[size] => 上传文件的大小
第三步:判断系统错误 (详见上传文件错误代码 )
第四步:处理逻辑需要
文件类型 限制:通过判断上传文件的扩展名,来确定上传文件的类型是否符合要求
文件大小 限制:通过判断 $_FILES['size' ]的大小,来判断上传文件的大小是否符合要求
第五步:处理安全需要
MIME类型检测:我们需要获取文件的真实MIME类型,防止文件是病毒文件
第六步:生成随机文件名
我们必须为用户生成一个永不重复的文件名,防止用户之间的上传文件被覆盖
第七步:拼接文件路径
拼接完整的路径,以便下一步文件移动。
工作中,存储文件夹,一般是以年月日命名,方便我们后续的管理和 维护
第八步:移动上传文件 :move_upload_files()
PHP5httpCS(COOKIE,SESSION)
一、COOKIE
COOKIE记录用户信息数据
(
网站自动登录、记录用户爱好、购物车等
)
。
COOKIE
数据是
由服务器
来生成,并传回到
客户端,可以保存在服务器或客户端。
使用COOKIE的特点
实现网站自动登录,可以跟踪用户,并记录用户状态。记录一些用户的爱好,下次访问时:产品推送。
购物车。你曾经浏览过的商品可以记录下来。简单加密不安全,保存数量有限。
COOKIE的工作原理
1、设置COOKIE
描述:发送一个COOKIE到客户端。
语法:bool setcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]] )
例:setcookie("username",'admin',time()+3600,"/",".wdc.com",false,false);
参数:$expire,COOKIE的有效期,默认是0,表示关闭浏览器COOKIE就失效了。1即时性 2过期时间time()+N秒 3永久过期时间PHP_INT_MAX
$path,COOKIE的有效路径。
$domain,COOKIE的有效域名。
$secure,是否仅能使用https来传送COOKIE。
$httponly,是否只能通过http协议来使用COOKIE。
COOKIE
的名称和值$value类型:只能 是字符串 、值还可是能直接转换
为字符串 的
(
字符串、数字、布尔)
,不能是其他值。
例setcookie("username",implode(array(1,2,3)));// Cookie
username=123
自动转为字符串,可以
读取Cookie:
setcookie("lasttime",date('Y-m-d H:i:s',time())); echo "$_COOKIE[lasttime]";//2017-01-16 10:45:20
设置一个过期时间 $expire
例: setcookie("username","user",time()+3600);
2
、
COOKIE
有效
$path
路径
默认是
网站根目录
“
/
”。换句话说:在本网站的
任何子目录下
都可以使用该
COOKIE
。
setcookie(‘username’ , ‘admin’ , 0 , ‘/upload/’)
//
该
COOKIE
数据只能在
upload
目录及其子目录下使用
3
、
COOKIE
域名
$domain
有效性
默认值为当前域名,只可以用在当前域名下
举例:
setcookie(‘username’ , ‘admin’ , 0 , ‘/’ , ‘
.2016.cn
’)
//
设置主域名、一级域名,可以在任何子域名下使用---------------------------------
setcookie(‘username’ , ‘admin’ , 0 , ‘/’ , ‘
www.2016.cn
’)
//
二级域名,只能在
当前
域名下使用
setcookie(‘username’ , ‘admin’ , 0 , ‘/’ , ‘
image.2016.cn
’)
//
二级域名,只能在
当前
域名下使用
setcookie(‘username’ , ‘admin’ , 0 , ‘/’ , ‘
photo.image.2016.cn
’)
//
三级域名,只能
当前
本域名下使用
4、是否仅限
https
可以发送
COOKIE,默认FALSE,如http也可
5
、是否只能通过
http
协议使用
COOKIE 默认FALSE,其他程序也可使用cookie,如JS
6、删除COOKIE(5方法)
1、设置有效时间为过去的时间setcookie("username","user",time()-1);
2、将COOKIE值设置为FALSE:setcookie("username",false);
3、空字符串setcookie("username",'');
4、或不设置COOKIE值setcookie("username");
5、清除浏览器缓存
例:setcookie("username",'admin',time()-1,"/",".wdc.com",false,false);//最好指定路径文件夹
二、SESSION
COOKIE
将会话数据保存在
客户端
,而
SESSION
是将会话数据 存在
服务器 ,
相对安全
;
session是另一种记录客户状态的机制。
特点:
session是基于cookie的,
SESSION
保存的数据量很大;
COOKIE
保存的数据类型只能是字符串,而
SESSION
可以存储所有数据类型,除资源外;
session在第一次建立的时候,会为用户生成一个独一无二的sessionid ,并保存在cookie中 ;
服务器就是通过存储在cookie中的sessionid来识别来访用户的!
2、SESSION 工作原理
3、开启SESSION会话功能
描述:开启一个新的SESSION会话,或者重用一个SESSION会话。语法:
bool session_start ( void )
说明:开启SESSION,就是创建一个SESSION的ID。该ID是唯一的,永不重复,是一个随机的值。
注意:一个页面只能开启一次,不能开启第2次。同一个网站,对于某个用户来说,只有一个SESSION的ID。
4、添加 SESSION 数据
语法:$_SESSION[ name ] = value;例:$_SESSION['user'][]=array('a','b','c');
SESSION的名称,可以是字符下标,也可以是整型下标。其值为除资源外类型数据。
5、读取SESSION数据(注意:设置要在开启之前 )
1 、获取/设置当前的 SESSION - ID 值,
语法: string session_id ([ string $id ] )
2 、获取当前 SESSION 的 COOKIE 数据名称,
语法: string session_name ([ string $name ] )
例、print_r(session_id());// nmro8te07991t5bf419ku294j6
6、删除
SESSION
数据
使用
unset()
来删除单个
SESSION
数据; unset($_SESSION['username']);
1.1删除全部session_unset();id文件还在, 成为垃圾
1.2session_destroy();数据内存中还在,但sessionid文件删除。
注意:删除session时,两步必须都有,缺一不可。
可以将一个空的数组,赋给$_SESSION变量。 $_SESSION=array();
7、销毁当前 SESSION 文件 语法: bool session_destroy ( void )
8、SESSION
在 服务器 的存储位置
保存在服务器的
C
盘下:
C:\WINDOWS\TEMP,
SESSION
文件名的格式:
sess_sessID
9、SESSION 设置:修改 php.ini 文件
1、修改SESSION保存位置(session.save_path)
2、修改SESSION名称(session.name)
3、使用函数修改SESSION的COOKIE的相关参数(session_set_cookie_params())
针对当前用户的配置称为“脚本级配置”“局部配置”。
语法:
void session_set_cookie_params ( int $lifetime [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]] )
参数:$lifetime
,过期时间,以秒为单位,直接写秒,
注意:该函数必须在
SESSION_START()
之前设置
10、SESSION 的垃圾回收
garbage collection(已默认设置)
SESSION
垃圾回收时间
(session.gc_maxlifetime)
maxlifetime
:最大存活时间
在php.ini中session.gc_maxlifetime = 1440 //默认24分钟,同时回收概率
session.gc_divisor 太大该过期时间也不生效
回收的概率
(session.gc_probability
、
session.gc_divisor)
session.gc_probability = 1 (分子默认1),session.gc_divisor = 1000(分母默认1000)
默认的比率是:
1/1000
,每
1000
个用户访问时,会完整的进行一次清理。
11、session补充
COOKIE删除后SESSION是否不再可用
1. 设置php.ini配置文件的“session.use_trans_sid = 1”,或编译时打开了“--enable-trans-sid”选项,让PHP自动跨页传递Session ID。
2. 手动通过URL传值、隐藏表单传递Session ID。
3. 用文件、数据库等形式保存Session ID,在跨页过程中手动调用。
session是基于cookie的,但是如果禁用cookie,只要用
其他方式传递sessionid,session同样可以使用!
例如:使用url的get方式传递sessionid。
如果需要使用get方式传递sessionid,修改php.ini配置:
第一步:session.use_cookies = 0
第二步:session.use_only_cookies = 0
第三步:session.use_trans_sid = 1
实例:1第二次登录显示上次登录时间2设置session
if ($_COOKIE) {
echo "欢迎再次光临,上次登录时间"."$_COOKIE[lasttime]";
}
else {
echo "欢迎光临";
}
setcookie("lasttime",date('Y-m-d H:i:s',time()),time()+300);
session_start();
$_SESSION['username1']='admin';
print_r($_SESSION);
PHP6-talk论坛
一、论坛概述
1
、论坛功能概述
一个项目,主要由两个部分:网站前端
+
网站后台
网站前端:
HTML
结构、
CSS
样式、
JS
行为
(jQuery
、
AJAX)
,
有一个特点:兼容性
。
网站后端
(
网站后台管理
)
:
PHP(
脚本程序
)
、
MySQL
、文件处理、图片处理、
SESSION
和
COOKIE
论坛功能:用户管理、版块管理、贴子管理、积分管理、头衔管理、文件管理、照片管理、系统设置、分页模块、样式管理等。最流程的论坛
Discuz!
我们自己论坛实现的功能:
用户管理
、
贴子管理
。
2
、论坛的数据表结构
用户、帖子、回帖
3
、论坛的文件结构
用户注册模块
用户数据表结构
4
、注册页面
JS
验证
5
、把验证码添加到表单中
6
、随机字符串作为表单验证依据
7
、将用户数据保存到数据库
register_save.php
(
判断表单是否提交、获取表单提交值、验证码判断、判断用户是否已经注册、执行插入
SQL
语句、跳转到成功页面或失败页面
)
图片验证码: include/yanzhengma.php
2
、将验证码字符串写入
SESSION
,
./include/yanzhengma.php
PHP 连接 MySQL 数据库: include/conn.php
二、用户登录模块
3
、用户登录表单主要代码:
login.php
、
login_save.php
4
、用户登录数据的处理
(
判断表单是否提交、获取表单提交值、判断该用户是否存在、更新用户资料、将用户名和密码写入
COOKIE
、将用户名和
ID
写入
SESSION)
5
、实现自动登录
6
、用户登录成功后修改首页的“游客”为“用户名”
index.php
7
、用户登录成功后将“登录|注册”修改为“退出”、
header.php
三、发布贴子
(send.php
、
send_save.php)
在线代码编辑器: FCKEditor 、 KindEditor 等 ,它们主要是用 JS 开发的。除了上传功能是 PHP 的功能外,其它功能都是 JS 实现的。
4 、保存贴子的主要代码
2 、传递贴子 ID 参数
六、回复贴子 (content.php 、 reply_save.php)
知识点补充
描述:计算字符串的
MD5
散列值
语法:
string md5 ( string $str [, bool $raw_output = false ] )例echo md5("admin");
如果可选的
raw_output
被设置为
TRUE
,那么
MD5
报文摘要将以
16
字节长度的原始二进制格式返回
返回:以
32
字符十六进制数字形式返回散列值。
4、 简单正则表达 -字符(具有特殊含义的字符)去验证数据
元字符
含义
+
>=1
*
>=0
?
=0 或 =1
\d
任意数字
\D
非数字
\w
字母、数字、下划线
\W
非字母、数字、下划线
.
除了换行以外的所有字符
{3}
3位长度字符
{3,5}
3-5位的字符
{3,}
大于等于3位的字符
\
转义字符
[2,9]
字符只能是2或9
[2-9]
字符是2到9之间
()
将( 和 ) 之间的表达式定义为“组”(group)
|
将两个匹配条件进行逻辑“或”(Or)运算
// var reg=/^\d{7}$|^\d{4}-\d{7}$/; //练习1:匹配一个固话(类似于4378060 或者 0359-4378060 格式的)
// var reg=/^182\d{8}$/; //练习2:匹配开头为182的手机号码
var reg=/^\w+@[a-z0-9A-Z]+\.[a-z0-9A-Z]+$/;//练习3:匹配一个邮箱
document.getElementById('reg').οnblur=function(){
alert(reg.test(document.getElementById('reg').value));
}