1

これは、これに対するフォローアップの質問です。行内の特定の整数を確認しますWHERE user = $ name

ユーザーが自分のサイトに1日5回だけコメントできるようにしたいと思います。この5回後、ユーザーは24時間待つ必要があります。これを実現するために、MYSQLデータベースのユーザーのすぐ隣にカウンターを作成します。つまり、ユーザーの名前があるところに、カウンターが上がるところがあります。5に達すると、カウントを停止し、24時間後にリセットされます。時刻を確認するためにタイムスタンプを使用します。タイムスタンプが24時間より古いかどうかを確認します。その場合、カウンターはリセットされ(-5)、ユーザーは再度コメントできます。それを行うために、私は次のコードを使用しますが、それが5で止まることはありません、私の推測は私の比較がどういうわけか間違っていると思います:

$counter = mysql_query("SELECT FROM table VALUES CommentCounterReset WHERE Name = '$name'");

if(!isset($_SESSION['ts'])); {
    $_SESSION['ts'] = time();
}

if  ($counter >= 5) { 
    if (time() - $_SESSION['ts'] <= 60*60*24){
        echo "You already wrote five comments.";
    }
    else {
        $sql = "UPDATE table SET CommentCounterReset = CommentCounterReset-5 WHERE Name = '$name'";   
    }     
}  
else {
 $sql = "UPDATE table SET CommentCounterReset = CommentCounterReset+1 WHERE Name = '$name'";
    echo "Your comment has been added.";
}
4

2 に答える 2

1

24 時間後ではなく、1 日 5 回コメントを追加できるようにする必要があります。

$db = new PDO('mysql:host=localhost;dbname=test', 'root', '', array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

$stmt = $db->prepare("SELECT `Name`, `timestamp`, `CommentCounterReset` FROM `table` WHERE `Name`=:name");
$stmt->execute(array(':name' => $_GET['name']));
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$lastComment = $row['timestamp']; // timestamp from database and not from $_SESSION because $_SESSION get's destroyed.
$countComments = $row['CommentCounterReset']; // number of comments added

$row_count = $stmt->rowCount();
if(!$row_count){
    $stmt = $db->prepare("INSERT INTO `table` VALUES(0, :name, :timestamp, 1)");
    $stmt->execute(array(':name' => $_GET['name'], ':timestamp' => date('U')));
    echo "Your comment has been added.";
} else {
    if($countComments > 4 && date('d') == date('d', $lastComment)){ // if number of comments are greater than 4 and is same day
        echo "You already wrote five comments today.";
    } else {
        if(date('d') != date('d', $lastComment)){ // if there are different days, reset the counter to 1
            $stmt = $db->prepare("UPDATE `table` SET `CommentCounterReset` = 1, `timestamp`=:timestamp WHERE `Name`=:name");
            $stmt->execute(array(':name' => $_GET['name'], ':timestamp' => date('U')));
        } else { // if it's same day increase counter with 1
            $stmt = $db->prepare("UPDATE `table` SET `CommentCounterReset` = `CommentCounterReset`+1 WHERE `Name`=:name");
            $stmt->execute(array(':name' => $_GET['name']));
        }
        echo "Your comment has been added.";
    }
}

mysql_*しかし、私はそれを強く思いとどまらせています!

$link = mysql_connect('localhost', 'root', '');
mysql_select_db('test', $link);

$stmt = mysql_query("SELECT `Name`, `timestamp`, `CommentCounterReset` FROM `table` WHERE `Name`='".mysql_real_escape_string($_GET['name'])."'");
$num = mysql_num_rows($stmt);

if(!$num){
    $stmt = mysql_query("INSERT INTO `table` VALUES(0, '".mysql_real_escape_string($_GET['name'])."', '".date('U')."', 1)");
    echo "Your comment has been added.";
} else {
    $row = mysql_fetch_assoc($stmt);
    $lastComment = $row['timestamp']; // timestamp from database and not from $_SESSION because $_SESSION get's destroyed.
    $countComments = $row['CommentCounterReset']; // number of comments added

    if($countComments > 4 && date('d') == date('d', $lastComment)){ // if number of comments are greater than 4 and is same day
        echo "You already wrote five comments today.";
    } else {
        if(date('d') != date('d', $lastComment)){ // if there are different days, reset the counter to 1
            $stmt = mysql_query("UPDATE `table` SET `CommentCounterReset` = 1, `timestamp`='".date('U')."' WHERE `Name`='".mysql_real_escape_string($_GET['name'])."'");
        } else { // if it's same day increase counter with 1
            $stmt = mysql_query("UPDATE `table` SET `CommentCounterReset` = `CommentCounterReset`+1 WHERE `Name`='".mysql_real_escape_string($_GET['name'])."'");
        }
        echo "Your comment has been added.";
    }
}

私のtable

CREATE TABLE `table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `Name` varchar(30) NOT NULL,
  `timestamp` int(11) NOT NULL,
  `CommentCounterReset` int(11) NOT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
于 2012-09-23T09:43:19.383 に答える
1

あなたが書く:

$counter = mysql_query("SELECT FROM table VALUES CommentCounterReset WHERE Name = '$name'");

if  ($counter >= 5) {

...しかし、クエリの結果ではなく、$counterリソースです。したがって、比較には欠陥があります。

クエリを実行してから値を取得する必要があります。

$exec = mysql_query("SELECT CommentCounterReset FROM table WHERE Name='$name';");
// Insert considerations about SQL injection and benefits of PDO here :-)
$tuple = mysql_fetch_assoc($exec);         // Might also do with fetch_array
$counter = $tuple['CommentCounterReset'];  // and $tuple[0]

ただし、制限を超えないようにするためのより良い方法は、ほとんどの作業を SQL に任せることです。投稿の名前と日付を保存します。テーブル内の行の総数は最大 5*number_of_users です。このようにして、同じ日に (24 時間ではなく) 投稿をチェックします。

// Clean the table. This will be done frequently, and it will be very fast
mysql_query("DELETE FROM comment_counters WHERE day < date(now());");
// It is also possible to add "... AND name='$name'" to the WHERE to reduce
// the number of affected rows; in this case the first version of the query
// ought to be run as a maintenance as near midnight as possible.

$exec = mysql_query("SELECT COUNT(*) < 5 AS ok FROM comment_counters WHERE name='$name';");
$data = mysql_fetch_assoc($exec);
mysql_free_result($exec);
$okay = $data['ok'];
if ($okay)
{
   // Okay to post
   mysql_query("INSERT INTO comment_counters (day, name) VALUES (date(now()), '$name');");
   // Do the rest of the posting
}
else
{
   // Cannot post.
}
于 2012-09-23T16:01:05.983 に答える