网站首页 > 教程文章 正文
技术背景
在使用PHP与MySQL进行交互时,我们常常会使用mysql_fetch_array()、mysql_fetch_assoc()、mysql_fetch_row()、mysql_num_rows()等函数来处理查询结果。然而,当查询失败时,这些函数会抛出错误,提示“expects parameter 1 to be resource, boolean given”。这通常是因为查询执行失败,返回的不是一个有效的资源,而是布尔值false。
实现步骤
1. 检查查询是否失败
在使用查询结果之前,需要先检查查询是否成功执行。可以通过判断mysql_query()的返回值是否为false来实现。
2. 处理查询错误
如果查询失败,可以使用mysql_error()函数获取具体的错误信息,并进行相应的处理。
3. 防范SQL注入
为了避免SQL注入攻击,应该对用户输入的数据进行过滤和转义。可以使用mysql_real_escape_string()函数来转义用户输入的数据。
4. 升级到更安全的扩展
mysql_*函数已经被弃用,建议使用mysqli_*扩展或PDO来替代。
核心代码
使用mysql_*函数的示例代码
$username = mysql_real_escape_string($_POST['username']);
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");
if($result === FALSE) {
trigger_error(mysql_error(), E_USER_ERROR);
}
while($row = mysql_fetch_array($result))
{
echo $row['FirstName'];
}
使用mysqli_*扩展的示例代码
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查连接
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// 输出数据
while($row = $result->fetch_assoc()) {
// 处理数据
}
} else {
echo "0 results";
}
$conn->close();
使用PDO的示例代码
try {
$pdo = new PDO("mysql:host=localhost;dbname=test", "test","");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$username = $_POST['username'];
$stmt = $pdo->prepare("SELECT * FROM Users WHERE UserName LIKE :username");
$stmt->bindParam(':username', $username, PDO::PARAM_STR);
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo $row['FirstName'];
}
} catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
最佳实践
- 开启错误报告:在开发环境中,开启PHP的错误报告功能,以便及时发现和解决问题。可以在代码中添加以下代码:
error_reporting(-1);
ini_set('display_errors', 1);
- 使用预处理语句:使用mysqli_*扩展或PDO的预处理语句可以有效防范SQL注入攻击。
- 检查数据库连接:在执行查询之前,确保数据库连接正常。
常见问题
1. 单引号和双引号的问题
在PHP中,单引号和双引号的字符串处理方式不同。单引号字符串不会解析变量,而双引号字符串会解析变量。因此,在编写SQL查询时,需要注意引号的使用。
2. 数据库选择问题
在执行查询之前,需要确保已经选择了正确的数据库。可以使用mysql_select_db()函数来选择数据库。
3. 数据库连接问题
如果数据库连接失败,查询也会失败。可以使用mysql_connect()函数来建立数据库连接,并检查连接是否成功。
4. SQL注入问题
如果没有对用户输入的数据进行过滤和转义,可能会导致SQL注入攻击。建议使用预处理语句来防范SQL注入攻击。
猜你喜欢
- 2025-05-11 阿里开源MySQL中间件Canal快速入门
- 2025-05-11 MyBatis插件开发实战:手写一个分页插件
- 2025-05-11 Flask数据库——SQLAlchemy
- 2025-05-11 MySQL 到 Hazelcast Cloud 实时数据同步实操分享
- 2025-05-11 sqlmap 详解
- 2025-05-11 一篇文章让你学会Elasticsearch中的查询
- 2025-05-11 Mysql性能优化这5点你知道吗?简单却容易被初学者忽略!
- 2025-05-11 Spring Boot 实现 MySQL 读写分离技术
- 2025-05-11 Spring事务失效的7大场景:源码级排查方案来了!
- 2025-05-11 MySQL利用int类型高性能实现签到活动
- 最近发表
-
- 绝区零:公测必看!300菲林兑换码、萌新补给一览!切勿踩坑!
- 事半功倍 轻松制作可交互移动原型
- LOL英雄联盟美服注册教材 教你玩转美服
- 「正点原子Linux连载」第五十八章Linux INPUT子系统实验(一)
- 如何轻松薅Cursor羊毛:用免手机号邮箱快速注册
- C/C++基础语法复习(一):C++与C语言的区别,主要有这些
- 永久免费的高配容器Clawcloud,超爽体验!
- Spaceship低价注册域名 | 每年5元不到 | XYZ域名 | 托管cloudflare
- 云杉网络DeepFlow基于Free5GC的方案示例
- alma8飞速搭建zabbix6、微信报警、windows、linux、交换机监控
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- md5 sha1 (32)
- mybatis plus page (35)
- semaphore 使用详解 (32)
- update from 语句 (32)
- vue @scroll (38)
- 堆栈区别 (33)
- 在线子域名爆破 (32)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)