重复提交是我们开发中会常碰到的一个问题,除了我们使用js来防止表单的重复提交,同时还可以使用php来防止重复提交哦。
例1
代码如下 | 复制代码 |
<?php |
具体原理
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) { |
4. 设置token值
代码如下 | 复制代码 |
1.$token = mt_rand(0,1000000); |
<?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查询接口: |
13 | http://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 | */ |
24 | echo file_get_contents("接口网址和参数"); |
25 | ?> |
第六章、分页
第七章、php基础知识巩固
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()函数返回的句柄。
curl_version()函数的作用是获取curl相关的版本信息,curl_version()函数有一个参数,不清楚是做什么的
print_r(curl_version())
?>
curl_getinfo()函数的作用是获取一个curl连接资源句柄的信息,curl_getinfo()函数有两个参数,第一个参数是curl的资源句柄,第二个参数是下面一些常量:
$ch = curl_init(“http://www.baidu.com/”);
print_r(curl_getinfo($ch));
?>
curl_copy_handle()函数的作用是拷贝一个curl连接资源的所有内容和参数
$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()函数的作用是关闭一个批处理句柄资源。
$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