0
点赞
收藏
分享

微信扫一扫

php中的pdo和mysqli的对比选择


  在PHP中,如何选择PDO和mysqli呢?本文做个简单的比较

1)总的比较
  

 

PDO

MYSQLI

数据库支持

12种不同的数据库支持

支持MYSQL

API

OOP

OOP和过程

命名参数

支持

不支持

对象映射支持

支持

支持

preparestment

支持

不支持

支持存储过程

支持

支持

 

 

 

 

2  连接方式
  先来看下两者连接数据库的方式:


​​// PDO ​​



​​$pdo​​​
​​​= ​​​
​​​new​​​
​​​PDO(​​​
​​​"mysql:host=localhost;dbname=database"​​​
​​​, ​​​
​​​'username'​​​
​​​, ​​​
​​​'password'​​​
​​​); ​​







​​// mysqli, 面向过程方式​​



​​$mysqli​​​
​​​= mysqli_connect(​​​
​​​'localhost'​​​
​​​,​​​
​​​'username'​​​
​​​,​​​
​​​'password'​​​
​​​,​​​
​​​'database'​​​
​​​); ​​







​​// mysqli, 面向对象​​



​​$mysqli​​​
​​​= ​​​
​​​new​​​
​​​mysqli(​​​
​​​'localhost'​​​
​​​,​​​
​​​'username'​​​
​​​,​​​
​​​'password'​​​
​​​,​​​
​​​'database'​​​
​​​); ​​




​​3 数据库支持
PDO支持多种数据库,但MYSQLI只支持MYSQL​​



​​4 命名参数name parameter​​



​​PDO的方式:​​






​​$params​​​
​​​= ​​​
​​​array​​​
​​​(​​​
​​​':username'​​​
​​​=> ​​​
​​​'test'​​​
​​​, ​​​
​​​':email'​​​
​​​=> ​​​
​​​$mail​​​
​​​, ​​​
​​​':last_login'​​​
​​​=> time() - 3600); ​​







​​$pdo​​​
​​​->prepare(' ​​




​​SELECT * FROM users ​​




​​WHERE username = :username ​​




​​AND email = :email ​​




​​AND last_login > :last_login'); ​​




​​而MYSQLI则麻烦点,不支持这样,只能:






​​ $query = $mysqli->prepare(' ​​




​​ SELECT * FROM users ​​




​​ WHERE username = ? ​​




​​ AND email = ? ​​




​​ AND last_login > ?'); ​​









​​ $query->bind_param('sss', 'test', $mail, time() - 3600); ​​




​​ $query->execute();​​




​​ 这样的话,一个个对问号的顺序,也比较麻烦,不大方便。​​









​​5 ORM映射的支持





​​ 比如有个类user,如下:​​










​​ ​​class​​ ​​User { ​​ ​​




​​ ​​public​​ ​​$id​​​​; ​​ ​​




​​ ​​public​​ ​​$first_name​​​​; ​​ ​​




​​ ​​public​​ ​​$last_name​​​​; ​​ ​​









​​ ​​public​​ ​​function​​ ​​info() ​​ ​​




​​ ​​{ ​​ ​​




​​ ​​return​​ ​​'#'​​​​.​​​​$this​​​​->id.​​​​': '​​​​.​​​​$this​​​​->first_name.​​​​' '​​​​.​​​​$this​​​​->last_name; ​​ ​​




​​ ​​} ​​ ​​




​​​}​​​












​​​ ​​$query​​ ​​= ​​​​"SELECT id, first_name, last_name FROM users"​​​​; ​​ ​​​









​​​​// PDO ​​​​




​​​ ​​$result​​ ​​= ​​​​$pdo​​​​->query(​​​​$query​​​​); ​​ ​​​




​​​ ​​$result​​​​->setFetchMode(PDO::FETCH_CLASS, ​​​​'User'​​​​); ​​ ​​​









​​​ ​​while​​ ​​(​​​​$user​​ ​​= ​​​​$result​​​​->fetch()) { ​​ ​​​




​​​ ​​echo​​ ​​$user​​​​->info().​​​​"\n"​​​​; ​​ ​​​




​​​​} ​​​​














​​ MYSQLI用面向过程的方式:​​






​​ if ($result = mysqli_query($mysqli, $query)) { ​​




​​ while ($user = mysqli_fetch_object($result, 'User')) { ​​




​​ echo $user->info()."\n"; ​​




​​ } ​​









​​MYSQLI采用面向过程的方式:
​​


​​​// MySQLi, object oriented way ​​​




​​ ​​if​​ ​​(​​​​$result​​ ​​= ​​​​$mysqli​​​​->query(​​​​$query​​​​)) { ​​ ​​




​​ ​​while​​ ​​(​​​​$user​​ ​​= ​​​​$result​​​​->fetch_object(​​​​'User'​​​​)) { ​​ ​​




​​ ​​echo​​ ​​$user​​​​->info().​​​​"\n"​​​​; ​​ ​​




​​ ​​} ​​ ​​




​​​}​​​














​​​6 防止SQL注入方面:
PDO 手工设置
​​​


​​​ ​​$username​​ ​​= PDO::quote(​​​​$_GET​​​​[​​​​'username'​​​​]); ​​ ​​​







​​​​ ​​$pdo​​​​->query(​​​​"SELECT * FROM users WHERE username = $username"​​​​); ​​ ​​​​









​​​​​使用mysqli
​​​​​


​​​​​ ​​$username​​ ​​= mysqli_real_escape_string(​​​​$_GET​​​​[​​​​'username'​​​​]); ​​ ​​​​​









​​​​​ ​​$mysqli​​​​->query(​​​​"SELECT * FROM users WHERE username = '$username'"​​​​);​​ ​​​​​









​​​​​​7 preparestament
PDO方式:
​​​​​​


​​​​​​ ​​$pdo​​​​->prepare(​​​​'SELECT * FROM users WHERE username = :username'​​​​); ​​ ​​​​​​




​​​​​​ ​​$pdo​​​​->execute(​​​​array​​​​(​​​​':username'​​ ​​=> ​​​​$_GET​​​​[​​​​'username'​​​​])); ​​ ​​​​​​









​​​​​​​ MYSQLI:
​​​​​​​


​​​​​​​ ​​$query​​ ​​= ​​​​$mysqli​​​​->prepare(​​​​'SELECT * FROM users WHERE username = ?'​​​​); ​​ ​​​​​​​




​​​​​​​ ​​$query​​​​->bind_param(​​​​'s'​​​​, ​​​​$_GET​​​​[​​​​'username'​​​​]); ​​ ​​​​​​​




​​​​​​​ ​​$query​​​​->execute();​​ ​​​​​​​

举报

相关推荐

0 条评论