讲师中心 微信公众号
AI工具推荐 视频效率加速

PHP与MySQLi:安全高效地查询数据库并获取指定列数据

冬强酱_3520

冬强酱_3520

发布时间:2025-11-13 16:45:28

|

732人浏览过

|

来源于php中文网

原创

PHP与MySQLi:安全高效地查询数据库并获取指定列数据

本教程详细介绍了如何使用php的mysqli扩展安全地查询mysql数据库,根据指定列的搜索条件,检索并获取匹配行的特定列数据。文章重点强调了使用预处理语句(prepared statements)来有效防止sql注入攻击,并提供了完整的代码示例和最佳实践指导,确保数据库操作的安全性与高效性。

在Web开发中,从数据库中检索特定信息是常见的操作。例如,您可能需要根据用户输入的域名查找对应的账户密钥。本文将指导您如何使用PHP的MySQLi扩展,以安全且高效的方式实现这一目标。我们将以一个名为Account_info的数据库表为例,该表包含id、domain_name、account_name和account_key等列。我们的目标是根据domain_name搜索,并返回对应的account_key。

传统查询方法的潜在风险

许多开发者在初次尝试数据库查询时,可能会采用直接将变量拼接到SQL查询字符串中的方式。例如:

$domainSearch = "example.net";
$sql = mysqli_query($connect, "SELECT `account_name` FROM `Account_info` WHERE `domain_name`='$domainSearch'");

这种方法虽然在某些简单场景下看似有效,但它存在严重的安全漏洞——SQL注入。恶意用户可以通过在$domainSearch中插入特殊的SQL代码来修改甚至破坏您的数据库。因此,这种做法在生产环境中是绝对不推荐的。

推荐方法:使用预处理语句 (Prepared Statements)

为了避免SQL注入并提高数据库操作的安全性与效率,PHP的MySQLi扩展提供了预处理语句(Prepared Statements)。预处理语句的工作原理是将SQL查询的结构与数据分离,先将SQL模板发送到数据库进行预编译,然后再将数据绑定到这个模板上。

立即学习“PHP免费学习笔记(深入)”;

以下是使用预处理语句查询Account_info表并获取account_key的详细步骤:

1. 准备SQL语句

首先,定义一个带有占位符(?)的SQL查询字符串。这些占位符将用于后续绑定实际的参数。

$sql = "SELECT account_key FROM Account_info WHERE domain_name=?";

注意:这里我们直接选择了account_key列,因为这是我们最终需要的。如果需要获取所有列,可以使用SELECT *。

Word 文档生成与编辑
Word 文档生成与编辑

需要创建、读取、编辑或处理 Word 文档(.docx / .dotx)时使用。触发词:'Word'、'word 文档'、'.docx'、'生成报告'、'制作合同/简历/方案/说明书'、'提取 word 内容'、'在文档里查找替换'、'给文档加页眉页脚/目录/表格'。也用于把任意内容排版成一份正式的 Word 文件。不要用它处理 PDF、Excel 或无关编程任务。中文创作场景尤其适合:小说大纲稿、投稿文档、合同、简历、工作总结。

下载

2. 创建预处理语句对象

使用mysqli_prepare()或$connect->prepare()方法创建预处理语句对象。

$stmt = $connect->prepare($sql);
if (!$stmt) {
    die("预处理语句失败: " . $connect->error);
}

3. 绑定参数

使用bind_param()方法将变量绑定到SQL语句中的占位符。bind_param()的第一个参数是一个字符串,指定了每个绑定的变量的数据类型(例如,s代表字符串,i代表整数,d代表双精度浮点数,b代表BLOB)。随后的参数是要绑定的变量。

$domainSearch = "example.net"; // 搜索的域名
$stmt->bind_param("s", $domainSearch); // "s" 表示 $domainSearch 是一个字符串

4. 执行语句

执行预处理语句。

$stmt->execute();
if ($stmt->errno) {
    die("语句执行失败: " . $stmt->error);
}

5. 获取结果集

如果查询是SELECT语句,需要使用get_result()方法获取结果集。

$result = $stmt->get_result(); // 获取 mysqli_result 对象

6. 提取数据

从结果集中提取数据。对于只期望返回一行数据的情况,可以使用fetch_assoc()方法将结果作为关联数组获取。

$data = $result->fetch_assoc(); // 提取一行数据作为关联数组

7. 访问所需数据

现在可以通过数组键访问所需的account_key,并将其赋值给一个变量。

$accountKey = null; // 初始化变量
if ($data) {
    $accountKey = $data["account_key"];
    echo "查询结果: " . $accountKey; // 例如:输出 889977
} else {
    echo "未找到匹配的域名。";
}

完整示例代码

将上述步骤整合到一个完整的PHP脚本中,假设您已经建立了数据库连接($connect变量)。

<?php
// 假设 $connect 已经是一个有效的 mysqli 数据库连接对象
// 例如:
// $servername = "localhost";
// $username = "your_username";
// $password = "your_password";
// $dbname = "Account_info";
// $connect = new mysqli($servername, $username, $password, $dbname);
// if ($connect->connect_error) {
//     die("连接失败: " . $connect->connect_error);
// }

$domainSearch = "example.net"; // 待搜索的域名

// 1. 准备SQL语句,使用占位符
$sql = "SELECT account_key FROM Account_info WHERE domain_name=?";

// 2. 创建预处理语句对象
$stmt = $connect->prepare($sql);
if (!$stmt) {
    die("预处理语句失败: " . $connect->error);
}

// 3. 绑定参数
// "s" 表示 $domainSearch 是一个字符串类型
$stmt->bind_param("s", $domainSearch);

// 4. 执行语句
$stmt->execute();
if ($stmt->errno) {
    die("语句执行失败: " . $stmt->error);
}

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

// 6. 提取数据
// fetch_assoc() 返回一行作为关联数组,如果没有更多行则返回 null
$data = $result->fetch_assoc();

// 7. 访问所需数据并赋值给变量
$accountKey = null; // 初始化变量
if ($data) {
    $accountKey = $data["account_key"];
    echo "域名 '" . $domainSearch . "' 对应的账户密钥是: " . $accountKey;
} else {
    echo "未找到域名 '" . $domainSearch . "' 的匹配记录。";
}

// 关闭语句和连接
$stmt->close();
// $connect->close(); // 如果不再需要数据库连接,可以关闭
?>

注意事项

  • 错误处理: 在实际应用中,务必对prepare()、bind_param()、execute()和get_result()的返回值进行检查,并处理可能出现的错误,例如数据库连接失败、SQL语法错误或参数绑定错误等。
  • 数据类型: bind_param()方法中的类型字符串至关重要。正确指定数据类型有助于数据库进行优化并防止某些类型的错误。
  • 多行结果: 如果您的查询可能返回多行数据(例如,查询所有account_name相同的记录),您需要在一个循环中重复调用fetch_assoc()(或fetch_row()、fetch_array())来遍历所有结果。例如:
    while ($row = $result->fetch_assoc()) {
        // 处理每一行数据
        echo $row["account_key"] . "<br>";
    }
  • 资源释放: 在完成数据库操作后,养成关闭预处理语句($stmt->close())和数据库连接($connect->close())的习惯,以释放系统资源,避免资源泄漏。

总结

通过本文的学习,您应该已经掌握了如何使用PHP的MySQLi扩展,结合预处理语句来安全、高效地查询数据库并获取指定列的数据。预处理语句不仅是防止SQL注入攻击的关键手段,也是编写健壮和高性能数据库应用程序的最佳实践。始终优先考虑使用预处理语句进行所有涉及用户输入的数据库操作,以确保您的应用程序安全可靠。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4783

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

971

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1249

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

6801

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

3503

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

6780

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

9421

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1270

2024.04.29

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 194人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn