php完美的rss 生成类

 更新时间:2016年11月25日 16:24  点击:1574
RSS订阅功能,在很多网站都可以有但也有很多,下面代码是自己写的,其中使用到了一个PHP类:RSS.class.php,感觉非常方便,不敢独享,特拿出来跟大家分享。
 代码如下 复制代码

include_once("class/RSS.class.php");//引入RSS PHP类
$RSS= new RSS("名称","地址","描述","RSS频道图标");
$RSS->AddItem("日志的标题","日志的地址","日志的摘要","日志的发布日期");
$RSS->Display();//输出RSS内容


全部代码如下:

 代码如下 复制代码
<?php
// +----------------------------------------------------------------------
// | YBlog
// +----------------------------------------------------------------------
// | Copyright (c) 2008 http://www.111cn.net/nokia/n97/ All rights reserved.
// +----------------------------------------------------------------------
// +----------------------------------------------------------------------
// | Author: yhustc <yhustc@gmail.com>
// +----------------------------------------------------------------------
// $Id$
 
/**
 +------------------------------------------------------------------------------
 * RSS生成类
 +------------------------------------------------------------------------------
 * @author    yhustc <yhustc@gmail.com>
 * @version   $Id$
 +------------------------------------------------------------------------------
 */
class RSS
{
    /**
     +----------------------------------------------------------
     * RSS频道名
     +----------------------------------------------------------
     * @var string
     * @access protected
     +----------------------------------------------------------
     */
    protected $channel_title = '';
    /**
     +----------------------------------------------------------
     * RSS频道链接
     +----------------------------------------------------------
     * @var string
     * @access protected
     +----------------------------------------------------------
     */
    protected $channel_link = '';
    /**
     +----------------------------------------------------------
     * RSS频道描述
     +----------------------------------------------------------
     * @var string
     * @access protected
     +----------------------------------------------------------
     */
    protected $channel_description = '';
    /**
     +----------------------------------------------------------
     * RSS频道使用的小图标的URL
     +----------------------------------------------------------
     * @var string
     * @access protected
     +----------------------------------------------------------
     */
    protected $channel_imgurl = '';
    /**
     +----------------------------------------------------------
     * RSS频道所使用的语言
     +----------------------------------------------------------
     * @var string
     * @access protected
     +----------------------------------------------------------
     */
    protected $language = 'zh_CN';
    /**
     +----------------------------------------------------------
     * RSS文档创建日期,默认为今天
     +----------------------------------------------------------
     * @var string
     * @access protected
     +----------------------------------------------------------
     */
    protected $pubDate = '';
    protected $lastBuildDate = '';
 
    protected $generator = 'YBlog RSS Generator';
 
    /**
     +----------------------------------------------------------
     * RSS单条信息的数组
     +----------------------------------------------------------
     * @var string
     * @access protected
     +----------------------------------------------------------
     */
    protected $items = array();
 
    /**
     +----------------------------------------------------------
     * 构造函数
     +----------------------------------------------------------
     * @access public
     +----------------------------------------------------------
     * @param string $title  RSS频道名
     * @param string $link  RSS频道链接
     * @param string $description  RSS频道描述
     * @param string $imgurl  RSS频道图标
     +----------------------------------------------------------
     */
    public function __construct($title, $link, $description, $imgurl = '')
    {
        $this->channel_title = $title;
        $this->channel_link = $link;
        $this->channel_description = $description;
        $this->channel_imgurl = $imgurl;
        $this->pubDate = Date('Y-m-d H:i:s', time());
        $this->lastBuildDate = Date('Y-m-d H:i:s', time());
    }
 
    /**
     +----------------------------------------------------------
     * 设置私有变量
     +----------------------------------------------------------
     * @access public
     +----------------------------------------------------------
     * @param string $key  变量名
     * @param string $value  变量的值
     +----------------------------------------------------------
     */
     public function Config($key,$value)
     {
        $this->{$key} = $value;
     }
 
    /**
     +----------------------------------------------------------
     * 添加RSS项
     +----------------------------------------------------------
     * @access public
     +----------------------------------------------------------
     * @param string $title  日志的标题
     * @param string $link  日志的链接
     * @param string $description  日志的摘要
     * @param string $pubDate  日志的发布日期
     +----------------------------------------------------------
     */
     function AddItem($title, $link, $description, $pubDate)
     {
        $this->items[] = array('title' => $title, 'link' => $link, 'description' => $description, 'pubDate' => $pubDate);
     }
 
     /**
     +----------------------------------------------------------
     * 输出RSS的XML为字符串
     +----------------------------------------------------------
     * @access public
     +----------------------------------------------------------
     * @return string
     +----------------------------------------------------------
     */
    public function Fetch()
    {
        $rss = "<?xml version="1.0" encoding="utf-8" ?>rn";
        $rss = "<rss version="2.0">rn";
        $rss .= "<channel>rn";
        $rss .= "<title><![CDATA[{$this->channel_title}]]></title>rn";
        $rss .= "<description><![CDATA[{$this->channel_description}]]></description>rn";
        $rss .= "<link>{$this->channel_link}</link>rn";
        $rss .= "<language>{$this->language}</language>rn";
 
        if (!empty($this->pubDate))
            $rss .= "<pubDate>{$this->pubDate}</pubDate>rn";
        if (!empty($this->lastBuildDate))
            $rss .= "<lastBuildDate>{$this->lastBuildDate}</lastBuildDate>rn";
        if (!empty($this->generator))
            $rss .= "<generator>{$this->generator}</generator>rn";
 
        $rss .= "<ttl>5</ttl>rn";
 
        if (!empty($this->channel_imgurl)) {
            $rss .= "<image>rn";
            $rss .= "<title><![CDATA[{$this->channel_title}]]></title>rn";
            $rss .= "<link>{$this->channel_link}</link>rn";
            $rss .= "<url>{$this->channel_imgurl}</url>rn";
            $rss .= "</image>rn";
        }
 
        for ($i = 0; $i < count($this->items); $i++) {
            $rss .= "<item>rn";
            $rss .= "<title><![CDATA[{$this->items[$i]['title']}]]></title>rn";
            $rss .= "<link>{$this->items[$i]['link']}</link>rn";
            $rss .= "<description><![CDATA[{$this->items[$i]['description']}]]></description>rn";
            $rss .= "<pubDate>{$this->items[$i]['pubDate']}</pubDate>rn";
            $rss .= "</item>rn";
        }
 
        $rss .= "</channel>rn</rss>";
        return $rss;
    }
 
    /**
     +----------------------------------------------------------
     * 输出RSS的XML到浏览器
     +----------------------------------------------------------
     * @access public
     +----------------------------------------------------------
     * @return void
     +----------------------------------------------------------
     */
    public function Display()
    {
        header("Content-Type: text/xml; charset=utf-8");
        echo $this->Fetch();
        exit;
    }
}
?>
文章先来介绍关于qqwry.dat的文件内容结构然后根据它的特点我们可写出读取qqwry.dat ip库的内容找到我们想要的内容。

首先看看QQWry.Data文件的内容结构 ,以及解读方式 。

一、文件结构
文件主要分三个结构
1、文件头,8个字节;
2、数据记录区,不定长度;
3、索引区,长度为 7 的整数倍;

二、文件头
文件头的8个字节分两部分,每个部分4个字节,分别指定了索引区的开始地址和结束地址。所以可以通过两个地址的差值 除 7 后 加 1 可以计算出总的记录数。

二、记录区
记录区的数据需要通过索引区的数据来获得各个数据的起始位置;本区数据记录了IP地址的结束地址和地区字符串;所有地区字符串都以 0×00 为结束。

三、索引区
检索IP对应的地区,关键就是找到IP起始地址对应的索引内容。一个IP索引数据包含7个字节,前4个字节是IP地址起始值,后3个字节是对应的IP数据 记录在文件内的偏移地址;IP数据记录中,前 4 个字节是IP结束地址;紧跟的数据有两种模式: 0×01 模式 和 0×02 模式。

0×01模式,即在IP数据的第5个字节是 0×01,则在后面的 3 个字节是国家地区数据的偏移地址;国家地区数据包括国家和地区这两个字符串。即
—————————————————————
4字节 | 3字节 重定向 0x NN NN NN -> 国家地区数据的文件偏移地址
—————————————————————

0×02模式,即在IP数据的第5个字节是 0×02,则在后面的 3 个字节是国家数据的偏移地址,地区数据是再往后的字符串,以 0×00 截至。即
—————————————————————————–
4字节 | 3字节 重定向 0x NN NN NN -> 国家数据的文件偏移地址 | 地区字符串 | 0×00
—————————————————————————–

对于 0×01 模式所得到的 国家地区数据中,它可能又带有一个重定向结构,即
————————————–
国家字符串 | 0×00 | 地区字符串 | 0×00
————————————–

————————————————————————-
国家字符串 | 0×00 | 0×02 | 3字节 0x NN NN NN -> 地区字符串的文件偏移地址
————————————————————————-

对于前一种情况,比较简单,直接读出两个字符串数据就可以了;对于后一种情况,需要再次重定向到地区字符串的偏移地址,然后读取到 0×00 为字符串结尾。

对于这种采取地址映射实际字符串值的方式,主要作用是避免重复记录字符串值。在整个IP地址库文件中,有太多相同字符串记录了,采用 3 字节的映射地址要比重复记录字符串值节省太多空间了。

PHP代码读取操作QQWry.dat文件 :

 代码如下 复制代码

function bin2ip($bin){
 $ip = '';
 $bd = str_split($bin, 1);
 for($i = 4; $i > 0; $i--){
  $ip .= "." . sprintf("%03d", implode('', unpack('s', $bd[$i-1] . chr(0))));
 }
 return substr($ip, 1);
}

//--------------------------------------------------
$f = fopen('QQWry.Dat', 'r');
$c = fread($f, 4);
$d = fread($f, 4);

$index_begin = implode('', unpack('L', $c));
$index_end  = implode('', unpack('L', $d));
if($index_begin < 0) $index_begin += pow(2, 32);
if($index_end < 0) $index_end += pow(2, 32);

$ip_num = ($index_end - $index_begin) / 7 + 1;

echo "index begin at: $index_beginn";
echo "index end at: $index_endn";
echo "ip data count : $ip_numn";

$output = '';

for($i = 0; $i < $ip_num; $i++){

 //文件指针指到每个IP数据文件的索引取得索引数据(7字节)上
 fseek($f, $i * 7 + $index_begin);
 $ip4 = fread($f, 4); //IP起始地址
 if(strlen($ip4) < 4) exit('data file error');

 $ip3 = fread($f, 3); //IP记录偏移地址
 if(strlen($ip3) < 3) exit('data file error');

 $dataseek = implode('', unpack('L', $ip3 . chr(0)));
 if($dataseek < 0) $index_ip_record += pow(2, 32);

 //指向记录区 $dataseek 位置查找记录
 fseek($f, $dataseek);
 $ipdata = fread($f, 4); //IP结束地址
 if(strlen($ipdata) < 4) exit('data file error');

 $area = '';
 $country = '';

 //读一个标记位
 $flag = fread($f, 1);
 if($flag == chr(1)){ //国家名偏移标记位 模式一 0x01
  $area1seek = fread($f, 3);
  if(strlen($area1seek) < 3) exit('data file error');
  $area1seek = implode('', unpack('L', $area1seek . chr(0)));
  fseek($f, $area1seek);
  $flag = fread($f, 1); //可能又是标记位
 }
 if($flag == chr(2)){ //国家地区 重定向
  $area1seek = fread($f, 3);
  if(strlen($area1seek) < 3) exit('data file error');
  $area1seek = implode('', unpack('L', $area1seek . chr(0)));
  $flag = fread($f, 1);
  if($flag == chr(2)){
   $area2seek = fread($f, 3);
   $area2seek = implode('', unpack('L', $area2seek . chr(0)));
   fseek($f, $area2seek);
  }else{
   fseek($f, -1, SEEK_CUR);
  }
  while(($c = fread($f, 1)) != chr(0)) $area .= $c;
  fseek($f, $area1seek);
  while(($c = fread($f, 1)) != chr(0)) $country .= $c;
 }else{
  fseek($f, -1, SEEK_CUR);
  while(($c = fread($f, 1)) != chr(0)) $country .= $c;

  $flag = fread($f, 1); //如果地区是重定向的
  if($flag == chr(2)){
   $area2seek = fread($f, 3);
   $area2seek = implode('', unpack('L', $area2seek . chr(0)));
   fseek($f, $area2seek);
  }else{
   fseek($f, -1, SEEK_CUR);
  }
  while(($c = fread($f, 1)) != chr(0)) $area .= $c;
 }
 $adata = trim($country) . trim($area); //$country是国家字符串 , $area 是地区字符串
}
fclose($f);

这个函数我们看到最多的就是文件操作相关函数如fopen,fseek,fread这些,有需要的朋友可以看看。

上传类使用ORG类库包中的Net.UpdateFile类,最新版本的上传类包含的功能如下(有些功能需要结合ThinkPHP系统其他类库):

1.基本上传功能

2.支持批量上传

3.支持生成图片缩略图

4. 自定义参数上传

5.上传检测(包括大小、后缀和类型)

6.支持上传类型、附件大小、上传路径定义

7.支持哈希或者日期子目录保存上传文件

8.上传图片的安全性检测

9.支持上传文件命名规则

10. 支持对上传文件的Hash验证


在ThinkPHP中使用上传功能无需进行特别处理。例如,下面是一个带有附件上传的表单提交:

 代码如下 复制代码
<form METHOD=POST action=“/Manual/upload” enctype=“multipart/form-data” >
<input type=“text” NAME=“name” >
<input type=“text” NAME=“email” >
<input type=“file” name=“photo” >
<input type=“submit” value=“保 存” >
</form>

 

注意表单的Form标签中一定要添加 enctype=”multipart/form-data” 文件才能上传。因为表单提交到当前模块的upload操作方法,所以我们在模块类里面添加下面的upload方法即可:

 代码如下 复制代码
Public function upload(){
import(“ORG.Net.UploadFile”);
$upload = new UploadFile(); // 实例化上传类
$upload->maxSize = 3145728 ; // 设置附件上传大小
$upload->allowExts = array(‘jpg’, ‘gif’, ‘png’, ‘jpeg’); // 设置附件上传类型
$upload->savePath = ‘./Public/Uploads/’; // 设置附件上传目录
if(!$upload->upload()) { // 上传错误 提示错误信息
$this->error($upload->getErrorMsg());
}else{ // 上传成功 获取上传文件信息
$info = $upload->getUploadFileInfo();
}
// 保存表单数据 包括附件数据
$User = M(“User”); // 实例化User对象
$User->create(); // 创建数据对象
$User->photo = $info[0]["savename"]; // 保存上传的照片 根据需要自行组装
$User->add(); // 写入用户数据到数据库
$this->success(“数据保存成功!”);
}

 

首先是实例化上传类

 代码如下 复制代码
import(“ORG.Net.UploadFile”);
$upload = new UploadFile(); // 实例化上传类

 

实例化上传类之后,就可以设置一些上传的属性(参数),支持的属性有:

maxSize: 文件上传的最大文件大小(以字节为单位)默认为-1 不限大小

savePath:文件保存路径,如果留空会取UPLOAD_PATH常量定义的路径

saveRule:上传文件的保存规则,必须是一个无需任何参数的函数名,例如可以是 time、 uniqid com_create_guid 等,但必须能保证生成的文件名是唯一的,默认是uniqid

hashType:上传文件的哈希验证方法,默认是md5_file

autoCheck:是否自动检测附件,默认为自动检测

uploadReplace:存在同名文件是否是覆盖

allowExts:允许上传的文件后缀(留空为不限制),使用数组设置,默认为空数组

allowTypes:允许上传的文件类型(留空为不限制),使用数组设置,默认为空数组

thumb:是否需要对图片文件进行缩略图处理,默认为false

thumbMaxWidth:缩略图的最大宽度,多个使用逗号分隔

thumbMaxHeight:缩略图的最大高度,多个使用逗号分隔

thumbPrefix:缩略图的文件前缀,默认为thumb_   (如果你设置了多个缩略图大小的话,请在此设置多个前缀 )

thumbSuffix:缩略图的文件后缀,默认为空   (如果你设置了多个缩略图大小的话,请在此设置多个后缀 )

thumbPath:缩略图的保存路径,留空的话取文件上传目录本身

thumbFile:指定缩略图的文件名

thumbRemoveOrigin:生成缩略图后是否删除原图

autoSub:是否使用子目录保存上传文件

subType:子目录创建方式,默认为hash,可以设置为hash或者date

dateFormat:子目录方式为date的时候指定日期格式

hashLevel:子目录保存的层次,默认为一层

以上属性都可以直接设置,例如:

 代码如下 复制代码
$upload->thumb = true
$upload->thumbMaxWidth = “50,200″
$upload->thumbMaxHeight = “50,200″

 

其中生成缩略图功能需要Image类的支持。

设置好上传的参数后,就可以调用 UploadFile类的upload方法进行附件上传,如果失败,返回false,并且用getErrorMsg方法获取错误提示信息;如果上传成功, 可以通过调用getUploadFileInfo方法获取成功上传的附件信息列表。因此getUploadFileInfo方法的返回值是一个数组,其中 的每个元素就是上传的附件信息。每个附件信息又是一个记录了下面信息的数组,包括:

key:附件上传的表单名称

savepath:上传文件的保存路径

name:上传文件的原始名称

savename:上传文件的保存名称

size:上传文件的大小

type:上传文件的MIME类型

extension:上传文件的后缀类型

hash:上传文件的哈希验证字符串

文件上传成功后,就可以通过这些附件信息来进行其他的数据存取操作,例如保存到当前数据表或者单独的附件数据表都可以。

如果需要使用多个文件上传,只需要修改表单,把

XML/HTML代码

 代码如下 复制代码
<input type=“file” name=“photo”>

改为

XML/HTML代码

 代码如下 复制代码

<input type=“file” name=“photo1″>
<input type=“file” name=“photo2″>
<input type=“file” name=“photo3″>

或者

PHP代码
<input type=“file”  name=“photo[]“ >
<input type=“file”  name=“photo[]“ >
<input type=“file”  name=“photo[]“ >

两种方式的多附件上传系统的文件上传类都可以自动识别。

本文章介绍了在php中的面向对象中的自动加载类 对象串行化 多态的应用的应用实例,有需要了解的同学可以看看。

自动加载类
很多开发者写面向对象的应用程序时,对每个类的定义建立一个 PHP 源文件。一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表。

在软件开发的系统中,不可能把所有的类都写在一个PHP文件中,当在一个PHP文件中需要调用另一个文件中声明的类时,就需要通过include把这个文件引入。不过有的时候,在文件众多的项目中,要一一将所需类的文件都include进来,是一个很让人头疼的事,所以我们能不能在用到什么类的时候,再把这个类所在的php文件导入呢?这就是我们这里我们要讲的自动加载类。

在 PHP 5 中,可以定义一个 __autoload()函数,它会在试图使用尚未被定义的类时自动调用,通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类, __autoload()函数接收的一个参数,就是你想加载的类的类名,所以你做项目时,在组织定义类的文件名时,需要按照一定的规则,最好以类名为中心,也可以加上统一的前缀或后缀形成文件名,比如xxx_classname.php、classname_xxx.php以及就是classname.php等等.

本例尝试分别从 MyClass1.php 和 MyClass2.php 文件中加载 MyClass1 和 MyClass2 类

 代码如下 复制代码

function __autoload($classname)
{
    require_once $classname . '.php';
}

//MyClass1类不存在自动调用__autoload()函数,传入参数”MyClass1”
$obj  = new MyClass1();

//MyClass2类不存在自动调用__autoload()函数,传入参数”MyClass2”
$obj2 = new MyClass2();


对象串行化
有时候需要把一个对象在网络上传输,为了方便传输,可以把整个对象转化为二进制串,等到达另一端时,再还原为原来的对象,这个过程称之为串行化, 就像我们现在想把一辆汽车通过轮船运到美国去,因为汽车的体积比较大,我们可以把汽车拆开成小的部件,然后我们把这些部件通过轮般运到美国去,到了美国再把这些部件组装回汽车。

有两种情况我们必须把对象串行化,第一种情况就是把一个对象在网络中传输的时候要将对象串行化,第二种情况就是把对象写入文件或是数据库的时候用到串行化。

串行化有两个过程,一个是串行化,就是把对象转化为二进制的字符串,我们使用serialize()函数来串行化一个对象,另一个是反串行化,就是把对象转化的二进制字符串再转化为对象, 我们使用unserialize()函数来反串行化一个对象.

PHP中serialize()函数的参数为对象名,返回值为一个字符串,Serialize()返回的字符串含义模糊,一般我们不会解析这个串来得到对象的信息,我们只要把返回来的这个字符串传到网络另一端或是保存到方件中即可。

PHP中unserialize()函数来反串行化对象,这个函数的参数即为serialize()函数的返回值,输出当然是重新组织好的对象.

 代码如下 复制代码

class Person
{
    //下面是人的成员属性
    var $name;  //人的名子
    var $sex;    //人的性别
    var $age;    //人的年龄

    //定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值
    function __construct($name="", $sex="", $age="")
    {
        $this->name=$name;
        $this->sex=$sex;
        $this->age=$age;
    }

    //这个人可以说话的方法, 说出自己的属性
    function say()
    {
        echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."";
    }
}

$p1=new Person("张三", "男", 20);

$p1_string=serialize($p1); //把一个对象串行化,返一个字符串

echo $p1_string."";  //串行化的字符串我们通常不去解析

$p2=unserialize($p1_string);  //把一个串行化的字符串反串行化形成对象$p2

$p2->say();

多态的应用
多态是除封装和继承之外的另一个面象对象的三大特性之一,我个人看来PHP中虽然可以实现多态,但和c++还有Java这些面向对象的语言相比,多态性并不是那么突出,因为PHP本身就是一种弱类型的语言,不存在父类对象转化为子类对象或者是子类对象转化为父类对象的问题,所以多态的应用并不是那么的明显;所谓多态性是指一段程序能够处理多种类型对象的能力,比如说在公司上班,每个月财务发放工资,同一个发工资的方法,在公司内不同的员工或是不同职位的员工,都是通过这个方法发放的,但是所发的工资都是不相同的。所以同一个发工资的方法就出现了多种形态。对于面向对象的程序来说,多态就是把子类对象赋值给父类引用,然后调用父类的方法,去执行子类覆盖父类的那个方法,但在PHP里是弱类型的,对象引用都是一样的不分父类引用,还是子类引用。

我们现在来看一个例子,首先还是要使用多态就要有父类对象和子类对象的关系。做一个形状的接口或是抽象类做为父类,里面有两个抽象方法,一个求周长的方法,另一个是求面积的方法;这接口的子类是多种不同的形状,每个形状又都有周长和面积,又因为父类是一个接口,所以子类里面就必须要实现父类的这两个周长和面积的抽象方法,这样做的目的是每种不同形状的子类都遵守父类接口的规范,都要有求周长和求面积的方法。

 代码如下 复制代码

//定义了一个形状的接口,里面有两个抽象方法让子类去实现
interface Shape
{
    function area();
    function perimeter();
}

//定义了一个矩形子类实现了形状接口中的周长和面积
class Rect implements Shape
{
    private $width;
    private $height;

    function __construct($width, $height)
    {
        $this->width=$width;
        $this->height=$height;
    }

    function area()
    {
        return "矩形的面积是:".($this->width*$this->height);
    }

    function perimeter()
    {
        return "矩形的周长是:".(2*($this->width+$this->height));
    }
}

//定义了一个圆形子类实现了形状接口中的周长和面积
class  Circular implements Shape
{
    private $radius;

    function __construct($radius)
    {
        $this->radius=$radius;
    }

    function area()
    {
        return "圆形的面积是:".(3.14*$this->radius*$this->radius);
    }

    function perimeter()
    {
        return "圆形的周长是:".(2*3.14*$this->radius);
    }

//把子类矩形对象赋给形状的一个引用
$shape=new Rect(5, 10);

echo $shape->area()."
";
echo $shape->perimeter()."
";

//把子类圆形对象赋给形状的一个引用
$shape=new Circular(10);

echo $shape->area()."
";
echo $shape->perimeter()."
";

上例执行结果:
矩形的面积是:50
矩形的周长是:30
圆形的面积是:314
圆形的周长是:62.8

好了关于它们三个我们有详细的介绍了,大家不懂还可以百度一下哦。

$_POST 变量用于收集来自 method=\"post\" 的表单中的值。从带有 POST 方法的表单发送的信息,对任何人都是不可见的(不会显示在浏览器的地址栏),并且对发送信息的量也没有限制。

先来看个最简单的实例

 代码如下 复制代码

<form action ="post.php" method ="post">
Name: <input type="text" name="username" />
<input type ="submit" value="ok" />
</form>

如我输入 你好,

post.php文件代码如下

 代码如下 复制代码

You are <?php echo $_POST["username"]?>.

输出结果就是

You are 你好

那么post如何获取像单选按钮呢,实例如下

 代码如下 复制代码

<form action = "radiopost.php" method = "post">
<input type="radio" name="abcde" value = "Apple">Apple</input><br />
<input type="radio" name="abcde" value = "Orange">Orange</input><br />
<input type="radio" name="abcde" value = "Mango">Mango</input><br />
<input type="submit" value="ok">
</form>

radiopost.php文件

 代码如下 复制代码

<?php echo $_POST["abcde"]?>

这样你选择那个就全出输那个的值,对于checkbox会有所不同,这个大家可以注意一下

 代码如下 复制代码

<form action = "checkboxpost.php" method = "post">
<input type="checkbox" name="abcde[ ]" value = "Apple">Apple</input><br />
<input type="checkbox" name="abcde[ ]" value = "Orange">Orange</input><br />
<input type="checkbox" name="abcde[ ]" value = "Mango">Mango</input><br />
<input type="submit" value="ok">
</form>

checkboxpost.php文件

 代码如下 复制代码

print_r($_POST['abcde']);

输出的是个数组形式了

注:
通过 HTTP POST 发送的变量不会显示在 URL 中。
变量没有长度限制。

$_POST 与 php://input可以取到值,$HTTP_RAW_POST_DATA 为空
$_POST 以关联数组方式组织提交的数据,并对此进行编码处理,如urldecode,甚至编码转换。
php://input 可通过输入流以文件读取方式取得未经处理的POST原始数据

php://input 允许读取 POST 的原始数据。和 $HTTP_RAW_POST_DATA 比起来,它给内存带来的压力较小,并且不需要任何特殊的 php.ini 设置。php://input 不能用于 enctype="multipart/form-data"。
这里拓展一下post模拟方法

 代码如下 复制代码

<?PHP           
    $flag = 0;       
    //要post的数据        
$argv = array(       
     'var1'=>'abc',        
     'var2'=>'你好吗');        
//构造要post的字符串        
foreach ($argv as $key=>$value) {        
     if ($flag!=0) {       
             $params .= "&";        
             $flag = 1;        
     }        
     $params.= $key."="; $params.= urlencode($value);        
     $flag = 1;        
     }        
     $length = strlen($params);       
         //创建socket连接        
     $fp = fsockopen("127.0.0.1",80,$errno,$errstr,10) or exit($errstr."--->".$errno);        
     //构造post请求的头        
     $header = "POST /mobile/try.php HTTP/1.1";        
     $header .= "Host:127.0.0.1";        
     $header .= "Referer:/mobile/sendpost.php";        
     $header .= "Content-Type: application/x-www-form-urlencoded";        
     $header .= "Content-Length: ".$length."";        
     $header .= "Connection: Close";       
     //添加post的字符串        
     $header .= $params."";        
     //发送post的数据        
     fputs($fp,$header);        
     $inheader = 1;        
     while (!feof($fp)) {       
             $line = fgets($fp,1024); //去除请求包的头只显示页面的返回数据        
             if ($inheader && ($line == "n" || $line == "")) {       
                 $inheader = 0;        
             }        
             if ($inheader == 0) {        
                 echo $line;        
             }        
     }        
fclose($fp);        
?>     

[!--infotagslink--]

相关文章

  • php svn操作类

    以前我们开发大型项目时都会用到svn来同步,因为开发产品的人过多,所以我们会利用软件来管理,今天发有一居然可以利用php来管理svn哦,好了看看吧。 代码如下 ...2016-11-25
  • PHP 数据库缓存Memcache操作类

    操作类就是把一些常用的一系列的数据库或相关操作写在一个类中,这样调用时我们只要调用类文件,如果要执行相关操作就直接调用类文件中的方法函数就可以实现了,下面整理了...2016-11-25
  • 源码分析系列之json_encode()如何转化一个对象

    这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
  • php中去除文字内容中所有html代码

    PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
  • JS+CSS实现分类动态选择及移动功能效果代码

    本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
  • Php文件上传类class.upload.php用法示例

    本文章来人大家介绍一个php文件上传类的使用方法,期望此实例对各位php入门者会有不小帮助哦。 简介 Class.upload.php是用于管理上传文件的php文件上传类, 它可以帮...2016-11-25
  • index.php怎么打开?如何打开index.php?

    index.php怎么打开?初学者可能不知道如何打开index.php,不会的同学可以参考一下本篇教程 打开编辑:右键->打开方式->经文本方式打开打开运行:首先你要有个支持运行PH...2017-07-06
  • php二维码生成

    本文介绍两种使用 php 生成二维码的方法。 (1)利用google生成二维码的开放接口,代码如下: /** * google api 二维码生成【QRcode可以存储最多4296个字母数字类型的任意文本,具体可以查看二维码数据格式】 * @param strin...2015-10-21
  • Java生成随机姓名、性别和年龄的实现示例

    这篇文章主要介绍了Java生成随机姓名、性别和年龄的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-01
  • PHP实现无限级分类(不使用递归)

    无限级分类在开发中经常使用,例如:部门结构、文章分类。无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式; 查找分类A下面所有分类包含的文章。1.实现原理 几种常见的实现方法,各有利弊。其中...2015-10-23
  • PHP实现递归无限级分类

    在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性。那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类。 递归,简单的说就是一段程序代码的重复调用,当把...2015-10-23
  • C#生成随机数功能示例

    这篇文章主要介绍了C#生成随机数功能,涉及C#数学运算与字符串操作相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • PHP中func_get_args(),func_get_arg(),func_num_args()的区别

    复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04
  • ecshop商品无限级分类代码

    ecshop商品无限级分类代码 function cat_options($spec_cat_id, $arr) { static $cat_options = array(); if (isset($cat_options[$spec_cat_id]))...2016-11-25
  • mybatis-plus实体类主键策略有3种(小结)

    这篇文章主要介绍了mybatis-plus实体类主键策略有3种(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-08-27
  • C#类中static变量用法分析

    这篇文章主要介绍了C#类中static变量用法,实例分析了static变量使用技巧与相关注意事项,需要的朋友可以参考下...2020-06-25
  • PHP 一个完整的分页类(附源码)

    在php中要实现分页比起asp中要简单很多了,我们核心就是直接获取当前页面然后判断每页多少再到数据库中利用limit就可以实现分页查询了,下面我来详细介绍分页类实现程序...2016-11-25
  • PHP编程 SSO详细介绍及简单实例

    这篇文章主要介绍了PHP编程 SSO详细介绍及简单实例的相关资料,这里介绍了三种模式跨子域单点登陆、完全跨单点域登陆、站群共享身份认证,需要的朋友可以参考下...2017-01-25
  • jQuery为动态生成的select元素添加事件的方法

    下面小编就为大家带来一篇jQuery为动态生成的select元素添加事件的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-09-01
  • PHP自动生成后台导航网址的最佳方法

    经常制作开发不同的网站的后台,写过很多种不同的后台导航写法。 最终积累了这种最写法,算是最好的吧...2013-09-29