PHP: mysql v mysqli v pdo


PHP: mysql v mysqli v pdo

我读到了一些关于在php中使用mysqli与pdo的问题。

我看到过像mysqli或PDO这样的问题——利弊是什么?或者从mysql转移到mysqli或pdo?,这两家公司都专门处理mysqli v pdo。我对这两种方法中哪一种更好不太感兴趣。

我想知道为什么应该避免使用mysql函数。当然,根据PHP的文档,它们正在被弃用http://php.net/manual/en/faq.databases.php#faq.databases.mysql.deprecated,线程PHP PDO和MySQLi表明PDO和MySQL更强大,而线程MySQL、MySQLi和PDO之间有什么区别?意味着这些更新的方法更安全。

总的来说,我想知道mysql_方法的主要弱点是什么,以及避免它的原因是什么(我想这不仅仅是因为它被弃用了)。我计划更新我受影响的脚本,并开始好奇为什么这个旧方法被弃用。

谢谢!

mysql_query函数的设计使得您必须小心地对注入其中的每一个数据进行转义,如果您遗漏了一个数据,则整个应用程序可能会被自动SQL漏洞攻击工具破坏。

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

mysql函数是PHP早期的产物,与mysqli作为选项或PDO设计提供的新的面向对象特性相比,它的局限性要大得多。

使用这两个新接口中的一个有很多很好的理由,但最重要的是mysql_query函数太危险了,无法在生产代码中使用。有了它,你将永远只差一个错误就可以解决一些非常严重的问题。

充满密码和信用卡号码的数据库不断出现是有原因的。有了一个明显的SQL注入点,完全接管一个站点几乎太容易了。

从选择MySQL 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-library是为PHP 2.0版本发布的,从那时起就没有进行过重大的重写。PHP 2.0于1997年发布,这应该足以解释为什么不使用它

首先,如果不正确地手动清理输入,mysql函数极易发生SQL注入。mysqli和pdo对sql语句选项进行了参数化,避免了这种风险。在我看来,它们通常也有更好的编码风格。