您的位置:首页 > 编程语言 > PHP开发

java到php之:php知识点概括

2013-10-08 17:06 190 查看
1:

配置:在开始程序中apache的Edit the Apache httpd.conf Configuration
File进行

配置

a:更改DocumentRoot,即我的项目的存放路径

b: 同时更改DIRECTORY 同上路径

c: DirectoryIndex(目录索引,也就是在仅指定目录的情况下,默认显示的文件名)

,可以添加很多,系统会根据从左至右的顺序来优先显示,以单个半角空格隔开,比如

有些网站的首页是index.htm,就在光标那里加上“index.htm ”文件名是任意的,不

一定非得“index.html”,比如“test.php”等,都可以。

我这里未做更改,项目存放路径为安装目录下的htdocs(相当于tomcat的webapps)

命令启动apache:

可以通过命令行开关来控制Apache服务。要启动一个已经安装的Apache服务,可以使用



httpd -k start

要停止一个已经安装的Apache服务,可以使用:

httpd -k stop



httpd -k shutdown

要重启一个运行中的Apache服务,强制它重新读取配置文件,可以使用:

httpd -k restart



*****************************

---------------------------------------

*********************************************

php语法简介:

1:判断类型

instanceof 用于确定一个 PHP 变量是否属于某一类 class 的实例(如属于person类),

通常在面向对象开发中可能用的。$xiaoming=new person;$xiaoming.instanceof
person

2:表示两内容的拼接

$c=$b.$a; //$a 具体表示内容和 $b 表示内容拼接

echo "计算结果是=".$res;

3:定义常量(变量名前不需加$)

a:使用define


define("TAX_RATE",0.08);

b:const TAX_RATE2=0.1;
//注意只有const变量前不需要加$

4:引入另一个php页面,并使用其中函数


//1.


//require 'b.php';


//2. 通过变量引入


//$fileName="b.php";


//require $fileName;




//3.


require ('b.php');


abc();//调用b.php中的函数

require 和require_once 区别

这两个区别为,前者遇到即包含文件,后者会判断是否已经包含过了,如果包含过了,

则不再包含文件。一可以节省资源,二可以避免重复定义的错误。

redeclare: 再次声明.

include: 包含,包括

再谈 include 和 require 区别 ( 同时 include_once 和
require_once 区别)

相同的地方就是,都是可以引入别的页面.

不同的地方是: include 如果出现了错误,会继续执行,require 出现错误,则会终止

程序.

证明:

小结: 我们应当使用哪个?

我们做项目的时候,基本上使用的 require_once

注意我们的requir_once / require ... 应当放在 php 最前面.

5: php的变量的类型都不申明的,这跟java有很大的区别,在以后写代码的时候记住

php 的变量的数据类型,是变化的,php变量的数据类型是由运行时的上下文决定

如:private $age;//在赋值的时候确定

java--private int age;

但是属性 必须指定访问修饰符!!

6://定义全局变量---注意啦。声明和赋值写成一句话居然会报错!
global
$global_nums;//声明,这个语句是放在<?php
..位置的,而不是放在像java放在class 括号内的!
$global_nums=0;//赋值
在函数内使用的时候需要再次申明一下,不然报错
global $global_nums;
7:php的一些常量,可以去查手册
__LINE__
文件中的当前行号。
__FILE__
文件的完整路径和文件名。
*********接收表单的参数

<form action="homework01.php"
method="post">

<input type="text"
name="layer"/>

<select name="shape">

//在php页面接收

$n=$_REQUEST['layer'];

$shape=$_REQUEST['shape'];

***********类的成员和函数调用

$cat1=new Cat();//前面不需要加Cat

$cat1->name="小白";//$对象名->属性名;必须是public或者protected(看情况)才能访



$cat1->speak();//调用函数,不是使用.

****************函数传参时是传的地址还是值

传的是值,如果要传地址需加&

***************构造方法

在php 5 中一个类可以同时有 两种形式的构造方法--php方法前都要加function关键字!

__construct() 和 类名() , 当两个同时存在的时候,优先调用__construct(),
请大家以后使用__construct()

public function __construct($iname,$iage){

//$name=$iname;

//$age=$iage;


$this->name=$iname;


$this->age=$iage;


echo
“我是构造方法”;

}

注意:

1. $this
本质可以理解就是这个对象的地址

2. 哪个对象使用到$this,
就是哪个对象地址

3. $this不能在类外部使用.


构造方法的注意事项

(1)一旦自定义了一个构造函数,默认的

构造函数就被覆盖了,这时在创建对象的时候就要使用自定义的构造函数.

(2)一个类只能有一个构造函数.(不能重载),子类不会默认调用父类的构造函数,这与java不同!

构造方法的8点说明:

①构造方法名和类名相同(php4版),php5版的构造方法

名可以和类名相同,也可以是__construct()

②构造方法没有返回值

③主要作用是完成对新对象的初始化,并不是创建对象本身。

④在创建新对象后,系统自动的调用该类的构造方法

⑤一个类有且只有一个构造方法,在php5后虽然__construct() 和 类名()
可以共存,但是实际上也只能使用一个。

⑥如果没有给类自定义构造方法,则该类使用系统默认的构造方法。

class Cat{


//注意__是两个下划线

funciton __construt($name){


echo “ok”;

}

}

$cat1=new Cat();

⑦如果给类自定义了构造方法,则该类的默认构造方法被覆盖。

⑧构造方法的默认访问修饰符是public

**************************** 析构方法 (java没有,自动的垃圾回收机制)

这里我要谈到面向对象和面向过程的问题!

在csdn上发现一个问题:

--1--

有个VC写的DLL有3个方法,

Open();
耗时5秒

DoSomething(); 耗时0.1秒

Close();
耗时0.1秒

--1--

我现在已经写了一个javaBean,对应3个方法,并且调试成功。

jOpen();

jDoSomething();

jClose();

但是由于DoSomething是被多次频繁调用的方法,所以不能每次都去Open,Close.

所以我希望在构造的时候Open一次,直到用完了再Close。

这样是不是要写一个“静态类”一样的东西保证构造时Open一次,一直使用,到析构的

时候再做一次Close就够了。

1.这个静态类怎么写呢?

2.java没有析构函数,Close的时机也不好确定。

解答:在1中这是典型的面向过程的思路,所以在java中的面向对象的过程必须是建立一个对象,然后再对象中进行此三个方法的定义,然后再调用(怎么调用看自己的控制)不过这个实例的close方法是怎么代表其消亡的呢?如果不想每次去调用open的话那么可以使用单例的模式!java的finalize()方法,在jvm中我将研究finalize

php中的析构函数:注意一个类最多只有一个,且无返回值

function __destruct(){


echo $this->name."销毁资源
关闭数据库..<br/>";


}

1.
析构方法会自动调用

2.
析构方法主要用于销毁资源

3.
析构方法调用顺序是,先创建的对象后被销毁

4.
析构方法什么时候被调用

(1)
当程序(进程结束)退出时

(2)
当一个对象称为垃圾对象的时候,该对象的析构方法也会被调用,

(3)
所谓垃圾对象,就是指,没有任何变量再引用它.

(4)
一旦一个对象成为垃圾对象,析构方法就会立即调用

**************************get/set方法

这个知识点在java中我都有点不记得了,在类中的成员属性修饰符一般是使用private

修饰的(即只限在本类中使用)如果不使用get/set方法在新建一个类的时候

Person p=new Person();//p是无法设置age等属性的,很自然的我们使用p.setAge(1)

private $age;//不写类型的啊

//查看年龄


public function getAge(){


return $this->age;


}

php还有一种特别的,就是不要对每个属性写get/set方法,直接一起解决,但不建议使用。通过 一对
__set 和 __get方法来操作我们的变量

//使用__set
方法来管理所有的属性,pro_name,pro_val为固定标志


public function __set($pro_name,$pro_val){


$this->pro_name=$pro_val;


}




//使用__get 可以获取所有的属性值


public function __get($pro_name){




if(isset($pro_name)){


return $this->pro_name;


}else{


return
null;


}


}

**********类中的属性和方法在各个方法中的引用必须加$this->

function test11(){


$this->name="hljmr";


$this->test12();


}

*****************继承。和java一样不支持多继承

class 类名 extends 父类名{


//在写自己需要的属性和方法.

}

1.
父类的 public protected
的属性和方法被继承. private 的属性和方法没有被继承.

2.
一个类只能继承一个父类,(直接继承).如果你希望继承多个类的属性和方法,则使用多层继承
3.
当创建子类对象的时候,默认情况下,不会自动调用父类的构造方法.

4.
如果我们希望去调用父类的 构造方法,或者其它的方法(public
/ protected) ,
可以这样处理
(了解)

4.1
类名::方法名() 4.2
parent::方法名()
*******************静态static

使用静态变量
静态的变量的基本用法

1.
在类中定义静态变量
[访问修饰符] static $变量名;

2.
如何访问静态变量
如果在类中访问 有两种方法 self::$静态变量名 ,
类名::$静态变量名
如果在类外访问: 有一种方法 类名::$静态变量名
*****************重载

基本概念:
函数名一样,通过函数的参数个数或者是参数类型不同,达到调用同一个函数名,但是可以区分不同的函数。。。为什么在这里要写上定义呢,因为在php中根据这个定义很容易出错!
class A{


public function test1(){


echo “test1”;
}
public function test1($a){


echo “test1 hello”;
}
}
重载
$a =new A();
$a->test1();
$a->test1(456);
上面的这用用法是不对.
PHP5
中如何通过魔术函数来实现方法重载的效果,我觉得一点都不好用,官方就不推荐,看看php6怎么解决的!
代码说明
<?php


class A{


public function test1($p){


echo "接收一个参数";


echo "<br/>接收到参数是";


var_dump($p);


}


public function test2($p){


echo "接收两个参数<br/>";


var_dump($p);


}


//这些提供一个__call 魔术函数


//__call 是它一个对象调用某个方法,而该方法不存在,则


//系统会自动调用__call


function __call($method,$p){


var_dump($p);


if($method=="test"){//根据参数个数区分,当然也可以根据参数的类型来写


if(count($p)==1){


$this->test1($p);


}else if(count($p)==2){


$this->test2($p);


}


}


}


}


$a=new A();


$a->test(1);


$a->test(56,90);


?>
小结: 关于重载


php5 默认情况下不直接支持方法重载

php5
可以同__call魔术方法,模拟一个方法效果的效果.

***********************重写,在父类中不知道怎么写某个模块的时候可以再子类中进行重写,如动物的叫声!

关于方法重写细节讨论

1.
要实现重写,要求 子类的那个方法的名字和参数列表个数一摸一样,但是并不要求参数的名称一样.

2.
如果子类要去调用父类的某个方法(public / protected) 则可以使用 parent::方法名(参数..) ,
父类名::方法名(参数...)
3. 注意
在实现方法覆盖的时候,访问修饰符可以不一样
//但是必须满足: 子类的访问范围>=父类的访问范围
注意这里面出现了多态,如当你没有在子类中重写这个方法的时候,那么子类调用的还是父类的方法!

*******************************抽象类

1.
在实际开发中,我们可能有这样一种类,是其它类的父类,但是它本身并不需要实例化,主要用途是用于让子类来继承,这样可以到达代码复用.
同时利于项目设计者,设计类.
快速入门
当然,1。 在实现方法覆盖的时候,访问修饰符可以不一样。2.但是必须满足:
子类的访问范围>=父类的访问范围3.含抽象方法的,必须是抽象类,抽象类但并不需要全是抽象方法abstract
class Animal{ abstract public function cry();4.
如果A类继承了一个抽象类 B,则要求A类实现从B类继承的所有抽象方法
*******************************接口
class 类名 implements 接口名1,接口2.
一个类可以去实现多个接口(解决单一继承的缺陷),注意:接口的方法是public 【默认就是public 】
interface iUsb{

//属性
//方法
}
//1.当一个类实现了 某个接口,则要求该类必须实现这个接口的所有方法

//接口的方法都不能有方法体, 接口它的作用就是 声明一些方法,供其它类来实现.
接口还体现编程中我们希望的效果 高内聚低耦合 的
什么情况下可以考虑使用接口----项目经理常做的工作

1.
定规范

2.
定下规范,让别的程序员来实现

3. 当多个类 ,他们之间是平级的关系. 这些类都会去实现某个功能,只是实现的方式不一样

*******************************
final关键字和const关键字

用法Final不希望类被继承,不希望方法被修改,注意final关键字不能去修饰属性.java可以
用法const:当你有一个属性,不希望被修改,则考虑使用const 做成常量。
定义const 常量名=赋初值;
//不要加修饰符,必须给定初值,不需要$了!!常量在类的内部使用 self::常量的名称 类名::常量的名称(类外部也使用此)
使用 类名::常量名; 接口名::常量
比较一下java 的final 修饰符
可以修饰类,方法,属性

Java 的final修饰的时候注意两种,一种是修饰基本数据类型如final int
i=100;必须赋值,且i=100永远不变,另一种是修饰对象引用,比如说final Husbrand
hl;那么一个女生在引用这个老公对象后就永远不可以换老公,但是老公本身是可以改变的(职业,工资等属性)!!

******************************错误和异常处理介绍 处理错误方式①-die

php处理错误的三种方法

1.
使用简单的die 语句
使用方法如下 :(1)
if(!file_exists("aaa.txt")){


die("文件不存在");


}else{


//打开文件操作


}


echo "ok";
(2) 更简单的方法
file_exists("aaa.txt") or die("文件不存在!!!");
用户自定义错误处理器
在php中对错误有不同的级别区分:
案例入门 :
<?php


//定义了一个函数(我用于处理错误的函数)


function my_error($errno,$errmes){


echo "<font size='5'
color='red'>$errno</font><br/>";


echo "错误信息是:";


exit();


}


//改写set_error_handler处理器


//下面这句话的含义是 : 如果出现了 E_WARNING这个级别的错误,就去调用my_error函数.


set_error_handler("my_error",E_WARNING);//使用自定义的my_error处理方法来处理错误

//当然还可以写set_error_handler("my_error",E_NOTICE);….


$fp=fopen("aa.txt","r");


?>
异常处理:与java类似

基本语法
try{


//
可能出现错误或是异常的代码
}catch(Exception e){


//
对异常处理
//1. 自己处理
//2. 自己不处理,将其抛出.
}

**********************************php错误日志

保存错误日志的用处是便于,后续分析.
基本方法是使用 error_log来实现.
基本用法是:
//自定义错误函数


function my_error3($errno,$errmes){


$err_info="错误号是:".$errno."--".$errmes;


echo $err_info;


//把这个错误信息保存


//\r\n 表示向文件输入一个回车换行


//<br/> 表示向网页输出一个回车换行


error_log($err_info."\r\n",3,"d:/myerr.txt");


}
现在我们要把时间保存下来.
*******************************http协议深度剖析①-http请求详解
防盗链技术
http协议

1.
http协议是建立在 tcp/ip协议基础上.

2.
我们的web开发数据的传输都是依赖于http协议.

3.
http协议全称是 超文本传输协议
http协议的-http请求(request)
基本结构
请求行
消息头


<----空行
消息体(实体内容)
举例:
GET /test/hello.html
HTTP/1.1
【表示发送的get请求, 请求资源是/test/hello.html 】
Accept: */* 【表示客户端可以接受任何数据】
Referer:
http://localhost:80/test/abc.html
1.表示我是从哪里来】
Accept-Language: zh-cn 【页面语言】
User-Agent: Mozilla/4.0
【告诉服务我的浏览器的内核,操作系统】
Accept-Encoding: gzip, deflate
【表示接受什么样的数据压缩格式.
Host: localhost:80
【主机:80
Connection:
Keep-Alive

【表示不要立即断掉我们的请求.】
现在我们想知道,客户端究竟给服务器发送的内容
如果我这个http1.php. 不希望 192.168.1.33 这个用户访问.

在服务器端,我们可以通过$_SERVER来获取我们需要的信息
重要的有:
HTTP_HOST
REMOTE_ADDR 访问该页面的ip
DOCUMENT_ROOT 可以获取 apche的主目录
REQUEST_URI 可以获取 请求的资源名
http请求有两种主要的方式
get / post
get 和post的区别有哪些

1.
安全性 get 请求的数据会显示在 地址栏上, post请求的数据,放在http协议的消息体

2.
从可以提交数据的大小看.
2.1 http协议本身并没有限制数据大小.
2.2 浏览器在对get 和post请求做显示, get 请求数据
2k+35 ,post没有显示.

3.
get请求可以更好的添加到收藏夹.
现在我们实际使用一些http请求,完成一个防盗链的练习.
☞ http请求不是固定,是根据实际情况的,比如REFEER.

********************************* http协议深度剖析②-http响应详解(302
304码运用)

Http响应(response)
简单定义: 一个Http响应代表服务器给浏览器回送的数据,同时告诉浏览器应当怎样处理数据.

1.
基本结构
状态行
消息头信息


<--
空行
实体信息
快速入门
HTTP/1.1 200
OK
【200 ok 表示客户端请求成功】
Server:
Microsoft-IIS/5.0
【表示告诉浏览器 服务器的情况 】
Date: Thu, 13 Jul 2000 05:46:53 GMT 【告诉浏览器 请求的页面
的时间 】
Content-Length:
2291
【表示回送的数据有 2291个字节】
Content-Type:
text/html
【文档类型】
Cache-control:
private
【缓存】
hello


对状态码的说明

举例说明Http响应的实际应用
302状态码的使用
比如我们现在希望访问a.php 页面,让其自动重定向到b.php
基本用法使用
<?php


//header(“Location: 新的页面”);


header(“Location: http://www.sohu.com”);

exit();


?>
细节: 302 状态码也可以让其跳转到外网去


404 码
404 最常见的状态码
404一般说就是该页面不存在


304码使用
304 码主要是告诉浏览器,请求的资源不需要更新
<?php

echo
“hello”;

echo
“<img src=”Sunset.jpg”
width=”100px”>“
?>
上面说明了 304的具体用法
HTTP/1.1 304 Not Modified
Date: Tue, 13 Sep 2011 02:10:38 GMT
Server: Apache/2.2.17 (Win32) PHP/5.3.5
Connection: Keep-Alive
Keep-Alive: timeout=5, max=99
ETag: "12d00000000572c-6f69-3e1d849f35000"

******************************http响应详解(禁用缓存设置)

下面是比较详细的一个Http响应

Location: http://www.baidu.org/index.php
Server:apache
Content-Encoding:
gzip 【内容编码支持gzip压缩算法】
Content-Length:
80
【返回数据大小】
Content-Language: zh-cn
Content-Type: text/html; charset=GB2312
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT
【表示浏览器请求资源,最新时间】
Refresh:
1;url=http://www.baidu.com 【告诉浏览器,间隔1秒,重定向到
baidu】
Content-Disposition: attachment;
filename=aaa.zip
Transfer-Encoding: chunked
Set-Cookie:SS=Q0=5Lb_nQ;
path=/search 【讲Cookie】
Expires: -1
Cache-Control:
no-cache
Pragma:
no-cache
Connection:
close/Keep-Alive
Date: Tue, 11 Jul 2000 18:23:51 GMT
演示如何通过Http响应,控制浏览器间隔一定时间去跳转.
<?php


//header(“Refresh: 3 ; url=http://www.sohu.com”);


header(“Refresh: 3 ; url=http://localhost/http/d.php”);
?>
演示如何通过Http响应控制页面缓存,在默认情况下,浏览器会缓存页面.
<?php


//通过header来禁用缓存(ajax )


header("Expires: -1");


header("Cache-Control: no_cache");


header("Pragma: no-cache");


echo "hello!cache";

?>
****************************************** http响应详解(文件下载)

代码如下:
<?php


//对函数的说明


//参数说明 $file_name 文件名


//
$file_sub_dir: 下载文件的子路径 '"/xxx/xxx/"


function down_file($file_name,$file_sub_dir){


//死去活来,演示下载一个图片.


//如果文件是中文.






//原因 php文件函数,比较古老,需要对中文转码 gb2312


$file_name=iconv("utf-8","gb2312",$file_name);


//绝对路径


$file_path=$_SERVER['DOCUMENT_ROOT'].$file_sub_dir.$file_name;


//如果你希望绝对路径




//1.打开文件


if(!file_exists($file_path)){


echo "文件不存在!";


return ;


}


$fp=fopen($file_path,"r");




//获取下载文件的大小


$file_size=filesize($file_path);


if($file_size>30){




echo "<script
language='javascript'>window.alert('过大')</script>";


return ;


}


//返回的文件


header("Content-type: application/octet-stream");



//
按照字节大小返回


header("Accept-Ranges: bytes");



//
返回文件大小


header("Accept-Length: $file_size");



//
这里客户端的弹出对话框,对应的文件名


header("Content-Disposition: attachment;
filename=".$file_name);



//向客户端回送数据




$buffer=1024;


//为了下载的安全,我们最好做一个文件字节读取计数器


$file_count=0;


//这句话用于判断文件是否结束


while(!feof($fp) &&
($file_size-$file_count>0) ){


$file_data=fread($fp,$buffer);


//统计读了多少个字节


$file_count+=$buffer;


//把部分数据回送给浏览器;


echo $file_data;


}


//关闭文件


fclose($fp);


}


//测试函数是否可用


down_file("顺平.jpg","/http/down/");
?>

***********************************************
PHP数据库编程①-使用mysql扩展库

php数据库编程
说php有三种方式来操作我们的mysql数据库


mysql扩展库


mysqli扩展库


pdo
☞ mysql扩展库(操作数据库的函数)和mysql数据库的区别
1.mysql数据库是用于存放数据.
2.mysql数据库的三层结构示意图

1.
编写php程序完成对用户表的显示
代码
<?php


//mysql扩展库操作mysql数据库步骤如下


//1. 获取连接


$conn=mysql_connect("127.0.0.1","root","root");


if(!$conn){


die("连接失败".mysql_error());


}


//2. 选择数据库


mysql_select_db("test");


//3. 设置操作编码(建议有)!!!


mysql_query(“set names utf8”); //保证我们的php程序是按照utf8码操作.应该是utf-8


//4. 发送指令sql (ddl 数据定义语句 , dml(数据操作语言
update insert ,delete) ,dql (select ), dtl
数据事务语句 rollback
commit... )



$sql="select * from user1";


//函数


//$res 表示结果集,你可以简单的理解就是 一张表.如果是dml操作则返回的res为boolean


$res=mysql_query($sql,$conn);


//var_dump($res); //mysql result 资源类型


//5. 接收返回的结果,并处理.(显示)


// mysql_fecth_row 会依次取出$res结果集的下一行数据,赋值给$row


// $row就是一个数组, 样式array(5) { [0]=> string(1) "1"
[1]=> string(2) "zs" [2]=> string(32)
"e10adc3949ba59abbe56e057f20f883e" [3]=> string(11)
"zs@sohu.com" [4]=> string(2) "30" }


//mysql_fetch_assoc mysql_fetch_array


while($row=mysql_fetch_row($res)){


//第一种取法是 同 $row[$i]


//echo "<br/>
$row[0]--$row[1]--$row[2]";


//echo "<br/>";


//var_dump($row);


//第二种取法


foreach($row as $key => $val){


echo "--$val";


}


echo "<br/>";


}

//6. 释放资源,关闭连接(必须)


mysql_free_result($res);


//这句话可以没有,建议有.

//
mysql_close($conn);
?>
细节 :

1.
使用完 $res 结果集后,一定要及时的释放资源.

2.
mysql_close() 如果没有的话,系统也会自动的关闭

3.
从$res获取行数据的时候,处理 mysql_fetch_row($res),还有三个方法.
分别是
mysql_fetch_row($res)
,返回一个索引的数组 (推荐.)
mysql_fetch_assoc($res)
,返回一个关联数组
mysql_fetch_array($res)
,返回索引数组和关联数组 (两套)
mysql_fetch_object($res) ,把一行数据,当做一个对象返回.
演示通过mysql扩展库,进行dml操作
代码:封装成一个工具类 SqlTool
<?php

class
SqlTool {


//属性


private $conn;


private $host="localhost";


private $user="root";


private $password="root";


private $db="test";


function SqlTool(){


$this->conn=mysql_connect($this->host,$this->user,$this->password);


if(!$this->conn){


die("连接数据库失败".mysql_error());


}


mysql_select_db($this->db,$this->conn);


mysql_query("set names utf8");


}


//方法..


// 完成select dql


public function execute_dql($sql){


$res=mysql_query($sql,$this->conn) or
die(mysql_error());


return
$res;


}


//完成 update,delete ,insert dml
/$sql="insert into user1 (name,password,email,age)
values('小明',md5('123'),'xiaoming@sohu.com',34)";


//$sql="delete from user1 where id=5";


// $sql="update user1 set age=100 where id=6";


public function execute_dml($sql){


$b=mysql_query($sql,$this->conn);


//echo "添加的id=".mysql_insert_id($this->conn);


if(!$b){


return 0;//失败


}else{


if(mysql_affected_rows($this->conn)>0){


return 1;//表示成功


}else{


return 2;//表示没有行数影响.


}


}


}


}
?>
PHP数据库编程⑥-使用mysqli扩展库

使用php
的mysqli扩展库去操作mysql数据库
简单介绍:
mysqli (mysql improve mysql扩展库的增强版)
mysql 扩展库 和 mysqli 扩展库的比较

1.
mysqli 的稳定性和安全性,效率有所提高

2.
mysqi 支持面向对象编程 ,同时 mysqli 扩展库考虑到php老程序员,提供面向过程的编程风格.
用appserver
php版本5.2.x
$mysqli=new
MySQLi(“localhost”,”root”,”roo3t”,”test”);
//安照变相对象的方式
if($mysqli->connect_error){


die($mysqli->connect_error);
}
// 考虑兼容低版本
if(mysqli_connect_error()){


die(“连接error”. mysqli_connect_error())
}


mysqli 编程的快速入门
编写一个程序,这个程序从user1表中读取数据,并打印在网页中。(使用mysqli完成.)

1.
先使用mysqli面向对象的风格,完成案例

1.1.
配置php.ini 文件让php支持mysqli扩展库
extension=php_mysqli.dll
1.2 建库,建表.
这里我们使用原来的user1表.
1.3 编写代码
<?php


header("Content-type:
text/html;charset=utf-8");


//mysqli操作mysql数据库(面向对象风格)


//1.创建MySQLi 对象


$mysqli=new MySQLi("localhost","root","root","test");


//验证是否ok


if($mysqli->connect_error){


die("连接失败".$mysqli->connect_error);


}


//2. 操作数据库(发送sql)


$sql="select * from user1";


//$res 是结果集.mysqli result


$res=$mysqli->query($sql);


//var_dump($res);


//3. 处理结果 mysql_fetch_row();


while($row=$res->fetch_row()){


foreach($row as $key=>$val){


echo "--$val";


}


echo "<br/>";


}


//4. 关闭资源


//释放内存


$res->free();


//关闭连接


$mysqli->close();
?>

我们再使用面向过程的方式给大家演示一下.
代码:
//1.得到mysqli连接


header("Content-type: text/html;charset=utf-8");


$mysqli=mysqli_connect("localhost","root","root","test");


if(!$mysqli){


die("连接失败".mysqli_connnect_error($mysqli));


}


//2.向数据库发送sql语句(ddl,dml dql ...)


$sql="select * from user1";


$res=mysqli_query($mysqli,$sql);


//var_dump($res);


//3.处理得到的结果


//循环取出$res中的数据mysqli_fetch_row mysql_fetch_row


while($row=mysqli_fetch_row($res)){




foreach($row as $key=>$val){


echo "--$val";


}


echo "<br/>";


}


//4.关闭资源


mysqli_free_result($res);


mysqli_close($mysqli);
☞ 在mysqli 扩展中,也提供了四种方式来获取mysqli
result结果集mysqli_result::fetch_assoc
<==>
mysql_fetch_assoc
mysqli_result::fetch_row
<==>
mysql_fetch_row
mysqli_result::fetch_array
<===> mysql_fetch_array

mysqli_result::fetch_object<===>
mysql_fetch_object
这里我们推荐大家使用前两种效率较高
☞ 在mysqli释放结果集有三种方式:
void mysqli_result::free ( void )
void mysqli_result::close ( void )
void mysqli_result::free_result ( void )
☞ mysql 的sql 语句的特别说明:
如果操作的字段类型是 string型,则要求我们的 要用 ‘’ 包括。
如果操作的字段类型是 数值型,则可以用 ’80’ 包括,也可以不用

mysqli的增强-批量执行sql语句
批量执行 dml语句
基本语法
$sqls=”sql1;sql2;...”

mysqli::multi_query($sqls)
体验案例: PHP 网站
//请使用mysqli的mysqi::multi_query() 一次性添加三个用户 宋江 卢俊义
吴用
代码:
<?php


//请使用mysqli的mysqi::multi_query() 一次性添加三个用户 宋江 卢俊义 吴用




//1.得到mysqli对象


$mysqli=new MySQLi("localhost","root","hsp123","test");


if($mysqli->connect_error){




die($mysqli->connect_error);


}


$sqls="insert into user1 (name,password,email,age)
values('宋江','aaa','aa@shu.com',45);";


$sqls.="insert into user1 (name,password,email,age)
values('卢俊义','aaa','aa@shu.com',45);";


$sqls.="insert into user1 (name,password,email,age)
values('吴用','aaa','aa@shu.com',45);";


//$sqls.="update ;";


//$sqls.="delete ;";


//dml 和 dql


$b=$mysqli->multi_query($sqls);


if(!$b){


echo "执行失败".$mysqli->error;


}else{


echo "ok";


}


//关闭资源


$mysqli->close();
?>
PHP数据库编程⑨-使用mysqli扩展库增强(批量执行sql和事务控制)

☞ 批量执行dml语句可以混合使用 delete insert
update,但是最好不要使用select


批量执行 dql语句
它的作用是可以一次性的取回多个结果集
<?php


//练习2: 请使用mysqli的mysqi::multi_query()
一次性查询并显示①users表的结构 、 ②users表中用户id ,和用户名字


//1.得打mysqli对象(究竟是什么
代表的是和mysql数据库的连接. $conn)


$mysqli=new MySQLi("localhost","root","hsp123","test");


//2.批量查询


$sqls="select * from emp;";


$sqls.="select * from user1;";


$sqls.="desc user1";




//3.处理结果


//如果成功,则至少有一个结果集


$mysqli 对象 中 $mysqli result
数组


if($res=$mysqli->multi_query($sqls)){




do{


//从mysqli连接取出第一个结果集


$result=$mysqli->store_result();


//显示mysqli result对象


while($row=$result->fetch_row()){


foreach($row as $key => $val){


echo "--$val";


}


echo "<br/>";


}


//及时释放$result;


$result->free();


if(!$mysqli->more_results()){


break;


}


echo
"<br/>******新的结果集*******<br/>";


}while($mysqli->next_result());


}


//4.关闭资源


$mysqli->close();
?>

mysql的事务处理
看一个实际情况
有一张银行账号表
create table account
(id int primary key,
balance float);
现在有一段php程序, 要完成 把 1号 10 元钱,转到 2号账号上
<?php


$mysqli=new MySQLi("localhost","root","hsp123","test");


if($mysqli->connect_error){


die($mysqli->connect_error);


}


$sql1="update account set balance=balance-2 where id=1";


$sql2="update account2 set balance=balance+2 where id=2";


$b1=$mysqli->query($sql1) or
die($mysqli->error);


$b2=$mysqli->query($sql2) or
die($mysqli->error);


if(!$b1||!$b2){


echo "失败";


}else{


echo "成功";


}


$mysqli->close();
?>
这时,我们需要有一种方法来控制两句sql语句同时成功,同时失败.
->事务


事务

基本:事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败。如:网上转账就是典型的要用事务来处理,用以保证数据的一致性
现在我们使用事务来完成上面的代码
代码:
<?php


$mysqli=new
MySQLi("localhost","root","hsp123","test");


if($mysqli->connect_error){


die($mysqli->connect_error);


}


//将提交设为false[事务一旦提交就没有机会回滚


$mysqli->autocommit(false);


//-> savepoint a;会把但前情况记录


$sql1="update account set balance=balance-2 where id=1";


$sql2="update account2 set balance=balance+2 where id=2";


$b1=$mysqli->query($sql1) ;


$b2=$mysqli->query($sql2) ;


if(!$b1||!$b2){


echo "失败,回滚".$mysqli->error;


//回滚!


$mysqli->rollback();


}else{


//提交[一旦提交没有机会回滚


$mysqli->commit();


}


$mysqli->close();


//显示控制台
?>
☞ 在mysql控制台可以使用事务来操作,具体步骤如下

1.
开启一个事务 start transaction

2.
做保存点 savepoint 保存点名称

3.
操作....

4.
可以回滚,可以提交

4.1
如果没有问题提交commit

4.2
如果你觉得有问题,就回滚
rollback to 保存点.


事务的acid特性
原子性,一致性,持久性,隔离性.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: