PHP连接MySQL对比:原生函数已废弃,PDO是推荐方案

洛溪
洛溪
发布时间:2026-10-14| 2人浏览过
原创

在PHP开发中,连接MySQL数据库主要有两种路径:早期遗留的原生`mysql_`系列函数以及现代的PDO扩展。本文将通过实际操作演示这两种方式的代码差异与安全特性,帮助开发者做出正确选择。

环境准备与数据初始化

在编写PHP代码之前,需要准备一个包含基础测试数据的MySQL数据库。请确保你的开发环境中已安装MySQL并在终端或管理工具中执行以下SQL脚本:

  1. 创建数据库:创建名为 test 的数据库。
  2. 创建表结构:建立 user 表,包含姓名(varchar(50))和年龄(int)两个字段。
  3. 插入测试数据:模拟真实场景写入三条用户记录。
/*创建数据库*/
CREATE DATABASE IF NOT EXISTS `test`;
/*选择数据库*/
USE `test`;
/*创建表*/
CREATE TABLE IF NOT EXISTS `user` (
  name varchar(50),
  age int
);
/*插入测试数据*/
INSERT INTO `user` (name, age) VALUES('harry', 20), ('tony', 23), ('harry', 24);

方法一:原生 MySQL 扩展连接(不推荐)

这是PHP早期的标准数据库连接方式。通过直接传递用户名和密码建立连接,并利用字符串拼接的方式构建SQL查询语句。

<?php
$host = 'localhost';
$database = 'test';
$username = 'root';
$password = 'root';
$selectName = 'harry';//要查找的用户名
$connection = mysql_connect($host, $username, $password);//连接到数据库
mysql_query("set names 'utf8'");//设置字符集
if (!$connection) {
  die("could not connect to the database.\n" . mysql_error());//诊断连接错误
}
$selectedDb = mysql_select_db($database);//选择数据库
if (!$selectedDb) {
  die("could not select the database\n" . mysql_error());
}
$selectName = mysql_real_escape_string($selectName);//防止SQL注入
$query = "select * from user where name = '$selectName'";//构建查询语句
$result = mysql_query($query);//执行查询
if (!$result) {
  die("Query failed\n" . mysql_error());
}
while ($row = mysql_fetch_row($result)) {
  $name = $row[0];
  $age = $row[1];
  echo "Name: $name ";
  echo "Age: $age \n";
}

结果输出:

Name: harry Age: 20
Name: tony Age: 23

这种方式虽然直观,但代码风格较为陈旧,且由于需要手动转义,在处理复杂逻辑时容易出错。

方法二:PDO 预处理连接(推荐)

PDO(PHP Data Objects)是一个为PHP提供轻量级接口的扩展。它通过预处理语句(Prepared Statements)和命名参数来处理查询,极大降低了SQL注入的风险,并且能更好地兼容多种数据库。

第1步:创建PDO对象并配置环境

目的:建立安全的底层连接通道。
动作:实例化 PDO 类,传入DSN及认证信息,并设置字符集以防止乱码。

<?php
$dsn = "mysql:host=$host;dbname=$database;charset=utf8";
$username = 'root';
$password = 'root';
//创建一个pdo对象
$pdo = new PDO($dsn, $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//启用异常模式

第2步:构建与执行预处理查询

目的:安全地获取指定用户的查询结果。
动作:使用占位符 ? 代替实际输入值,并通过 execute() 绑定参数,彻底杜绝拼接导致的注入风险。

$sql = "select * from user where name = ?";
$stmt = $pdo->prepare($sql);
$rs = $stmt->execute(array($selectName));
if ($rs) {
  // PDO::FETCH_ASSOC 关联数组形式
  while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $name = $row['name'];
    $age = $row['age'];
    echo "Name: $name ";
    echo "Age: $age \n";
  }
}
$pdo = null;//关闭连接

最终输出的内容与方法一相同,但内部机制更加稳健。

总结

PHP内置的 mysql_* 扩展组已被彻底移除,不应再用于新项目。相比之下,使用 PDO 不仅语法更简洁,还能通过预处理机制保障数据安全。以上就是PHP连接MySQL不同方式的详细内容,更多关于PHP数据库教程的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。