网站首页 > 知识剖析 正文
技术背景
在使用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注入攻击。
- 上一篇: workerman 自定义的协议如何解决粘包拆包
- 下一篇: PHP 单例模式
猜你喜欢
- 2025-04-27 C#与TypeScript语法深度对比
- 2025-04-27 ES6从入门到精通学习路径
- 2025-04-27 前端面试-Web Worker:让你的网页不再“卡到崩溃”的秘诀
- 2025-04-27 Spring Data JPA避坑指南:99%新手踩过的坑我都帮你填平了!
- 2025-04-27 AspNetCore中的文件上传与下载优化
- 2025-04-27 iOS PhotoKit简单用法
- 2025-04-27 扫盲Kafka?看这一篇就够了!
- 2025-04-27 JavaScript 神奇语法糖:让你的代码更简洁高效掌握这些简写技巧
- 2025-04-27 (国产CAD SDK)网页CAD的配置属性的如何设置
- 2025-04-27 前端面试-Blob分析,不常用,就怕面试官有毒
- 最近发表
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)