【问题标题】:Cache-Control messing with mysqli->affected_rows缓存控制与 mysqli->affected_rows 混淆
【发布时间】:2010-12-20 00:27:18
【问题描述】:

我有一个网页(我们称之为 A.html)。 A.html 有一些 javascript,它使用简单的 document.location="B.php" 将页面切换到动态 php 页面(我们称之为 B.php)。 B.php 根据它看到的 cookie 运行 mysql 查询,并根据 mysqli->affected_rows 变量返回结果。但是,每次页面切换时 mysqli->affected_rows 都等于 0,即使 mysql 表确实按照预期的方式进行了更改。有趣的是,当我使用 url 栏(或刷新页面)直接进入 B.php 时,mysqli->affected_rows 是 1,就像它应该的那样。

查看wireshark,两个GET请求之间的唯一区别是第二个(非javascript)有一行Cache-Control: max-age=0。有谁知道为什么这会影响任何事情,如果有办法解决这个问题?

编辑:这是代码

    $req = $mysqli->prepare('update users set sts=NOW() where i=? and sid=? and sip=? and NOW()-sts <= '.$authentication_timeout.';');
    if ($mysqli->error) {
        log_mysql_error($mysqli);
        die('Unexpected error:'.$mysqli->error);
    }
    $req->bind_param('sss',$uid,$sid,$_SERVER['REMOTE_ADDR']);
    $req->execute();

    print $mysqli->affected_rows;
    $req->close();

【问题讨论】:

    标签: php javascript mysql cache-control rows-affected


    【解决方案1】:

    如果确实是缓存使您的啤酒变酸,那么我想这样做

    document.location="B.php?nocache=" + new Date().getTime();
    

    将解决问题。你能检查并验证是不是这样吗?

    【讨论】:

    • 试过你的解决方案,没用。结果与以前相同,当 javascript 更改页面时它声称没有行已更改(即使它们已更改),当我简单地刷新时它工作正常
    【解决方案2】:

    您没有显示任何代码,所以我只能猜测,但affected_rows() 将在不会更改表中任何内容的更新时返回 NULL。所以大概,如果你重新加载你的页面,第二次加载将显示0,即使之前在页面上运行了更新。

    【讨论】:

      【解决方案3】:

      缓存根本不是问题。出现问题是因为在这种特殊情况下,同一行在此代码执行之前正在更新,并且没有足够的时间延迟使 NOW() 有所不同。所以当行匹配时,数据没有变化,所以 $mysqli->affected_rows 仍然等于零。 $mysqli->info 显示“匹配的行数:1,更改的行数:0”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-07
        • 2012-08-09
        • 1970-01-01
        相关资源
        最近更新 更多