0

PHP中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及以后版本中包含;

相对于mysql扩展,mysqli扩展有一系列的优势,提升主要有:面向对象接口、 prepared语句支持、多语句执行支持、事务支持、增强的调试能力、嵌入式服务支持。
 

PHP数据对象(PDO)

PHP数据对象,全称PHP Database Objects,是PHP应用中的一个数据库抽象层规范。它提供了一种统一的PHP与数据库交互的方法,使得你的PHP应用不去关心具体要 连接的数据库服务器系统类型。也就是说,如果你使用PDO的API,可以在任何需要的时候无缝切换数据库服务器。 具体来讲,它的优势在于:只要正确提供数据源,余下对于数据库的基本操作都是一样的。也就是说,同一段代码既可以同MySQL交互,也可以和SQLite3交互,当然也可以和PostgreSQL进行交互,只要提供了正确的数据源。


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编译进去。
  



首先,创建数据表,后面演示使用:

CREATE TABLE IF NOT EXISTS `account` (
  `uid` int(11) unsigned NOT NULL COMMENT '账户ID',
  `uname` varchar(64) NOT NULL DEFAULT '' COMMENT '用户名',
  `upwd` varchar(48) NOT NULL DEFAULT '' COMMENT '密码',
  `createDate` datetime NOT NULL COMMENT '创建日期'
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

插入两条测试数据

INSERT INTO account(uid, uname,upwd,createDate) VALUES(1,'Kevin','123',now()),(1,'jbsage','456',now());

接下来,上代码(以下四个例子代码运行环境Mac OS, PHP Storm,PHP5.6.16 运行通过):

一 mysql面向过程连接操作:


<?php
/**
 * Created by PhpStorm.
 * User: mac
 * Date: 2018/8/6
 * Time: 下午4:00
 */
header("Content-Type: text/html;charset=utf-8;");
$username="root";
$userpass="111";
$dbhost="127.0.0.1";
$dbdatabase="JBSage";

//生成一个连接
$db_con = @mysql_connect($dbhost,$username,$userpass);
if(!$db_con){
    die("数据库连接错误".  @mysql_error());
}else{
    echo"数据库连接成功<br/>";
}

//选择一个需要操作的数据库
@mysql_select_db($dbdatabase,$db_con);
//执行MySQL语句
$result=@mysql_query("SELECT uid,uname FROM account");
//提取数据
while($rows=@mysql_fetch_row($result)){
//mysql_fetch_row() 从和结果标识 data 关联的结果集中取得一行数据并作为数组返回。
//每个结果的列储存在一个数组的单元中,偏移量从 0 开始。
//依次调用 mysql_fetch_row() 将返回结果集中的下一行,如果没有更多行则返回 FALSE。

    echo "UserId = {$rows[0]} <br/>UserName = {$rows[1]}";
    echo "<hr/><br/>";
}
//关闭链接
@mysql_close($db_con);

1.因为小编这里使用的是PHP 5版本,在mysql_connect()、mysql_select_db()等函数之前使用@(错误控制运算符),可以忽略掉系统产生的错误信息,不然的话,上面这段代码在PHP 5中是不能正常运行的;

2.提取数据,使用的是mysql_fetch_row

3.对于mysql_query()函数的返回值,如果执行的语句有返回值(如SELECT、SHOW、DESCRIBE等),则返回相应数据(成功时)或FALSE(失败时);如果执行的语句没有返回值(如DELETE、DROP、INSERT、UPDATE等),则返回TRUE(成功时)或FALSE(失败时)。

二 mysqli面向过程连接操作:


<?php
/**
 * Created by PhpStorm.
 * User: mac
 * Date: 2018/8/6
 * Time: 下午4:00
 */
header("Content-Type: text/html;charset=utf-8;");
$username="root";
$userpass="111";
$dbhost="127.0.0.1";
$dbdatabase="JBSage";

$db_con = mysqli_connect($dbhost,$username,$userpass);

if(!$db_con){
    die("数据库连接错误". mysqli_connect_error());
}else{
    echo"数据库连接成功<br/>";
}


mysqli_select_db($db_con,$dbdatabase);

$sql = "SELECT * FROM account;";
$result = mysqli_query($db_con,$sql);
if($result) {
    while ($rows = mysqli_fetch_array($result)) {
        echo "UserId = {$rows['uid']} UserName = {$rows['uname']}";
        echo "<hr/><br/>";
    }
}
mysqli_free_result($result);  //释放查询结果占用的内存

mysqli_close($db_con);

三 mysqli面向对象数据操作过程

<?php
/**
 * Created by PhpStorm.
 * User: mac
 * Date: 2018/8/6
 * Time: 下午4:00
 */
header("Content-Type: text/html;charset=utf-8;");
$username="root";
$userpass="111";
$dbhost="127.0.0.1";
$dbdatabase="JBSage";

$db_con = new mysqli($dbhost,$username,$userpass,$dbdatabase);

if(!$db_con)
{
    die("连接失败!".$mysqli->connect_error);
}

$result=$db_con->query("SELECT * FROM account");

if($result) {
    while ($rows = $result->fetch_row()) {
        print_r($rows);//返回一条记录
        echo "UserId = {$rows[0]} UserName = {$rows[1]}";//解析记录中的字段
        echo "<hr/><br/>";
    }
}
$result->free();//释放内存

$db_con->close();//关闭数据库链接

四 PDO数据库操作过程

<?php
/**
 * Created by PhpStorm.
 * User: mac
 * Date: 2018/8/6
 * Time: 下午4:00
 */
header("Content-Type: text/html;charset=utf-8;");

$dsn = 'mysql:dbname=jbsage;host=127.0.0.1;port=3306';
$username = 'root';
$password = '111';
$db = null;
try {
    $db = new PDO($dsn, $username, $password); // also allows an extra parameter of configuration
} catch(PDOException $e) {
    die('Could not connect to the database:<br/>' . $e);
}

echo "数据库链接成功<br/>";
$sql = 'SELECT * FROM account';

$res = $db->query($sql) or var_dump($db->errorInfo());
// var_dump($res);
while($mon = $res->fetch(PDO::FETCH_ASSOC)) {

    echo "UserId = {$mon['uid']} UserName = {$mon['uname']}";
    echo "<hr/><br/>";
}
$dbh = null; // 运行完成,关闭连接

对上面的代码进行解释:
$dsn = 'mysql:dbname=jbsage;host=127.0.0.1;port=3306';
DSN为我们需要构造的数据源,里面的信息包括:数据库类型mysql,主机地址是127.0.0.1,数据库名称是jbsage。
注意,不同数据库的数据源构造方式是不一样的,这里以mysql数据库为例。

$db = new PDO($dsn, $username, $password);
初始化一个PDO对象,构造函数的参数第一个就是我们的数据源,第二个是连接数据库服务器的用户,第三个参数是密码。

下表比较了PHP中三种主要的MySQL连接方式的功能:

 

mysqli

PDO (使用PDO MySQL驱动和MySQL Native驱动)

PHPmysql

引入的PHP版本

5.0

5.0

3.0之前

PHP5.x是否包含

MySQL

PHP5.3中活

仅维护

MySQL目中的建使用程度

-

不建

API的字符集支持

prepare语句的支持情

prepare语句的支持情

储过程支持情况

行支持情况

大多数

是否支持所有MySQL4.1以上功能

大多数