首页 > 编程技术 > php

php生成HTML文件的应用和原理笔记

发布时间:2016-11-25 14:59

生成html页面我们需要使用到的文件系统操作函数包括有fopen , fread , filesize , fwrite , fclose了,这些是基本要用到了,还像删除,创建目录之类的,下面我们来看看。

1.PHP部分文件操作函数。(fopen , fread , filesize , fwrite , fclose)

2.unlink() , mkdir() 删除函数。

-------------------------------------------------------------

1.PHP部分文件操作函数
(1)fopen 打开文件函数。 R / W / A
格式:fonpen(路径和文件名,打开方式);

(2)fread 读取文件内容。
格式:fread(打开的文件,结束的位置);

(3)filesize 读取文件大小,字节为计量单位。
格式:filesize(路径和文件名);

(4)fwrite 写入文件内容。
格式:fwrite(路径和文件名,写入的内容);

(5)fclose 关闭打开的文件。
格式:fclose(路径和文件名);

-------------------------------------------------------------

2.unlink(); mkdir(); 删除函数

unlink(); 删除文件函数
格式:unlink(路径和文件);

mkdir(); 删除目录函数
格式:mkdir(路径和目录名);

-------------------------------------------------------------

实例操作:

 代码如下 复制代码

<?php
$title = "新标题";
$content = "新内容www.111cn.net";

$fp = fopen("tmp.htm", "r"); //打开文件,以只读方式。
$str = fread($fp, filesize("tmp.htm")); //读取文件内容,格式:fread(打开的文件,结束的位置);。
$str = str_replace("{title}", $title, $str); //将str变量中的路径文件内容替换掉重新赋值
$str = str_replace("{content}", $content, $str);
fclose($fp); //以上为替换模板的内容。

$id = "hello";
$path = $id . '.htm';
$handle = fopen($path, "w"); //写入方式打开新闻路径
fwrite($handle, $str); //把刚才替换的内容写进生成的HTML文件
fclose($handle);
echo "生成成功";
?>

例,找到一个html生成类

 代码如下 复制代码

<?php

// --------------------------------------------------------------------------
// File name   : html.class.php
// Description : www.111cn.net生成静态页面的类
// Requirement : PHP5
//
// Copyright(C), 蟋蟀, 2013, All Rights Reserved.
//--------------------------------------------------------------------------

class myHtml{

//生成html文件路径
private $html_dir="./";
//html文件名称
private $html_name;
//生成html文件的位置名称
public  $path;
//缓存区内容
private $content;
//文件句柄
private $handle;
//内存指针
private $accesses;
         //构造函数
public function __construct($html_dir="",$html_name="")
{
   $this->accesses++;
  //如果文件路径不存在建立文件夹
  if(opendir($html_dir)==0)
         {
           mkdir($html_dir);
         }

  $this->html_dir=$html_dir!=""?$html_dir:"./";
  $this->html_name=$html_name!=""?$html_name:substr(basename(__FILE__),0,strrpos(basename(__FILE__),".")).".html";
  $this->path= ($this->html_dir{strlen($this->html_dir)-1}=="/")
     ?($this->html_dir.$this->html_name):($this->html_dir."/".$this->html_name);
  ob_start();

}
//析构函数
public function __destruct()
        {
         $this->accesses--;
          ob_end_clean();
        }
//生成html页面
function tohtml()
{
$this->content=ob_get_contents();
if (is_file ($this->path)){
  @unlink ($this->path);
}
$handle = fopen ($this->path,"w");
if (!is_writable ($this->path)){
  return false;
}
if (!fwrite ($handle,$this->content)){
  return false;
}
fclose ($handle); //关闭指针
return $this->path;
}
}
/*
$html=new myHtml("./","z.htm");
print "静态页面程序";
$html->tohtml();
*/
?>

 

在php中cookie与session的区别在于cookie数据保存在客户端,session数据保存在服务器端了,自然在使用方法上会有些细节上的区别了,但后面比前者要安全得多。

1.cookie&session简介和区别

cookie数据保存在客户端,session数据保存在服务器端。

简 单的说,当你登录一个网站的时候,如果web服务器端使用的是session,那么所有的数据都保存在服务器上面,客户端每次请求服务器的时候会发送 当前会话的sessionid,服务器根据当前sessionid判断相应的用户数据标志,以确定用户是否登录,或具有某种权限。由于数据是存储在服务器 上面,所以你不能伪造,但是如果你能够获取某个登录用户的sessionid,用特殊的浏览器伪造该用户的请求也是能够成功的。sessionid是服务 器和客户端链接时候随机分配的,一般来说是不会有重复,但如果有大量的并发请求,也不是没有重复的可能性,我曾经就遇到过一次。登录某个网站,开始显示的 是自己的信息,等一段时间超时了,一刷新,居然显示了别人的信息。

如果浏览器使用的是 cookie,那么所有的数据都保存在浏览器端,比如你登录以后,服务器设置了 cookie用户名(username),那么,当你再次请求服务器的时候,浏览器会将username一块发送给服务器,这些变量有一定的特殊标记。服 务器会解释为 cookie变量。所以只要不关闭浏览器,那么 cookie变量便一直是有效的,所以能够保证长时间不掉线。如果你能够截获某个用户的 cookie变量,然后伪造一个数据包发送过去,那么服务器还是认为你是合法的。所以,使用 cookie被攻击的可能性比较大。如果设置了的有效时间,那么它会将 cookie保存在客户端的硬盘上,下次再访问该网站的时候,浏览器先检查有没有 cookie,如果有的话,就读取该 cookie,然后发送给服务器。如果你在机器上面保存了某个论坛 cookie,有效期是一年,如果有人入侵你的机器,将你的  cookie拷走,然后放在他的浏览器的目录下面,那么他登录该网站的时候就是用你的的身份登录的。所以 cookie是可以伪造的。当然,伪造的时候需要主意,直接copy   cookie文件到 cookie目录,浏览器是不认的,他有一个index.dat文件,存储了 cookie文件的建立时间,以及是否有修改,所以你必须先要有该网站的 cookie文件,并且要从保证时间上骗过浏览器,曾经在学校的vbb论坛上面做过试验,copy别人的 cookie登录,冒用了别人的名义发帖子,完全没有问题。

Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID 为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一 SessionID提交到服务器端,来存取Session数据。这一过程,是不用开发人员干预的。所以一旦客户端禁用Cookie,那么Session也会失效。

服务器也可以通过URL重写的方式来传递SessionID的值,因此不是完全依赖Cookie。如果客户端Cookie禁用,则服务器可以自动通过重写URL的方式来保存Session的值,并且这个过程对程序员透明。

可以试一下,即使不写Cookie,在使用request.getCookies();取出的Cookie数组的长度也是1,而这个Cookie的名字就是JSESSIONID,还有一个很长的二进制的字符串,是SessionID的值。


2.cookie的配置与应用

基本语法:setcookie("cookie", "cookievalue", time()+3600, "/forum", ".xxx.com", 1);
                      名字          值      有效时间,毫秒   路径     保存域    是否使用https

访问和处理cookie
访问基本语法:

 代码如下 复制代码
echo $mycookie;
echo $cookiearray['0'];
echo $_COOKIE['mycookie'];   (推荐)
echo $HTTP_COOKIE_VARS['mycookie'];

删除cookie
删除基本语法:

 代码如下 复制代码
setcookie("cookie","");   (用空cookie覆盖原值)
setcookie("cookie", "value", time()-1/time());   (时间销毁)

实例:

 代码如下 复制代码

<?php
if ($_POST['user'] && $_POST['password']) {
 setcookie("us", $_POST['user']);
 setcookie("pwd", $_POST['password']);
 echo "用户:".$_COOKIE['us']."<br />"."密码:".$_COOKIE['pwd'];
}
?>

<form id="form1" name="form1" method="post" action="file.php">
   用户:<input type="text" name="user" />
   <br />
   密码:<input type="text" name="password" />
   <input type="submit" name="Submit" value="提交" />
</form>


注意:在输出之前必须操作完cookie,否则error。

--------------------------------------------------------

1.session的配置与应用

基本语法:

 代码如下 复制代码
session_start();   //初始化,必须放在文件头。
$_SESSION['name'] = value;   //配置session。
echo $_SESSION['name'];   //使用session。
isset($_SESSION['name']);   //判断。
unset($_SESSION['name']);   //删除。
session_destroy();   //销毁所有session。

举一些实例来介绍session与cookie上的区别

<一>:session


               启动session:


                      session_start();


                       PS:该函数需要放在文件最前端,前面不要有任何输出,最好顶头写(不要有前导空格).


              设置session:


                       $_SESSION['name']='value';


                       PS:在使用的时候,直接使用$_SESSION[]方法设置值,其中"[ ]"部分为session的name,"="后面为值.


               读取session:


                      echo $_SESSION['name'];

                       PS:不论是设置session还是读取session都要先开启session(使用session_start()).

               销毁session:


                       1.关闭浏览器,自动销毁.


                       2.直接给 $_SESSION[]=''; 清空.

 

 

       <二>:cookie


               设置cookie:


                      bool setcookie(string name[,string value[,int expire[,string path[,string domain[,bool secure[,bool httponly]]]]]] )

                           name:   cookie变量名

                           value:   cookie变量的值

                           expire:  有效期结束的时间,

                           path:    有效目录,

                           domain: 有效域名,顶级域唯一

                           secure:  如果值为1,则cookie只能在https连接上有效,如果为默认值0,则http和https都可以.

               例如:

                       setcookie('username','hello',time()+3600);

                       setcookie("username",'hello',time()+3600,"/~rasmus/",".paea.cn",1);

                       PS:setcookie前不能出现输出数据操作,否则就会出现错误类似于session_start().

              读取cookie:

                       echo $_COOKIE['username'].'||';

                       echo $HTTP_COOKIE_VARS["username"];

                      PS:两种输出方式.

               销毁cookie:


                       设置一个过去的时间来注销cookie

                       setcookie('username','hello',time()-3600);

                       PS:setcookie前不能出现输出数据操作,否则就会出现错误类似于session_start().

 

总结一下

作用:

 session和cookie都是用于暂时记录用户数据的方式.

区别:

1.SESSION存储在服务器端,用户无法进行修改,比较安全,COOKIE存储在客户端,用户可以进行修改,不安全。

2.Session会在一定时间内保存在服务器上,会占用服务器资源。Cookie存储在用户windows下的Temp目录中的。

3.单个cookie在客户端的限制是4k

4.session遍历使用$_SESSION[] ,cookie遍历使用$_COOKIE[]

5.禁用过cookie后session无法使用

6.session使用的时候要加session_start()并且前面不能有任何输出.

php中上传文件必须知道几个技巧,一个必须是由表单post过去的数据,然后由php move_uploaded_file进行接受了,再保存到服务器指定路径即可。

1.form 标签 enctype 属性。

2.$_FILES 系统函数。 //将上传内容转换为数组。

3.move_uploaded_file 函数。 //移动存放在缓存文件夹里的上传文件到指定文件夹。

4.is_uploaded_file 函数。 //判断是否存在。

---------------------------------------

1.form 标签

格式:<form enctype="multipart/form-data" ... ...>
      <input name="upfile" type="file">

2.$_FILES 系统函数
$_FILES['name'] //客户端上传文件原文件名。
$_FILES['type'] //文件的MIME类型,如:“image/gif”
$_FILES['size'] //上传文件大小,字节为单位。
$_FILES['tmp_name'] //临时文件名,一般为默认。
$_FILES['error'] //上传相关情况代码(0:成功,1:超过php.ini设置大小。2:超过PHP文件代码指定大小。3:文件只有部分被上传。4:没有文件被上传。5:上传文件大小为0。)

3.move_uploaded_file 函数
上传后移动文件到目标位置的函数
move_uploaded_file(临时文件,目标位置和文件名;)

4.is_uploaded_file 函数
判断上传MIME类型的文件函数
is_uploaded_file(MIME);

---------------------------------------

实例:

 代码如下 复制代码
<form enctype="multipart/form-data" action="upload.php" method="post">
<input type="hidden" name="max_file_size" value="100000">
<input name="userfile" type="file">  
<input type="submit" value="上传文件">
</form>

注意

1、表单中enctype=”multipart/form-data”必须指定,以便让服务器知道文件带有常规的表单信息。
2、必须有一个可以设置上传文件最大长度的表单区域,即允许上传文件的最大值(按字节计算),它是隐藏值域,即max_file_size,通过设置其Value(值)可以限制上传文件的大小,避免用户在花时间等待上传大文件之后才发现该文件太大了的麻烦。但是一般别人可以绕过这个值,所以安全起见,最好是在php.ini文件中配置upload_max_filesize选项,设定文件上传的大小,默认是2M

 代码如下 复制代码

function uploadfile($type,$name,$ext,$size,$error,$tmp_name,$targetname,$upload_dir)
{
    $MAX_SIZE = 2000000;
    $FILE_MIMES = array('image/pjpeg','image/jpeg','image/jpg','image/gif','image/png');
    $FILE_EXTS = array('.jpg','.gif','.png','.JPG','.GIF','.PNG');

    $file_path = $upload_dir.$targetname;
   
    if(!is_dir($upload_dir))
    {
        if(!mkdir($upload_dir))
            die("文件上传目录不存在并且无法创建文件上传目录");
        if(!chmod($upload_dir,0755))
            die("文件上传目录的权限无法设定为可读可写");
    }
   
    if($size>$MAX_SIZE)
        die("上传的文件大小超过了规定大小");

    if($size == 0)
        die("请选择上传的文件");

    if(!in_array($type,$FILE_MIMES) || !in_array($ext,$FILE_EXTS))
        die("请上传符合要求的文件类型");

    if(!move_uploaded_file($tmp_name, $file_path))
        die("复制文件失败,请重新上传");

    switch($error)
    {
        case 0:
            return ;
        case 1:
            die("上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值");
        case 2:
            die("上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值");
        case 3:
            die("文件只有部分被上传");
        case 4:
            die("没有文件被上传");
    }
}

如何上传多个文件?比如同时上传3个文件

 代码如下 复制代码

只需将


 <input name="userfile" type="file">

改成

<input name="userfile[]" type="file">
<input name="userfile[]" type="file">
<input name="userfile[]" type="file">

对应的在调用此函数时,$_FILES['userfile']['name'][0],代表第一个文件的相关文件信息,依此类推,其他也一样。

 

一些关于php性能配置,有必须时我们也可以修改一下

max_execution_time = 30 ;每个PHP页面运行的最大时间值(秒),默认30秒
max_input_time = 60 ;每个PHP页面接收数据所需的最大时间,默认60秒
memory_limit = 128m ;每个PHP页面所吃掉的最大内存,默认128M。如果觉得小了,可以设置大点。128够用。
max_execution_time = 600
max_input_time = 600
upload_max_filesize = 32m
post_max_size = 32m

如果文件大小限制了我们可以如下解决

打开php.ini,首先找到

file_uploads = on ;是否允许通过HTTP上传文件的开关。默认为ON即是开

upload_tmp_dir ;文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹

upload_max_filesize = 8m ;望文生意,即允许上传文件大小的最大值。默认为2M

post_max_size = 8m ;指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值。默认为8M

一般地,设置好上述四个参数后,上传<=8M的文件是不成问题,在网络正常的情况下。

但如果要上传>8M的大体积文件,只设置上述四项还一定能行的通。

 
进一步配置以下的参数

max_execution_time = 600 ;每个PHP页面运行的最大时间值(秒),默认30秒

max_input_time = 600 ;每个PHP页面接收数据所需的最大时间,默认60秒

memory_limit = 8m ;每个PHP页面所吃掉的最大内存,默认8M

把上述参数修改后,在网络所允许的正常情况下,就可以上传大体积文件了

max_execution_time = 600
max_input_time = 600
memory_limit = 32m
file_uploads = on
upload_tmp_dir = /tmp
upload_max_filesize = 32m
post_max_size = 32m

php中魔术函数包括有tostring、call、clone、autoload几个常用的函数,希望此教程对各位朋友会有所帮助。

面向对象开发总结

1.对象的描述和配置。(可以理解为对对象的输出文字描述)
2.对象方法的一场处理。(可以理解为出现异常时候,自定义更人性化的错误信息)
3.克隆对象的应用。(可以理解为在原始对象上,克隆出一样的另一个对象,注意是另一个。)
4.自动载入对象的方法。(可以理解为引用)

1.对象描述和配置

方法名:__tostring()
格式:

 代码如下 复制代码
class My {
function __tostring() {
return "这里写这个类的文字描述"; //要用return,echo会出错。
}
}
$p = new My();
echo $p;

实例:

 代码如下 复制代码
<?php
class My {
 function __toString() {
  return "这个类的作用是,保卫地球。";
 }
}
$p = new My();
echo $p;
?>

2.对象方法的异常处理

调用一些不存在的对象方法的异常处理,是程序正常运行。
方法名:__call($funname,$arr_value)
格式:

 代码如下 复制代码
class My {
function __call($n,$v) {
echo "错误的方法名:".$n;
echo "错误的参数:".$v;
}
}

实例:

 代码如下 复制代码

<?php
class My {
 function __toString() {
  return "这个类的作用是,保卫地球。";
 }

 function __call ($n,$v) {
  echo "错误的方法<b>".$n."</b><br />";
    echo "错误的值<b>".print_r($v)."</b>"; //值是以数组方式传递的,所以要用print_r。
 }
}
$p = new My();
$p->demo("第一",6);
?>

3.对象的克隆

通过克隆方式可以在内存中生成两个一样的对象或升级原对象。(不是简单的赋值,而是在内存中开两块内存,克隆出的和被克隆的是2个属性方法一样的不同的两个对象)
方法名:__clone()
关键字:clone
格式:

 代码如下 复制代码
class My {
function __clone() {
echo "克隆时自动调用的函数";
}
}
$a = new My();
$b = clone $a;


实例:

 代码如下 复制代码

<?php
class My {
 public $name = "小猪";
 function __toString() {
  return "这个类的作用是,保卫地球。";
 }

 function __call ($n,$v) {
  echo "错误的方法<b>".$n."</b><br />";
    echo "错误的值<b>".print_r($v)."</b>"; //值是以数组方式传递的,所以要用print_r。
 }
}
$p = new My();
$b = clone $p;

echo $b->name="小猪头"."<br />"; //这是克隆并修改后的对象,如果使用 $b = $p,那修改$b->name="小猪头";后,再输出$p,也会被修改。
echo $p->name; //这是原对象,它已经被$b克隆了,其他都一样,但是他们是独立的。
?>


4.自动载入对象的方法


快速取得对象名称并自动载入进当前页面
方法名:__autoload()
格式:

 代码如下 复制代码
function __autoload($class_n) {
include($class_n.".php");
}
$p = new MyPc(); //自动调用执行如下
$d = new demo(); //include("mypc.php")

实例:

 代码如下 复制代码

<?php
function __aotoload ($class_name) {
 include($class_name.".php"); //写在类外部。
}

$p = new class_name(); //这里实例化的类名就被上面的函数变量 $class_name 替代了,非常方便。
?>

本文章来给各位同学介绍关于PHP面向对象开发之类的多态详解,希望此教程对各位同学有所帮助。

类的多态

1.多态的介绍和优势。
2.运算符:instanceof。
3.多态的简单应用。

1.多态的介绍和优势

介绍:多态性是继承抽象和继承后,面向对象语言的第三特征。

例子:USB接口,插上不同的东西会使用不同的功能。

优势:OOP并不仅仅是把很多函数和功能集合起来,目的而是使用类,继承,多态的方式描述我们生活中的一种情况。

 
2.运算符:instanceof

PHP一个类型运算符,用来测定一个给定的对象是否来自指定的对象
格式:

 代码如下 复制代码

class A {}
class B {}

$thing = new A;
if ($thing instanceof A) {
echo "A";
}
if ($thing instanceof B) {
echo "B";
}

3.多态的简单应用
实例1:

 代码如下 复制代码

<?php
class A {

}

class B {

}

$new = new A;

if ($new instanceof A) {
echo "A";
}
if ($new instanceof B) {
echo "B";
}
?>

实例2:

 代码如下 复制代码

<?php
interface MyUsb {
 function type();
 function alert();
}

class Zip implements MyUsb {
 function type() {
  echo "2.0";
 }
 function alert() {
  echo "U盘驱动正在检测……<br />";
 }
}

class Mp3 implements MyUsb {
 function type() {
  echo "1.0";
 }
 function alert() {
  echo "MP3驱动正在检测……";
 }
}

class MyPc {
 function Add_Usb($what) {
  $what->type();
  $what->alert();
 }

}
$p = new MyPc();

$zip = new Zip();

$mp3 = new Mp3();

$p->Add_Usb($zip);
$p->Add_Usb($mp3);
?>

补充一个实例213.29.11.16更新

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>继承和多态</title>
</head>

<body>
<?php
/*  父类  */
class MyObject{
 public $object_name;         //图书名称
 public $object_price;          //图书价格
 public $object_num;          //图书数量
 public $object_agio;          //图书折扣
 function __construct($name,$price,$num,$agio){    //构造函数
  $this -> object_name = $name;
  $this -> object_price = $price;
  $this -> object_num = $num;
  $this -> object_agio = $agio;
 }
 function showMe(){          //输出函数
  echo '这句话不会显示。';
 }
}
/*  子类Book  */
class Book extends MyObject{         //MyObject的子类。
 public $book_type;          //类别
 function __construct($type,$num){       //声明构造方法
  $this -> book_type = $type;
  $this -> object_num = $num;
 }
 function showMe(){          //重写父类中的showMe方法
  return '本次新进'.$this -> book_type.'图书'.$this->object_num.'本<br>';
 }
}
/*  子类Elec  */
class Elec extends MyObject{         //MyObject的另一个子类
 function showMe(){          //重写父类中的showMe方法
  return '热卖图书:'.$this -> object_name.'<br>原价:'.$this -> object_price.'<br>特价:'.$this -> object_price * $this -> object_agio;
 }
}
/*  实例化对象  */
$c_book = new Book('计算机类',1000);       //声明一个Book子类对象
$h_elec = new Elec('PHP函数参考大全',98,3,0.8);     //声明一个Elec子类对象
echo $c_book->showMe()."<br>";        //输出Book子类的showMe()方法
echo $h_elec->showMe();         //输出Elec子类的是showMe()方法
?>
</body>
</html>

标签:[!--infotagslink--]

您可能感兴趣的文章: