1

私はMySQLを使用してPHPで投票システムを開発しています。ユーザーはラジオボタンを使用して選択を入力すると、データベースに入力されます。同じページで、送信ボタンをクリックすると、ユーザーの投票率が表示されます。

しかし、コードは複数回は機能しません。このクエリを整理するのを手伝ってください。

さらに詳しく

このプログラムでは、データベース テーブル ポーリングを使用して、and という名前の 2 つの列を作成しyesnoそれらの値を 0 に設定します。次に、2 つの変数$iandを使用$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ます。残念ながら、そのようには機能しません-スクリプトを実行するたびにゼロになります(技術的には、初期化されていない状態で開始され、インクリメントすると「変数未定義」通知が発行され、元の値がゼロになる)。

第 2 に、ユーザーごとに何かを記憶する必要があり、そのデータがデータベースに格納されていない場合を除き、このプログラムにはセッションは必要ありません。私が知る限り、ユーザーごとに保存する必要があるのは投票だけです。それはデータベースに保存されるため、他に覚えておく必要はありません。(公平を期すために、ユーザーが投票したことを覚えておくことをお勧めします。そのため、投票に感謝し、投票ボタンを無効にすることができますが、それは、複数回投票するつもりの人に対する弱い保護です).

ob_start()あなたが何のために何のために使っているのかは明らかではありませんob_flush()。それらを削除することをお勧めします。

さて、あなたの質問を人々が理解しにくいと感じたのは、列のデータ型が明確にされていなかったからです。通常、投票コードは投票者ごとに行を格納するため、投票が不正ではないことをある程度確信できます。yesこれは、 andnoがブール値であることを意味します。ただし、行が 1 つだけであることを意図しており、これらの値は整数カウントであることがわかりました。

UPDATEその場合、現在の値を使用して実行する必要があります。はいの場合の方法は次のとおりです。

UPDATE poll SET yes = yes + 1;

私が言うように、これを再設計して、各有権者の選択が記録されるようにしたほうがよいでしょう。

最後に、いくつかの一般的なヒント:

  • インデントを正確にします。スペースやタブを使用するかどうかは問題ではありませんが、一貫性を保ちます。役立つ場合は、エディターで非表示の文字をオンにします。
  • 意味のある変数名を使用してください。と を使用しないでください。$qry$resを使用$queryしてください$result。小さなループでは一文字の名前でも構いませんが、ここではそうではありません。意味を表す変数を使用してください。変数を短くしてもパフォーマンスは向上しません。
  • 期待どおりに動作しない場合は、コードを実行してデータベースを調べます。コマンドexit()を中間の場所に配置し、中間結果を調べます。これがデバッグの本質です。問題がどこにあるのかを大まかに調べ、悪い結果の原因が見つかるまでそれを絞り込みます。
  • データベースについて質問するときCREATE TABLEは、質問に SQL を含めてください。読者がデータ構造を確認し、サンプル データも表示できるようにします。そうすれば、最初の多くの混乱が解消されたはずです。
于 2014-02-01T00:54:00.727 に答える