-1

重複の可能性:
mysql_fetch_array()は、パラメーター1がリソースであり、ブール値がselectで指定されていることを想定しています。

私は、この質問をすることを想定していなかったことを知っています。なぜなら、それは以前に尋ねられたものであり、ここにそれに対する答えがあるからです。しかし、私はこれが同じことだとは思いません。エラーが発生した場所の行番号の説明がないのに、これまでにそのようなブールエラーに遭遇したことはありませんか?

代わりに、問題を特定するのに役立つ行情報やその他の情報がないこのエラーメッセージだけが表示されますか?

これが一語一語取得する際のエラーです:

: 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

まず第一に、あなたのコードはSQLインジェクションに対して脆弱です。変数をエスケープせにクエリに含めています。これらの変数の1つに不適切な値があると、ユーザーは自分の権限を上書きしたり、データベース内のすべてを削除したりすることができます。

コードをより安全にする方法については、質問の下にある私のコメントをお読みください。

あなたが抱えている問題は、$account_permsにデータベースからの結果が含まれていないことです。コードにmysql_fetch_array()の呼び出しが2つしかないので、デバッグコードを追加することで、簡単に見つけることができます。

$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 に答える
0

経験則として常に、mysqlで不明なエラーが発生した場合(ところで、使用すべきではありません)、常にor die (mysql_error())その目的である組み込み関数を使用してエラーをフェッチします。この場合、ここに追加することをお勧めします

$account_perms = mysql_query($query, $connection) or die(mysql_error());問題に関するメッセージが明確に表示されます。

于 2013-01-30T19:58:40.047 に答える