【问题标题】:PHP PDO query won't work because of a header redirect由于标头重定向,PHP PDO 查询将不起作用
【发布时间】:2018-06-26 21:46:18
【问题描述】:

我遇到了两个问题,该函数应将 +1 添加到数据库字段并在完成后重定向到目标 URL。

问题是除非我清除缓存,否则我的 UPDATE 查询不起作用。在试图找出为什么会发生这种情况时,我遇到了另一个奇怪的问题,它在我更改后没有更新功能。

我所做的是尝试评论header,但它仍在重定向我,直到缓存被清除。另一方面,当 header 被评论并且在我清除缓存后,我的 UPDATE 函数每次都有效。

    public function clickShortlink($slug) {
        $connect = $this->connect();

        $stmt = $connect->prepare("UPDATE `shortlink` SET clicks = clicks + 1 WHERE slug = :slug;");
        $stmt->bindValue(":slug", $slug);
        $stmt->execute();

        $stmt = $connect->prepare("SELECT target FROM `shortlink` WHERE slug = :slug");
        $stmt->bindValue(":slug", $slug);
        $stmt->execute();
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $target = $row['target'];
        }

        if (isset($target)) {
            $connect = null;
            header("Location: ".$target);
            exit;
        }

        $connect = null;
    }

我对@9​​87654325@ 缺少什么?

编辑

我就是这样称呼clickShortLink()

    <?php 
        if (isset($_GET['gototarget'])) {
            $shortlink = new Shortlink();
            $url = $shortlink->clickShortlink($_GET['slug']);
        } 
    ?>

<form>
    <br>
    <br>
    <input type="text" name="slug" value="di5gV">
    <button name="gototarget">Go to target</button>
</form>

【问题讨论】:

  • 您的上述代码中没有任何内容会导致问题。关于header() 需要注意的一件事是,它要求在发送标头之前没有 DOM 输出。 clickShortLink() 是怎么调用的,之前有输出吗?请注意,您可能还希望将 if (isset($target) 逻辑包装在针对查询的检查中,例如 if($stmt-&gt;execute())...
  • 如果您遇到与缓存相关的问题,这可能会有所帮助:stackoverflow.com/questions/1341089/…
  • @ObsidianAge 编辑了问题,并注意到了额外的if。 @Mr Glass 不幸的是,这无济于事,PHP 可以进入浏览器缓存吗?
  • 如果代码在您清除缓存后有效,则该代码有效。您的问题是浏览器缓存您的页面。如果您在未用于访问此页面的浏览器中尝试您的代码并且它有效,那么您就知道您的代码有效(并且您需要解决缓存问题)。
  • 如果您无法通过此操作,您始终可以将所需的 URL 作为 javascript 变量传递,让 javascript 检查 location.href == yourURL,如果未设置 location.href = yourURL

标签: php oop pdo


【解决方案1】:

就像@Mr Glass 在 cmets 中发现的那样,问题与我在 .htaccess 中的代码有关。

<IfModule mod_headers.c>
Header set Connection keep-alive
Header set Cache-Control "max-age=1209600, must-revalidate"
</IfModule>

不幸的是,添加“无缓存”元标记并没有帮助,但在从我的 .htaccess 文件中删除此代码后,一切似乎都可以正常工作。

【讨论】:

    猜你喜欢
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 2010-09-30
    • 2014-12-09
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多