0

奇妙な問題が発生しています。memcache関数を使用してクエリの出力をcount.phpという名前のファイルにキャッシュしています。このファイルは、ユーザーが特定のページを表示しているときにajaxによって毎秒呼び出されます。出力は5秒間キャッシュされるため、この時間内にこのファイルに5回ヒットする場合は、キャッシュされた結果が少なくとも3〜4回返されると予想されます。ただし、これは発生していません。代わりに、echoステートメントから明らかなようにクエリがdbに送信されるたびに、URLを入力してブラウザから直接ファイルが呼び出された場合(http://example.com/help/count.phpなど) )5秒以内に何度も繰り返しデータがキャッシュから返されます(これもechoステートメントから証明されます)。以下はcount.phpの関連コードです

mysql_connect(c_dbhost, c_dbuname, c_dbpsw) or die(mysql_error());
mysql_select_db(c_dbname) or die("Coud Not Find Database");

$product_id=$_POST['product_id'];

echo func_total_bids_count($product_id);


function func_total_bids_count($product_id)
{
    $qry="select count(*) as bid_count from tbl_userbid where userbid_auction_id=".$product_id;
    $row_count=func_row_count_only($qry);
    return $row_count["bid_count"];
}

function func_row_count_only($qry)
{
    if($_SERVER["HTTP_HOST"]!="localhost")
    {
        $o_cache = new Memcache;
        $o_cache->connect('localhost', 11211) or die ("Could not connect to memcache");
        //$key="total_bids" . md5($product_id);
        $key = "KEY" . md5($qry);
        $result = $o_cache->get($key);
        if (!$result) 
        {
            $qry_result = mysql_query($qry);
            while($row=mysql_fetch_array($qry_result)) 
            {
                $row_count = $row;
                $result = $row;
                $o_cache->set($key, $result, 0, 5);
            }
            echo "From DB <br/>";
        }
        else
        {
            echo "From Cache <br/>";
        }
            $o_cache->close();
        return $row_count;
    }
}

ajaxがこのファイルを呼び出すと、毎秒DBがヒットするのに、ブラウザにURLを入力すると、キャッシュされたデータが返される理由がわかりません。URLメソッドを試すために、$ product_idを有効な番号に置き換えました(例:私の場合は$ product_id = 426)。最初のヒットから5秒以内にデータがキャッシュから返されると予想しているため、ここで何が問題になっているのかわかりません。データをキャッシュから返すようにしたい。誰かが私が何が起こっているのかを理解するのを手伝ってくれませんか?

4

2 に答える 2

0

アドレス バーを使用している場合は GET を実行していますが、コードは $_POST['...'] を探しているため、無効なクエリになってしまいます。そのため、最初は、アドレス バーを使用した結果が期待どおりにならないことがあります。あなたの Ajax 呼び出しは実際に POST を実行していますか?

SQL インジェクションの脆弱性があることにも注意してください。$product_id が整数であることを確認してください。

于 2013-03-04T23:29:08.600 に答える
0

あなたのコードには多くの問題があります。まず第一に、データベースに接続してテーブルを選択します。次に、空のオブジェクトもカバーするため、 ! empty($result)で$result をチェックする必要があります。

上記のように、'product_id' が $_POST 配列にない場合、$_REQUEST を使用して $_GET もカバーできます (ただし、$_POST 経由であることが確実な場合はそうすべきではありません)。

于 2013-03-04T23:35:04.540 に答える