php三种方法解决抓取页面内容乱码问题

<?php
function gzdecode2($data) {
$len = strlen($data);
if ($len < 18 || strcmp(substr($data,0,2),”\x1f\x8b”)) {
return null; // Not GZIP format (See RFC 1952)
}
$method = ord(substr($data,2,1)); // Compression method
$flags = ord(substr($data,3,1)); // Flags
if ($flags & 31 != $flags) {
// Reserved bits are set — NOT ALLOWED by RFC 1952
return null;
}
// NOTE: $mtime may be negative (PHP integer limitations)
$mtime = unpack(“V”, substr($data,4,4));
$mtime = $mtime[1];
$xfl = substr($data,8,1);
$os = substr($data,8,1);
$headerlen = 10;
$extralen = 0;
$extra = “”;
if ($flags & 4) {
// 2-byte length prefixed EXTRA data in header
if ($len – $headerlen – 2 < 8) {
return false; // Invalid format
}
$extralen = unpack(“v”,substr($data,8,2));
$extralen = $extralen[1];
if ($len – $headerlen – 2 – $extralen < 8) {
return false; // Invalid format
}
$extra = substr($data,10,$extralen);
$headerlen += 2 + $extralen;
}

$filenamelen = 0;
$filename = “”;
if ($flags & 8) {
// C-style string file NAME data in header
if ($len – $headerlen – 1 < 8) {
return false; // Invalid format
}
$filenamelen = strpos(substr($data,8+$extralen),chr(0));
if ($filenamelen === false || $len – $headerlen – $filenamelen – 1 < 8) {
return false; // Invalid format
}
$filename = substr($data,$headerlen,$filenamelen);
$headerlen += $filenamelen + 1;
}

$commentlen = 0;
$comment = “”;
if ($flags & 16) {
// C-style string COMMENT data in header
if ($len – $headerlen – 1 < 8) {
return false; // Invalid format
}
$commentlen = strpos(substr($data,8+$extralen+$filenamelen),chr(0));
if ($commentlen === false || $len – $headerlen – $commentlen – 1 < 8) {
return false; // Invalid header format
}
$comment = substr($data,$headerlen,$commentlen);
$headerlen += $commentlen + 1;
}

$headercrc = “”;
if ($flags & 1) {
// 2-bytes (lowest order) of CRC32 on header present
if ($len – $headerlen – 2 < 8) {
return false; // Invalid format
}
$calccrc = crc32(substr($data,0,$headerlen)) & 0xffff;
$headercrc = unpack(“v”, substr($data,$headerlen,2));
$headercrc = $headercrc[1];
if ($headercrc != $calccrc) {
return false; // Bad header CRC
}
$headerlen += 2;
}

// GZIP FOOTER – These be negative due to PHP’s limitations
$datacrc = unpack(“V”,substr($data,-8,4));
$datacrc = $datacrc[1];
$isize = unpack(“V”,substr($data,-4));
$isize = $isize[1];

// Perform the decompression:
$bodylen = $len-$headerlen-8;
if ($bodylen < 1) {
// This should never happen – IMPLEMENTATION BUG!
return null;
}
$body = substr($data,$headerlen,$bodylen);
$data = “”;
if ($bodylen > 0) {
switch ($method) {
case 8:
// Currently the only supported compression method:
$data = gzinflate($body);
break;
default:
// Unknown compression method
return false;
}
} else {
// I’m not sure if zero-byte body content is allowed.
// Allow it for now… Do nothing…
}

// Verifiy decompressed size and CRC32:
// NOTE: This may fail with large data sizes depending on how
// PHP’s integer limitations affect strlen() since $isize
// may be negative for large sizes.
if ($isize != strlen($data) || crc32($data) != $datacrc) {
// Bad format! Length or CRC doesn’t match!
return false;
}
return $data;
}

$url=”http://www.x23us.com/html/8/8998/2527190.html”;

/*方法三*/
/*
$str=file_get_contents($url);
$str=gzdecode2($str);
echo $str;
*/

/*方法二*/
/*
$str = file_get_contents(“compress.zlib://”.$url);
echo $str;
*/

/*方法一*/

function curl_get($url, $gzip=false){
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
if($gzip) curl_setopt($curl, CURLOPT_ENCODING, “gzip”); // 关键在这里
$content = curl_exec($curl);
curl_close($curl);
return $content;
}

echo curl_get($url,true);

?>

原文:http://www.jb51.net/article/43095.htm


关注公众号,了解更多it技术(it问答网

PHP 全局变量 – 超全局变量

PHP 全局变量 – 超全局变量
PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的
全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可
以访问它们。

这些超全局变量是:
$GLOBALS
$_SERVER
$_REQUEST
$_POST
$_GET
$_FILES
$_ENV
$_COOKIE
$_SESSION


关注公众号,了解更多it技术(it问答网

phpstorm介绍

官方网址:https://www.jetbrains.com/

中文网址:https://www.jetbrains.com/zh/phpstorm/specials/phpstorm/phpstorm.html?utm_source=baidu&utm_medium=cpc&utm_campaign=cn-bai-br-phpstorm-ex-pc&utm_content=phpstorm-prue&utm_term=phpstorm

PhpStorm (强大的PHP开发环境)2017.2.4 附注册方法

http://www.oyksoft.com/soft/40722.html?pc=1

 

 

 


关注公众号,了解更多it技术(it问答网

表达式全集

表达式全集

字符 描述
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“n”匹配字符“n”。“\n”匹配一个换行符。串行“\\”匹配“\”而“\(”则匹配“(”。
^ 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。
* 匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“do”。?等价于{0,1}。
{n} n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。
{n,} n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。
{n,m} m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。
? 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。
. 匹配除“\n”之外的任何单个字符。要匹配包括“\n”在内的任何字符,请使用像“(.|\n)”的模式。
(pattern) 匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“\(”或“\)”。
(?:pattern) 匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。
(?=pattern) 正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern) 正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
(?<=pattern) 反向肯定预查,与正向肯定预查类拟,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。
(?<!pattern) 反向否定预查,与正向否定预查类拟,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。
x|y 匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”。
[xyz] 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。
[^xyz] 负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“p”。
[a-z] 字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。
[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。
\B 匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。
\cx 匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c”字符。
\d 匹配一个数字字符。等价于[0-9]。
\D 匹配一个非数字字符。等价于[^0-9]。
\f 匹配一个换页符。等价于\x0c和\cL。
\n 匹配一个换行符。等价于\x0a和\cJ。
\r 匹配一个回车符。等价于\x0d和\cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于[^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于\x09和\cI。
\v 匹配一个垂直制表符。等价于\x0b和\cK。
\w 匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”。
\W 匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。
\xn 匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,“\x41”匹配“A”。“\x041”则等价于“\x04&1”。正则表达式中可以使用ASCII编码。.
\num 匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1”匹配两个连续的相同字符。
\n 标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。
\nm 标识一个八进制转义值或一个向后引用。如果\nm之前至少有nm个获得子表达式,则nm为向后引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若n和m均为八进制数字(0-7),则\nm将匹配八进制转义值nm。
\nml 如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。
\un 匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配版权符号(©)。

 

常用正则表达式

用户名 /^[a-z0-9_-]{3,16}$/
密码 /^[a-z0-9_-]{6,18}$/
十六进制值 /^#?([a-f0-9]{6}|[a-f0-9]{3})$/
电子邮箱 /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/
/^[a-z\d]+(\.[a-z\d]+)*@([\da-z](-[\da-z])?)+(\.{1,2}[a-z]+)+$/
URL /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/
IP 地址 /((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/
/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
HTML 标签 /^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$/
删除代码\\注释 (?<!http:|\S)//.*$
Unicode编码中的汉字范围  /^[^u4E00-u9FA5]+$/

关注公众号,了解更多it技术(it问答网

字符截取+删除html

function cutdot($Str, $Length, $dot) {//$Str为截取字符串,$Length为需要截取的长度
global $s;
$i = 0;
$l = 0;
$ll = strlen($Str);
$s = $Str;
$f = true;

while ($i <= $ll) {
if (ord($Str{$i}) < 0x80) {
$l++; $i++;
} else if (ord($Str{$i}) < 0xe0) {
$l++; $i += 2;
} else if (ord($Str{$i}) < 0xf0) {
$l += 2; $i += 3;
} else if (ord($Str{$i}) < 0xf8) {
$l += 1; $i += 4;
} else if (ord($Str{$i}) < 0xfc) {
$l += 1; $i += 5;
} else if (ord($Str{$i}) < 0xfe) {
$l += 1; $i += 6;
}

if (($l >= $Length) && $f) {
$s = substr($Str, 0, $i);
$f = false;
}

if (($l > $Length) && ($i < $ll)) {
$s = $s;
return $s.$dot; //如果当前串长度小与指定长度,则退出。
}
}
return $s;
}

//删除html样式,得到纯文本
function deleteHtmlTags($string, $br = false,$Length=””,$dot=””)
{
while(strstr($string, ‘>’))
{
$currentBeg = strpos($string, ‘<‘);
$currentEnd = strpos($string, ‘>’);
$tmpStringBeg = @substr($string, 0, $currentBeg);
$tmpStringEnd = @substr($string, $currentEnd + 1, strlen($string));
$string = $tmpStringBeg.$tmpStringEnd;
}

if(!empty($Length)){
return cutdot($string, $Length, $dot);
}else{
return $string;
}
}


关注公众号,了解更多it技术(it问答网

kohana框架介绍

Kohana 是一款纯 PHP5 的框架,基于 MVC 模式开发, 它的特点就是高安全性,轻量级代码,容易使用。 2009年9月发布了3.0版本,支持HMVC模式。

 

简介编辑
kohana是一个基于MVC模型构建的PHP5框架,它的目标旨在安全,重量轻,且易于使用。

特点编辑
1。严谨的PHP5面向对象编程。优势:可见性保护,自动加载,重载,接口,抽象类,单一模式等。
2。社区,没有公司。Kohana是由社区构想,讨论,及编码。Kohana的开发者们来自世界各地,有着各自的天赋。这使得开发速度得以提高,并在短时间内提供bug修复以及反馈用户提出的建议。
3。GET,POST,COOKIE,SESSION数组都能按照预期的工作。Kohana不限制你访问全局数据,但是提供了XSS过滤和检查所有的全局变量。
4。级联式资源,模块和继承。可以从你的系统,程序或者模块路径的任何地方加载控制器,模型,类库,助手和视图。配置参数可以继承或动态声明覆盖。
5。没有名字空间冲突。类前缀和后缀用来保护名字空间冲突。
6。类的自动加载。Kohana里的所有类都能自动被框架加载,不需要手动引用。
7。API一致性。类能使用驱动不同的访问不同的协议来保持API的一致性,即使底层发生变化。
8。强大的事件处理机制。Kohana的事件可被动态的添加、替换或删除。

目标编辑
更安全在任何时候,对安全的最佳做法:
*kohana内置XSS保护,也可以使用HTMLPurfier作为的XSS过滤器。
*所有数据插入到数据库是避免使用数据库特定方法,如mysql_real_escape_string,以防止SQL注入攻击。Kohana里的magicquotes是被关闭的。
*所有POST,GET,和COOKIE数据都经过处理,以防止恶意行为。
更轻量级以最有效的方式提供最大的灵活性:
*Kohana尽可能的使用公约配置(conventionoverconfiguration)。
*合理的配置和高度优化的环境检测例程允许kohana运行在几乎任何php5环境。
*松耦合(Loosecoupling)是用来总是载入的最少数量的文件,减少资源的使用。
*一个清洁的API和使用本土职能,尽可能使kohana成为最快的php5框架之一。

http://kohanaframework.org/


关注公众号,了解更多it技术(it问答网

php大小写敏感问题的总结(实用型)

我们知道,PHP语言对大小写敏感问题的处理有点乱,在编程时需要多加注意,特别是在linux平台中更要注意。本文对这一问题做个总结,供大家学习参考。

说明:
不鼓励用这些规则,仅作为学习研究之用。
在编程中,应当坚持“大小写敏感”,遵循统一的代码规范。

一、大小写敏感
1. 变量名区分大小写
所有变量均区分大小写,包括普通变量以及$_GET,$_POST,$_REQUEST,$_COOKIE,$_SESSION,$GLOBALS,$_SERVER,$_FILES,$_ENV 等;
例子:

<?php
$abc = ‘abcd’;
echo $abc; //输出 ‘abcd’
echo $aBc; //无输出
echo $ABC; //无输出
?>

 

2. 常量名默认区分大小写,通常都写为大写

<?php
define(“ABC”,”Hello World”);
echo ABC; //输出 Hello World
echo abc; //输出 abc
?>

3. php.ini配置项指令区分大小写
如 file_uploads = 1 不能写成 File_uploads = 1

 

二、大小写不敏感
1. 函数名、方法名、类名 不区分大小写,但推荐使用与定义时相同的名字
例子:

<?php
function show(){
echo “Hello World”;
}
show(); //输出 Hello World 推荐写法
SHOW(); //输出 Hello World
?>

<?php
class cls{
static function func(){
echo “hello world”;
}
}

Cls::FunC(); //输出hello world
?>

2. 魔术常量不区分大小写,推荐大写
包括:__LINE__、__FILE__、__DIR__、__FUNCTION__、__CLASS__、__METHOD__、 __NAMESPACE__。
例子:

<?php
echo __line__; //输出 2
echo __LINE__; //输出 3
?>

3. NULL、TRUE、FALSE不区分大小写
例子:

<?php
$a = null;
$b = NULL;
$c = true;
$d = TRUE;
$e = false;
$f = FALSE;
var_dump($a == $b); //输出 boolean true
var_dump($c == $d); //输出 boolean true
var_dump($e == $f); //输出 boolean true
?>

4.类型强制转换,不区分大小写

包括

(int),(integer) – 转换成整型
(bool),(boolean) – 转换成布尔型
(float),(double),(real) – 转换成浮点型
(string) – 转换成字符串
(array) – 转换成数组
(object) – 转换成对象
<?php
$a=1;
var_dump($a); //输出 int 1
$b=(STRING)$a;
var_dump($b); //输出string ‘1’ (length=1)
$c=(string)$a;
var_dump($c); //输出string ‘1’ (length=1)
?>

 


关注公众号,了解更多it技术(it问答网

PHP与MYSQL事务处理

MYSQL的事务处理主要有两种方法。
1、用begin,rollback,commit来实现
begin 开始一个事务
rollback 事务回滚
commit 事务确认
2、直接用set来改变mysql的自动提交模式
MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过
set autocommit=0 禁止自动提交
set autocommit=1 开启自动提交
来实现事务的处理。
当你用 set autocommit=0 的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束。
注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务!
个人推荐使用第一种方法!
MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型是不支持的!
***:一般MYSQL数据库默认的引擎是MyISAM,这种引擎不支持事务!如果要让MYSQL支持事务,可以自己手动修改:
方法如下:1.修改c:\appserv\mysql\my.ini文件,找到skip-InnoDB,在前面加上#,后保存文件。
2.在运行中输入:services.msc,重启mysql服务。
3.到phpmyadmin中,mysql->show engines;(或执行mysql->show variables like ‘have_%’; ),查看InnoDB为YES,即表示数据库支持InnoDB了。
也就说明支持事务transaction了。
4.在创建表时,就可以为Storage Engine选择InnoDB引擎了。如果是以前创建的表,可以使用mysql->alter table table_name type=InnoDB;
或 mysql->alter table table_name engine=InnoDB;来改变数据表的引擎以支持事务。
*/
/*************** transaction–1 ***************/
$conn = mysql_connect(‘localhost’,’root’,’root’) or die (“数据连接错误!!!”);
mysql_select_db(‘test’,$conn);
mysql_query(“set names ‘GBK'”); //使用GBK中文编码;
//开始一个事务
mysql_query(“BEGIN”); //或者mysql_query(“START TRANSACTION”);
$sql = “INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, ‘test1’, ‘0’)”;
$sql2 = “INSERT INTO `user` (`did`, `username`, `sex`) VALUES (NULL, ‘test1’, ‘0’)”;//这条我故意写错
$res = mysql_query($sql);
$res1 = mysql_query($sql2);
if($res && $res1){
mysql_query(“COMMIT”);
echo ‘提交成功。’;
}else{
mysql_query(“ROLLBACK”);
echo ‘数据回滚。’;
}
mysql_query(“END”);
/**************** transaction–2 *******************/
/*方法二*/
mysql_query(“SET AUTOCOMMIT=0”); //设置mysql不自动提交,需自行用commit语句提交
$sql = “INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, ‘test1’, ‘0’)”;
$sql2 = “INSERT INTO `user` (`did`, `username`, `sex`) VALUES (NULL, ‘test1’, ‘0’)”;//这条我故意写错
$res = mysql_query($sql);
$res1 = mysql_query($sql2);
if($res && $res1){
mysql_query(“COMMIT”);
echo ‘提交成功。’;
}else{
mysql_query(“ROLLBACK”);
echo ‘数据回滚。’;
}
mysql_query(“END”); //事务处理完时别忘记mysql_query(“SET AUTOCOMMIT=1”);自动提交


/******************对于不支持事务的MyISAM引擎数据库可以使用表锁定的方法:********************/

//MyISAM & InnoDB 都支持,
/*
LOCK TABLES可以锁定用于当前线程的表。如果表被其它线程锁定,则造成堵塞,直到可以获取所有锁定为止。
UNLOCK TABLES可以释放被当前线程保持的任何锁定。当线程发布另一个LOCK TABLES时,或当与服务器的连接被关闭时,所有由当前线程锁定的表被隐含地解锁。
*/

mysql_query(“LOCK TABLES `user` WRITE”);//锁住`user`表
$sql = “INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, ‘test1’, ‘0’)”;
$res = mysql_query($sql);
if($res){
echo ‘提交成功。!’;
}else{
echo ‘失败!’;
}
mysql_query(“UNLOCK TABLES”);//解除锁定

百度文献:
http://wenku.baidu.com/view/62d2b7360b4c2e3f572763c8.html

MYSQL高级特性 — 事务处理 下面以两个银行账户之间的转账为例子进行演示。 要使用MySQL中的事务处理,首先需要创建使用事务表类型(如BDB = Berkeley DB或InnoDB)的表。 CREATE TABLE account ( account_id BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, balance DOUBLE ) TYPE = InnoDB; 要在事务表上使用事务处理,必须要首先关闭自动提交: SET AUTOCOMMIT = 0; 事务处理以BEGIN命令开始: BEGIN; 现在mysql客户处在于服务器相关的事物上下文中。任何对事务表所做的改变在提交之前不会成为永久性的改变。 UPDATE ACCOUNT SET balance = 50.25 WHERE account_id = 1; UPDATE ACCOUNT SET balance = 100.25 WHERE account_id = 2; 在做出所有的改变之后,使用COMMIT命令完成事务处理: COMMIT; 当然,事务处理的真正优点是在执行第二条语句发生错误时体现出来的,若在提交前终止整个事务,可以进行回滚操作: ROLLBACK; 下面是另一个例子,通过MYSQL直接进行数学运算: SELECT @first := balance FROM account WHERE account_id = 1; SELECT @second := balance FROM account WHERE account_id = 2; UPDATE account SET balance = @first – 25.00 WHERE account_id = 1; UPDATE account SET balance = @second + 25.00 WHERE account_id = 2; 除了COMMIT命令外,下列命令也会自动结束当前事务: ALTER TABLE BEGIN CREATE INDEX DROP DATABASE DROP TABLE LOCK TABLES RENAME TABLE TRUNCATE UNLOCK TABLES 内容来自于《MySQL 权威指南(Managing & Using MySQL)》, O’Reilly & Associates, Inc. 作者George Reese等。

PHP+mysql,由于程序中需要同时像两个表中插入数据,而且不能插错,因此应该定义一个事物操作。要么两条都做,要么两条都不做。
注意:每次使用事物后,需将事物设置回自动提交!
例一:
<?php
$handler=mysql_connect(“localhost”,””,””);
mysql_select_db(“task”);
mysql_query(“SET   AUTOCOMMIT=0”);//设置为不自动提交,因为MYSQL默认立即执行
mysql_query(“BEGIN”);//开始事务定义
if(!mysql_query(“insert   into   trans   (id)   values(‘2’)”))
{
mysql_query(“ROOLBACK”);//判断当执行失败时回滚
}
if(!mysql_query(“insert   into   trans   (id)   values(‘4’)”))
{
mysql_query(“ROOLBACK”);//判断执行失败回滚
}
mysql_query(“COMMIT”);//执行事务
mysql_close($handler);

例二:
<?php
$id=$_GET[id];
include_once(“conn.php”);
$conn->autocommit(false);
if(!$conn->query(“delete from tb_sco where id='”.$id.”‘”))
{
$conn->rollback();
}
if(!$conn->query(“delete from tb_stu where id='”.$id.”‘”))
{
$conn->rollback();
}
$conn->commit();
$conn->autocommit(true);
?>

<?php
//echo “=======”;exit;
$conn=mysql_connect(“localhost”,”root”,”root”);
if(!$conn){echo “数据库连接出错!”;
die();
}

mysql_select_db(“try”,$conn);
mysql_query(“SET NAMES GBK”);

$sql=”update aa set moeny=moeny-200 where uid=1″;
$sql2=”update bb set moeny=moeny+200 where uid=1″; //测试的时候,可以把这个写错,看效果
//$rst=mysql_query($sql2);
//echo $rst;exit;

mysql_query(“set autocommit=0”);//设置为不自动提交,因为MYSQL默认立即执行
//$t1=mysql_query($sql);
//$t2=mysql_query($sql2);

if(!mysql_query($sql)){
mysql_query(“ROOLBACK”);//判断执行失败回滚
echo “更新失败”;exit;
}

elseif(!mysql_query($sql2)){
mysql_query(“ROOLBACK”);//判断执行失败回滚
echo “更新失败”;exit;
}
else{
mysql_query(“commit”);//执行事务
echo “更新成功!”;exit;
}

收藏于 2010-07-20


关注公众号,了解更多it技术(it问答网

php对csv文件的读取,写入,输出下载操作

<?php
$file = fopen(‘text.csv’,’r’);

while ($data = fgetcsv($file)) {    //每次读取CSV里面的一行内容
//print_r($data); //此为一个数组,要获得每一个数据,访问数组下标即可
$goods_list[] = $data;
}
//print_r($goods_list);
echo $goods_list[0][1];
fclose($file);
?>

在实际工作中,很多时候需要把网站上的一些数据下载到CSV文件里,方便以后查看。

亦或者是用CSV进行一些批量的上传工作。

这个时候我们就需要对CSV进行读写操作。

1.CSV的读取操作

view plaincopy to clipboardprint?

  1. <?php
  2.     $file = fopen(‘D:/file/file.csv’,’r’);
  3.     while ($data = fgetcsv($file)) {    //每次读取CSV里面的一行内容
  4.          print_r($data); //此为一个数组,要获得每一个数据,访问数组下标即可
  5.      }
  6.      fclose($file);
  7. ?>

<?php$file = fopen(‘D:/file/file.csv’,’r’);while ($data = fgetcsv($file)) { //每次读取CSV里面的一行内容print_r($data); //此为一个数组,要获得每一个数据,访问数组下标即可}fclose($file);?>

2.CSV的写入操作

view plaincopy to clipboardprint?

  1. <?php
  2.   $fp = fopen(‘d:/file/file.csv’, ‘w’);
  3.   fputcsv($fp,array(‘aaa’,’bbb’,’cccc’));
  4.   fputcsv($fp,array(‘mmm’,’yyy’,’haha’));   //fputcsv可以用数组循环的方式进行实现
  5.    fclose($fp);
  6. ?>

<?php$fp = fopen(‘d:/file/file.csv’, ‘w’);fputcsv($fp,array(‘aaa’,’bbb’,’cccc’));fputcsv($fp,array(‘mmm’,’yyy’,’haha’)); //fputcsv可以用数组循环的方式进行实现fclose($fp);?>

3.输出CSV(下载功能)

view plaincopy to clipboardprint?

  1. <?php
  2.      header(“Content-Type: text/csv”);
  3.      header(“Content-Disposition: attachment; filename=test.csv”);
  4.      header(‘Cache-Control:must-revalidate,post-check=0,pre-check=0’);
  5.      header(‘Expires:0’);
  6.      header(‘Pragma:public’);
  7.     echo “id,areaCode,areaName\n”;
  8.     echo “1,cn,china\n”;
  9.     echo “2,us,America\n”;
  10. ?>

<?phpheader(“Content-Type: text/csv”);header(“Content-Disposition: attachment; filename=test.csv”);header(‘Cache-Control:must-revalidate,post-check=0,pre-check=0’);header(‘Expires:0’);header(‘Pragma:public’);echo “id,areaCode,areaName\n”;echo “1,cn,china\n”;echo “2,us,America\n”;?>


关注公众号,了解更多it技术(it问答网

用PHP5的SimpleXML解析XML文档

$xmlstring=<<<XML
<?xml version="1.0" encoding="ISO-8859-1"?>
 
<note>
 
<to>xuduowei</to>
 
<from>John</from>
 
<heading>Reminder</heading>
 
<body>Don’t forget the meeting!</body>
 
</note>
 
XML;
 
 
$xml = simplexml_load_string($xmlstring);
 
 
var_dump($xml);

 

输出:

object(SimpleXMLElement)#1 (4) { [“to”]=> string(4) “George” [“from”]=> string(4) “John” [“heading”]=> string(8) “Reminder” [“body”]=> string(29) “Don’t forget the meeting!” }

 

$xmlstring = <<<XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>xuduowei</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don’t forget the meeting!</body>
</note>
XML;

$xml = simplexml_load_string($xmlstring);
//$xml = simplexml_load_string($xmlstring,'SimpleXMLElement',LIBXML_NOCDATA);

echo $xml->to;


php 的simplexml_load_string后两个参数有什么用处?

第二个参数表示解析所使用的类,类必须继承于SimpleXMLElement,而默认值就是SimpleXMLElement。
第三个参数表示解析的选项,LIBXML_NOCDATA表示不对CDATA进行转意,而是把他当成普通的文本进行解析。


假设XML节点里面如果有<goods_name><![CDATA[小牛N1]]></goods_name>,那么最终转换成对象里面是没有goods_name这个值

的,如果加了LIBXML_NOCDATA,值为小牛N1,相当于把<![CDATA[小牛N1]]>转换成了文本返回

 

 

xml 是一种创建元数据的语言,元数据是描述其它数据的数据,PHP中的XML处理是基于LIBXML2的,安装时默认开启。

可以通过phpinfo()函数查看是否开启了XML处理模块,DOM,LIBXML,SAMPLEXML。

首先,通过samplexml_load_file函数把xml文件加载到一个对象中,samplexml_load_file可以用户远程文件.
例如:

$xml = samplexml_load_file(“messages.xml”); // 本地文件系统,当前目录

$xml=simplexml_load_file(“http://www.xuduowei.com/tc/cs.xml”);//远程服务器上的

用 var_dump($xml) 和 print_r($xml) 分别输出其结构.var_dump给出了变量的类型和长度,而print_r可读性更强
输出对象中的所有元素名称和它的值.

echo $xml->MessageTitle; //输出消息的标题
echo $xml->MessageBody; // 输出消息体
echo $xml->MessageAuthor; //消息的作者

echo $xml->MessageDate;  // 消息产生的日期

echo $xml->MessageNumber;  // 消息代码

$xml=”<GetLatestContestAppResp>
<ret>0</ret>
<LatestContestApp>
<ContestApp>
<UserId>111</UserId>
<RealName>张三</RealName>
<AppName>battlefield1942</AppName>
</ContestApp>
<ContestApp>
<UserId>222</UserId>
<RealName>李四</RealName>
<AppName>battlefield II</AppName>
</ContestApp>
<ContestApp>
<UserId>333</UserId>
<RealName>王五</RealName>
<AppName>battlefield 1943</AppName>
</ContestApp>
… …
</LatestContestApp>
</GetLatestContestAppResp>”;

$xml_arr = simplexml_load_string($xml);
//print_r($xml_arr);
//echo count($xml_arr->LatestContestApp->ContestApp).”==”; //总数计算
//echo $xml_arr->LatestContestApp->ContestApp[1]->UserId;//取得相应的节点值


关注公众号,了解更多it技术(it问答网