PHP:mysql v mysqli v pdo

时间:2012-08-23 17:40:14

标签: php mysql pdo mysqli

我一直在阅读有关使用mysqli与pdo在php中使用mysql的一些问题。

我见过mysqli or PDO - what are the pros and cons?Moving from mysql to mysqli or pdo?等问题,这些问题都只涉及mysqli v pdo。我不太关心这两种方法中的哪一种更好。

我想知道为什么要避免使用mysql_函数。当然,他们正在按照PHP文档http://php.net/manual/en/faq.databases.php#faq.databases.mysql.deprecated被弃用,线程PHP PDO and MySQLi表明PDO和MySQLi更强大,线程What is the difference between MySQL, MySQLi and PDO?暗示这些新方法是更安全。

总的来说,我想知道mysql_方法的主要缺点是什么,以及避免它的原因(我猜更具体而不仅仅是因为它已被弃用)。我打算更新受影响的脚本,并对这个旧方法被弃用的原因感到好奇。

谢谢!

3 个答案:

答案 0 :(得分:23)

mysql_query函数的设计是这样的,你必须小心地逃避你注入的每一个数据,如果你错过了一个你的整个应用程序都可以被销毁通过automatic SQL vulnerability exploit tool

mysqli和PDO都支持 required 的占位符,以确保您的查询不受SQL注入错误的影响。在所有内容上调用mysql_real_escape_string不仅乏味,而且容易出错,而这就是出现问题的地方。

mysql函数是PHP早期的产物,并且比mysqli作为选项或PDO设计提供的新的面向对象特性更加有限。 / p>

使用这两个新接口之一有很多很好的理由,但最重要的是mysql_query功能在生产代码中使用起来太危险了。有了它,你将永远是一个错误,远离一些非常严重的问题。

有充足的密码和信用卡号码的数据库不断出现的原因。拥有明显的SQL注入点使得完全接管站点变得非常容易。

答案 1 :(得分:8)

从选择MySSQL API @ PHP.net

// mysqli
$mysqli = new mysqli("example.com", "user", "password", "database");
$result = $mysqli->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = $result->fetch_assoc();
echo htmlentities($row['_message']);

// PDO
$pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');
$statement = $pdo->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['_message']);

// mysql
$c = mysql_connect("example.com", "user", "password");
mysql_select_db("database");
$result = mysql_query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = mysql_fetch_assoc($result);
echo htmlentities($row['_message']);

创建一个对象,如mysqli和PDO,是编写任何现代软件的推荐方法。 mysql liblary是针对PHP 2.0版发布的,从那时起就没有重大改写。 PHP 2.0于1997年发布,应该足以解释为什么不使用它。

答案 2 :(得分:2)

一方面,如果你没有手动正确地清理输入,mysql函数极易出现SQL注入。 mysqli和pdo具有参数化的sql语句选项,可以避免这种风险。在我看来,它们通常也有更好的编码风格。