如果未设置会话,则无法执行脚本

Can't execute script if session not set

早上好,我正在尝试开发一个 link 缩短系统,其中包含 php (5.6) 中的统计信息。这些统计数据之一是会话数。我正在尝试使用此逻辑:

if session doesn't exist
    start the session
    add +1 to the session field and +1 to the click field
else
    just add +1 to the click field.

在我的第一种方法中,我尝试将 session_start 放在代码的中间,但没有成功。我意识到我做不到,我移动了代码第一行的语句,做了一个很大的 if 条件。

<?php if (session_status() === PHP_SESSION_NONE) { session_start();
    ...config and stuff...
    $pdo->query("UPDATE links SET session = session + 1 WHERE slug = '$slug'");
    $pdo->query("UPDATE links SET click = click + 1 WHERE slug = '$slug'");
    } else {
    ...config and stuff...
    $pdo->query("UPDATE links SET click = click + 1 WHERE slug = '$slug'");
    }
?>

当我调试这个时,会话字段总是更新,但它应该只在第一次增加。我错过了什么?

旁注:这是重定向页面,我不知道它是否有用。

session_status 仅显示当前会话的状态,而不显示用户是否曾经启动过会话。这就是为什么您的 session_status() === PHP_SESSION_NONE 在第一次请求执行该 if 语句时始终为真。

也许你想做一些事情,比如在会话中存储一些标志来指示它是否是用户的第一次访问

session_start();

if (!isset($_SESSION['initialized'])) {
    $_SESSION['initialized'] = time();
    ...config and stuff...
    $pdo->query("UPDATE links SET session = session + 1 WHERE slug = '$slug'");
    $pdo->query("UPDATE links SET click = click + 1 WHERE slug = '$slug'");
} else {
    ...config and stuff...
    $pdo->query("UPDATE links SET click = click + 1 WHERE slug = '$slug'");
}

session_status() === PHP_SESSION_NONE 将始终在会话实际开始之前产生 true。 您应该改用标志。只需将 session_start 放在第一行并执行以下操作:

<?php
    session_start();
    if (!isset($_SESSION['flag'])) {
       $stmt = $pdo->prepare("UPDATE links SET session = session + 1 WHERE slug = :slug");
       $stmt->execute([':slug' => $slug, ]);
       $_SESSION['flag'] = true;
    }
    
    $stmt = $pdo->query("UPDATE links SET click = click + 1 WHERE slug = :slug");
    $stmt->execute([':slug' => $slug, ]);