-1

可能重复:
mysql_fetch_array() 期望参数 1 是资源,选择中给出的布尔值

我知道不应该问这个问题,因为它之前被问过,并且在这里有一个答案。但我不认为这是一回事。我以前从来没有遇到过这样的布尔错误,而没有给出错误所在行号的描述?

相反,我得到的只是这个错误消息,没有任何行信息或其他信息来帮助我识别问题?

这是我逐字逐句的错误:

: mysql_fetch_array() expects parameter 1 to be resource, boolean given in on line : mysql_fetch_array() expects parameter 1 to be resource, boolean given in on line

这很奇怪,因为它通常会告诉行号,但在这种情况下显然不是。

我正在使用这个mysql函数:

function account_perms() {
    global $connection;
    global $_SESSION;
    global $profile_id;
    $query = "SELECT *
        FROM ptb_permissions
        WHERE ptb_permissions.private_id = \"$profile_id\"
        AND ptb_permissions.user_id = ".$_SESSION['user_id']." ";

    $account_perms = mysql_query($query, $connection);
    confirm_query($query, $connection);
    return $account_perms;
}

这个php代码:

<?php
$account_perms = account_perms();

while ($perms = mysql_fetch_array($account_perms)) {
    if ($perms['privellages'] == '1')  {          
         $photo = "data/private_photos/$profile[1]/pic1.jpg";
         if (!file_exists($photo)) {
              $photo = "data/photos/0/_default.jpg";
         }
         $thumb = "data/private_photos/$profile[1]/thumb_pic1.jpg";
         if (!file_exists($thumb)) {
              $thumb = "data/photos/0/_default.jpg";
         }
         if (logged_in()) {
              echo "<li><a href=\"$photo\" rel=\"shadowbox\" title=\"<strong>$profile[2]'s Photo's</strong>\"><img src=\"$thumb\" width=\"90\" height=\"90\" alt=\"<strong>{$profile[2]}'s Photos</strong>\"  /></a></li>";

         }
     }
}

$account_perms = account_perms();
while ($perms = mysql_fetch_array($account_perms)) {
     if ($perms['privellages'] == '0')  {
        $photo = "data/private_photos/0/_default.jpg";
                  if (!file_exists($photo)) {
                       $photo = "data/photos/0/_default.jpg";
                  }
                  $thumb = "data/private_photos/0/_default.jpg";
                  if (!file_exists($thumb)) {
                       $thumb = "data/photos/0/_default.jpg";
                  }
                  if (logged_in()) {
                       echo "<li><a href=\"$photo\" rel=\"shadowbox\" title=\"<strong>$profile[2]'s Photo's</strong>\"><img src=\"$thumb\" width=\"90\" height=\"90\" alt=\"<strong>{$profile[2]}'s Photos</strong>\"  /></a></li>";

                  } 
       }
}
?>

请有人告诉我为什么我会收到这个错误。

4

2 回答 2

0

总而言之,根据经验,当您在 mysql 中遇到未知错误(顺便说一句,您不应该使用)时,总是使用内置函数来获取错误,or die (mysql_error())这就是它的目的。在这种情况下,我建议您在此处添加

$account_perms = mysql_query($query, $connection) or die(mysql_error());您将清楚地看到有关该问题的消息。

于 2013-01-30T19:58:40.047 回答
0

首先,您的代码易受 SQL 注入攻击。您将变量包含在查询中而不转义它们。如果其中一个变量的值不正确,用户将能够覆盖他们的权限,甚至删除数据库中的所有内容

请阅读我在您的问题下方的评论,以了解如何使您的代码更安全。

您遇到的问题是 $account_perms 中不包含来自数据库的结果。我在您的代码中只看到两次对 mysql_fetch_array() 的调用,因此通过添加一些调试代码应该很容易找到在这种情况下它不起作用:

$account_perms = account_perms();
echo 'first time using mysql_fetch';
var_dump($account_perms);

对于您使用 mysql_fetch_array() 的其他位置也是如此

此外,由于可能存在 SQL 注入漏洞,您可能会调试您的 SQL 并检查生成的 SQL 查询是否格式正确。您可以通过将其放在您的 account_perms() 函数中来做到这一点:

// rest of code ..
var_dump($query);

$account_perms = mysql_query($query, $connection);

// etc..

[更新]根据下面OP的评论,只有在用户未登录时才会出现问题。因此,问题可能出在这部分:

SELECT *
    FROM ptb_permissions
    WHERE ptb_permissions.private_id = \"$profile_id\"
    AND ptb_permissions.user_id = ".$_SESSION['user_id']." ";

如果用户未登录,则会话中可能未设置“user_id”键,因此查询结果将变为:

SELECT *
    FROM ptb_permissions
    WHERE ptb_permissions.private_id = \"$profile_id\"
    AND ptb_permissions.user_id = 

哪个无效,导致数据库没有返回结果

最好在代码中添加一些机制来检查用户是否登录,然后才检索信息

在所有情况下,在使用它们之前检查您正在使用的变量是否存在并包含正确的值

例如,重新编写 account_perms() 函数,并将您使用的变量作为参数传递,而不是使用全局变量;

function account_perms($profile_id, $session_user_id) {
    // Convert both id's to integers (I'm assuming both are numbers here)
    // this also makes it safer
    // agains SQL injections (in this case)
    $profile_id      = (int) $profile_id;
    $session_user_id = (int) $session_user_id;

    if ($profile_id <= 0 || $session_user_id <= 0) {
        // no valid profile-id or no valid session-user-id
        // return false to indicate something was wrong
        // you may also use 'die()' with an error message
        // or Throw an Exception
        return false;
    }

    // we'll leave this global variable for now
    global $connection;

    if (!$connection) {
        die('No database connection found');
    }

    $query = "SELECT *
        FROM ptb_permissions
        WHERE ptb_permissions.private_id = " . $profile_id . "
        AND ptb_permissions.user_id = " . $session_user_id .";";

    $account_perms = mysql_query($query, $connection);
    confirm_query($query, $connection);
    return $account_perms;
}

然后在您的脚本中:

if (!isset($_SESSION['user_id'])) {
   // user_id not found. we don't need to go any further
   die('no user-id in session');
}


$account_perms = account_perms($profile_id, $_SESSION['user_id']);

if (!$account_perms) {
    die('Unable to retrieve account-permissions from database');
}

这只是为了说明如何解决这个问题

于 2013-01-30T20:00:46.650 回答