我正在尝试为数据库建立一个投票系统,当前记录在屏幕上以php形式呈现,并带有用于向上或向下投票的图像。单击时,它们分别运行php脚本upvote.php或downvote.php,它们传递id值(被操纵的记录的整数。
目前它可以工作,脚本按预期增加和减少记录投票值。但是,我试图阻止用户多次为一条记录执行此操作。我试图通过使用会话并将其命名为id的值并在更改投票值之前检查是否已设置该id的会话来实现此目的。
我将使用我的'upvote.php'作为我的例子:
//Upvote Script
//begin session
session_start();
//database connection credentials import
include("../scripts/connection_variables.php");
//connect to mysql or display error
@mysql_connect("$db_host","$db_username","$db_pass") or die ("Could not connect to the database, please try again shortly. If problem persists please refer to help then contact support.");
//select database or or display error
@mysql_select_db("$db_name") or die ("Could not connect to the database, please try again shortly. If problem persists please refer to help then contact support.");
//collect id
$id = $_GET['id'];
//check if user has already voted for this
if(isset($_SESSION[$id])) {
//session has been set for this id, so don't execute the script
exit();
}else{
//set the session
$_SESSION[$id] = "The punniest thing about puns is that they are really punny.";
//increment the votes value
$query = "UPDATE punniest_database SET votes= 1 + votes WHERE id='$id'";
mysql_query($query);
}
答案 0 :(得分:-1)
用于会话的默认序列化程序无法处理仅限数字的键。它还会在关机期间发出警告消息,您应该在日志中看到它(假设您已启用日志记录,请查找“未知”)。
较旧的序列化处理程序不能存储数字索引,也不能包含字符串索引包含特殊字符
(引自下面的链接)
您可以使用以下脚本对其进行测试,将其保存在某处并刷新几次:
<?php
session_start();
$_SESSION[time()] = true;
var_dump($_SESSION);
最便携的解决方案是在键前面加上一个静态字符串。或者,您可以更改用于会话的serialize handler。