0

「read」が「0」に設定されているテーブル ptb_messages から、ユーザーが持っている新しいメッセージの数を取得しようとしています

誰かが私が間違っているところを教えてください。

私のテーブルは次のようになります。

id | from_user_id | to_user_id | subject | content | date_sent | read

1         2              4        hello     hello    2012-04-13    0

この関数を使用して、ユーザーの未読メッセージの数を表示しようとしています。

function check_new_messages() {
            global $connection;
            global $_SESSION;
            $query = "SELECT COUNT('read') FROM ptb_messages WHERE to_user_id =".$_SESSION['user_id']." AND ('read)'='0'";
            $check_new_messages_set = mysql_query($query, $connection);
            confirm_query($check_new_messages_set);
            return $check_new_messages_set;     
        }

<?php

$check_new_messages_set = check_new_messages();
while ($new = mysql_fetch_array($check_new_messages_set)) {

echo "There are ". $new['COUNT(read)'] ." items.";

}

 ?>
4

4 に答える 4

3

COUNTそのフィールドはまったく必要ありません。でWHERE十分です。引用符はほんの少しずれています:

$query = "SELECT COUNT(*) FROM ptb_messages WHERE to_user_id =".$_SESSION['user_id']." AND `read` = 0";

mysql_また、拡張子は使用しないでください。これらは PHP 5.5 で廃止され、SQL インジェクションの脆弱性を簡単に導入します。PDO または MySQLi でプリペアド ステートメントを試してみてください。

于 2012-12-19T21:28:55.090 に答える
0

さて、Mysqli または PDO を調べる必要があります。そうは言っても、列「読み取り」の状態が異なることは明らかです。0 = 未読み取り、1 = 読み取りなど....

ここでは、関数をより汎用的にして、1 つの関数でこれらの状態を取得できるようにすることができます。このようなもの:

function check_new_messages($id,$state)
{
    $query ="SELECT COUNT(*)as newmessage FROM ptb_messages WHERE to_user_id =".$id." AND `read` ='".$state."'";
    $check_new_messages_set = mysql_query($query, $connection);
    confirm_query($check_new_messages_set);
    return $check_new_messages_set;     
 }
    $check_new_messages_set = check_new_messages($_SESSION['user_id'], '0' );
    while ($new = mysql_fetch_array($check_new_messages_set))
        {
            echo "There are ". $new['newmessage'] ." items.";
        }

MYSQLI を使用した例を次に示します。この例では、行数を返してエコーできます。

function check_new_messages($id,$state)
{
    $MessageCount = new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME);
    if ($MessageCount->connect_errno)
    {
        echo "Failed to connect to MySQL: (" . $MessageCount->connect_errno . ") " . $MessageCount->connect_error;
        $MessageCount->close();
    }
    $values = $MessageCount->query("SELECT to_user_id FROM ptb_messages WHERE to_user_id =".$id." AND `read` ='".$state."'");
    if($count = $values->num_rows)
    {
        return $count;
    }
        return 0;
}

// このように呼び出しを返します

$Unread = check_new_messages($_SESSION['user_id'], '0' );
echo "There are ". $Unread ." items.";
于 2012-12-19T23:39:56.113 に答える
0

試す:

        $query = "SELECT COUNT(read) FROM ptb_messages WHERE to_user_id =".$_SESSION['user_id']." AND read = 0";

また、 SQL インジェクションについても読みたいと思うかもしれません。

于 2012-12-19T21:28:33.470 に答える
0

まず、SQL を微調整する必要があると思います。

SELECT COUNT('read') FROM ptb_messages WHERE to_user_id =".$_SESSION['user_id']." AND ('read)'='0'

そうではありませんか:

SELECT COUNT(id) FROM ptb_messages WHERE to_user_id =".$_SESSION['user_id']." AND `read` = 0

次に、この行:

echo "There are ". $new['COUNT(read)'] ." items.";

次のようにする必要があります。

echo "There are ". $new[0] ." items.";
于 2012-12-19T21:32:52.023 に答える