Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如果“投票”表中不存在客户端IP,如何正确添加费率_Php_Sql - Fatal编程技术网

Php 如果“投票”表中不存在客户端IP,如何正确添加费率

Php 如果“投票”表中不存在客户端IP,如何正确添加费率,php,sql,Php,Sql,你好,堆栈溢出社区 到目前为止,我已经做了两个关于评级系统的主题,很高兴在你们的帮助下,我成功地实现了这一目标。它工作正常,每个人都可以投票,所以我在每次投票后将客户的IP添加到数据库表“投票”中。我想帮我做一个检查,比如:1如果客户已经投票通过,则不将其评级存储在数据库中 $ip = $_SERVER['REMOTE_ADDR']; $sql = $connection->prepare("SELECT postid, ip FROM votes WHERE ip = :ip"); $s

你好,堆栈溢出社区

到目前为止,我已经做了两个关于评级系统的主题,很高兴在你们的帮助下,我成功地实现了这一目标。它工作正常,每个人都可以投票,所以我在每次投票后将客户的IP添加到数据库表“投票”中。我想帮我做一个检查,比如:1如果客户已经投票通过,则不将其评级存储在数据库中

$ip = $_SERVER['REMOTE_ADDR'];
$sql = $connection->prepare("SELECT postid, ip FROM votes WHERE ip = :ip");
$sql->bindParam(':ip', $id, PDO::PARAM_INT); 
$sql->execute();
if($sql->rowCount() > 0){
  // I prefer to use the rowCount() but also a fetch will be ok for your task
    echo 'You already voted.';
} else { // do your saving tasks here }
另外,我如何避免插入postid和ip?它们是否已经存在于“投票”中? 例如,我为id为2的帖子投票一次,它会创建: -身份证号码:1 -职位:2 -ip:客户端的ip

当再次为同一帖子投票时,它会创建相同的信息,因此这是无用的,应该被阻止

投票表结构:

CREATE TABLE IF NOT EXISTS `votes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `postid` int(11) NOT NULL,
  `ip` varchar(15) DEFAULT NULL,
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
更新:/Full-Rate.php/

注意。

您可以使用SELECT查询检查数据库中是否已存在ip地址

$ip = $_SERVER['REMOTE_ADDR'];
$sql = $connection->prepare("SELECT postid, ip FROM votes WHERE ip = :ip");
$sql->bindParam(':ip', $id, PDO::PARAM_INT); 
$sql->execute();
if($sql->rowCount() > 0){
  // I prefer to use the rowCount() but also a fetch will be ok for your task
    echo 'You already voted.';
} else { // do your saving tasks here }

在我发布整个代码之前,我想让你试试这个。如果它有效,那么我将发布更新查询的第二部分


嗯,也许我做错了什么…它不起作用,也许我把它整合错了。我会上传整个价格。php@Stephan882你遇到了什么问题?嗯,我试着用你的代码实现了它,没有你的代码,它的行为是一样的…可能我做错了什么,但这是可以理解的,因为我是php初学者^^上面更新的代码没有你的select查询就很清楚了,但是我可以再次添加它,这样你们就可以检查我是否做错了什么,或者问题是否来自其他地方。我可以建议你们只使用INSERT查询,这样只需一次操作就可以在数据库中插入ip、postid和评级。另一个建议是将更新和插入操作分开,这样可以更有效地调试代码。是的,它可以工作,但它仍然会在DB中添加相同的新行,即使它说不成功^^^^我已经设法修复了,但我的方式有点糟糕。然而,我真的很感激你对我的一切帮助:P
<?php
    $servername = "localhost";
    $username = "root";
    $password = "oregon";
    $dbname = "project";

    try {   
        $connection = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
        $connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);  

        $sql = $connection->prepare("SELECT * FROM votes");
        if ($sql->execute()) {
            $row_votes = $sql->fetch();
            if ($row_votes['postid'] == $_POST['post_id'] && $row_votes['ip'] == $_SERVER['REMOTE_ADDR']) {
                echo "You've already voted for this post. You cannot vote again.";
            } else {
                $sql = $connection->prepare("INSERT INTO votes (postid, ip) VALUES (:postid, :ip)");
                $sql->bindParam(':postid', $postid);
                $sql->bindParam(':ip', $ip);    
                $postid = $_POST['post_id'];
                $ip = $_SERVER['REMOTE_ADDR'];
                if ($sql->execute()) {
                    echo "INSERT was successeful";
                } else {
                    echo "INSERT was unseccessful";
                }
            }
        } else {
            echo "Could not execute query";
        }
    }
    catch(PDOException $e) {
        echo "Error: " . $e->getMessage();
    }

    $connection = null;
?>