1

我正在使用 MySQL 开发一个 PHP 投票系统,用户通过单选按钮输入他的选择,这将进入数据库。在同一页面上,点击提交按钮后会显示用户投票的百分比。

但是代码不能工作超过一次。请帮我整理一下这个查询。

更多细节

在这个程序中,我使用数据库表轮询,其中我创建了两个名为的列yes并将no它们的值设置为 0。然后,我使用两个变量$i$j在单击提交按钮时更新数据库中的 yes 或 no 的值。

如果选择“是”,则$i增加其值并使用UPDATE查询将其保存。然后我从 yes 和 no 列中获取值来计算百分比。

我设置$_session['yes']存储投票“是”的选民百分比的结果,变量也是如此$_session['no']。最后,我从数据库中获取值以存储$i$j用于下次单击,但值没有改变。

PHP代码:

<?php
    ob_start();
    session_start();
    $conn=mysql_connect('localhost','root','');
    mysql_select_db('oop',$conn);
      global $i,$j; 
     if(isset($_POST['btnsav']) && isset($_POST['vote']))
      { if($_POST['vote']=='yes')
     {   $y=$i++;
    $query="update poll set yes='$y'";
    $res=mysql_query($query) or die(mysql_error());
            if($res>0)
            {
                $qry="select yes from poll";
                $res=mysql_query($qry) or die(mysql_error());
                $r=mysql_fetch_array($res) or die(mysql_error());
                $k=$r[0];

                $qry="select no from poll";
                $res=mysql_query($qry) or die(mysql_error());
                $r1=mysql_fetch_array($res) or die(mysql_error());
                $k1=$r1[0];

                $y=$k/($k+$k1);
                $y1=$y*100;
                $_SESSION['yes']=$y1;


            }

         }
               else 

         {
             $n=$j++;       
             $query="update poll set no='$n'";
             $res=mysql_query($query) or die($query);

            if($res>0)
            {

                $qry="select no from poll";
                $res=mysql_query($qry) or die(mysql_error());
                $r=mysql_fetch_array($res) or die(mysql_error());
                $k=$r[0];

                $qry="select yes from poll";
                $res=mysql_query($qry) or die(mysql_error());
                $r1=mysql_fetch_array($res) or die(mysql_error());
                $k1=$r1[0];

                $y=$k/($k+$k1);
                $y1=$y*100;
                $_SESSION['no']=$y1;


         }


          }
       }

                    $qry1="select yes from poll";
                $res1=mysql_query($qry1) or die(mysql_error());
                $r1=mysql_fetch_array($res1) or die(mysql_error());
                $i=$r1[0];

                 $qry2="select no from poll";
                $res2=mysql_query($qry2) or die(mysql_error());
                $r2=mysql_fetch_array($res2) or die(mysql_error());
                $j=$r2[0];
                   echo ceil($i);
                   echo ceil($j);
    ?>

HTML 代码:

<html>
    <head>
        <style>
            .main
            {
                margin-top: 50px;
            }
        </style>
    </head>
    <body>
        <div class="main">
        <center>
            <h2><font color="blue">Vote For India</font></h2>
        <form method="post">
            <tr>
                <td>Ques: Are you support Rahul Gandhi as PM candidate??<br /></td>
            </tr>
            <tr>
                <td>YES<input type="radio" name="vote" value="yes" /><br />
                NO<input type="radio" name="vote" value="no" /><br /></td>
            </tr>
            <tr>
                <input type="submit" name="btnsav" value="VOTE" /><br />
            </tr>
           <?php
                if(isset($_SESSION['yes']))
                {
                    echo ceil($_SESSION['yes']);
                }
                elseif (isset($_SESSION['no'])) 
                {
                   echo 'Non supportrs'.ceil($_SESSION['no']);
                }
                      ?>
        </form>
        </center>
        </div>
    </body>
</html>

PHP代码:

<?php
ob_end_flush();
session_destroy();
?>
4

1 回答 1

0

这段代码有很多误解,还有一些不完全错误但可以改进的地方。

首先,无需声明global $i,$j- 在函数或方法之外,您已经在全局上下文中。我想知道您是否打算将这些变量“用于所有用户”,即每次有人单击“是”时$i递增,每次有人点击“否”时$j递增。不幸的是,它不是那样工作的——每次运行脚本时它们都为零(从技术上讲,它们会以未初始化的形式开始,当你增加它们时,它们会发出“变量未定义”通知,并将假定它们的原始值为零)。

其次,您不需要该程序的会话,除非您想在每个用户的基础上记住某些内容,并且该数据未存储在数据库中的位置。据我所知,您需要为每个用户存储的唯一内容是他们的投票,并且由于它存储在数据库中,因此没有其他要记住的内容。(公平地说,您可能希望记住用户已投票,因此您可以感谢他们的投票并禁用投票按钮,但这对于打算多次投票的人来说是一种薄弱的保护)。

目前尚不清楚您在使用什么ob_start()以及ob_flush()用于什么。我建议删除它们。

现在,人们发现您的问题难以理解的原因是列的数据类型没有明确。通常,投票代码为每个选民存储一行,因此可以确定投票不是不诚实的这意味着yesandno将是布尔值。但是,我已经计算出您打算只有一行,并且这些值是整数计数。

在这种情况下,您需要UPDATE使用当前值。以下是如何做到这一点:

UPDATE poll SET yes = yes + 1;

正如我所说,最好重新设计它,这样每个选民的选择都会被记录下来——否则有人会投票多次,以使他们喜欢的候选人看起来比实际情况更受欢迎。

最后,一些一般提示:

  • 使您的压痕准确。使用空格或制表符并不重要,但要保持一致。如果有帮助,请在编辑器中打开不可见字符。
  • 使用有意义的变量名。不要使用$qryand $res,使用$queryand $result。对于小循环来说,单字母名称是可以的,但在这里不行——使用代表你意思的变量。您不会通过使用更短的变量来节省性能。
  • 当事情没有按预期工作时,运行代码并检查数据库。将exit()命令放在中间位置并检查您的中间结果。这是调试的本质——大致找出问题所在,然后缩小范围,直到找到错误结果的根源。
  • 在询问有关数据库CREATE TABLE的问题时,请在您的问题中提供 SQL,以便读者可以看到数据结构,并显示一些示例数据。这将消除很多最初的困惑。
于 2014-02-01T00:54:00.727 回答