个人博客网站文章地址:http://blog.mclink.xyz/index/article/index/id/37.html
看书的时候提及了PDO扩展连接数据库,之前一直用用的mysql扩展和mysqli扩展,基本没用PDO,所以查了一些资料,特地记录转载,
PHP的MySQL扩展(优缺点)
设计开发允许PHP应用与MySQL数据库交互的早期扩展。mysql扩展提供了一个面向过程 的接口;
并且是针对MySQL4.1.3或更早版本设计的。因此,这个扩展虽然可以与MySQL4.1.3或更新的数 ;
据库服务端 进行交互,但并不支持后期MySQL服务端提供的一些特性。
PHP的mysqli扩展
mysqli扩展,我们有时称之为MySQL增强扩展,可以用于使用 MySQL4.1.3或更新版本中新的高级特性;
mysqli扩展在PHP 5及以后版本中包含;
mysqli扩展有一系列的优势,相对于mysql扩展的提升主要有:面向对象接口、 prepared语句支持、多语句执行支持、事务支持、增强的调试能力、嵌入式服务支持。
PHP数据对象(PDO)
PHP数据对象,是PHP应用中的一个数据库抽象层规范。PDO提供了一个统一的API接口可以,使得你的PHP应用不去关心具体要 连接的数据库服务器系统类型。也就是说,如果你使用PDO的API,可以在任何需要的时候无缝切换数据库服务器。
*********************************************************************************************************************************
PHP-MySQL 是 PHP 操作 MySQL 资料库最原始的 Extension ,PHP-MySQLi 的 i 代表 Improvement ,
提更了相对进阶的功能,就 Extension 而言,本身也增加了安全性。
而 PDO (PHP Data Object) 则是提供了一个 Abstraction Layer 来操作资料库
1.mysql与mysqli
mysqli是php5提供的新函数库,(i)表示改进,其执行速度更快.当然也更安全
mysql是非持继连接函数而mysqli是永远连接函数。也就是说
mysql每次链接都会打开一个连接的进程而mysqli多次运行mysqli将使用同一连接进程,从而减少了服务器的开销 有些朋友在编程的时候,使用new mysqli(‘localhost’, usenamer’, ‘password’, ‘databasename’);总是报
错,Fatal error: Class ‘mysqli’ not found in d:\…
mysqli类不是php自带的吗?
不是默认开启的,win下要改php.ini,去掉php_mysqli.dll前的;,linux下要把mysqli编译进去。
一:Mysqli.dll是一个允许以对象的方式或者过程操作数据库的,它的使用方式也很容易。
php连接到mysql数据库,我们一般最经典的方式就是使用mysql_connect(),具体代码如下:
- mysql_connect($db_host, $db_user, $db_pass) or die(mysql_error());
- mysql_select_db($db_name);
- <?php
- $link = mysqli_connect("localhost","root","123456","test") or die("Error " . mysqli_error($link)); //连接,test为数据库的名称
- $query = "SELECT name FROM userInfo" or die("Error in the consult.." . mysqli_error($link));//查询
- $result = mysqli_query($link, $query);//查询的结果
- while($row = mysqli_fetch_array($result)) {
- echo $row["name"] . "<br>";
- }
- ?>
上面的这段代码是一个完整的从连接到查询再到关闭数据库的一个例子。从该例子中可以看到,mysql_connect()和mysqli_connect()函数的用法上的小区别。
- //mysql
- mysql_connect("localhost","root","123456");
- mysql_select_db("userInfo");
- //mysqli
- mysqli_connect("localhost","root","123456","test");
mysqli的连接数据库方法中除了使用上述(又称之为面向过程)之外,另外一种就是面向对象方式:
- <?php
- $mysqli = new mysqli("localhost","root","123456","test") //填写mysql用户名、密码及数据库的名称
- or die("Could not connect to MySQL server!");
- $mysqli->query("set names utf8"); //设置数据库内数据的编码,相当于同时设置客户端、服务器端和脚本编码方式。
- $sql = "select * from userInfo";
- $result = $mysqli->query($sql);
- if($result){
- if($result->num_rows>0){
- while($row =$result->fetch_array()){//循环输出结果集中的记录
- echo ($row[0])." ";
- echo ($row[1])." ";
- echo ($row[2])." ";
- echo "<br/>";
- }
- }
- }else{
- echo "Sorry!";
- }
- $result=NULL;
- $mysqli->close();
- ?>
- <?php
- $pdo = new PDO('pgsql:host=192.168.1.111;port=5432;dbname=anydb', 'anyuser', 'pw');//连接到数据库
- sleep(5);
- $stmt = $pdo->prepare('SELECT * FROM sometable');
- $stmt->execute();
- $pdo = null;//关闭连接
- ?>
PDO(PHP数据对象),是PHP访问数据库的一个轻量级的统一接口。它提供了一个数据访问抽象层,这也就是说无论什么数据库都能用相同的方法进行查询或读取。需要注意的是PDO本身并不能实现任何的数据库功能,而是必须要使用一个具体数据库的PDO驱动进行访问数据库服务。
2、怎么用PDO?
这里我们就以PHP的黄金搭档mysql作为例子看看:
PDO_MYSQL:PDO_MYSQL是PDO接口能够完成连接mysql数据库的驱动(注:仅使用于mysql 3.x以上版本)。
安装:打开php.ini文件,可以找到如下代码,这里可以看到mysql的驱动默认已经打开(前面没有用于注释的分号),如有连接其他数据库的需要,自行添加其他数据库的驱动程序(取出相应的项前面的分号,没有的添上)。
- //各数据库的PDO驱动
- extension=php_pdo.dll
- extension=php_pdo_firebird.dll //Firebird
- extension=php_pdo_informix.dll //Informix
- extension=php_pdo_mssql.dll //sql server
- extension=php_pdo_mysql.dll //mysql
- extension=php_pdo_oci.dll //Oracle
- extension=php_pdo_oci8.dll
- extension=php_pdo_odbc.dll //DB2
- extension=php_pdo_pgsql.dll //PostgreSQL
- extension=php_pdo_sqlite.dll //SQLite
连接:通过创建PDO基类的实例创建连接。
- //连接到数据库
- $db = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
- //处理连接错误
- try {
- $db = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
- //查询
- foreach($db->query('SELECT * from FOO') as $row) {
- print_r($row);
- }
- $dbh = null;
- } catch (PDOException $e) {
- print "Error!: " . $e->getMessage() . "<br/>";
- die();
- }
- //关闭连接
- $db = null;
PDO方式连接数据库mysql的实例:
- <?php
- $dbms='mysql'; //数据库 mysql
- $host='localhost'; //数据库主机名
- $dbName='test'; //数据库名
- $user='root'; //连接用户名
- $pass=''; //密码
- $dsn="$dbms:host=$host;dbname=$dbName";
- classdbextendsPDO{
- publicfunction__construct(){
- try{
- parent::__construct("$GLOBALS[dsn]",$GLOBALS['user'],$GLOBALS['pass']);
- }catch(PDOException$e){
- die("Error: ".$e->__toString()."<br/>");
- }
- }
- publicfinalfunctionquery($sql){
- try{
- returnparent::query($this->setString($sql));
- }catch(PDOException$e){
- die("Error: ".$e->__toString()."<br/>");
- }
- }
- privatefinalfunctionsetString($sql){
- echo"处理查询";
- return $sql;
- }
- }
- $db=new db();
- $db->setAttribute(PDO::ATTR_CASE,PDO::CASE_UPPER);
- foreach($db->query('select * from table_name') as $row){
- print_r($row);
- }
- $db->exec('delete from table_name where id=11');
- ?>
3、更多的PDO方法:
- PDO::beginTransaction — 启动一个事务
- PDO::commit — 提交一个事务
- PDO::__construct — 创建一个表示数据库连接的 PDO 实例
- PDO::errorCode — 获取跟数据库句柄上一次操作相关的 SQLSTATE
- PDO::errorInfo — Fetch extended error information associated with the last operation on the database handle
- PDO::exec — 执行一条 SQL 语句,并返回受影响的行数
- PDO::getAttribute — 取回一个数据库连接的属性
- PDO::getAvailableDrivers — 返回一个可用驱动的数组
- PDO::inTransaction — 检查是否在一个事务内
- PDO::lastInsertId — 返回最后插入行的ID或序列值
- PDO::prepare — Prepares a statement for execution and returns a statement object
- PDO::query — Executes an SQL statement, returning a result set as a PDOStatement object
- PDO::quote — Quotes a string for use in a query.
- PDO::rollBack — 回滚一个事务
- PDO::setAttribute — 设置属性
- PDOStatement::bindColumn — 绑定一列到一个 PHP 变量
- PDOStatement::bindParam — 绑定一个参数到指定的变量名
- PDOStatement::bindValue — 把一个值绑定到一个参数
- PDOStatement::closeCursor — 关闭游标,使语句能再次被执行。
- PDOStatement::columnCount — 返回结果集中的列数
- PDOStatement::debugDumpParams — 打印一条 SQL 预处理命令
- PDOStatement::errorCode — 获取跟上一次语句句柄操作相关的 SQLSTATE
- PDOStatement::errorInfo — 获取跟上一次语句句柄操作相关的扩展错误信息
- PDOStatement::execute — 执行一条预处理语句
- PDOStatement::fetch — 从结果集中获取下一行
- PDOStatement::fetchAll — 返回一个包含结果集中所有行的数组
- PDOStatement::fetchColumn — 从结果集中的下一行返回单独的一列。
- PDOStatement::fetchObject — 获取下一行并作为一个对象返回。
- PDOStatement::getAttribute — 检索一个语句属性
- PDOStatement::getColumnMeta — 返回结果集中一列的元数据
- PDOStatement::nextRowset — 在一个多行集语句句柄中推进到下一个行集
- PDOStatement::rowCount — 返回受上一个 SQL 语句影响的行数
- PDOStatement::setAttribute — 设置一个语句属性
- PDOStatement::setFetchMode — 为语句设置默认的获取模式。
- Exception::getMessage — 获取异常消息内容。
- Exception::getPrevious — 返回异常链中的前一个异常
- Exception::getCode — 获取异常代码
- Exception::getFile — 获取发生异常的程序文件名称
- Exception::getLine — 获取发生异常的代码在文件中的行号
- Exception::getTrace — 获取异常追踪信息
- Exception::getTraceAsString — 获取字符串类型的异常追踪信息
- Exception::toString — 将异常对象转换为字符串
- Exception::clone — 异常克隆
本文转自:https://blog.csdn.net/llittlepig/article/details/38272769