1

検索するすべてのテーブル行にユーザーIDが存在するかどうかを確認したいと思います。

編集申し訳ありませんが、私は誤解を招いたと思います。ユーザーがカテゴリ内のすべての記事を読んだかどうかを確認したいのですが、カテゴリを表示するフォーラムフロントエンドがあり、カテゴリ内に記事があります。

カテゴリ画面で、すべての記事が読まれているか、すべての記事が読まれていないかの画像を表示したいので、カテゴリごとにすべての記事をループする必要があります。これは、以下のクエリの例であり、ユーザーIDがすべてに存在するかどうかを確認します。はいの場合は行が返され、ユーザーIDが欠落している行がある場合はすべての記事が読み取られ、一部の記事は読み取られていません

これは私のSQLクエリです

$colname_readposts = "-1";
if (isset($_GET['Thread_Category_Article_id'])) {
$colname_readposts = $_GET['Thread_Category_Article_id'];
}
mysql_select_db($database_test, $test);
$query_readposts = sprintf("SELECT Thread_Article_User_Read FROM Thread_Articles WHERE             Thread_Category_Article_id = %s", GetSQLValueString($colname_readposts, "int"));
$readposts = mysql_query($query_readposts, $cutthroats) or die(mysql_error());
$row_readposts = mysql_fetch_assoc($readposts);
$totalRows_readposts = mysql_num_rows($readposts);

返されたすべての行にユーザーIDが含まれているかどうかを確認するにはどうすればよいですか?アイデアは、ユーザーがすべての記事を読んだかどうかを確認することです。はいの場合はREADを表示し、いいえの場合はUNREADを表示します。

行ごとの結果は次のようになります。0、15、20、37これらは、ユーザーが投稿を表示したときに入力されるIDです。私は、ユーザーが特定の記事を読んだかどうかを示すために、単一の記事に対してこのチェックを取得することができましたが、複数の記事をチェックする方法がわかりません:

これが私の単一の記事のチェックです:

<?php
$userid = $_SESSION['loggedin_id'];
$userreadlist = $row_readposts['Thread_Article_User_Read'];
$myarray = (explode(',',$userreadlist));
if (in_array($userid,$myarray )){ 
?>
html image READ
<?php } else { ?>
html image UNREAD
<?php } ?>

どんな助けでもいただければ幸いです。カール

4

1 に答える 1

1

まず、mysql_*関数を忘れてください。ext/mysqlは PHP 5.5 の時点で非推奨の API であるため、mysqli または PDO を使用することをお勧めします。

私が集めたものから、これらの結果のいずれかに特定のユーザーのIDが含まれているかどうかを実際に確認しようとしていますか? その場合は、SQL クエリで次のようにします。

SELECT Thread_Article_User_Read FROM Thread_Articles WHERE 
    Thread_Category_Article_id = %s AND UserID = %s

そして、このユーザーの ID を 2 番目の引数として指定します。(構文は 100% 正しいとは限りませんが、要点を証明する必要があります)

ユーザーのIDがあることを確認したい場合は、もう一度; SQLでこれを行います:

SELECT Thread_Article_User_Read FROM Thread_Articles WHERE 
    Thread_Category_Article_id = %s AND UserID IS NOT NULL

これにより、'UserID' に有効な値が存在することが保証されます。

これらの例のいずれかに基づいてソリューションを作成する場合は、当然、「UserID」を実際の列名に置き換えてください。

ただし、テーブルからすべての結果をダンプしている場合-ユーザーのIDが特定の列に存在するかどうかを確認する必要があります(あなたのように! ); その後、実際には、単一の記事ページで使用しているロジックを適応させることができます. これはあなたにこのようなものを与えるはずです...

$userid = $_SESSION['loggedin_id'];
$colname_readposts = "-1";
if (isset($_GET['Thread_Category_Article_id'])) {
    $colname_readposts = $_GET['Thread_Category_Article_id'];
}

/* connect to db and run query; CHANGE ME TO SOMETHING NOT DEPRECATED */
mysql_select_db($database_test, $test);
$query_readposts =
  sprintf("SELECT Thread_Article_User_Read FROM Thread_Articles WHERE
    Thread_Category_Article_id = %s", GetSQLValueString($colname_readposts, "int"));
$readposts = mysql_query($query_readposts, $cutthroats) or die(mysql_error());


/* loop through all returned items */
while($row = mysql_fetch_assoc($readposts)) {
    /* repeat the check you used on an individual
       row on the single article page. i.e: */

    $userreadlist = $row['Thread_Article_User_Read'];
    $myarray = (explode(',',$userreadlist));

    if (in_array($userid,$myarray )){
        /* user has read */
    } else {
        /* user hasn't read */
    }
}

そのコードが単一のページで機能した場合、上記で機能するはずです。ループの繰り返しごとに、単一のページで作業していたのと同じように、単一の行で作業しています。データが同じテーブルからのものである場合、列名などが一致し、機能します。

または、未読の投稿があるかどうかを知りたい場合は、ループをこれに置き換えてください...

/* loop through all returned items */
$read = true;
while($row = mysql_fetch_assoc($readposts)) {
    /* repeat the check you used on an individual
       row on the single article page. i.e: */

    $userreadlist = $row['Thread_Article_User_Read'];
    $myarray = (explode(',',$userreadlist));

    if (! in_array($userid,$myarray )){
        $read = false;
        break;
    } 
}

if( $read ){
   /* all pages are read */
} else {
   /* there are unread pages */
}
于 2013-01-02T01:29:06.807 に答える