如果未设置会话,则无法执行脚本
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, ]);
早上好,我正在尝试开发一个 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, ]);