在Web后端开发中,PHP与数据库的交互是核心环节------无论是用户登录、数据存储还是信息查询,都需要通过PHP脚本操作数据库完成。本文将详细讲解PHP与MySQL数据库的交互步骤,重点剖析常见的SQL注入漏洞风险及防范方法,同时介绍MySQL系统数据库的核心作用,助力新手快速掌握后端数据交互技巧。
一、PHP与MySQL数据库交互完整步骤
PHP与MySQL交互主要分为4个核心步骤:建立连接、接收输入、执行SQL、处理结果,每一步都有明确的实操代码,新手可直接复制修改使用,下面代码以$_POST为例。
1. 建立数据库连接
使用mysqli_connect()函数建立PHP与MySQL的连接,需配置数据库地址、账号、密码和目标数据库名,同时添加连接测试,避免连接失败导致后续操作异常。
php
<?php
// 定义数据库连接参数
$db_host = '127.0.0.1'; // 本地数据库地址(Windows可替换为localhost)
$db_user = 'root'; // 数据库默认账号(通常为root)
$db_pass = 'root'; // 替换为自己的数据库密码
$db_name = 'school'; // 要连接的目标数据库名
// 建立数据库连接
$conn = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
// 测试连接是否成功,失败则终止脚本并提示错误
if (!$conn) {
die("数据库连接失败: " . mysqli_connect_error());
}
?>
2. 接收用户输入
通过PHP超全局变量$_POST或$_GET,接收用户在网页表单中输入的信息(如账号、密码),并存储到对应变量中。
php
<?php
// 接收用户通过POST方法提交的账号数据
$name = $_POST['name'];
// 接收用户通过POST方法提交的密码数据
$pwd = $_POST['password'];
?>
3. 执行SQL语句
拼接SQL查询语句,使用mysqli_query()函数将SQL指令发送给数据库,获取执行结果。以用户登录查询为例,核心是根据用户输入的账号和密码,查询数据库中是否存在对应记录。
php
<?php
// 拼接SQL查询语句(注意替换"对应数据库名"为实际数据表名,如users)
$sql = "SELECT * FROM 对应数据库名 WHERE name='$name' AND password='$pwd'";
// 执行SQL语句,并将结果赋值给$result变量
$result = mysqli_query($conn, $sql);
?>
4. 处理查询结果
根据SQL执行结果,向用户反馈操作结果(如登录成功/失败),操作完成后需关闭数据库连接,释放资源。
php
<?php
// 判断查询结果中是否存在数据(大于0即为存在)
if (mysqli_num_rows($result) > 0) {
// 取出查询到的用户信息(关联数组形式)
$user_info = mysqli_fetch_assoc($result);
// 输出登录成功提示
echo "登录成功!欢迎你:" . $user_info['name'];
} else {
// 无匹配数据,输出登录失败提示
echo "登录失败:用户名或密码错误";
}
// 关闭数据库连接,避免资源浪费
mysqli_close($conn);
?>
二、核心风险:SQL注入漏洞(重点防范)
上述基础交互代码存在一个致命安全漏洞------SQL注入。由于代码直接将用户输入的$name和$pwd拼接到SQL语句中,未做任何过滤处理,攻击者可通过输入恶意SQL指令,篡改查询逻辑,实现非法登录、窃取数据等攻击。
1. SQL注入攻击原理(以登录为例)
攻击者在账号输入框中输入恶意指令:1' or 1=1 #,拼接后的SQL语句会发生篡改,原本的查询逻辑被破坏。
sql
-- 正常查询语句(安全)
SELECT * FROM users WHERE name='$name' AND password='$pwd';
-- 恶意注入示例(通过注释绕过验证)
SELECT * FROM users WHERE name='' or 1=1#' AND password='$pwd';
攻击逻辑解析:
-
'与SQL语句中原本的'闭合,使name字段的条件变为空字符串。 -
or 1=1表示"或"逻辑,1=1是恒真条件,因此整个WHERE条件恒真。 -
#是SQL注释符,将后面的AND password='$pwd'注释掉,使密码验证失效。
最终结果:数据库会查询到所有用户记录,攻击者无需正确账号密码即可登录,若添加limit指令,还可窃取多个用户信息。
2. SQL注入防范方法
核心原则:对用户输入的内容进行严格过滤或转译,禁止直接拼接SQL语句。重点过滤或转译以下特殊字符/关键字:
limit、or、'、"、#、-- 等,可使用PHP内置函数mysqli_real_escape_string()对用户输入进行转译,避免恶意指令被执行。
三、MySQL系统数据库解析
MySQL内置了3个核心系统数据库,各自承担不同的功能,了解这些系统数据库,有助于更好地管理数据库和排查问题。
1. information_schema(核心系统库)
这是MySQL中最常用的系统数据库,专门存储整个MySQL的元数据信息,包括所有数据库的库名、数据表名、字段名、数据类型等。
核心表介绍:
-
SCHEMATA:存储所有数据库的名称。
-
TABLES:存储所有数据表的信息(所属数据库、表名等)。
-
COLUMNS:存储所有数据表的字段信息(字段名、数据类型、所属表等)。
提示:information_schema是SQL注入攻击中,攻击者窃取数据库结构的核心目标。
2. performance_schema
主要用于监控MySQL的运行性能、资源消耗情况及SQL语句执行统计,可帮助开发者排查数据库性能问题(如慢查询、资源占用过高)。
3. mysql
用于存储MySQL的核心配置信息,包括用户账户、用户权限、角色、密码(加密存储)、主机访问权限等,是MySQL权限管理的核心数据库,修改此数据库可能导致数据库无法正常使用,需谨慎操作。
四、实操总结
PHP与数据库交互的核心是"连接-接收-执行-处理"四步,新手可先掌握基础代码,再重点关注SQL注入漏洞------这是后端开发中最常见、最危险的安全漏洞之一。同时,了解MySQL系统数据库的作用,能帮助我们更好地管理数据库、排查问题。
建议新手在实操时,先完成基础交互流程,再添加SQL注入防范措施,多测试、多调试,逐步养成安全开发的习惯。