php 如何通过mysqli操作数据库?

在PHP中,mysqli(MySQL Improved Extension)是操作MySQL数据库的扩展库,提供了面向对象和过程式两种风格。以下是mysqli的基本操作方法:

1. 连接数据库

面向对象风格
php 复制代码
$mysqli = new mysqli('localhost', 'username', 'password', 'database_name');

// 检查连接是否成功
if ($mysqli->connect_error) {
    die("连接失败: " . $mysqli->connect_error);
}

echo "连接成功";
过程式风格
php 复制代码
$conn = mysqli_connect('localhost', 'username', 'password', 'database_name');

if (!$conn) {
    die("连接失败: " . mysqli_connect_error());
}

echo "连接成功";

2. 执行查询(SELECT)

php 复制代码
// 准备SQL语句
$sql = "SELECT id, name, email FROM users";
$result = $mysqli->query($sql);

// 检查查询结果
if ($result->num_rows > 0) {
    // 输出数据
    while ($row = $result->fetch_assoc()) {
        echo "ID: " . $row["id"] . " - Name: " . $row["name"] . " - Email: " . $row["email"] . "<br>";
    }
} else {
    echo "0 结果";
}

// 释放结果集
$result->free();

3. 预处理语句(防止SQL注入)

php 复制代码
// 准备SQL语句
$sql = "SELECT id, name, email FROM users WHERE age > ?";
$stmt = $mysqli->prepare($sql);

// 绑定参数
$age = 18;
$stmt->bind_param("i", $age); // "i" 表示整数类型

// 执行查询
$stmt->execute();

// 获取结果
$result = $stmt->get_result();

// 处理结果
while ($row = $result->fetch_assoc()) {
    echo "ID: " . $row["id"] . " - Name: " . $row["name"] . "<br>";
}

// 关闭预处理语句
$stmt->close();

4. 插入数据

php 复制代码
// 准备SQL语句
$sql = "INSERT INTO users (name, email, age) VALUES (?, ?, ?)";
$stmt = $mysqli->prepare($sql);

// 绑定参数
$name = "John Doe";
$email = "john@example.com";
$age = 30;
$stmt->bind_param("ssi", $name, $email, $age); // "ssi" 表示两个字符串和一个整数

// 执行插入
if ($stmt->execute()) {
    echo "新记录插入成功,ID: " . $stmt->insert_id;
} else {
    echo "Error: " . $stmt->error;
}

// 关闭预处理语句
$stmt->close();

5. 更新数据

php 复制代码
// 准备SQL语句
$sql = "UPDATE users SET age = ? WHERE id = ?";
$stmt = $mysqli->prepare($sql);

// 绑定参数
$newAge = 31;
$id = 1;
$stmt->bind_param("ii", $newAge, $id);

// 执行更新
if ($stmt->execute()) {
    echo "记录更新成功,受影响的行数: " . $stmt->affected_rows;
} else {
    echo "Error: " . $stmt->error;
}

// 关闭预处理语句
$stmt->close();

6. 删除数据

php 复制代码
// 准备SQL语句
$sql = "DELETE FROM users WHERE id = ?";
$stmt = $mysqli->prepare($sql);

// 绑定参数
$id = 1;
$stmt->bind_param("i", $id);

// 执行删除
if ($stmt->execute()) {
    echo "记录删除成功,受影响的行数: " . $stmt->affected_rows;
} else {
    echo "Error: " . $stmt->error;
}

// 关闭预处理语句
$stmt->close();

7. 事务处理

php 复制代码
// 开始事务
$mysqli->begin_transaction();

try {
    // 执行多个SQL操作
    $mysqli->query("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
    $mysqli->query("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
    
    // 提交事务
    $mysqli->commit();
    echo "事务执行成功";
} catch (Exception $e) {
    // 回滚事务
    $mysqli->rollback();
    echo "事务失败: " . $e->getMessage();
}

8. 关闭连接

php 复制代码
$mysqli->close();

mysqli与PDO的对比

特性 mysqli PDO
数据库支持 仅MySQL 支持多种数据库(MySQL、PostgreSQL等)
面向对象 支持(也支持过程式) 仅面向对象
预处理语句 支持 支持
错误处理 支持异常模式 支持异常模式
事务处理 支持 支持
跨数据库兼容性

总结

  • mysqli是专门为MySQL设计的扩展,性能略高。
  • 预处理语句是防止SQL注入的关键,强烈推荐使用。
  • 事务处理可确保数据的一致性。
  • 对于跨数据库项目,建议使用PDO。

以上示例展示了mysqli的基本用法,实际开发中建议结合异常处理和预处理语句,提高代码的安全性和可维护性。

相关推荐
GIS之路2 小时前
GeoTools 基础概念解析
数据库·设计模式·oracle
NetX行者5 小时前
.NET 9 GUID v7 vs v4:时间有序性如何颠覆数据库索引性能
数据库·mysql·abp vnext
sunon_5 小时前
实现druid数据源密码加密
数据库
sevevty-seven6 小时前
Redis中的红锁
数据库·redis·php
CYRUS_STUDIO8 小时前
深入 Android syscall 实现:内联汇编系统调用 + NDK 汇编构建
android·操作系统·汇编语言
GoodStudyAndDayDayUp8 小时前
dbever 导出数据库表的建表语句和数据插入语句
数据库
没有口袋啦9 小时前
《Reids》配置文件
数据库·redis
诺亚凹凸曼9 小时前
浅谈mysql的undolog
数据库·mysql
m0_694845579 小时前
云服务器如何管理数据库(MySQL/MongoDB)?
服务器·数据库·mysql
死也不注释9 小时前
【第一章编辑器开发基础第一节绘制编辑器元素_6滑动条控件(6/7)】
android·编辑器