无法将php $ _SESSION命名为id值

时间:2013-08-24 16:04:09

标签: php mysql sql session

我正在尝试为数据库建立一个投票系统,当前记录在屏幕上以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);
}

1 个答案:

答案 0 :(得分:-1)

用于会话的默认序列化程序无法处理仅限数字的键。它还会在关机期间发出警告消息,您应该在日志中看到它(假设您已启用日志记录,请查找“未知”)。

  

较旧的序列化处理程序不能存储数字索引,也不能包含字符串索引包含特殊字符

(引自下面的链接)

您可以使用以下脚本对其进行测试,将其保存在某处并刷新几次:

<?php
session_start();
$_SESSION[time()] = true;
var_dump($_SESSION);

最便携的解决方案是在键前面加上一个静态字符串。或者,您可以更改用于会话的serialize handler