$conn = new mysqli($host, $user, $password)
; ,2. 创建/选择数据库:$conn->query("CREATE DATABASE dbname")
; ,3. 读取SQL文件并执行:$sql = file_get_contents('file.sql'); $conn->multi_query($sql)
; ,4. 处理结果并关闭连接,需确保SQL文件语法正确且文件路径PHP调用数据库文件的核心在于通过扩展库建立与数据库的连接,并执行相应的SQL操作,以下是详细的实现步骤及注意事项:
环境准备与扩展配置
-
启用PHP数据库扩展
根据使用的数据库类型,需在php.ini
中启用对应扩展:- MySQL(推荐MySQLi或PDO):取消注释
extension=mysqli extension=pdo_mysql
- SQLite(轻量级数据库):取消注释
extension=pdo_sqlite
如需支持其他数据库(如PostgreSQL、Oracle),需相应启用
pdo_pgsql
或oci8
等扩展。
- MySQL(推荐MySQLi或PDO):取消注释
-
数据库文件路径配置
若使用SQLite或本地数据库文件,需明确文件存储路径:- 绝对路径:直接指定完整路径,如
/var/www/data/database.sqlite
。 - 相对路径:基于脚本位置,如
./app/data/database.sqlite
。
- 绝对路径:直接指定完整路径,如
PHP连接数据库的常用方法
(一)MySQL数据库连接
-
使用MySQLi扩展
// 连接参数:主机、用户名、密码、数据库名 $conn = mysqli_connect("localhost", "root", "password", "testdb"); if (!$conn) { die("连接失败: " . mysqli_connect_error()); } // 设置字符集(可选) mysqli_set_charset($conn, "utf8mb4");
关键参数说明:
| 参数 | 说明 |
|————–|——————————|
|localhost
| 数据库服务器地址(可为IP或域名) |
|root
| 数据库用户名 |
|password
| 用户密码 |
|testdb
| 目标数据库名 | -
使用PDO扩展(推荐)
try { $dsn = "mysql:host=localhost;dbname=testdb"; // DSN(数据源名称) $username = "root"; $password = "password"; $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // 异常模式 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // 关联数组返回 PDO::ATTR_CHARSET => "utf8mb4" // 字符集 ]; $conn = new PDO($dsn, $username, $password, $options); } catch (PDOException $e) { die("连接失败: " . $e->getMessage()); }
DSN格式说明:
mysql:host=服务器地址;port=端口号;dbname=数据库名
(二)SQLite数据库连接
SQLite以文件形式存储数据库,适合小型项目:
// 使用PDO连接SQLite try { $dsn = "sqlite:./data/database.sqlite"; // 数据库文件路径 $conn = new PDO($dsn); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die("连接失败: " . $e->getMessage()); }
执行SQL操作与数据处理
(一)基础CRUD操作
-
查询数据(SELECT)
// MySQLi示例 $result = mysqli_query($conn, "SELECT FROM users WHERE id = 1"); $row = mysqli_fetch_assoc($result); // 获取单条记录 // PDO示例(通用) $stmt = $conn->prepare("SELECT FROM users WHERE id = ?"); $stmt->execute([1]); $row = $stmt->fetch();
-
插入数据(INSERT)
// 使用预处理语句(防止SQL注入) $stmt = $conn->prepare("INSERT INTO users (name, email) VALUES (?, ?)"); $stmt->execute(["John Doe", "john@example.com"]);
-
更新与删除(UPDATE/DELETE)
// 更新数据 $stmt = $conn->prepare("UPDATE users SET email = ? WHERE id = ?"); $stmt->execute(["newemail@example.com", 1]); // 删除数据 $stmt = $conn->prepare("DELETE FROM users WHERE id = ?"); $stmt->execute([1]);
(二)处理结果集
方法 | 说明 |
---|---|
fetch() |
逐条获取数据(前向模式) |
fetchAll() |
获取全部数据(数组形式) |
fetch_assoc() |
MySQLi专属,关联数组返回单条数据 |
fetch_object() |
MySQLi专属,对象形式返回单条数据 |
错误处理与调试
-
PDO错误处理
try { // 执行危险操作 } catch (PDOException $e) { // 记录错误日志 error_log("数据库错误: " . $e->getMessage()); echo "操作失败,请稍后重试。"; }
-
MySQLi错误处理
if (!mysqli_query($conn, $sql)) { error_log("MySQL错误: " . mysqli_error($conn)); echo "操作失败,错误码: " . mysqli_errno($conn)); }
关闭连接与资源释放
-
关闭MySQLi连接
mysqli_close($conn);
-
PDO自动释放资源
PDO在变量超出作用域时会自动关闭连接,无需显式关闭。
常见问题与解决方案
(一)如何选择MySQLi vs PDO?
特性 | MySQLi | PDO |
---|---|---|
支持数据库类型 | 仅MySQL | 多数据库(MySQL、SQLite等) |
预处理语句 | 支持 | 支持 |
错误处理模式 | 函数回调 | 面向对象异常 |
推荐场景 | 单一MySQL项目 | 多数据库兼容或复杂项目 |
(二)数据库文件路径问题
- SQLite文件路径错误:确保路径存在且有读写权限。
- 相对路径问题:使用
__DIR__
魔法常量定义相对路径,如__DIR__ . "/data/db.sqlite"
。
【FAQs】
Q1:为什么推荐使用PDO而不是MySQLi?
A1:PDO支持多种数据库,具备统一的接口,且支持命名参数和高级错误处理,更适合复杂项目,切换数据库时只需修改DSN,无需重构代码。
Q2:如何迁移旧版mysql_
函数到现代扩展?
A2:
- 替换
mysql_connect()
为mysqli_connect()
或PDO。 - 用
mysqli_query()
或PDO::prepare()
替代mysql_query()
。 - 调整结果处理函数(如
mysql_fetch_assoc()
→fetch()
)。
通过以上步骤,PHP可高效调用数据库文件,并根据需求选择合适扩展,建议优先使用PDO,以获得更好的兼容性和安全性
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/68153.html