为什么不应该在PHP中使用mysql_*函数?

为什么不应该在PHP中使用mysql_*函数?

很多新手在学习PHP时,往往会听说mysql_* 函数是一个方便的PHP MySQL扩展,并开始使用它们来操作数据库。但是,现在却不再推荐使用这种方式,经验丰富的开发人员甚至会告诉你更好的方法。下面是一些理由和替代方法。

阅读更多:MySQL 教程

安全问题

mysql_* 函数没有对SQL注入等重要的问题进行足够的保护,这可以很容易地导致数据丢失,甚至导致您的网站被黑客攻击。例如,在早期的mysql_*函数中,您可能会看到以下类型的代码语句:

$sql = "SELECT * FROM users WHERE email = '". $_POST['email'] ."' AND password = '". $_POST['password'] ."'";

这样的代码非常容易受到SQL注入攻击,因为攻击者可以通过简单地输入以下内容来绕过表单验证:

1' OR 1=1--

这将在查询中注入OR 1=1,获得所有用户的密钥。现在,您可以通过使用以下语法来防止这种攻击:

$sql = "SELECT * FROM users WHERE email = ? AND password = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute(array($_POST['email'], $_POST['password']));

这将为SQL查询提供更强大的保护。

性能

原始的mysql_*函数使用不良的MySQL驱动程序并进行过多的数据转换。虽然它们相对简单,在小型项目中可能具有一些优势,但是在处理大量数据时,效率会比PDO / mysqli慢得多。

维护

mysql_* 是PHP的旧语法,在这个时代它的使用量已经非常少,并且已经被标记为过时的代码。因此,如果您的代码库仍然使用mysql_* ,指导其他开发人员来维护这些项目会变得非常困难。

PDO或mysqli

经验丰富的开发人员建议使用PDO或mysqli,这是两个更安全,更快,更现代化的替代方法。

例如,在使用PDO时,您需要这样写代码来连接到MySQL数据库:

$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'username', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

所有PDO查询都应该准备,像这样:

$sql = "SELECT * FROM users WHERE email = ? AND password = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute(array($_POST['email'], $_POST['password']));
$user = $stmt->fetchObject();

最后的语块省去了手动的提取结果数据,因为它作为存储在对象中的返回值返回。

mysqli也很好,但它使用的是传统的面向过程方法。

对于使用mysqli的唯一问题是查询结果的提取必须手动完成,并且您需要照顾堆叠投影查询结果。

以下是mysqli选择的示例:

$mysqli = new mysqli('localhost', 'username', 'password', 'testdb');
$res = $mysqli->query("SELECT * FROM users WHERE email = '". $_POST['email'] ."' AND password = '". $_POST['password'] ."'");
$user = $res->fetch_object();

总结

mysql_*函数已经失去了应有的地位,使用它们的代码在安全性和性能上面临很多问题。PDO和mysqli是更好的替代方案,它们提供了更多的性能和安全保护。尽管可能需要一些升级以将现有的代码设法适应PDO或mysqli,但是这应该是现代化必须面对的问题之一。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程