使用php更新数据库中正确行的问题

时间:2015-03-19 20:03:48

标签: php mysql mysqli row

我正试图为在我的电台播放的艺术家创建一个投票系统。我使用的源代码来自:http://dl.howcode.org/download/97ff383c7d4dc9939c65c9e6fab2a5dc

我发现的问题是,无论选择哪个选项,投票都会使用数据库第一行中的数字进行更新,因此,例如,如果第一行有3票并且用户尝试对某人投票0票,它将把正确的艺术家的票数改为4而不是1 ......我希望这有意义吗?

我的代码是:

[编辑]我已将查询更改为fetch assoc以使其更易于理解。

<?php

    $voteID = $_GET['voteID'];
    $connect = mysqli_connect('xxx', 'xxx', 'xxx', 'xxx');
    $query = "SELECT * FROM listenervotes WHERE voteID='$voteID'" ;
    $q = mysqli_query($connect, $query);
    while($row = mysqli_fetch_assoc($q)){
        $id = $row["id"];
        $voteTitle = $row["voteTitle"];
        $voteID = $row["voteID"];
        $ipaddress = $row["ipAddress"];
        echo "<h3>$voteTitle</h3>";
        ?>
        <table>
            <form action="" method="POST">
        <?php
            $artists = "SELECT * FROM artists WHERE voteID='$voteID'" ;
            $q2 = mysqli_query($connect, $artists);
            while($r = mysqli_fetch_assoc($q2)){
                $artist = $r["artistName"];
                $votes = $r["votes"];
                $genre = $r["genre"];
                $ip = $_SERVER['REMOTE_ADDR'];
                $newIpAddress = $ipaddress."$ip, ";
                $newVotes = $votes + 1;
                if (isset($_POST['vote'])) {
                    $voteOption = $_POST['voteOption'];
                    if ($voteOption == ""){
                        die("You haven't selected anyone!");
                    }else{

                        $ipaddressE = explode(",", $ipaddress);
                        if(in_array($ip, $ipaddressE)){
                            die("You have already voted!");
                        }else{
                            mysqli_query($connect, "UPDATE artists SET votes='$newVotes' WHERE voteID='$voteID' AND artistName='$voteOption'");
                            mysqli_query($connect, "UPDATE listenervotes SET ipaddress='$newIpAddress' WHERE voteID='$voteID'");
                            die('You voted successfully!<br><tr><td>'.$artist.'</td><td>'.$genre.'</td><td>'.$votes.' Votes</td></tr>');
                        }
                    }
                }
                echo '<tr><td>'.$artist.'</td><td>'.$genre.'</td><td><input type="radio" name="voteOption" value="'.$artist.'"</td></tr>';
            }

    }
?>

我可能会遗漏一些显而易见的东西,在我看来,我认为在设置新值之前我需要迭代遍历行,如果是,如何以及在哪里?

1 个答案:

答案 0 :(得分:0)

看起来您总是循环遍历所有行并使用找到的第一个值更新相关行。添加对ID的检查应该:

<?php

$voteID = $_GET['voteID'];
$connect = mysqli_connect('xxx', 'xxx', 'xxx', 'xxx');
$query = "SELECT * FROM listenervotes WHERE voteID='$voteID'" ;
$q = mysqli_query($connect, $query);
while($row = mysqli_fetch_assoc($q)){
    $id = $row["id"];
    $voteTitle = $row["voteTitle"];
    $voteID = $row["voteID"];
    $ipaddress = $row["ipAddress"];
    echo "<h3>$voteTitle</h3>";
    ?>
    <table>
        <form action="" method="POST">
    <?php
        $artists = "SELECT * FROM artists WHERE voteID='$voteID'" ;
        $q2 = mysqli_query($connect, $artists);
        while($r = mysqli_fetch_assoc($q2)){
            $artist = $r["artistName"];
            $votes = $r["votes"];
            $genre = $r["genre"];
            $ip = $_SERVER['REMOTE_ADDR'];
            $newIpAddress = $ipaddress."$ip, ";
            $newVotes = $votes + 1;
            if (isset($_POST['vote'])) {
                $voteOption = $_POST['voteOption'];
                if ($voteOption == ""){
                    die("You haven't selected anyone!");
                }else{

                    $ipaddressE = explode(",", $ipaddress);
                    if(in_array($ip, $ipaddressE)){
                        die("You have already voted!");
                    }elseif ($voteOption === $artist) { // Don't run UPDATE when we're on the wrong row.
                        mysqli_query($connect, "UPDATE artists SET votes='$newVotes' WHERE voteID='$voteID' AND artistName='$voteOption'");
                        mysqli_query($connect, "UPDATE listenervotes SET ipaddress='$newIpAddress' WHERE voteID='$voteID'");
                        die('You voted successfully!<br><tr><td>'.$artist.'</td><td>'.$genre.'</td><td>'.$votes.' Votes</td></tr>');
                    }
                }
            }
            echo '<tr><td>'.$artist.'</td><td>'.$genre.'</td><td><input type="radio" name="voteOption" value="'.$artist.'"</td></tr>';
        }

}

&GT;