在PHP的迭代中逐渐更新了多种连接MYSQL的方法,PHP连接MYSQL提供了三种比较常用的连接方式下面我们将详细介绍每种方法并提供完整示例。
一、三种主流的连接方式
方式 | 特点 | PHP版本要求 | 推荐指数 |
---|---|---|---|
MySQLi 面向过程 | 简单直接 | PHP 5.0+ | ★★★ |
MySQLi 面向对象 | 现代OOP风格 | PHP 5.0+ | ★★★★ |
PDO | 支持多种数据库,防SQL注入 | PHP 5.1+ | ★★★★★ |
通过上面表格我们清楚认识到,PDO的连接模式不仅高效而且更加安全,是我们推荐的一种方式,下面我们来看看各种连接案例的使用。
1、MySQLi 面向过程连接方法实例,这种模式比较传统是以往常用的一种方式。
<?php
$link = mysqli_connect("localhost", "root", "123456", "mydb");
if (!$link) {
die("连接错误: " . mysqli_connect_error());
}
$result = mysqli_query($link, "SELECT * FROM users");
while ($row = mysqli_fetch_assoc($result)) {
echo $row['username'] . "<br>";
}
mysqli_close($link);
?>
1、MySQLi 面向对象连接方法实例,这是现在比较常用的一种基础语法。
<?php
$servername = "localhost";
$username = "root";
$password = "123456";
$dbname = "mydb";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检测连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
echo "连接成功";
// 执行查询
$sql = "SELECT id, name FROM users";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "ID: " . $row["id"]. " - Name: " . $row["name"]. "<br>";
}
} else {
echo "0 结果";
}
// 关闭连接
$conn->close();
?>
3、PDO连接MySQL的方法实例,这是一种目前安全而且最推荐的一种方法。
<?php
$host = 'localhost';
$db = 'mydb';
$user = 'root';
$pass = '123456';
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$pdo = new PDO($dsn, $user, $pass, $options);
// 预处理SQL防止注入
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->execute(['id' => 1]);
while ($row = $stmt->fetch()) {
echo $row['name'] . "<br>";
}
} catch (PDOException $e) {
die("数据库连接失败: " . $e->getMessage());
}
?>
以上就是我们的实际案例,下面我们针对遇到的问题进行说明:
PDO连接错误处理,将 PDO 的错误模式设置为“异常模式”。当数据库操作发生错误时,PDO 会抛出 PDOException 异常,而不是静默失败或返回错误代码。
// PDO错误模式设置(必须)
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
预处理语句,防止SQL注入。这段代码是使用 MySQLi(MySQL Improved Extension) 的预处理语句(Prepared Statement)来安全地插入数据到数据库。这段代码是MySQLi中安全操作数据库的标准做法,通过预处理语句和参数绑定,兼顾了安全性和性能。这是现代PHP开发中必须掌握的技能!
// MySQLi预处理
$stmt = $conn->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email);
$stmt->execute();
// PDO预处理
$stmt = $pdo->prepare("UPDATE users SET name = ? WHERE id = ?");
$stmt->execute([$name, $id]);
针对PDO连接数据库我们建议做好前期的配置设置。
// 禁用预处理语句模拟
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
// 设置字符集
$conn->set_charset("utf8mb4");
下面我们提供一个完整的PHP操作MYSQL的封装实例用于大家学习。
class DB {
private static $instance = null;
private $pdo;
private function __construct() {
$dsn = 'mysql:host=localhost;dbname=mydb;charset=utf8mb4';
try {
$this->pdo = new PDO($dsn, 'root', '123456', [
PDO::ATTR_PERSISTENT => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
} catch (PDOException $e) {
die($e->getMessage());
}
}
public static function getInstance() {
if (!self::$instance) {
self::$instance = new DB();
}
return self::$instance;
}
public function getConnection() {
return $this->pdo;
}
}
// 使用示例
$db = DB::getInstance()->getConnection();
$stmt = $db->query("SELECT * FROM users LIMIT 5");
这段代码实现了一个PDO连接数据库的单例封装,具有多项设计优势和实用好处。1、确保整个应用生命周期内只有一个数据库连接实例,避免重复创建连接,节省资源,防止因多个连接导致的性能问题,并且统一管理连接状态。安全提升,性能优化,可维护性强。
Copyright © 2009-2025 viuoo.com