作者:烨竹
一、前后台数据传递
前台数据提交:get,post
后台数据接收:$GRT,$POST,$REQUEST
特殊表单提交:
二、文件上传
前台部分
form表单:
action属性要指向php文件,
method属性要设置为post
enctype 用于设置数据的传递方式
取值:
(默认的)application/x-www-url-encoded 只能上传文本数据
multipart/form-data 不仅仅传递文本数据,还可以进行文件上传
后台处理封装如下:
<?php
/**
* @Author: Marte
* @Date: 2018-03-07 21:24:31
* @Last Modified by: Marte
* @Last Modified time: 2018-03-08 21:59:09
*/
$author=$_POST["author"];
$introduce=$_POST["introduce"];
echo $_FILES["filename"]["size"];
if($_FILES["filename"]["size"]>1024*1024){
echo "<br>上传文件不能超过2M<br>";
exit();
}
$type=$_FILES["filename"]["type"];
if($type!=="image/jpeg" && $type!=="image/jpg"){
echo "<br>只能上传图片格式<br>";
echo $type;
exit();
}
if(is_uploaded_file($_FILES["filename"]["tmp_name"])){
//把文件转存到你希望的目录iconv===>转换字符编码
$uploadFile=$_FILES["filename"]["tmp_name"];
$user_path=$_SERVER["DOCUMENT_ROOT"]."/file/up/".$author;
if(!file_exists($user_path)){
mkdir($user_path);
}
$file_true_name=$_FILES["filename"]["name"];
$move_to_file=$user_path."/".time().rand(1,1000).substr($file_true_name,strrpos($fil e_true_name,"."));
if(move_uploaded_file($uploadFile,iconv("utf-8","gb2312",$move_to_file))){
echo "上传成功";
}else{
echo "上传失败";
}
}
?>
三、MYDQL数据库操作
登陆mysql:mysql_connect('host:port','user','password');
设置客户端字符集:mysql_query(sql);
选择数据库:mysql_select_db(‘数据库名’);
mysql_error(); 用于获取最近执行的一条sql的错误信息,如果没错误返回的是’’
mysql_errno(); 用于获取最近执行的一条sql的错误代码,如果没错误返回的是0
<?php
header('content-type:text/html;charset=utf-8');
//连接数据库
$mysqli = mysqli_connect('127.0.0.1:3306','root','root','blog') or die('数据库连接失败');
//设置客户端字符集
$sql ='set names utf-8';
$res = $mysqli -> query($sql) or die('2');
//增删改查
$sql ="select username from tp_admin where username = '$username' and password='$password'";
$res = $mysqli -> query($sql) or die('3');;
if(mydql_errno()){
echo 'sql语句错误';
echo '错误代码:',mysql_error(),'<br>';
echo '错误信息:',mysql_error(),'<br>';;
}
?>
四、文件和目录操作
文件相关信息:
file_exists(filename);文件是否存在
filemtime($filename);用于判断文件的最后修改时间
filesize(filename) ;用于判断文件的大小
basename(path);用于获取path字符串的文件名 path是一个表示文件的完整路径
realpath(filename);用于规范文件的路径,如果不存在返回false,如果存在,如果是相对路径会转换为绝对路径
打开文件 :fopen(filename,mode)
filename是一个表示文件的字符串
mode表示的打开的模式,取值
如果打开文件成功会返回资源类型(stream)
关闭文件fclose(handle);
handle是使用fopen()函数的返回值。
写入文件
fwrite(handle,data);
handle是fopen()函数返回的值,data是所要写的数据。
file_put_contents(filename,data);
filename是一个表示文件名的字符串
data是所要书写的数据
读取文件内容:
fgetc(handle);
handle是fopen函数的返回值
每次只读取1个字节
fgets(handle【,len】);
handle是fopen函数的返回值
每次只读取len-1个字节,如果len省略表示的是1024,如果遇到换行回车,会结束读取
fgetstring(handle,len)
handle是fopen函数的返回值
每次只读取len-1个字节,如果遇到换行回车,不会结束读取
ile(filename)
filename是一个表示文件的字符串
将文件的每一行,转换为数组的一个元素
readfile(filename)
filename是一个表示文件的字符串
将读取到的文件的内容,直接放到输出缓存。
file_get_contents(filename);
filename是一个表示文件的字符串
用于读取文件的全部内容,并返回
拷贝文件
copy(source,dest)
拷贝一个文件,同时可以进行改名
删除文件
unlink(filename)
filename是一个表示文件的字符串
文件的判断
is_file(filename);
主要用于区分文件与文件夹
文件指针(了解)
fseek(handle,n【,whence】); 用于移动文件的指针
n表示的所要移动的位置
whence表示相对于谁进行移动,取值:
SEEK_SET (缺省)相对于文件头部
SEEK_CUR 相对于当前位置
SEEK_END 相对于文件不尾部
ftell(handle); 用于获取文件的指针
文件锁(了解):flock(handle,type)
handle是fopen函数的返回值
type 是锁的类型,取值:
LOCK_EX 独占锁
LOCK_UN 解锁
目录操作
创建目录
mkdir(path【,mode,【recursive】】);
主要有于创建一个文件夹
path 所要创建文件夹
mode 所要创建的文件夹的权限(linux)
recursive 如果是true可以可以创建多层文件夹
打开目录
opendir(folder)
关闭目录
closedir(handle);
目录重命名
rename(source,dest)
用于对文件进行更名
删除目录
rmdir(folder);
用于删除文件夹
注意删除文件夹,文件夹必须为空,而且不能一次删除多级
读取目录内容
readdir(handle)
handle是个opendir函数的返回值
用于读取文件夹的内容每次只读取一个条目录
注意:不能读取子文件夹中的内容
扫描目录
scandir(folder)
用于扫描文件夹,一次性将当前文件夹中所有的内容都读取出来,并以数组的形式返回。
注意:不能读取子文件夹中的内容
判断文件夹还是文件
is_dir(dir);
案例:遍历文件夹
①、使用函数遍历指定文件夹的当前层级的内容(不包含子查询)
②、将文件夹以红色输出,文件以蓝色输出
③、如果是文件夹再遍历
五、HTTP协议
在PHP中也允许我们通过调用header()函数,来操作http协议的响应头来,实现某些功能。
①、设置浏览器的显示编码
header('Content-type:text/html;charset=utf-8');
②、跳转
header('location:http://www.baidu.com');
③、实现下载
六、数据采集
①、初始化curl
curl_init();
用于初始化curl功能。(相当于打开了一个浏览器)。
②、设置curl的参数
curl_setopt(ci,参数名,参数值);
ci curl的资源
参数: CURLOPT_URL 用于设置所要访问的网址
CURLOPT_RETURNTRANSFER 如果是true,那么返回值并不会显示在界面,而是返作为curl_exec()函数的返回值
③、执行curl
curl_exec($ci);
如下代码:
<?php
/**
* Class Curl curl简单封装 get post
*/
class Curl
{
/**
* @brief get请求
* @param $url 请求的url
* @param array $param 请求的参数
* @param array $header 头部数据
* @param int $timeout 超时时间
* @param int $followAction 是否允许被抓取的链接跳转
* @param int $gzip 是否启用gzip压缩
* @param string $format 格式
* @param int $log 是否启用日志
* @return mixed
*/
public static function get($url, $param = array(), $header = array(), $timeout = 3, $followAction = 0, $gzip = 0, $format = 'html',$log=0)
{
$ch = curl_init();
if (is_array($param)) {
$url = $url . '?' . http_build_query($param);
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)");
if ($followAction) {
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); //允许被抓取的链接跳转
}
if ($gzip) {
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept-Encoding: gzip, deflate'));
curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate');
}
//curl_setopt($ch, CURLOPT_REFERER, '');
$data = curl_exec($ch);
if ($format == 'json') {
$data = json_decode($data, true);
}
if($log){
if($format=='html'){
self::_logCurlInfo($ch,$param,'');
}else{
self::_logCurlInfo($ch,$param,$data);
}
}
curl_close($ch);
return $data;
}
/**
* @brief post请求
* @param $url 请求的url地址
* @param array $param 请求的参数
* @param array $header http头
* @param int $ssl 是否启用ssl
* @param string $format 返回的格式
* @param int $log 是否启用日志
* @return mixed
*/
public static function post($url, $param = array(), $header = array(), $ssl = 0, $format = 'json',$log=0)
{
$ch = curl_init();
if (is_array($param)) {
$urlparam = http_build_query($param);
} else if (is_string($param)) { //json字符串
$urlparam = $param;
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, 120); //设置超时时间
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回原生的(Raw)输出
curl_setopt($ch, CURLOPT_POST, 1); //POST
curl_setopt($ch, CURLOPT_POSTFIELDS, $urlparam); //post数据
if ($header) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
}
if ($ssl) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true); //将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
}
$data = curl_exec($ch);
if ($format == 'json') {
$data = json_decode($data, true);
}
if($log){
if($format=='html'){
self::_logCurlInfo($ch,$param,'');
}else{
self::_logCurlInfo($ch,$param,$data);
}
}
curl_close($ch);
return $data;
}
/**
* 请求信息记录日志
* @param $ch curl句柄
* @param $request 请求参数
* @param $response 响应结果
*/
private static function _logCurlInfo($ch,$request,$response)
{
$info = curl_getinfo($ch);
$resultFormat = "耗时:[%s] 返回状态:[%s] 请求的url[%s] 请求参数:[%s] 响应结果:[%s] 大小:[%s]kb 速度:[%s]kb/s";
$resultLogMsg = sprintf($resultFormat,$info['total_time'],$info['http_code'],$info['url'],var_export($request,true),var_export($response,true),$info['size_download']/1024,$info['speed_download']/1024);
error_log($resultLogMsg.PHP_EOL,3,self::CURL_LOG_PATH);
}
}
/* example:
echo Curl::get('http://www.baidu.com');
$arr = Curl::post('127.0.0.1/test/test.php',['a'=>1,'b'=>2],'',0);
var_dump($arr);
*/
七、cookie和session
cookie
设置cookie
①、设置cookie
语法:
setcookie(name,value【,expire【,path【,domain【,secure【,httponly】】】】】);
name 设置cookie的名
value 设置cookie的值
②、cookie的有效时间
语法:
setcookie(name,value,expire);
说明:
expire是用于设置有效期,单位是秒,如果省略表示这个cookie是进程cookie。
有效时间是浏览器关闭。
expire是从时间原点(计算机世界内将1970年1月1日0时0分0秒设置为时间原点)算起。
如果有效时间过期,那么浏览器将不会再携带此cookie的数据给服务器端
③、cookie的路径
语法:
setcookie(name,value,expire,path);
说明:
php文件有自己的位于服务器的路径
cookie有自己的位于客户端的显示路径
一个php文件究竟那读取哪些cookie,要看cookie的显示路径是否是当前php文件的父路径。
实际工作中使用最多的就是一个cookie整站有效(将要设置的cookie如何让站点中的任何一个php文件都能读取到)。
④、cookie的域
语法:
setcookie(name,value,expire,path,domain);
说明:
主要有生实现cookie跨域,前提是必须是二级域名相同。
语法:
setcookie(name,value,expire,path,domain,secure)
说明:
secure参数表示cookie只能使用https协议进行传输
http
https = http + ssl
⑥、httponly
语法:
setcookie(name,value【,expire【,path【,domain【,secure【,httponly】】】】】);
说明:
用于设置当前cookie是否只允许php进行访问。
读取cookie
$_COOKIE预定义的变量,就是用于保存客户端在请求服务器进,携带的cookie数据
删除cookie
只要是将cookie的用效期设置为过期,那么下次访问服务器时,cookie就不会携带过来。
方法1:设置过期时间为当前时间之前
方法2:将cookie的值设置为字符‘’
关于cookie值的类型
cookie的值只能字符串,所以不能存储数组、对象。
但实际开发中,确实有需数组的需求。可以使用如下变通的方法来实现
session
简单理解:ession也是会话技术中的一种,它是以cookie为基础,将重要的数据保存在服务器上,再将能够唯一标识用户数据以cookie的形式保存客户端
开启session
session_start()
session操作——设置session
本质就是向$_SESSION变量中写数据 $_SESSION['name']='zhangsan';
session操作——读取session
读取session就是从$_SESSION这个变量中读取数据 echo $_SESSION['name'];
session操作——获取session ID
session_id() echo session_id();
session数据
$_SESSION数组的下标只能是字符,但是$_SESSION中可以存储任何类型的数据
销毁session
session_destroy();
八、绘画gd2,验证码,水印,缩略图
创建画布
imagecreatetruecolor(w,h)
分配颜色
imagecolorallocate(img,r,g,b)
填充颜色
imagefill(img,x,y,color);
基本图形的绘制
绘制矩形
imagerectangle(img,x1,y1,x2,y2,color);
绘制直线
imageline(img,x1,y1,x2,y2,color);
绘制字母
imagestring(img,size,x,y,string,color);
绘制汉字
imagettftext(img ,size,angle,x,y, ,color,font,string);
输出画布
imagepng(img【,filename】)
imgjpeg(img【,filename】);
imagegif(img【,filename】);
说明:filename就是所要保存的图片文件的名子,如果省略表示,输出到浏览器
验证码
简单理解:验证码的本质就是用于区分人与计算机,就是减少对站点的一个访问频率。
制作验证码:制作验证码的本质就是将随机生成的字符串绘制到画布
验证码类:一般框架会有封装,就不多做介绍了。
水印
简单理解:版权标识,起到宣传的作用;
原理:在张图片上嵌入另一个图片
图片合并:
imagecopymerge($dest,$src,$dx,$dy,$sx,$sy,$sw,$sh,optical);
说明:
$dest (目标图片)是用户图片
$src (源图片)logo图片
$dx,$dy 目标图片上的某个点
$sx,$sy 源图片上的某个点
$sw,$sh 在源图片是所获取的宽高
optical 透明度取值0至100
在src上从sx,sy为起点,截取sw为宽sh为高的区域,放在dest上的dx,dy点上。
缩略图
简单理解:节省网络带宽,增加用户的体验度。
原理:将用户图片,等比缩放,并放到一个指定的画布中
imagecopyresampled ($dest , $src, $dx , $dy , $sx ,$sy ,$dw , $dh , $sw ,$sh )
说明:
dest 目标图片(最终的缩略图)
src 源图(用户图片)
dx,dy 目标图片上的某个点
sx,sy 源图上的某个点
dw,dh 目标图片的宽高
sw,sh 源图上的宽高
在src图片从sx,sy点开始取sw为宽sh为高的区域,,放在dest画布的以dx,dy为左上角顶点,以sw为宽,sh为高的区域
网友评论