PHP学习第11课:php如何访问mysql服务
1、特点:
(1)mysql拓展是早期版本;
(2)面向过程;
(3)非持续性链接,即每次链接都要打开一个新的进程;
(4)相对mysqli,PDO功能及安全性较差,且操作过程较繁琐。
除非系统是旧的版本(不想升级,说白了就是“怕”)不得不使用,否则应该果断废弃。
1、特点:
(1)mysqli是mysql improve,即mysql的加强版;
(2)永久链接;
(3)支持面向对象;
(4)其他:支持prepared语句,多语句执行,事务,嵌入式服务;
prepared是一个预处理机制,可以将整个命令向mysql服务器发送一次,以后只要参数变化,只需要分析命令的结构,可以减少数据的传输量,提高处理效率。
同样,能不用就不用。

1、举个例子,mysql拓展和mysqli拓展都是MYSQL的东西,有一天领导一声令下,“我们改成Oracle数据库吧”,你是不是有一种“很不爽”的感觉,因为你需要学习和安装php关于Oracle拓展的东西,虽然我们提倡“好好学习,天天向上”,但有的时候确实感觉比较麻烦。
这时候数据库抽象层PDO的作用就显现:统一不同数据库的访问接口,容易实现数据库迁移。


2、需要注意的是,windows的php版本中,PDO和主要的数据库驱动和php是一起发布的,修改起来很简单(将配置文件中php.ini中对应拓展的“注释”去掉即可),Linux环境的还需要再安装,由于我前期PHP的安装使用的是“yum”,
同样我通过yum来安装“PDO”和“pdo_mysql”:
yum install php70w-pdo
yum install php70w-pdo_mysql

1、连接管理:
(1)通过创建PDO基类的实例来实现(new PDO()),其构造函数接收的参数有库源,用户名,密码等。可以使用try{}catch{}来捕获异常。
(2)关闭连接的时候,可以赋值给该实例为NULL,否则程序在结束的时候关闭链接;
(3)可以通过附加参数,建立长连接:
$opt = array(PDO::ATTR_PRESISTENT =>TRUE);
$db = new PDO('mysql:host=127.0.0.1;dbname=hlongworld',$user,$pwd,$opt);
注意事项:
(1)建议使用try{}catcah{}来处理异常信息;
(2)PDO构造函数可接受的参数有4个;
(3)PDO包含好多预定义常量,具体可参见php官网。

2、错误处理模式:
(1)PDO::ERRMODE_SILENT:
默认模式,,可以使用errorCode()和errorInfo()对语句对象和数据库对象进行排错;
(2)PDO::ERRMODE_WARNING:
可以发出一条PHP的E_WARNING错误,$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
(3)PDO::ERRMODE_EXCEPTION:
放大脚本产生错误的地方,更清晰的构造自己的错误处理,
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
3、执行sql:
(1)PDP::exec() : 执行update,insert,save等非结果集的操作,该方法返回受影响的行数;
(2)PDO::query():执行select查询操作(可以使用quote()过滤特殊字符,防止sql注入);
(3)PDO::prepare()和PDOStatement::execute():同一个查询需要执行多次,可提高查询效率。
以下我们重点讲解一下PDO预处理的内容。





1、我们在进行sql 操作是,服务器会分析,编译指令,使用预处理可以使sql语句之传输一次,以后在使用相同的查询的时候,只需要修改参数即可,相当于建立一种语句缓存,可以减少数据的传输量,减少开销。一言以蔽之“一次解析,多次执行”。
此外,还有一个好处,是在某种程度上避免了sql注入。因为我们的sql语句格式是一定的,变化的只是参数而已。
2、准备语句(PDO::prepare()):
sql语句中具体的列值使用两种“占位符”方式来实现:
(1)命名参数;
(2)问号参数;




3、绑定参数:
bindParam(1,2,3,4,5)一共有5个参数
(1)第一个参数由使用的占位符的类型有关,使用命名参数,则为命名的字符串,如果是?号参数,则为该参数在所有占位符中的位置(1,2,3。。。);
(2)第二个参数不能直接提供数据,只能提供变量;
(3)第三个参数表示数据类型;
(4)第四个参数表示数据长度;
(5)第五个参数表示驱动选项。

4、执行execute():

5、获取数据的方法:
(1)fetch();
(2)fetchAll();