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

server/2024/9/24 23:24:52/

文章目录

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

http://www.ppmy.cn/server/99709.html

相关文章

2024华为OD机试真题- 求字符串中所有整数的最小和-(C++/Python)-C卷D卷-100分

2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++) 目录 题目描述 说明 输入描述: 输出描述: 示例1 示例2 示例3 示例4 解题思路 考点 代码 c++ python 题目描述 输入字符串s,输出s中包含所有整数的最小和 说明 字符串s,只包含 a-z A-Z ; 合法的整数包…

使用 MongoDB 构建 AI:Flagler Health 的 AI 旅程如何彻底改变患者护理

Flagler Health 致力于为慢性病患者提供支持&#xff0c;为其匹配合适的医生以提供合适的护理。 通常&#xff0c;身患严重病痛的患者面临的选择有限&#xff0c;他们往往需要长期服用阿片类药物&#xff0c;或寻求成本高昂的侵入性外科手术干预。遗憾的是&#xff0c;后一种方…

理解栈(Stack)及其在 C++ 中的应用【栈、数据结构】

在这篇博客中&#xff0c;我们将详细介绍栈&#xff08;Stack&#xff09;这一重要的数据结构&#xff0c;包括其基本概念、常用操作、C 中的实现&#xff0c;以及一些实际应用。 什么是栈&#xff1f; 栈是一种数据结构&#xff0c;它遵循“后进先出”&#xff08;LIFO - La…

Perl套接字编程指南:构建网络通信应用

摘要 Perl是一种功能强大的脚本语言&#xff0c;广泛应用于系统管理、网络编程等多种场景。Perl的套接字编程能力允许开发者创建客户端和服务器端的网络应用。本文将详细介绍Perl中套接字的使用&#xff0c;包括基础概念、API的使用&#xff0c;以及构建简单客户端和服务器的示…

SpringCloud-gateway编码实现路由策略的自动刷新,动态路由

文章目录 一、概述1、背景2、实现思路 二、编码实现1、nacos配置刷新公共类2、自定义RouteDefinition3、route缓存类4、动态更新路由网关service5、动态路由加载类 三、测试 一、概述 1、背景 gateway可以配置路由断言过滤器&#xff0c;但是通常一个微服务体系下&#xff0c…

电脑管家软件搬运导致edge、chrome浏览器不可用

最新版本的腾讯电脑管家可以直接搬运软件到其他路径&#xff0c;但是搬运浏览器会造成软件问题&#xff0c;不建议搬运。 浏览器恢复到原路径&#xff0c;可以解决浏览器不可用的问题&#xff1a; 首先到达你的搬运路径下 可以看到软件文件夹&#xff0c;比如Microsoft Edge或…

vue 打包时候的分包

export default defineConfig({plugins: [vue()],resolve: {alias: {: fileURLToPath(new URL(./src/, import.meta.url))}},// 分包&#xff0c;node_modules中的单独打包成名字为vendor的js文件build: {rollupOptions: {manualChunks(id) {if (id.includes(node_modules)) {r…

AWS中的 CloudFormation

AWS中的 CloudFormation 1. CloudFormation 是什么&#xff1f; AWS CloudFormation 是亚马逊科技&#xff08;AWS&#xff09;提供的一项服务&#xff0c;允许用户通过模板来描述和配置&#xff0c;从而实现基础设施即代码&#xff08;Infrastructure as Code&#xff0c;la…