0

我遇到了一个奇怪的问题。我正在使用名为 count.php 的文件中的 memcache 函数缓存查询的输出。当用户查看特定页面时,该文件每秒由 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 ,这与 !$ result一样更可靠,因为它也涵盖空对象。

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

于 2013-03-04T23:35:04.540 回答