领先的免费Web技术教程,涵盖HTML到ASP.NET

网站首页 > 知识剖析 正文

解决mysql_fetch_array等函数参数类型错误问题

nixiaole 2025-04-27 15:30:01 知识剖析 3 ℃

技术背景

在使用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注入攻击。

最近发表
标签列表