【问题标题】:I want to implement something that doesn't allow the user to rate more than once我想实现一些不允许用户多次评分的东西
【发布时间】:2017-04-04 23:02:18
【问题描述】:

我使用了别人的代码,它使用了 ipaddress 方式。但是,我想使用一个代码来检查当前的用户 ID 和 ID 号。

$ipaddress = md5($_SERVER['REMOTE_ADDR']); // here I am taking IP as UniqueID but you can have user_id from Database or SESSION

/* Database connection settings */
$con = mysqli_connect('localhost','root','','database');

if (mysqli_connect_errno()) {
    echo "<p>Connection failed:".mysqli_connect_error()."</p>\n";
}   /* end of the connection */

if (isset($_POST['rate']) && !empty($_POST['rate'])) {
    $rate =  mysqli_real_escape_string($con, $_POST['rate']);
    // check if user has already rated
    $sql = "SELECT `id` FROM `tbl_rating` WHERE `user_id`='" . $ipaddress . "'";
    $result = mysqli_query( $con, $sql);
    $row =  mysqli_fetch_assoc();//$result->fetch_assoc();
    if (mysqli_num_rows($result) > 0) {
        //$result->num_rows > 0) {
        echo $row['id'];
    } else {
        $sql = "INSERT INTO `tbl_rating` ( `rate`, `user_id`) VALUES ('" . $rate . "', '" . $ipaddress . "'); ";
        if (mysqli_query($con, $sql)) {
            echo "0";
        }
    }
}
//$conn->close();

【问题讨论】:

  • 那么,您在尝试时遇到了什么问题?
  • 我不知道该怎么做?我是 php 新手...
  • 感谢某人的帮助,因为我在最后一年的项目中需要这个
  • 如果您不打算使用 IP 地址,您首先必须定义如何识别用户。请记住,会话 cookie 可以并且将会被删除,所以这不是要走的路。你有登录系统吗?
  • 仅供参考,您的$conn-&gt;close(); 中有太多n。如果您要取消注释关闭,请使用:$con-&gt;close();

标签: php mysqli sql-insert unique-key


【解决方案1】:

在您的数据库表中,将user_id 列设置为UNIQUE KEY。这样,如果用户尝试进行第二次投票,那么数据库将拒绝 INSERT 查询,并且您可以在受影响的行 = 0 时显示一条消息。

或者,(从用户体验的角度来看更好)您可以在加载页面内容之前抢先对登录用户执行 SELECT 查询:

$allow_rating = "false";  // default value

if (!$conn = new mysqli("localhost", "root","","database")) {
    echo "Database Connection Error: " , $conn->connect_error;  // never show to public
} elseif (!$stmt = $conn->prepare("SELECT rate FROM tbl_rating WHERE user_id=? LIMIT 1")) {
    echo "Prepare Syntax Error: " , $conn->error;  // never show to public
} else { 
    if (!$stmt->bind_param("s", $ipaddress) || !$stmt->execute() || !$stmt->store_result()) {
        echo "Statement Error: " , $stmt->error;  // never show to public
    } elseif (!$stmt->num_rows) {
        $allow_rating = "true";  // only when everything works and user hasn't voted yet
    }
    $stmt->close();
}

echo "Rating Permission: $allow_rating";

如果他们已经在表格中有一行,那么甚至不给他们再次提交的机会。

【讨论】:

  • 是的。那应该可以正常工作。但我建议添加一个新表,其中包含 user_id、post_id(或 any_id)和一个 true 或 false 的布尔字段。这样,如果同一用户再次尝试评分,您将查询它的 id 是否存在于这个新表中,如果布尔字段中的 value 为 true,则显示一条消息告诉他他无法评分。如果你想用一个IP地址是可以的,但有时他会改变他的位置,他的网络,他的电话,IP也会改变。你也应该考虑到这一点。饼干不是一个很好的解决方案。只需使用 IP 地址和额外的表
  • 为了提高安全性,我建议使用 PDO 重新编写脚本。 MySQLi 已经足够好了,但我更喜欢 PDO。
  • @AmirHD 我已更新我的答案以包括一些条件检查点以便于调试。您还有什么需要我调整或解释的吗?或者这是一个可以接受的答案?
猜你喜欢
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 2015-07-15
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多