php--编程

作者: DragonRat | 来源:发表于2018-05-21 18:38 被阅读2次

    作者:烨竹

    一、前后台数据传递

    前台数据提交: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为高的区域


    相关文章

      网友评论

        本文标题:php--编程

        本文链接:https://www.haomeiwen.com/subject/gbqqjftx.html