投票系统和PHP会话无法正常工作

时间:2014-01-31 19:27:42

标签: php mysql session session-cookies voting-system

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

但是代码不会超过一次。请帮我解决这个问题。

更多细节

在这个程序中,我使用数据库表轮询,在其中我创建了两个名为yesno的列,并将它们的值设置为0.然后,我使用两个变量$i和{{1用于在单击“提交”按钮的数据库中更新“是”或“否”的值。

如果"是"然后选择$j递增其值并使用$i查询保存它。然后我从yes和no列中获取值来计算百分比。

我设置UPDATE来存储投票选民的百分比结果"是",以及变量$_session['yes']的相同结果。最后,我从数据库中获取值以存储在$_session['no']$i中,以便下次单击,但值不会更改。

PHP代码:

$j

HTML CODE:

<?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);
    ?>

PHP代码:

<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>

1 个答案:

答案 0 :(得分:0)

此代码中存在许多误解,以及一些不完全错误但可以改进的事情。

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

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

目前尚不清楚您使用的是ob_start()ob_flush()。我建议删除它们。

现在,人们发现您的问题难以理解的原因是列的数据类型尚未明确。通常情况下,投票代码会为每个选民存储一行,因此可以某些确定投票不是不诚实的。这意味着yesno将是布尔人。但是,我已经知道你打算只有一行,这些值是整数。

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

UPDATE poll SET yes = yes + 1;

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

最后,一些一般提示:

  • 准确缩进缩进。使用空格或制表符无关紧要,但要保持一致。如果它有帮助,请在编辑器中打开不可见的字符。
  • 使用有意义的变量名称。请勿使用$qry$res,请使用$query$result。单个字母名称适用于小循环,但不在此处 - 使用代表您的意思的变量。您不会通过缩短变量来节省性能。
  • 当事情无法按预期工作时,请运行代码并检查数据库。在中间位置放入exit()命令并检查您的中期结果。这是调试的本质 - 大致解决问题所在,并缩小范围直到找到不良结果的来源。
  • 在询问有关数据库的问题时,请在您的问题中提供CREATE TABLE SQL,以便读者可以查看数据结构,并显示一些示例数据。这样可以解决很多最初的困惑。