[后端代码审计] PHP 与 MySQL交互

文章目录

    • 前言
    • [1. 环境准备](#1. 环境准备)
    • [2. 连接 MySQL 数据库](#2. 连接 MySQL 数据库)
      • [2.1 使用 MySQLi 扩展](#2.1 使用 MySQLi 扩展)
        • [2.1.1 面向过程的方式](#2.1.1 面向过程的方式)
        • [2.1.2 面向对象的方式](#2.1.2 面向对象的方式)
    • [3. 执行 SQL 查询](#3. 执行 SQL 查询)
      • [3.1 查询数据](#3.1 查询数据)
        • [3.1.1 结果集对象操作](#3.1.1 结果集对象操作)
      • [3.2 插入数据](#3.2 插入数据)
      • [3.3 更新数据](#3.3 更新数据)
      • [3.4 删除数据](#3.4 删除数据)
    • [4. 关闭连接](#4. 关闭连接)
    • [5. 使用 PDO 扩展](#5. 使用 PDO 扩展)
      • [5.1 创建 PDO 连接](#5.1 创建 PDO 连接)
      • [5.2 执行 SQL 查询](#5.2 执行 SQL 查询)
      • [5.3 使用预处理语句](#5.3 使用预处理语句)
    • [6. 错误处理](#6. 错误处理)
      • [6.1 使用 MySQLi 错误处理](#6.1 使用 MySQLi 错误处理)
      • [6.2 使用 PDO 错误处理](#6.2 使用 PDO 错误处理)

前言

​ PHP(Hypertext Preprocessor)是一种开源的脚本语言,主要用于Web开发,特别是服务器端编程。是学习网络安全需要掌握的一门语言。

函数速查:

函数 说明
mysqli_connect( ) 与MySQL数据库建立连接
mysqli_close( ) 关闭与MySQL数据库的连接
mysqli_connect_errno( ) 返回与MySQL数据库建立连接错误时的错误编号
mysqli_connect_error( ) 返回与MySQL数据库建立连接错误时的错误信息
mysqli_query( ) 执行SQL语句
mysqli_errno( ) 返回执行SQL语句错误时的错误编号
mysqli_error( ) 返回执行SQL语句错误时的错误信息
mysqli_fetch_assoc( ) 从结果集对象中取数据,按条取数据

1. 环境准备

在开始之前,请确保你已经安装了 PHP 和 MySQL,并且已启动了相关服务。

如果没有安装部署,可以查看文章 [Linux安全运维] LAMP 环境搭建保姆级教学(Apache + MySQL + PHP)

PHP与MySQL交互的过程可以分为4步:

  • 建立与MySQL连接
  • 执行SQL语句,返回结果集对象
  • 从结果集对象中获取数据
  • 关闭与MySQL连接

2. 连接 MySQL 数据库

2.1 使用 MySQLi 扩展

MySQLi 是 PHP 提供的扩展之一,支持面向过程和面向对象的方式连接 MySQL 数据库。

2.1.1 面向过程的方式

示例:

php 复制代码
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "testdb";

// 创建连接
$conn = mysqli_connect($servername, $username, $password, $dbname);

// 检查连接
if (!$conn) {
    die("连接失败: " . mysqli_connect_error());
}
echo "连接成功";

解释: 使用 mysqli_connect 函数连接数据库,若连接失败则输出错误信息。

2.1.2 面向对象的方式

示例:

php 复制代码
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "testdb";

// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);

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

解释: 使用 new mysqli 创建一个数据库连接对象,检查连接是否成功。

3. 执行 SQL 查询

3.1 查询数据

示例:

php 复制代码
$sql = "SELECT id, name, email FROM users";
$result = mysqli_query($conn, $sql);

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

解释: 使用 mysqli_query 执行 SELECT 查询,mysqli_fetch_assoc 逐行获取结果数据。

3.1.1 结果集对象操作

mysqli_fetch_assoc是结果集对象操作函数,下面是对结果集对象操作函数的说明:

函数速查:

函数 说明
mysqli_fetch_row( ) 以索引数组的方式获取一条记录的数据
mysqli_fetch_assoc( ) 以关联数组的方式获取一条记录的数据
mysqli_fetch_array( ) 以索引数组或关联数组的方式获取一条记录的数据
mysqli_fetch_all( ) 以索引数组或关联数组的方式获取全部记录的数据
mysqli_fetch_rows( ) 获取结果集对象中数据条数
mysqli_fetch_result( ) 释放一个结果集相关的内存
php 复制代码
//获取结果集对象中数据条数
var_dump(mysqli_fetch_rows($results));
//以关联数组的方式获取记录的数据
while($result = mysqli_fetch_assoc($results)){
    var_dump($result);
}
//使用表格的形式
while($result = mysqli_fetch_assoc($results)){
    echo "<tr>";
    echo "<td>"{$result['user_id']}"</td>"
        "<td>"{$result['user_name']}"</td>"
        "<td>"{$result['last_name']}"</td>"
        "<td>"{$result['user']}"</td>"
        "<td>"{$result['password']}"</td>";
    echo "</tr>";
}

3.2 插入数据

示例:

php 复制代码
$sql = "INSERT INTO users (name, email) VALUES ('张三', 'zhangsan@example.com')";

if (mysqli_query($conn, $sql)) {
    echo "新记录插入成功";
} else {
    echo "错误: " . $sql . "<br>" . mysqli_error($conn);
}

解释: 使用 mysqli_query 执行 INSERT 语句,将数据插入数据库表。

3.3 更新数据

示例:

php 复制代码
$sql = "UPDATE users SET email='newemail@example.com' WHERE id=1";

if (mysqli_query($conn, $sql)) {
    echo "记录更新成功";
} else {
    echo "错误: " . $sql . "<br>" . mysqli_error($conn);
}

解释: 使用 mysqli_query 执行 UPDATE 语句,更新数据库表中的数据。

3.4 删除数据

示例:

php 复制代码
$sql = "DELETE FROM users WHERE id=1";

if (mysqli_query($conn, $sql)) {
    echo "记录删除成功";
} else {
    echo "错误: " . $sql . "<br>" . mysqli_error($conn);
}

解释: 使用 mysqli_query 执行 DELETE 语句,删除指定的记录。

4. 关闭连接

示例:

php 复制代码
mysqli_close($conn);

解释: 使用 mysqli_close 关闭数据库连接。

5. 使用 PDO 扩展

PDO(PHP Data Objects)是另一种连接数据库的方式,支持多种数据库类型,提供了更强大的功能和更好的安全性。

5.1 创建 PDO 连接

示例:

php 复制代码
$dsn = "mysql:host=localhost;dbname=testdb";
$username = "root";
$password = "";

try {
    $pdo = new PDO($dsn, $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "连接成功";
} catch (PDOException $e) {
    echo "连接失败: " . $e->getMessage();
}

解释: 使用 new PDO 创建连接对象,设置错误模式为异常。

5.2 执行 SQL 查询

示例:

php 复制代码
$sql = "SELECT id, name, email FROM users";
$stmt = $pdo->query($sql);

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    echo "ID: " . $row["id"] . " - Name: " . $row["name"] . " - Email: " . $row["email"] . "<br>";
}

解释: 使用 PDO 的 query 方法执行 SELECT 查询,fetch 方法逐行获取数据。

5.3 使用预处理语句

示例:

php 复制代码
$sql = "INSERT INTO users (name, email) VALUES (:name, :email)";
$stmt = $pdo->prepare($sql);

$stmt->bindParam(':name', $name);
$stmt->bindParam(':email', $email);

$name = '李四';
$email = 'lisi@example.com';
$stmt->execute();

解释: 使用 PDO 预处理语句提高安全性,防止 SQL 注入。

6. 错误处理

在进行数据库操作时,处理错误是非常重要的。使用 PDO 的异常处理机制或 MySQLi 的错误信息来处理和调试错误。

6.1 使用 MySQLi 错误处理

示例:

php 复制代码
if (!$result) {
    echo "错误: " . mysqli_error($conn);
}

6.2 使用 PDO 错误处理

示例:

php 复制代码
try {
    // 数据库操作
} catch (PDOException $e) {
    echo "错误: " . $e->getMessage();
}
相关推荐
伏虎山真人3 分钟前
开源数据库 - mysql - mysql-server-8.4(gtid主主同步+ keepalived热切换)部署方案
数据库·mysql·开源
皮皮陶2 小时前
Unity WebGL交互通信
unity·交互·webgl
内核程序员kevin4 小时前
在Linux环境下使用Docker打包和发布.NET程序并配合MySQL部署
linux·mysql·docker·.net
CodingBrother4 小时前
MySQL 中的 `IN`、`EXISTS` 区别与性能分析
数据库·mysql
kayotin4 小时前
Wordpress博客配置2024
linux·mysql·docker
hbh112233abc4 小时前
实现 think/queue 日志分离
php·thinkphp·queue
甄臻9245 小时前
Windows下mysql数据库备份策略
数据库·mysql
杀神lwz5 小时前
Java 正则表达式
java·mysql·正则表达式
山南2375 小时前
MySql-8.0.40安装详细教程
mysql
黑客K-ing6 小时前
网络安全名词解释
开发语言·网络·安全·网络安全·php