首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ajax调用memcache函数总是查询数据库

Ajax调用memcache函数总是查询数据库
EN

Stack Overflow用户
提问于 2013-03-05 07:15:48
回答 2查看 473关注 0票数 0

我遇到了一个奇怪的问题。我使用memcache函数将查询的输出缓存到一个名为count.php的文件中。当用户查看特定页面时,ajax每秒都会调用该文件。输出被缓存了5秒,所以在这段时间内,如果这个文件有5次命中,我希望缓存的结果至少会返回3-4次。然而,这并没有发生,而是每次查询要转到db时,如echo语句所示,但是如果通过重复输入url (如http://example.com/help/count.php)多次直接从浏览器调用文件,则在5秒内从高速缓存返回数据(再次从echo语句中证明)。以下是count.php的相关代码

代码语言:javascript
复制
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秒内从缓存中返回。我希望数据从缓存中返回。有人能帮我了解一下发生了什么事吗?

EN

回答 2

Stack Overflow用户

发布于 2013-03-05 07:29:09

如果您使用的是地址栏,那么您正在执行GET,但是您的代码正在查找$_POST'...',因此您将得到一个无效的查询。因此,首先,使用地址栏的结果将不会是您期望的结果。你的Ajax调用实际上是在做POST吗?

还请注意,您在那里有一个SQL注入漏洞。确保$product_id为整数。

票数 0
EN

Stack Overflow用户

发布于 2013-03-05 07:35:05

您的代码有许多问题,首先,您总是连接到数据库并选择一个表,即使您不需要它。其次,你应该用!empty($result)检查$result,它比!$result更可靠,因为它也覆盖了空对象。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15212986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档