php网上参考技术

重复提交是我们开发中会常碰到的一个问题,除了我们使用js来防止表单的重复提交,同时还可以使用php来防止重复提交哦。

例1

 代码如下复制代码

<?php
/*
 * php中如何防止表单的重复提交
 */
session_start();
if (empty($_SESSION['ip'])) {//第一次写入操作,判断是否记录了IP地址,以此知道是否要写入数据库
    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; //第一次写入,为后面刷新或后退的判断做个铺垫
    //...........//写入数据库操作
} else {//已经有第一次写入后的操作,也就不再写入数据库
    echo '请不要再次刷新和后退'; //写一些已经写入的提示或其它东西
}
?>


具体原理

session范围变量token来防止。

1. 开启session:

session_start();

2. 如果有表单提交

 代码如下复制代码

if (isset($token))


token以hidden的形式包含在form当中。

 代码如下复制代码

<input type="hidden" name="token" value="<?php echo $token; ?>" />

 
3. 如果是重复提交表单

 代码如下复制代码

1.if ($_SESSION["token"] != $token) {
2.    // 不让重复提交,在此处理
3.    // header("location:".$_SERVER['PHP_SELF']);
4.} else {
5.    // 正常的表单提交,在此处理
6.    // echo "已提交";   
7.}

4. 设置token值

 代码如下复制代码

1.$token = mt_rand(0,1000000);
2.$_SESSION['token'] = $token;











第四章、购物车的实现

<?php
class Cart{
	public function Cart() {
		if(!isset($_SESSION['cart'])){
			$_SESSION['cart'] = array();
		}
	}

	/*
	添加商品
	param int $id 商品主键
		  string $name 商品名称
		  float $price 商品价格
		  int $num 购物数量
	*/
	public  function addItem($id,$name,$price,$num,$img) {
		//如果该商品已存在则直接加其数量
		if (isset($_SESSION['cart'][$id])) {
			$this->incNum($id,$num);
			return;
		}
		$item = array();
		$item['id'] = $id;
		$item['name'] = $name;
		$item['price'] = $price;
		$item['num'] = $num;
		$item['img'] = $img;
		$_SESSION['cart'][$id] = $item;
	}

	/*
	修改购物车中的商品数量
	int $id 商品主键
	int $num 某商品修改后的数量,即直接把某商品
	的数量改为$num
	*/
	public function modNum($id,$num=1) {
		if (!isset($_SESSION['cart'][$id])) {
			return false;
		}
		$_SESSION['cart'][$id]['num'] = $num;
	}

	/*
	商品数量+1
	*/
	public function incNum($id,$num=1) {
		if (isset($_SESSION['cart'][$id])) {
			$_SESSION['cart'][$id]['num'] += $num;
		}
	}

	/*
	商品数量-1
	*/
	public function decNum($id,$num=1) {
		if (isset($_SESSION['cart'][$id])) {
			$_SESSION['cart'][$id]['num'] -= $num;
		}

		//如果减少后,数量为0,则把这个商品删掉
		if ($_SESSION['cart'][$id]['num'] <1) {
			$this->delItem($id);
		}
	}

	/*
	删除商品
	*/
	public function delItem($id) {
		unset($_SESSION['cart'][$id]);
	}
	
	/*
	获取单个商品
	*/
	public function getItem($id) {
		return $_SESSION['cart'][$id];
	}

	/*
	查询购物车中商品的种类
	*/
	public function getCnt() {
		return count($_SESSION['cart']);
	}
	
	/*
	查询购物车中商品的个数
	*/
	public function getNum(){
		if ($this->getCnt() == 0) {
			//种数为0,个数也为0
			return 0;
		}

		$sum = 0;
		$data = $_SESSION['cart'];
		foreach ($data as $item) {
			$sum += $item['num'];
		}
		return $sum;
	}

	/*
	购物车中商品的总金额
	*/
	public function getPrice() {
		//数量为0,价钱为0
		if ($this->getCnt() == 0) {
			return 0;
		}
		$price = 0.00;
		foreach ($this->items as $item) {
			$price += $item['num'] * $item['price'];
		}
		return sprintf("%01.2f", $price);
	}

	/*
	清空购物车
	*/
	public function clear() {
		$_SESSION['cart'] = array();
	}
}

来源:http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2013/0524/13479.html




02/*
03新浪的IP查询接口:
04新浪的:http://counter.sina.com.cn/ip?ip=IP地址
05返回Js数据,感觉不是很精确,可以把问号后面的去掉,直接返回本机对应的IP所在地
06 
07有道的IP查询接口:
08返回XML数据:http://www.yodao.com/smartresult-xml/search.s?type=ip&q=0.0.0.0
09返回JSON数据:http://www.yodao.com/smartresult-xml/search.s?jsFlag=true&type=ip&q=0.0.0.0
10把0.0.0.0换成需查询的IP地址即可,这个应该是用纯真的数据库
11 
12太平洋电脑网IP查询接口:
13http://whois.pconline.com.cn/?ip=0.0.0.0
14把0.0.0.0换成IP地址,页面上还有其他无关内容,这些内容是告诉我们哪些接口可以调用、接口调用参数和使用方法等
15 
16查询手机号码归属地接口:
17返回XML数据:http://www.youdao.com/smartresult-xml/search.s?type=mobile&q=13888880000
18返回JSON数据:http://www.youdao.com/smartresult-xml/search.s?jsFlag=true&type=mobile&q=13888880000
19 
20身份证查询接口:
21返回XML数据:http://www.youdao.com/smartresult-xml/search.s?type=id&q=身份证号
22返回JSON数据:http://www.youdao.com/smartresult-xml/search.s?jsFlag=true&type=id&q=身份证号
23*/
24echo file_get_contents("接口网址和参数");
25?>

第六章、分页

<?php
include("conn.php"); //数据库链接,自己解决
 
 $sql="select * from news";
 $query=mysql_query($sql);
 $all_num=mysql_num_rows($query); //总条数
 $page_num=3; //每页条数
 $page_all_num = ceil($all_num/$page_num); //总页数
 $page=empty($_GET['page'])?1:$_GET['page']; //当前页数      三元运算
 $page=(int)$page; //安全强制转换
 $limit_st = ($page-1)*$page_num; //起始数
//=================================================
 $sql="select * from news limit $limit_st , $page_num";
 
 $query=mysql_query($sql);
    while($row=mysql_fetch_array($query)){
       echo $row['title']." <a href='view.php?id={$row['id']}'>浏览</a><hr>";
}
 
 $px = $page>=$page_all_num ? $page_all_num : $page+1 ;
 
 $ps = $page<=1 ? 1 : $page-1 ;
 
?>
<a href='page.php'>首页 </a> | 
<a href='page.php?page=<?php echo $ps?>'>上一页 </a> | 
<a href='page.php?page=<?php echo $px?>'>下一页 </a> | 
<a href='page.php?page=<?php echo $page_all_num?>'>尾页 </a>

第七章、php基础知识巩固

1.不要依赖register_global=ON的环境,从你刚懂得配置php运行环境甚至尚不明白register_global的ON/OFF会对自己有什么影响的那天起,就应该勇敢地把它设为OFF.

2.写程序前看看怎么用error_reporting.
3.不懂就问本身没错,但你需要在那之前查查手册。
4.当然,你需要懂得使用手册。手册上找不到答案的时候,应该考虑下网络上的搜索引擎。
5.刚学会php+mysql之后,不要叫嚷着要写论坛,要写XXX。要明白,刚学会写汉字并不表示你有能力写诗。
6.在学web编程的时候,你应该先去认识html这个朋友。
7.有点能力后,试着回答新手的问题,不要看到自己懂的而别人不懂就沾沾自喜,扔下一名“简单,那是基本的东西”就走更要不得。
8.思考是一个好习惯,不动手去写就等于空想,什么也没有。
9.写好一段程序,如果觉得很满意,一周后再看一遍,也许你会认为它应该有所改变
10.有空多看看别人的程序,找出他人的不足或优点,自己掂量。

二. 各取所需

1.善于使用“引用”,它能直接影响到程序的效率。

2.善于用三元运算子,可以让程式较精简有效率。
比如:

PHP代码:

if ($data[$i]['nickname']){
    $nickname =  $data[$i]['nickname'];
}
else{
    $nickname =  $data[$i]['ip'];
}

可以写成:

PHP代码:

$nickname =  $data[$i]['nickname'] ? $data[$i]['nickname'] : $data[$i]['ip'];

3.善于组织if...else...回圈
比如:

PHP代码:

$ext_name = strtolower(str_replace(".", "", strrchr($upfilename, ".")));
if (!empty($type))
{
    if (!strpos($type, $ext_name))
    {
        echo "Please upload the file of $type form.";
        exit(); 
   }
}

上面的代码你应该写成这样:

PHP代码:

$ext_name = strtolower(str_replace(".", "", strrchr($upfilename, ".")));
if (!($type==='') && strpos($type, $ext_name)===false)
{
    echo "Please upload the file of $type form.";
    exit();
}

4.尽量让你的代码清淅些,如果写成这样,是比较让人头痛的:

PHP代码:

$foo=$_post["foo"];
   $username=$_post["user"];
 $group=$_POST["group"];
if ($group=="wheel")
{
$username=$username."wheel";
}

同样的代码,这样就比较让人看得舒服了:

PHP代码:

$foo      = $_post["foo"];
$username = $_post["username"];
$group    = $_POST["group"];
if ($group=="wheel")
{
    $username = $username."wheel";
}

当然,有一定基础后,你应该要写成这样:

PHP代码:

$foo      = &$_POST['foo'];
$username =  $_POST["group"]!='wheel' ? $_POST["username"] : $_POST["username"].'wheel';

5.编写规范的mysql 语句。

字段和表名用"`"引起来,避免保留字的影响。
如果看到下面这样的一个sql query,会让人比较头痛:

PHP代码:

$query="select `flash_comment`.`content` , `flash_comment`.`nickname` , `flash_comment`.`date` , `flash_comment`.`ip` , `product`.`p_name` , `sgflash`.`fid` from `flash_comment` left join `product` on ( `flash_comment`.`p_no` = `product`.`p_no` ) left join `sgflash` on ( `product`.`p_name` = `sgflash`.`f_name` ) where `flash_comment`.`p_no` != '' order by `flash_comment`.`date`";

同样的一个query,写成这样就令人看得明白得多了:

PHP代码:

$query = "SELECT `flash_comment`.`content` , `flash_comment`.`nickname` , `flash_comment`.`date` , `flash_comment`.`ip` , `product`.`p_name` , `sgflash`.`fid`           FROM `flash_comment`           LEFT JOIN `product` ON ( `flash_comment`.`p_no` = `product`.`p_no` )           LEFT JOIN `sgflash` ON ( `product`.`p_name` = `sgflash`.`f_name` )           WHERE `flash_comment`.`p_no` != ''          ORDER BY `flash_comment`.`date`";


第八章、xml

<?xml version=""  encoding="utf-8"?>   //   使用案例

<student>   // 跟标签

<name></name>

<age></age>

</student>


必须要有个根标签。注释:<!--   注释  -- >   有单双引号混合时,可以用实体字符(手册)。  当有特殊字符时可以用CDATA节来包住。<name><![CDATA[  特殊字符内容 ]]</name>




第一章、远程获取文件

file_get_contents

<?php
$url = http://www.xxx.com/;
$contents = file_get_contents($url);
//如果出现中文乱码使用下面代码
//$getcontent = iconv("gb2312″, "utf-8″,file_get_contents($url));
//echo $getcontent;
echo $contents;
?>


curl
<?php
$url = "http://sjolzy.cn/";
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
//在需要用户检测的网页里需要增加下面两行
//curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
//curl_setopt($ch, CURLOPT_USERPWD, US_NAME.":".US_PWD);
$contents = curl_exec($ch);
curl_close($ch);
echo $contents;
?>




fopen->fread->fclose
<?php
$handle = fopen ("http://sjolzy.cn/", "rb");
$contents = "";
do {
$data = fread($handle, 8192);
if (strlen($data) == 0) {
break;
}
$contents .= $data;
} while(true);
fclose ($handle);
echo $contents;
?>

Ps1.使用file_get_contents和fopen必须空间开启allow_url_fopen。方法:编辑php.ini,设置 allow_url_fopen = On,allow_url_fopen关闭时fopen和file_get_contents都不能打开远程文件。

Ps2.使用curl 必须空间开启curl。在php.ini中开启curl

建议打开URL时使用file_get_contents()方法,可优化打开速度

引用地址:http://sjolzy.cn/PHP-remote-file-to-read-the-three-methods.html




第二章、curl高级详解

curl_close — 关闭一个curl会话
curl_copy_handle — 拷贝一个curl连接资源的所有内容和参数
curl_errno — 返回一个包含当前会话错误信息的数字编号
curl_error — 返回一个包含当前会话错误信息的字符串
curl_exec — 执行一个curl会话
curl_getinfo — 获取一个curl连接资源句柄的信息
curl_init — 初始化一个curl会话
curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄资源
curl_multi_close — 关闭一个批处理句柄资源
curl_multi_exec — 解析一个curl批处理句柄
curl_multi_getcontent — 返回获取的输出的文本流
curl_multi_info_read — 获取当前解析的curl的相关传输信息
curl_multi_init — 初始化一个curl批处理句柄资源
curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源
curl_multi_select — Get all the sockets associated with the cURL extension, which can then be “selected”
curl_setopt_array — 以数组的形式为一个curl设置会话参数
curl_setopt — 为一个curl设置会话参数
curl_version — 获取curl相关的版本信息

curl_init()函数的作用初始化一个curl会话,curl_init()函数唯一的一个参数是可选的,表示一个url地址。
curl_exec()函数的作用是执行一个curl会话,唯一的参数是curl_init()函数返回的句柄。
curl_close()函数的作用是关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄。

<?php
$ch = curl_init(“http://www.baidu .com/”);
curl_exec($ch);
curl_close($ch);
?>

curl_version()函数的作用是获取curl相关的版本信息,curl_version()函数有一个参数,不清楚是做什么的

<?php
print_r(curl_version())
?>

curl_getinfo()函数的作用是获取一个curl连接资源句柄的信息,curl_getinfo()函数有两个参数,第一个参数是curl的资源句柄,第二个参数是下面一些常量:

<?php
$ch = curl_init(“http://www.baidu.com/”);
print_r(curl_getinfo($ch));
?>




curl_copy_handle()函数的作用是拷贝一个curl连接资源的所有内容和参数

<?php
$ch = curl_init(“http://www.baidu.com/”);
$another = curl_copy_handle($ch);
curl_exec($another);
curl_close($another);
?>

curl_error()函数的作用是返回一个包含当前会话错误信息的字符串。
curl_errno()函数的作用是返回一个包含当前会话错误信息的数字编号。

curl_multi_init()函数的作用是初始化一个curl批处理句柄资源。
curl_multi_add_handle()函数的作用是向curl批处理会话中添加单独的curl句柄资源。curl_multi_add_handle()函数有两个参数,第一个参数表示一个curl批处理句柄资源,第二个参数表示一个单独的curl句柄资源。
curl_multi_exec()函数的作用是解析一个curl批处理句柄,curl_multi_exec()函数有两个参数,第一个参数表示一个批处理句柄资源,第二个参数是一个引用值的参数,表示剩余需要处理的单个的curl句柄资源数量。
curl_multi_remove_handle()函数表示移除curl批处理句柄资源中的某个句柄资源,curl_multi_remove_handle()函数有两个参数,第一个参数表示一个curl批处理句柄资源,第二个参数表示一个单独的curl句柄资源。
curl_multi_close()函数的作用是关闭一个批处理句柄资源。

<?php
$ch1 = curl_init();
$ch2 = curl_init();
curl_setopt($ch1, CURLOPT_URL, ”http://www.baidu.com/”);
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, ”http://www. google.com/”);
curl_setopt($ch2, CURLOPT_HEADER, 0);
$mh = curl_multi_init();
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);
do {
curl_multi_exec($mh,$flag);
} while ($flag > 0);
curl_multi_remove_handle($mh,$ch1);
curl_multi_remove_handle($mh,$ch2);
curl_multi_close($mh);
?>

curl_multi_getcontent()函数的作用是在设置了CURLOPT_RETURNTRANSFER的情况下,返回获取的输出的文本流。

curl_multi_info_read()函数的作用是获取当前解析的curl的相关传输信息。

curl_multi_select()
Get all the sockets associated with the cURL extension, which can then be “selected”


来源:http://www.21andy.com/blog/20080507/1095.html








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值