0

データベースの投票システムを作成しようとしています。現在、レコードは画面上のphpでレンダリングされ、上または下の投票用の画像が表示されます。クリックすると、php スクリプト upvote.php または downvote.php がそれぞれ実行され、id 値 (操作されているレコードの整数) が渡されます。

現在は機能しており、スクリプトはレコードの投票値を意図したとおりに増減します。ただし、ユーザーが 1 つのレコードに対してこれを複数回実行するのを止めようとしていました。セッションを使用して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);
}
4

1 に答える 1

-1

セッションに使用されるデフォルトのシリアライザーは、数値のみのキーを処理できません。また、シャットダウン中に警告メッセージが出力されます。ログに表示されるはずです (ログが有効になっていると仮定して、Unknown を探します)。

古いシリアル化ハンドラーは、数値インデックスや文字列インデックスを格納できず、特殊文字が含まれています

(以下リンクより引用)

次のスクリプトでテストし、どこかに保存して、数回更新できます。

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

最も移植性の高いソリューションは、キーに静的な文字列をプレフィックスとして付けることです。または、セッションに使用されるシリアル化ハンドラーを変更することもできます。

于 2013-08-24T16:11:37.720 に答える