我正在使用MySQL开发一个PHP投票系统,用户通过单选按钮输入他的选择,这将进入数据库。在同一页面上,点击提交按钮后会显示用户投票的百分比。
但是代码不会超过一次。请帮我解决这个问题。
在这个程序中,我使用数据库表轮询,在其中我创建了两个名为yes
和no
的列,并将它们的值设置为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>
答案 0 :(得分:0)
此代码中存在许多误解,以及一些不完全错误但可以改进的事情。
首先,没有必要声明global $i,$j
- 在已经处于全局上下文的函数或方法之外。我想知道您是否打算将这些变量设为“适用于所有用户”,即每当有人点击“是”时,$i
都会增加,每当有人点击“否”时,$j
就会递增。不幸的是它不会那样 - 它们对于每次运行脚本都是零(技术上它们将从未初始化开始,当你递增它们时它们将发出“变量未定义”通知,并将其原始值假设为是零)。
其次,您不需要此程序的会话,除非您想要基于每个用户的用户记住某些内容,并且该数据未存储在数据库中。据我所知,你需要在每个用户的基础上存储的唯一内容是他们的投票,并且因为它存储在数据库中,所以没有别的东西要记住。 (公平地说,您可能希望记住用户已投票,因此您可以感谢他们进行投票并禁用投票按钮,但这对于有意投票不止一次的人来说是一种弱保护。)
目前尚不清楚您使用的是ob_start()
和ob_flush()
。我建议删除它们。
现在,人们发现您的问题难以理解的原因是列的数据类型尚未明确。通常情况下,投票代码会为每个选民存储一行,因此可以某些确定投票不是不诚实的。这意味着yes
和no
将是布尔人。但是,我已经知道你打算只有一行,这些值是整数。
在这种情况下,您需要使用当前值执行UPDATE
。以下是如何做到这一点:
UPDATE poll SET yes = yes + 1;
正如我所说,重新设计这个会更好,所以每个选民的选择都被记录下来 - 否则有人会多次投票,以使他们的首选候选人看起来比这种情况更受欢迎。
最后,一些一般提示:
$qry
和$res
,请使用$query
和$result
。单个字母名称适用于小循环,但不在此处 - 使用代表您的意思的变量。您不会通过缩短变量来节省性能。exit()
命令并检查您的中期结果。这是调试的本质 - 大致解决问题所在,并缩小范围直到找到不良结果的来源。CREATE TABLE
SQL,以便读者可以查看数据结构,并显示一些示例数据。这样可以解决很多最初的困惑。