为什么这个ajax php poll Undefined index:poll?

时间:2012-10-15 11:59:20

标签: php mysql jquery

为什么我看到这个错误消息“(!)注意:未定义的索引:在第6行的D:\ wamp \ www \ poll \ poll.php中查询”当我尝试轮询时ajax中..我有两个文件

1- index.html包含获取请求

2- poll.php文件选择请求并显示结果

的index.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"  dir="ltr" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>AJAX Poll Using jQuery and PHP</title>

<link rel="stylesheet" type="text/css" href="styles.css" />
<script type="text/javascript" src="js/jquery-1.3.2.js" ></script>
<script type="text/javascript" >
$(function(){
    var loader=$('#loader');
    var pollcontainer=$('#pollcontainer');
    loader.fadeIn();
    //Load the poll form
    $.get('poll.php', '', function(data, status){
        pollcontainer.html(data);
        animateResults(pollcontainer);
        pollcontainer.find('#viewresult').click(function(){
            //if user wants to see result
            loader.fadeIn();
            $.get('poll.php', 'result=1', function(data,status){
                pollcontainer.fadeOut(1000, function(){
                    $(this).html(data);
                    animateResults(this);
                });
                loader.fadeOut();
            });
            //prevent default behavior
            return false;
        }).end()
        .find('#pollform').submit(function(){
            var selected_val=$(this).find('input[name=poll]:checked').val();
            if(selected_val!=''){
                //post data only if a value is selected
                loader.fadeIn();
                $.post('poll.php', $(this).serialize(), function(data, status){
                    $('#formcontainer').fadeOut(100, function(){
                        $(this).html(data);
                        animateResults(this);
                        loader.fadeOut();
                    });
                });
            }
            //prevent form default behavior
            return false;
        });
        loader.fadeOut();
    });

    function animateResults(data){
        $(data).find('.bar').hide().end().fadeIn('slow', function(){
                            $(this).find('.bar').each(function(){
                                var bar_width=$(this).css('width');
                                $(this).css('width', '0').animate({ width: bar_width }, 1000);
                            });
                        });
    }

});
</script>
</head>
<body>
    <div id="container" >
        <h1>User Poll</h1>
        <div id="pollcontainer" >
        </div>
        <p id="loader" >Loading...</p>
    </div>
</body>
</html>

poll.php

  <?php
    //Update database information according to your server settings
    $conn=mysql_connect('localhost', 'root', '') or die("Can't connect to mysql host");
    //Select the database to use
    mysql_select_db('ahmed') or die("Can't connect to DB");
    if(!$_POST['poll'] || !$_POST['pollid']){
        $query=mysql_query("SELECT id, ques FROM questions ORDER BY id DESC LIMIT 1");
        while($row=mysql_fetch_assoc($query)){
            //display question
            echo "<p class=\"pollques\" >".$row['ques']."</p>";
            $poll_id=$row['id'];
        }
        if($_GET["result"]==1 || $_COOKIE["voted".$poll_id]=='yes'){
            //if already voted or asked for result
            showresults($poll_id);
            exit;
        }
        else{
        //display options with radio buttons
            $query=mysql_query("SELECT id, value FROM options WHERE ques_id=$poll_id");
            if(mysql_num_rows($query)){
                echo '<div id="formcontainer" ><form method="post" id="pollform" action="'.$_SERVER['PHP_SELF'].'" >';
                echo '<input type="hidden" name="pollid" value="'.$poll_id.'" />';
                while($row=mysql_fetch_assoc($query)){
                    echo '<p><input type="radio" name="poll" value="'.$row['id'].'" id="option-'.$row['id'].'" /> 
                    <label for="option-'.$row['id'].'" >'.$row['value'].'</label></p>';
                }
                echo '<p><input type="submit"  value="Submit" /></p></form>';
                echo '<p><a href="'.$_SERVER['PHP_SELF'].'?result=1" id="viewresult">View result</a></p></div>';
            }
        }
    }
    else{
        if($_COOKIE["voted".$_POST['pollid']]!='yes'){

            //Check if selected option value is there in database?
            $query=mysql_query("SELECT * FROM options WHERE id='".intval($_POST["poll"])."'");
            if(mysql_num_rows($query)){
                $query="INSERT INTO votes(option_id, voted_on, ip) VALUES('".$_POST["poll"]."', '".date('Y-m-d H:i:s')."', '".$_SERVER['REMOTE_ADDR']."')";
                if(mysql_query($query))
                {
                    //Vote added to database
                    setcookie("voted".$_POST['pollid'], 'yes', time()+86400*300);               
                }
                else
                    echo "There was some error processing the query: ".mysql_error();
            }
        }
        showresults(intval($_POST['pollid']));
    }
    function showresults($poll_id){
        global $conn;
        $query=mysql_query("SELECT COUNT(*) as totalvotes FROM votes WHERE option_id IN(SELECT id FROM options WHERE ques_id='$poll_id')");
        while($row=mysql_fetch_assoc($query))
            $total=$row['totalvotes'];
        $query=mysql_query("SELECT options.id, options.value, COUNT(*) as votes FROM votes, options WHERE votes.option_id=options.id AND votes.option_id IN(SELECT id FROM options WHERE ques_id='$poll_id') GROUP BY votes.option_id");
        while($row=mysql_fetch_assoc($query)){
            $percent=round(($row['votes']*100)/$total);
            echo '<div class="option" ><p>'.$row['value'].' (<em>'.$percent.'%, '.$row['votes'].' votes</em>)</p>';
            echo '<div class="bar ';
            if($_POST['poll']==$row['id']) echo ' yourvote';
            echo '" style="width: '.$percent.'%; " ></div></div>';
        }
        echo '<p>Total Votes: '.$total.'</p>';
    }

3 个答案:

答案 0 :(得分:1)

更改poll.php的第6行:

if(!$_POST['poll'] || !$_POST['pollid']){

为:

if(!isset($_POST['poll']) || !isset($_POST['pollid'])){


如上所述,它假设存在$_POST['poll'],并且其值为nullfalse0。在值根本不存在的情况下,您看到的错误就是结果。解决方案是使用isset()确认变量已完全设置。


另外,改变第15行:

if($_GET["result"]==1 || $_COOKIE["voted".$poll_id]=='yes'){

if((isset($_GET["result"]) && $_GET["result"] == 1) || (isset($_COOKIE["voted"  .$poll_id]) && $_COOKIE["voted" . $poll_id] == 'yes')){


同样,正如所写的那样,它假定存在$_GET['result'],并且其值为1。在值根本不存在的情况下,您看到的错误就是结果。解决方案是再次首先确认已使用isset()设置变量,然后检查其值。



请参阅:http://php.net/manual/en/function.isset.php

答案 1 :(得分:0)

你应该改变:

if(!$_POST['poll'] || !$_POST['pollid']){

if(!isset($_POST['poll']) || !isset($_POST['pollid'])){

答案 2 :(得分:0)

当您的页面向poll.php发送没有请求数据的GET请求时,它会点击第6行并尝试评估$ _POST ['poll']。除非此时$ _POST数组中没有'poll'键,因此您会收到该错误。 在尝试评估数组键之前,使用isset()来测试数组键是否存在。如果你想测试一个键的存在,并且它被设置为评估为true的东西,那么你可以写:

if(isset($_POST['poll']) && $_POST['poll']){
    /*...code...*/
}

&&之后评估$ _POST ['poll']是可以的,因为它会停止评估isset()是否返回false。

另外,我注意到,至少在一种情况下,您将$ _POST数据直接放入mysql查询中。 Don't do that

这种处理很常见,我使用支持功能让它无忧无虑;它做了三件事:1)返回null没有通知/错误,如果键不存在2)转义字符串以防止SQL注入,如果值存在3)做一些可选类型转换,这是很好的布尔等。然后我可以用这种模式写:

$poll_id = $Input->get('poll_id', Input::INT);

if($poll_id) { /* do stuff */ }