PHP应用-一揽子解决方案

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)一般网页关闭时数据库自动断开连接
一、连接数据库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);//关闭数据库释放资源(建议添加,节约内存资源)
?>
三、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 、创建目录
  • 描述:新建目录
  • 语法: 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)."
";
     }//. .. text.txt 新建文本文档.txt
11、关闭目录 语法: void closedir ( resource $dir_handle )
二、文件操作
1、打开文件
  • resource fopen ( string $filename , string $mode ) :打开文件或者 URL
  • r   只读w 写入方式打开文件置0 ,追加方式打开,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) 统一资源定位符。对互联网上文件访问的一种方式。
1URL的构成
          语法: 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 请求头
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');
          //客户端刷新
          

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 "
    带后缀:".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 类型的资源 .
  • 语法: 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
表单控件:
第二步:接收上传数据$_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、获取/设置当前的SESSIONID值, 语法:string session_id ([ string $id ] )
2、获取当前SESSIONCOOKIE数据名称, 语法: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、加入在线编辑器
在线代码编辑器:FCKEditorKindEditor ,它们主要是用JS开发的。除了上传功能是PHP的功能外,其它功能都是JS实现的。
4、保存贴子的主要代码

四、贴子列表(list.php)

1、数据表结构(userthread)
2、连表查询
3、贴子列表主要代码
4、数据分页原理
5、单击页码向服务器传递页码参数
6、仿百度分页

五、贴子内容(content.php)

1、数据表结构(thread)
2、传递贴子ID参数
3、贴子内容的主要代码

六、回复贴子(content.phpreply_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)运算


你可能感兴趣的:(php)