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()效果一样。
4、mysql_num_rows()
-
-
-
描述:取得结果集中行的数目
-
语法: int mysql_num_rows ( resource $result )
-
-
例:$rows = mysql_num_rows($result);或
$sql = "SELECT count(*) FROM student";
第七剑:释放资源---
函数:bool mysql_close($link)一般网页关闭时数据库自动断开连接
<?php //一、连接数据库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");
?>
<?php //二、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 "<br>";
$sql="select * from student order by id";
$result=mysql_query($sql); //4执行MySQL语句
var_dump($result); //resource(4) of type (mysql result)
echo "<br>";
while ($arr=mysql_fetch_assoc($result)) {//使用定界符<<<很方便,但是注意定界符第一个DING后不能有空格或Tab或其他字符
$str=<<<DING
<table><tr align='center'>
<td>{$arr['id']}</td>
<td>{$arr['name']}</td>
<td>{$arr['sex']}</td>
<td>{$arr['edu']}</td>
<td>{$arr['salary']}</td>
<td>{$arr['bonus']}</td>
<td>{$arr['city']}</td>
<td><a href="edit.php?id={$arr['id']}">修改</a>
<a href="javascript:void(0)" onClick="jump({$arr['id']})">删除</a></td>
</tr></table>
DING;
echo $str;//注意要顶格写,且定界符最后一个DING后不能有空格或Tab,必须单独占一行(注意分号;)
}
mysql_close($link);//关闭数据库释放资源(建议添加,节约内存资源)
?>
<script type="text/javascript">
function jump(id){
if (window.confirm("你确定要删除吗?")) {
location.href="sdel.php?id="+id;
}
}
</script>
<?php //
三、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 "<script>window.alert('id={$id}记录已经被删除');location.href='ptest.php'</script>";
exit();
} else {
echo "<script>window.alert('id={$id}记录删除失败');location.href='ptest.php'</script>";
exit();
}
?>
PHP2filel(PHP目录操作,文件操作)
一、目录操作
1
、创建目录
-
描述:新建目录
-
语法: bool mkdir ( string $pathname [, int $mode = 0777 [, bool $recursive = false]] )
-
参数:
-
-
-
$pathname ,创建的目录名称;
-
$mode ,指定目录的权限;
-
-
-
在 windows 系统上,权限设置无效 ;
-
权限是一个八进制的值: 0777
-
第 1 位表示所有者权限,第 2 位表示的所在组权限,第 3 位表示所有的人权限
-
每一位权限也是由三个值构成: 1 为可执行、 2 为可写、 4 为可读
-
举例:如“ 7 ” =1+2+4, 举例: 0644 、 04444 、 0755 等。
-
提示:在 windows 下的只读权限为: 0444
-
-
-
-
-
-
-
$recursive 递归创建。如果为 TRUE ,且上层目录也不存在,则会自动创建。
-
-
-
返回值:创建成功返回 TRUE ,创建失败返回 FALSE 。
-
提示:文件夹不能替换。文件夹默认./ ../目录。
mkdir('../../hhh');//创建单个目录
if (
mkdir($dir,0444,true)
) {//创建多层目录要加true
echo "创建成功";
} else {
echo "创建失败";
}
2
、判断是不是一个目录
-
描述:判断给定文件名是否是一个目录
-
语法: bool is_dir ( string $filename )例 if (is_dir($dir)) {}
3
、判断目录或文件是否存在
-
描述:检查文件或目录是否存在
-
语法: bool file_exists ( string $filename )
4
、删除目录:
-
描述:删除目录
-
语法: bool rmdir ( string $dirname )
-
注意: 目录必须是空的才能删除。删除的文件夹不会进入回收站 。rmdir($dir);
5
、更改目录的访问权限
- 描述:改变文件模式
- 语法:bool chmod ( string $filename , int $mode )
- 参数:$filename,文件名称;$mode,八进制的权限值。chmod($dir,0444);
6
、读到文件夹访问权限
-
描述:取得文件的权限值
-
语法: int fileperms ( string $filename )
$int=fileperms("./image/abc/def/wang/text.txt"); //获取一个文件的权限(八进制)
$int=decoct($int); //八进制转十进制---也可以写成$int=base_convert($int,10,8);
echo substr($int,-4); //0666,其中-4是取后四位数
7
、目录重命名或移动目录
-
描述:重命名一个文件或目录
-
语法: bool rename ( string $oldname , string $newname )例rename($aaa,$bbb);
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)
10、显示中文目录或文件
-
语法: string iconv ( string $in_charset , string $out_charset , string $str )例 其中 $ out_charset ,转换后的字符编码;
$handle=opendir($dir,'ab');
while ($file=readdir($handle)) {
echo iconv("gbk", "utf-8", $file)."<br>";
}//. .. text.txt 新建文本文档.txt
11、关闭目录
语法:
void closedir ( resource $dir_handle )
二、文件操作
1、打开文件
- resource fopen ( string $filename , string $mode ) :打开文件或者 URL
- r 只读,w 写入方式打开文件置0 ,a 追加方式打开,w、a文件不存在,会自动创建
- r+ 文件头读写,w+读写方式打开,文件置0,a+读写追加方式打开
- “b”以二进制数据打开,为了安全起见,在打开方式后加上”b”参数。文便内容的移植。
-
返回:打开成功返回一个 句柄 ( 资源 ) ,打开失败返回 FALSE 。
2、关闭文件
- 描述:关闭一个已打开的文件指针
- 语法:bool fclose ( resource $handle )
3、读取文件内容
3.1读取指定大小的内容
-
- 描述:读取文件(可安全用于二进制文件)
- 语法:string fread ( resource $handle , int $length )例:echo fread($handle,filesize('./test.txt'));
3.2读取一行内容
-
描述:从文件指针中读取一行,默认1k
-
语法: string fgets ( resource $handle [, int $length ] )
3.3把整个文件读入数组
-
描述:把整个文件读入一个数组中
-
-
- $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);
3.4把文件内容读入字符串
(
不用打开
)
-
描述:将整个文件读入一个字符串
-
语法: string file_get_contents ( string $filename )
4、写入文件
4.1写入文件内容
-
-
描述:写入文件(可安全用于二进制文件)
-
语法: int fwrite ( resource $handle , string $string [, int $length ] )
-
$handle=fopen('./shi.txt','ab'); fwrite($handle,'---牡丹亭'); fclose($handle);
4.2将字符串写入文件(不用打开)
-
描述:将一个字符串写入文件---例: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
网络结构
PHP
没有兼容性,浏览器才有兼容性。
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.html和
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
2.3请求主体
GET
方式没有请求的主体,只有
POST
方式才有主体数据
2.4带有附件的
http
请求头
<form name="form1" method="post" enctype="multipart/form-data" 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');
<meta http-equiv="refresh" content="5;test.html">//客户端刷新
<script>location.href="test.html"</script>
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)
-
语法: resource imagecreatetruecolor ( int $width , int $height )
-
提示:分配的第 1 个颜色,不能用于真彩色画布的背景。
1.3
创建基于
windows
调色板
的空画布
-
-
语法: resource imagecreate ( int $x_size , int $y_size )
-
提示:分配的第 1 个颜色,直接用于画布背景。
-
$filename="./images/01.jpg"; $img=imagecreatefromjpeg($filename);
#var_dump($img);//resource(3) of type (gd)
header('Content-type:image/jpeg');//告诉浏览器以图片形式打开
imagejpeg($img);
2、销毁图像:释放资源、释放内存
-
-
语法: bool imagedestroy ( resource $image ), 返回一个布尔值。
-
3、为图像分配颜色(调色)
参数:
$image
是画布。
颜色:可以用
10
进制或
16
进制表示每一位取值
,如:红色:
(255,0,0),
红色:(0xFF,0x00,0x00)
$alpha为透明度,范围是0-127, 127为全透明。
3.1
分配普通颜色
int imagecolorallocate
-
-
语法: int imagecolorallocate ( resource $image , int $red , int $green , int $blue );
-
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 imagejpeg ( 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 "<br>带后缀:".unique("S_",true);//S_574ea2066121c6.92922561
6、上传文件大小判断:
(1)修改php.ini单个文件大小upload_max_filesize=80M
(2)在表单准中使用隐藏域来存储文件最大允许上传的值 提示:要写在<input type='file'>这行前才有效。
例:<input type='hidden' name='max_file_size' value='2*1024*1024'>
(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
类型的资源
.
-
语法: resource finfo_open ([ int $options = FILEINFO_NONE] )
-
-
参数:如果是默认参数,则返回含有字符集的 MIME 类型;如果使用 FILEINFO_MIME 参数,只返回 MIME 类型。
-
3
、
finfo_file()
:返回指定文件的信息(字符集、
MIME
类型)
-
-
语法: string finfo_file ( resource $finfo , string $file_name = NULL)
-
上传文件八步骤:
第一步:制作HTML 表单
上传方式method 的值必须为 post
表单编码格式:如果要上传附件,表单编码格式必须为enctype="multipart/form-data"
MAX_FILE_SIZE 的值用来限制用户上传文件的大小。
它可以避免我们在花时间等待上传文件之后才发现该文件太大。
1、该值必须设置在file控件之前才会起作用。
2、该值必须是一个最终值,不能是个运算式,因为表单数据都是字符串。例如:可以是1024,不可以是512*2
表单控件:<input type="file">
第二步:接收上传数据$_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
1、什么是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
1
、生成随机图片验证码,
2
、将验证码字符串写入
SESSION
,
./include/yanzhengma.php
PHP连接MySQL数据库:include/conn.php
二、用户登录模块
1
、用户数据表结构
2
、用户登录流程图
3
、用户登录表单主要代码:
login.php
、
login_save.php
4
、用户登录数据的处理
(
判断表单是否提交、获取表单提交值、判断该用户是否存在、更新用户资料、将用户名和密码写入
COOKIE
、将用户名和
ID
写入
SESSION)
5
、实现自动登录
6
、用户登录成功后修改首页的“游客”为“用户名”
index.php
7
、用户登录成功后将“登录|注册”修改为“退出”、
header.php
8
、用户退出功能模块
三、发布贴子
(send.php
、
send_save.php)
1、数据表结构(thread)
2、只有用户会员才可以发贴子
3、加入在线编辑器
在线代码编辑器:FCKEditor、KindEditor等 ,它们主要是用JS开发的。除了上传功能是PHP的功能外,其它功能都是JS实现的。
4、保存贴子的主要代码
四、贴子列表(list.php)
1、数据表结构(user、thread)
2、连表查询
3、贴子列表主要代码
4、数据分页原理
5、单击页码向服务器传递页码参数
6、仿百度分页
五、贴子内容(content.php)
1、数据表结构(thread)
2、传递贴子ID参数
3、贴子内容的主要代码
六、回复贴子(content.php、reply_save.php)
1、数据表结构(reply)
2、回复的表单
3、保存回贴内容
4、读取回贴内容
知识点补充
1
、
md5()
加密码函数
-
-
-
-
描述:计算字符串的 MD5 散列值
-
语法: string md5 ( string $str [, bool $raw_output = false ] )例echo md5("admin");
-
如果可选的 raw_output 被设置为 TRUE ,那么 MD5 报文摘要将以 16 字节长度的原始二进制格式返回
-
返回:以 32 字符十六进制数字形式返回散列值。
-
-
-
2
、
urlencode()
-
描述:编码 URL 字符串, 语法: string urlencode ( string $str )
-
返回:返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号( % )后跟两位十六进制数,空格则编码为加号( + )。
3
、
urldecode()
-
-
描述:解码已编码的 URL 字符串
-
语法: string urldecode ( string $str )
-
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)运算
|
<script type="text/javascript">
// 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));
}
</script>