Я хочу реализовать то, что не позволяет пользователю оценивать более одного раза

Я использовал чужой код, который использует способ ipaddress. Тем не менее, я хотел бы использовать код, который проверяет текущий идентификатор пользователя и номер идентификатора.

$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();

-1

Решение

В таблице базы данных установите user_id столбец как UNIQUE KEY, Таким образом, если пользователь попытается подать второй голос, база данных откажет INSERT запрос, и вы можете просто отобразить сообщение, когда затронутые строки = 0.

В качестве альтернативы (и лучше с точки зрения UX) вы можете превентивно выполнить запрос 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";

И если у них уже есть строка в таблице, то даже не дайте им возможность снова подать заявку.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]