0

ポーリングしようとすると、ajax に "( ! ) Notice: Undefined index: poll in D:\wamp\www\poll\poll.php on line 6" というエラー メッセージが表示される理由 .. 2 つのファイルがある

1- index.html に get リクエストが含まれています

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>';
    }
4

3 に答える 3

1

の 6 行目を次のように変更poll.phpします。

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

に:

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


書かれているように、それは の存在を前提とし、$_POST['poll']その値がnullfalseまたはであることに条件付けられています0。値が単に存在しない場合は、表示されているエラーが結果です。解決策は、 を使用して変数が設定されていることを確認することです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

于 2012-10-15T12:02:56.680 に答える
0

ページがリクエストデータなしでpoll.phpにGETリクエストを送信すると、6行目にヒットし、$ _POST['poll']を評価しようとします。その時点で$_POST配列に「poll」キーがないことを除いて、エラーが発生します。isset()を使用して、配列キーを評価する前に、配列キーの存在をテストします。キーの存在と、それが評価対象に設定されていることの両方をテストしたい場合は、次のtrueように記述します。

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

&&isset()がfalseを返すと評価を停止するため、の後に$_POST['poll']を評価しても問題ありません。

また、少なくとも1つのケースで、$_POSTデータをmysqlクエリに直接入れていることに気づきました。それをしないでください

この種の処理は非常に一般的であるため、サポート機能を使用して心配する必要はありません。それは3つのことを行います:1)nullキーが存在しない場合は通知/エラーなしで戻ります2)値が存在する場合はSQLインジェクションを防ぐために文字列をエスケープします3)ブール値などに適したオプションの型キャストを行います。次に、このパターンで書くことができます:

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

if($poll_id) { /* do stuff */ }
于 2012-10-15T12:29:58.937 に答える
0

変更する必要があります:

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

if(!isset($_POST['poll']) || !isset($_POST['pollid'])){
于 2012-10-15T12:02:31.053 に答える