Ajax调用memcache函数总是查询Db

时间:2013-03-04 23:15:48

标签: php ajax memcached

我遇到了一个奇怪的问题。我正在使用memcache函数在名为count.php的文件中缓存查询的输出。当用户查看特定页面时,该文件每秒由ajax调用。输出缓存5秒,所以在这段时间内如果这个文件有5次点击,我希望缓存的结果至少返回3-4次。但是这不会发生,而是每次从echo语句中查询到db时,如果通过在5秒内重复多次输入url(如http://example.com/help/count.php)来直接从浏览器调用该文件从缓存返回(再次从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调用此文件时,每秒都会触发数据库,​​但是当在浏览器中键入URL时,会返回缓存数据。要尝试URL方法,我只需用有效数字替换$ product_id(例如:在我的情况下,$ product_id = 426)。我不明白这里有什么错误,因为我希望在第一次点击后5秒内从缓存返回数据。我希望从缓存中返回数据。有人可以帮我理解发生的事情吗?

2 个答案:

答案 0 :(得分:0)

如果你正在使用地址栏,那么你正在进行GET,但你的代码正在寻找$ _POST [&#39; ...&#39;],所以你最终会查询无效。因此,首先,使用地址栏的结果不会是您期望的结果。您的Ajax调用实际上正在进行POST吗?

请注意,您在那里遇到了SQL注入漏洞。确保$ product_id是一个整数。

答案 1 :(得分:0)

您的代码存在许多问题,首先您总是连接到数据库并选择一个表,即使您不需要它。其次,您应该使用!empty($ result)检查$ result,这更可靠,只需!$ result ,因为它还包含空对象。

如上所述,如果'product_id'不在$ _POST数组中,你可以使用$ _REQUEST来覆盖$ _GET(但你不应该,如果你确定它是通过$ _POST来的)。