1、数组
语法
$arr = array(); //创建一个空数组
php的数组分为两类:索引数组、关联数组
1、索引数组
数组的键为从0开始的整数
创建方式:
方式1:
$arr = array('张三','李四','王五'); //他们的键值分别对应0, 1, 2
方式2:
$arr = array('0' => '张三','1' => '李四', '2' => '王五');
方式3:
$arr[0] = '张三';
$arr[1] = '李四';
$arr[2] = '王五';
访问方式:
$arr0 = $arr[0];
或者
$arr0 = $arr['0'];
循环访问数组
foreach($arr as $index => $val) {
//....
}
2、关联数组
关联数组是指数组的键都是字符串的数组
$arr = array(
'zhangsan' => '张三',
'lisi' => '李四',
'wangwu' => '王五'
);
赋值:
方式1:
$arr = array(
'zhangsan' => '张三',
'lisi' => '李四',
'wangwu' => '王五'
);
方式2:
$arr['zhangsan'] = '张三';
取值
$name = $arr['zhangsan'];
2、函数
1、自定义函数
使用function
关键字声明
function test($a, $b,..) {
//....
return something;
}
函数名和变量名一样,使用字母或下划线开头
return
关键字用来返回结果
可变函数,将函数存放在变量中,通过变量调用函数
function test() {
//....
}
$func = 'test';
$func();
2、内置函数
str_replace
3、判断函数是否存在
使用function_exists()
来检测函数是否存在
function_exists('func'); //返回一个布尔值
使用class_exists()
来检测类是否存在
class_exists(className); //返回一个布尔值
3、类和对象
类是对一类事物的抽象,对象则是事物的 具体实例
定义类
使用关键字class
,类名首字母大写,字母与下划线开头。
class Car {
$name = '汽车';
function getName () {
return $this->name;
}
}
定义实例
$car = new Car();
echo $car->getName();
属性
类中变量称为属性或者是字段。声明属性的时候可以为之添加控制其访问权限的关键字
class Car {
//公有属性
public $name = '汽车';
//私有属性
private $color = '白色';
//受保护属性
protected $price = '120000';
}
公有属性外部可以直接访问
echo $car->name;
私有属性和受保护属性是不允许外部访问,但在类的成员方法内部可以调用。调用使用->
类的方法也可以添加访问权限关键字
class Car {
public function getName() {
return '汽车';
}
}
静态方法
使用关键字static
声明,静态方法直接通过类名调用,使用::
class Car {
public static function getName() {
return '汽车';
}
}
静态方法调用
echo Car::getName;
构造函数和析构函数
构造函数使用__construct
定义,会在每次对象创建的时候调用该函数,因此常用来创建对象的时候进行一些初始化。
class Car {
function __construct() {
print "构造函数被调用\n";
}
}
在子类中如果定义了__construct则不会调用父类的__construct,如果需要同时调用父类的构造函数,需要使用parent::__construct()显式的调用。
class Car {
function __construct() {
print "父类构造函数被调用\n";
}
}
class Truck extends Car {
function __construct() {
print "子类构造函数被调用\n";
parent::__construct();
}
}
$car = new Truck();
PHP5支持析构函数,使用__destruct()
进行定义,析构函数指的是当某个对象的所有引用被删除,或者对象被显式的销毁时会执行的函数。
class Car {
function __construct() {
print "构造函数被调用 \n";
}
function __destruct() {
print "析构函数被调用 \n";
}
}
$car = new Car(); //实例化时会调用构造函数
echo '使用后,准备销毁car对象 \n';
unset($car); //销毁时会调用析构函数
静态关键字static
静态属性与方法可以在不实例化类的情况下调用,直接使用类名::方法名
的方式进行调用。静态属性不允许对象使用->操作符调用。
静态方法也可以通过变量来进动态调用
$func = 'getSpeed';
$className = 'Car';
echo $className::$func(); //动态调用静态方法
静态方法中,$this伪变量不允许使用。可以使用self,parent,static在内部调用静态方法与属性。
class Car {
private static $speed = 10;
public static function getSpeed() {
return self::$speed;
}
public static function speedUp() {
return self::$speed+=10;
}
}
class BigCar extends Car {
public static function start() {
parent::speedUp();
}
}
BigCar::start();
echo BigCar::getSpeed();
访问控制
使用关键字,public、private、protected
公有成员可以在任何地方被访问,当未设置访问权限关键词时默认为公有
私有成员只能被自身访问
受保护成员能被自身、子类和父类访问
如果构造函数定义成了私有方法,则不允许直接实例化对象了,这时候一般通过静态方法进行实例化,在设计模式中会经常使用这样的方法来控制对象的创建,比如单例模式只允许有一个全局唯一的对象。
class Car {
private function __construct() {
echo 'object create';
}
private static $_object = null;
public static function getInstance() {
if (empty(self::$_object)) {
self::$_object = new Car(); //内部方法可以调用私有方法,因此这里可以创建对象
}
return self::$_object;
}
}
//$car = new Car(); //这里不允许直接实例化对象
$car = Car::getInstance(); //通过静态方法来获得一个实例
继承
使用extend
关键字
class Bus extend Car {
//....
}
重载
PHP中的重载指的是动态的创建属性与方法,是通过魔术方法来实现的。属性的重载通过__set,__get,__isset,__unset来分别实现对不存在属性的赋值、读取、判断属性是否设置、销毁属性。
class Car {
private $ary = array();
public function __set($key, $val) {
$this->ary[$key] = $val;
}
public function __get($key) {
if (isset($this->ary[$key])) {
return $this->ary[$key];
}
return null;
}
public function __isset($key) {
if (isset($this->ary[$key])) {
return true;
}
return false;
}
public function __unset($key) {
unset($this->ary[$key]);
}
}
$car = new Car();
$car->name = '汽车'; //name属性动态创建并赋值
echo $car->name;
方法的重载通过__call
来实现,当调用不存在的方法的时候,将会转为参数调用__call
方法,当调用不存在的静态方法时会使用__callStatic
重载。
class Car {
public $speed = 0;
public function __call($name, $args) {
if ($name == 'speedUp') {
$this->speed += 10;
}
}
}
$car = new Car();
$car->speedUp(); //调用不存在的方法会使用重载
echo $car->speed;
同一个类的实例对象是相等的,但不全等
class Car {
}
$a = new Car();
$b = new Car();
if ($a == $b) echo '=='; //true
if ($a === $b) echo '==='; //false
对象复制,在一些特殊情况下,可以通过关键字clone来复制一个对象,这时__clone方法会被调用,通过这个魔术方法来设置属性的值。
class Car {
public $name = 'car';
public function __clone() {
$obj = new Car();
$obj->name = $this->name;
}
}
$a = new Car();
$a->name = 'new car';
$b = clone $a; //克隆对象$a会调用对象的类的__clone方法
var_dump($b);
对象序列化
可以通过serialize
方法将对象序列化为字符串,用于存储或者传递数据,然后在需要的时候通过unserialize
将字符串反序列化成对象进行使用。
class Car {
public $name = 'car';
}
$a = new Car();
$str = serialize($a); //对象序列化成字符串
echo $str.'<br>';
$b = unserialize($str); //反序列化为对象
var_dump($b);
4、字符串
定义方式:单引号、双引号、heredoc
$str = 'hello world';
$str1 = "hello world";
$str2 = <<<GOD
hello
world
GOD>>>
双引号字符串中间允许使用变量进行插值
$str = 'world';
$str1 = "hello $str"; //str1为hello world
去掉字符串首尾空格
trim()
、rtrim()
、ltrim()
.他们会去掉字符串的首尾字符,并返回一个处理后的心字符串,但原来的字符串并未改变。
$str = " hello world ";
echo $str1 = trim($str); //输出hello world
echo $str2 = ltrim($str); //输出hello world
echo $str3 = rtrim($str); //输出 hello world
echo $str; //输出 hello world
//改变原字符串
$str = trim($str);
获取字符串长度
获取长度的方法:strlen
$str = "hello";
echo $len = strlen($str); //输出5
获取字符串中中文长度mb_strlen()
$str = "hello 你好";
echo strlen($str); //输出12,中文就占了6个字符,也就是说每个中文三个字符,但这并不准确。
echo mb_strlen($str, 'utf-8'); //输出8,其中中文占两个字符,也就是说每个中文占一个字符
截取
英文字符串截取,substr()
。
语法:substr(字符串,截取开始位置,截取个数)
。注意:字符串的索引是从0开始的。
截取会返回一个新字符串,但并不会改变原字符串。
$str = "hello world";
echo substr($str,0,7); //输出hello w
echo $str; //输出hello world
中文字符串截取mb_substr()
语法:mb_substr(字符串, 开始位置, 截取个数, 'utf-8')
;
$str = "hello 你好";
echo mb_substr($str, 0, 7, 'utf-8');//输出hello 你
查找
查找字符串在另一段字符串中的首次出现的位置。strpos(原字符串, 查找字符串)
$str = "hello world";
$pos = strpos($str, 'world');
echo $pos; //输出为6,代表world在$str出现的位置在第六个
替换
替换字符串str_replace(被替换字符串, 代替字符串, 被搜索的字符串[,替换计数]
)
$str = "hello world";
$totol = 0;
$str1 = str_replace('l', '-', $str, $totol);
echo $str1; //输出he--o wor-d
echo $totol; //输出3,代表替换了3处
echo $str; //原字符串并不改变
格式化字符串
格式化字符串函数sprintf()
语法:sprintf(格式,要转化的字符串)
;
$str = '99.9';
$result = sprintf('%01.2f', $str);
echo $result; //结果显示99.90
1、这个 % 符号是开始的意思,写在最前面表示指定格式开始了。 也就是 “起始字符”, 直到出现 “转换字符” 为止,就算格式终止。
2、跟在 % 符号后面的是 0, 是 “填空字元” ,表示如果位置空着就用0来填满。
3、在 0 后面的是1,这个 1 是规定整个所有的字符串占位要有1位以上(小数点也算一个占位)。
如果把 1 改成 6,则 $result
的值将为 099.90
因为,在小数点后面必须是两位,99.90一共5个占位,现在需要6个占位,所以用0来填满。
4、在 %01 后面的 .2 (点2) 就很好理解了,它的意思是,小数点后的数字必须占2位。 如果这时候,$str
的值为9.234,则 $result
的值将为9.23.
为什么4 不见了呢? 因为在小数点后面,按照上面的规定,必须且仅能占2位。 可是 $str 的值中,小数点后面占了3位,所以,尾数4被去掉了,只剩下 23。
5、最后,以 f “转换字符” 结尾。
数组转为字符串
合并函数implode()
,将数组以特定分隔符拼接成一个字符串。
返回值是一个字符串。
语法:implode( 分隔符, 数组 );
;分隔符可为空''
$arr = array("hello","world");
$str = implode('-',$arr);
print_r($str); //输出hello-world
字符串分隔为数组
explode
以特定分隔符为标志分割字符串,并转为一个数组。
返回值是一个数组。
语法:explode(分隔标志,字符串,数组元素个数)
;
数组元素个数>0 表示至多;
<0 先加上总个数,若加上后>0,则等于运算后的个数,若小于等于0,则返回一个空数组;
=0 表示不分割,返回整个字符串。
$str = "hello-world";
$arr = explode('-',$str);
print_r($arr); //输出arr("hello","world")
字符串转义
addslashes
(添加斜杠语法)为字符串中的特殊字符进行转义,并返回一个新字符串
$str = "what's this?";
$str1 = addslashes($str);
echo $str;
5、正则表达式
使用?
会尽可能少的匹配 懒惰
使用+
会尽可能多地匹配 贪婪
preg_match(正则表达式,字符串,匹配到的字符串数组);
这个数组是由匹配到的整个字符串和子组构成的数组。
preg_match只能匹配1次或者0次,匹配到一次就停止搜索
preg_match_alll(正则表达式,字符串,匹配到的字符串数组);
匹配所有字符串,返回的数组[0]包含所有完整模式,[1]中包含第一个子组的所有匹配
preg_replace(正则表达式,用于替换的字符串或字符串数组,搜索和替换的字符串或字符串数组)
;
6、存储
cookie
PHP通过setcookie函数进行Cookie的设置,任何从浏览器发回的Cookie,PHP都会自动的将他存储在$_COOKIE
的全局变量之中,因此我们可以通过$_COOKIE['key']
的形式来读取某个Cookie值。
setcookie()
定义了 Cookie,会和剩下的 HTTP 头一起发送给客户端。 和其他 HTTP 头一样,必须在脚本产生任意输出之前发送 Cookie(由于协议的限制)。 请在产生任何输出之前(包括 <html>
和 <head>
或者空格)调用本函数。
setcookie语法
setcookie(name, value, expire, path, domain, secure, httponly)
;
- name cookie的名称
- value cookie 值
- expire 过期时间
- path 服务器路径,表示cookie对路径下的目录有下.默认为
'/'
,表示在所有目录下有效。 - domain 有效域名或者子域名
- secure 设置这个 Cookie 是否仅仅通过安全的 HTTPS 连接传给客户端
- httponly 设置成 TRUE,Cookie 仅可通过 HTTP 协议访问。
如果在调用本函数以前就产生了输出,setcookie() 会调用失败并返回 FALSE。 如果 setcookie() 成功运行,返回 TRUE。当然,它的意思并非用户是否已接受 Cookie
setcookie('test,'12345',time()+3600); //设置一个cookie,一小时后失效
删除cookie,没有专门用于删除cookie的函数,但是可以使用setcookie
,将失效时间设置为过去。
setcookie('test', '', time()-1);
session
session 存储在服务端
在PHP中使用session非常简单,先执行session_start方法开启session,然后通过全局变量$_SESSION进行session的读写。
session_star();
$_SESSION['test'] = time();
session会自动的对要设置的值进行encode与decode,因此session可以支持任意数据类型,包括数据与对象等。
session_start();
$_SESSION['ary'] = array('name' => 'jobs');
$_SESSION['obj'] = new stdClass();
var_dump($_SESSION);
删除与销毁session
删除使用unset函数,删除后就会从$_SESSION中去除,无法访问
session_start();
$_SESSION['name'] = 'jobs';
unset($_SESSION['name']);
echo $_SESSION['name']; //提示name不存在
要删除所有session,可以使用session_destroy()
函数销毁当前session,销毁后session_id仍会存在
session_start();
$_SESSION['name'] = 'jobs';
$_SESSION['time'] = time();
session_destroy();
session_destroy并不会立即的销毁全局变量$_SESSION
中的值,只有当下次再访问的时候,$_SESSION
才为空,因此如果需要立即销毁$_SESSION
,可以使用unset函数。
session_start();
$_SESSION['name'] = 'jobs';
$_SESSION['time'] = time();
unset($_SESSION);
session_destroy();
var_dump($_SESSION); //此时已为空
使用:
session可以用来存储多种类型的数据,因此具有很多的用途,常用来存储用户的登录信息,购物车数据,或者一些临时使用的暂存数据等。
用户在登录成功以后,通常可以将用户的信息存储在session中,一般的会单独的将一些重要的字段单独存储,然后所有的用户信息独立存储。
一般来说,登录信息既可以存储在sessioin中,也可以存储在cookie中,他们之间的差别在于session可以方便的存取多种数据类型,而cookie只支持字符串类型,同时对于一些安全性比较高的数据,cookie需要进行格式化与加密存储,而session存储在服务端则安全性较高。
7、文件系统
file_get_content
函数,次函数会将整个文件督导一个字符串中
语法:
$content = file_get_contents('./test.txt');
file_get_contents也可以通过参数控制读取内容的开始点以及长度。
$content = file_get_contents('./test.txt', null, null, 100, 500);
PHP也提供类似于C语言操作文件的方法,使用fopen,fgets,fread等方法,fgets可以从文件指针中读取一行,freads可以读取指定长度的字符串。
$fp = fopen('./text.txt', 'rb');
while(!feof($fp)) {
echo fgets($fp); //读取一行
}
fclose($fp);
$fp = fopen('./text.txt', 'rb');
$contents = '';
while(!feof($fp)) {
$contents .= fread($fp, 4096); //一次读取4096个字符
}
fclose($fp);
使用fopen打开的文件,最好使用fclose关闭文件指针,以避免文件句柄被占用。
判断文件是否存在
函数is_file
、file_exists
,返回值类型为布尔值
$filename = './test.txt';
echo is_file($filename);
echo file_exists($filename);
如果只是判断文件存在,使用file_exists就行,file_exists不仅可以判断文件是否存在,同时也可以判断目录是否存在,从函数名可以看出,is_file是确切的判断给定的路径是否是一个文件。
函数isreadable
、is_writeable
,用于判断文件是否可读或者可写
文件有很多元属性,包括:文件的所有者、创建时间、修改时间、最后的访问时间等。
fileowner:获得文件的所有者
filectime:获取文件的创建时间
filemtime:获取文件的修改时间
fileatime:获取文件的访问时间
其中最常用的是文件的修改时间,通过文件的修改时间,可以判断文件的时效性,经常用在静态文件或者缓存数据的更新。
$mtime = filemtime($filename);
echo '修改时间:'.date('Y-m-d H:i:s', $mtime);
获取文件大小filesize()
,返回的是数字,单位字节。要计算一个目录的大小,只能通过计算目中的文件的大小的总和。
9、Date 日期
php中的时间也是相对于1970年1月1日00:00:00来讲的,是一个以秒为单位的数字
获取这个时间使用time()
;
$time = time();
date
函数用来获取当前日期。
语法: date(日期格式,时间);
时间可省略,却省时默认为当前执行语句的时间。
$time = time();
$date = date('y-m-d',$time);
将某个日期转为格林威治时间的时间戳strtotime
$str = '2014-04-12';
$time = strtotime($str);
strtotime
除了能转换日期之外,还能解析日期字符串
strtotime('now'); //当前时间,与time()同
strtotime('+1 week 3 days 7 hours 5 seconds'); //获取1周3天7小时5秒后的时间戳
格林威治时间gmdate
,将一个日期或时间转为格林威治时间
$time = time();
$data = date('y-m-d H:i:s', $time);
$gmdate = gmdate('y-m-d H:i:s', $time);
10、图形操作
GD库
Graphic Device的简写,意为图形装置。是用来处理图形的扩展库。PHP通过GD库来处理JPG、PNG、GIF、SWF等。常用在图片加水印,验证码的生成方面。
PHP默认已经集成了GD库,,只需要在安装的时候开启就行。
header("content-type: image/png");
$img=imagecreatetruecolor(100, 100);
$red=imagecolorallocate($img, 0xFF, 0x00, 0x00);
imagefill($img, 0, 0, $red);
imagepng($img);
imagedestroy($img);
创建画布:
imagecreatetruecolor
,用来创建一个真彩色的空白图片。
$img = imagecreatetruecolor(100, 100); //创建一个100*100px的画布
设置画笔颜色:
imagecolorallocate
,为某个画布指定画笔颜色的RGB值
$red = imagecolorallocate($img, 0xFF, 0x00, 0x00);
线段绘制函数
imageline
用来绘制线段,指定画布,画笔,以及线段的起点和终点位置
imageline($img, 0, 0, 100,100, $red);
输出图像
header
与imagepng
输出图像
- header用来设置图片的格式
- imagepng用来导出画布为图片
header("content-type: image/png");
imagepng($img);
还可以将图片保存到文件中
imagepng($img, 'img.png');
销毁图片
imagedestroy
销毁图片,释放图片所占内存
imagedestroy($img);
GD库还可以进行其他很多操作。常用的有绘制线条,背景填充,画矩形,绘制文字等。
绘制文字
imagestring
用来绘制文字
语法:imagestring(画布,字体大小,文字显示的坐标x, 文字显示的坐标y, 绘制的文字,画笔颜色)
;
$img = imagecreatetruecolor(100,100);
$red = imagecolorallocate($img, 0xff,0x00,0x00);
imagestring($img, 5, 0, 0, 'hello world', $red);
header('content-type:image/png');
imgaepng($img);
imagedestroy($img);
图片可以保存为其他格式,但是要使用不同的函数
imagepng($img, savepath)
; savepath为图片保存的路径,方便重复使用。
imagegif($img, savepath)
;
imagejpeg($img, savepath, 质量百分比);
因为要进行压缩。
图片验证码
图片验证码的原理是在画布上绘制字符,为了防止程序识别,然后为画布绘制燥点,加斜线、加倾斜等,导出为图片。
燥点绘制使用imagesetpixel
,就是设置固定坐标的像素点的颜色
imagesetpixel($img, random(0,100),random(0,100), $black);
图片水印
水印的制作方式一般有两种,一是增加字符串,而是在图片上加上logo或者其他图片
从已存在的图片创建画布
$img = imagecreatefromjpeg($filename);
如果使用字符串作为水印,就如同之前的一样,绘制文字就ok。但是如果是要加另一个图片,那么则要创建另一个图像对象
$logo = imagecreatefrompng($filename2);
然后将logo图片复制到原图的指定位置,并指定logo的大小
imagecopy($img, $logo, 20, 20, 0, 0, $width,$height);
然后导出图片文件到原地址。
header('content-type: image/jpeg');
imagejpeg($img, $filename);
11、异常处理
try{
//捕获异常
}
catch(Exception $e) { //Exception是php定义好的异常类
//异常处理
}
除了程序运行可能抛出异常,也可以使用throw
手动抛出异常,抛出的异常应该是Exception
的实例对象
try {
//.....
throw new Exception('错误信息');
}catch(Exception $e) {
echo $e->getMessage();
}
Exception
包含属性:
- message 异常消息的内容
- code 异常代码
- file 抛出异常的文件
- line 抛出异常在该文件的行数
包含方法:
- getTrace 获取异常追踪信息
- getTraceAsString 获取异常追踪信息的字符串
- getMessage 获取错误信息
- 其他更多
还可以通过继承Exception类创建自定义的异常处理类
class MyException extend Exception {
//....
}
12、数据库
php支持的数据库很多,Mysql在php应用很广泛。
PHP中一个数据库可能有一个或者多个扩展,其中既有官方的,也有第三方提供的。像Mysql常用的扩展有原生的mysql库,也可以使用增强版的mysqli扩展,还可以使用PDO进行连接与操作。
mysql扩展进行数据库连接的方法:
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password');
mysqli扩展:
$link = mysqli_connect('mysql_host', 'mysql_user', 'mysql_password');
PDO扩展
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
$dbh = new PDO($dsn, $user, $password);
连接数据库
使用mysql_connect(地址,账号,密码);
选择数据库
使用mysql_select_db('db1');
设置连接数据库使用的字符串编码
mysql_query("set names 'utf-8'");
查询操作
mysql_query加sql语句的形式发送查询指令
$res = mysql_query("select * from user limit 1");
查询操作会返回一个资源句柄(resource),然后就可以通过这个资源获取查询结果中的数据。
$row = mysql_fetch_array($res);
var_dump($row);
默认的,PHP使用最近的数据库连接执行查询,但如果存在多个连接的情况,则可以通过参数指令从那个连接中进行查询。
$link1 = mysql_connect('127.0.0.1', 'code1', '');
$link2 = mysql_connect('127.0.0.1', 'code1', '', true); //开启一个新的连接
$res = mysql_query('select * from user limit 1', $link1); //从第一个连接中查询数据
插入数据
$sql = "insert into user(name,age,school) values ('麦兜',4,'春田花花幼稚园');"
mysql_query($sql); //执行插入操作
获取查询结果
获取方式有很多,最常用的是mysql_fetch_array
。可以通过设定参数来更改行数据的下标,默认的会包含数字索引的下标以及字段名的关联索引下标。
$sql = "select * from user limit 1";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
可以通过设定参数MYSQL_NUM只获取数字索引数组,等同于mysql_fetch_row
函数,如果设定参数为MYSQL_ASSOC则只获取关联索引数组,等同于mysql_fetch_assoc
函数。
$row = mysql_fetch_row($result);
$row = mysql_fetch_array($result, MYSQL_NUM); //这两个方法获取的数据是一样的
$row = mysql_fetch_assoc($result);
$row = mysql_fetch_array($result, MYSQL_ASSOC);
如果要获取数据集中的所有数据,我们通过循环来遍历整个结果集。
$data = array();
while ($row = mysql_fetch_array($result)) {
$data[] = $row;
}
删除数据
$sql = "update user set name = '曹操' where id=2 limit 1";
if (mysql_query($sql)) {
echo '更新成功';
}
或者
$sql = "delete from user where id=2 limit 1";
if (mysql_query($sql)) {
echo '删除成功';
}
对于删除与更新操作,可以通过mysql_affected_rows
函数来获取更新过的数据行数,如果数据没有变化,则结果为0。
$sql = "update user set name = '曹操' where id=2 limit 1";
if (mysql_query($sql)) {
echo mysql_affected_rows();
}
关闭连接
mysql_close();
mysql_close($link);
关闭指定连接