永发信息网

PDO vs.MySQLi 选择哪一个

答案:1  悬赏:60  手机版
解决时间 2021-03-10 07:54
  • 提问者网友:几叶到寒
  • 2021-03-09 22:30
PDO vs.MySQLi 选择哪一个
最佳答案
  • 五星知识达人网友:何以畏孤独
  • 2021-03-09 22:54
一:
PHP-MySQL 是 PHP 操作 MySQL 资料库最原始的 Extension ,PHP-MySQLi 的 i 代表 Improvement ,提更了相对进阶的功能,就 Extension 而言,本身也增加了安全性。而 PDO (PHP Data Object) 则是提供了一个 Abstraction Layer 来操作资料库,用讲的其实看不出来有有什麽差别,所以就直接看程式吧…
首先,先来看一段用 PHP-MySQL 写成的程式码,这类的范例常用在世界各地:

复制代码代码如下:

lt;?php
mysql_connect($db_host, $db_user, $db_password);
mysql_select_db($dn_name);
$result = mysql_query(SELECT `name` FROM `users` WHERe `location` = ;$location;);
while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
echo $row[;name;];
}
mysql_free_result($result);
?;

乍看之下没什麽问题,但其实背后有些学问…
这种方式不能 Bind Column ,以前例的 SQL 叙述来说,$location 的地方容易被 SQL Injection。后来于是发展出了 mysql_escape_string() (备注:5.3.0之后弃用) 以及 mysql_real_escape_string() 来解决这个问题,不过这麽一搞,整个叙述会变得复杂且丑陋,而且如果栏位多了,可以想见会是怎样的情形…

复制代码代码如下:

lt;?php
$query = sprintf(SELECt * FROM users WHERe user=;%s; AND password=;%s;,
mysql_real_escape_string($user),
mysql_real_escape_string($password));
mysql_query($query);
?;

在 PHP-MySQLi 中有了不少进步,除了透过 Bind Column 来解决上述问题,而且也多援 Transaction, Multi Query ,并且同时提供了 Object oriented style (下面这段 PHP-MySQLi 范例的写法) 和 Procedural style (上面 PHP-MySQL 范例的写法)两种写法…等等。

复制代码代码如下:

lt;?php
$mysqli = new mysqli($db_host, $db_user, $db_password, $db_name);
$sql = INSERT INTO `users` (id, name, gender, location) VALUES (?, ?, ?, ?);
$stmt = $mysqli-;prepare($sql);
$stmt-;bind_param(;dsss;, $source_id, $source_name, $source_gender, $source_location);
$stmt-;execute();
$stmt-;bind_result($id, $name, $gender, $location);
while ($stmt-;fetch())
{
echo $id . $name . $gender . $location;
}
$stmt-;close();
$mysqli-;close();
?;

但看到这边又发现了一些缺点,例如得 Bind Result,这个就有点多馀,不过这其实无关紧要,因为最大的问题还是在于这不是一个抽象(Abstraction)的方法,所以当后端更换资料库的时候,就是痛苦的开始…
于是 PDO 就出现了(备注:目前 Ubuntu 和 Debian 来说,PDO 并没有直接的套件可以安装,而是必须透过 PECL 安装)。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯