2017-12-03 10 views
0

私のウェブサイトには1つの選択ボックスと1セットのラジオボタンがあります。私はradiobuttonを変更した後にselectboxの値を保持したい。2つの投稿の後にselectの価値を保持する方法は?

「:未定義のインデックス:checkGameライン上の11

お知らせ:未定義のインデックス:checkGameライン13上のご注意」を私は選択ボックスで値を保つことができたが、私は他のラジオボタンを押したとき、私はこのエラーを取得しますここで

は私のコードです:

​​
+0

2番目のフォームは何も影響しないようです。少なくとも、フォームが送信されたときに処理されるコードは共有されていません。あなたは、私が思ったように、ただ一つの形を持つことができました!また、SQLはSQLインジェクションに対して脆弱です。 – RamRaider

+0

2番目のフォームのコードを追加しました。この2つの形式の理由は、コードを別の場所に置いて、もう一度考えてみたいということでした。私はおそらくまだ1つのフォームでそれを持つことができます...ありがとう!この脆弱性を修正するために何ができますか? – Leyer

+0

私はちょうど1つのフォームを使用したときすべてのうまくいった。私は遅れていた。午前3時にコード化すべきではありません。乾杯!私はまだ脆弱性について聞くのが大好きです。 – Leyer

答えて

0

はしばらくの間、コードを見ると、SQLインジェクションを防ぐための必要性を言及した後、私はその後、時間を費やし次のコードを一緒に盛り込んでみてください。コードは最初にprepared statementの使い方を示していましたが、最終的には以下のようになりました。これらのどれもテストされていないので、ここに文法エラーがある可能性があります。

は二つの形式を有していると私の心にはポイントが見えた - そう、彼らはここに統合されているとsortラジオボタンは、ゼロの値を持つ隠しフィールドを持っている - ここでの考え方は、何のラジオボタンがあり、その後選択されていない場合送信された値は常に0になります。これはPOST配列を処理する場合に便利です。

各ゲームの名前は、処理が行われる前に配列に定義されています。POSTされた値が有効であることを確認できます。また、SELECTメニューオプションとRADIOボタンを動的に生成できます。変数('game' & 'sort')は、どのボタンが押されたかにかかわらず、以前に提出された値を記憶するという本来の目的を可能にします。

<?php 

    session_start(); 



    /* 
     include database connection script or define here 
    */ 

    $dbhost = 'localhost'; 
    $dbuser = 'root'; 
    $dbpwd = 'xxx'; 
    $dbname = 'xxx'; 
    $db  = new mysqli($dbhost, $dbuser, $dbpwd, $dbname); 




    if(!isset($_SESSION['game']))$_SESSION['game']=false; 
    if(!isset($_SESSION['sort']))$_SESSION['sort']=false; 


    $games=array(
     'Any', 
     'Garrys Mod', 
     'Counter Strike Global Offensive', 
     'Counter Strike Source', 
     'Team Fortress 2' 
    ); 
    $sorts=array(
     0, 
     'Players Descending', 
     'Players Ascending', 
     'Max Players Descending', 
     'Max Players Ascending' 
    ); 

    $svrconn=array(); 



    if($_SERVER['REQUEST_METHOD']=='POST'){ 


     if(isset($_POST['submit'], $_POST['checkGame'], $_POST['playersSort']) && $_POST['checkGame'] != 'Any'){ 
      try{ 

       $game = filter_input(INPUT_POST, 'checkGame', FILTER_SANITIZE_STRING); 
       if(!in_array($game, $games)) throw new Exception('Unknown game'); 

       $_SESSION['game']=$game; 

       /* create the sql statement with a placeholder `?` */ 
       $sql = 'select `ipaddress`, `port` from `servers` where `game`=?'; 

       /* Attempt to create the `prepared statement` */ 
       $stmt = $db->prepare($sql); 

       /* statement was successfully created */ 
       if($stmt){ 

        /* bind a variable to the placeholder & execute query */ 
        $stmt->bind_param('s', $game); 
        $result=$stmt->execute(); 

        /* Yay! There are results to process */ 
        if($result){ 

         $stmt->store_result(); 
         $stmt->bind_result($ip, $port); 

         while($rs=$stmt->fetch()){ 
          $svrconn[]=array('address'=>$ip, 'port'=>$port); 
         } 

         $stmt->free_result(); 
         $stmt->close(); 
         $db->close(); 

        } else {/* bogus - no results */ 
         throw new Exception('No results'); 
        } 
       } else { 
        throw new Exception('sql query failed to prepare'); 
       } 
      }catch(Exception $e){ 
       exit($e->getMessage()); 
      } 
     } 

     /* 
      Because of the hidden field with a value of `0` this will not be invoked 
      unless a radio button is selected. 
     */ 
     if(!empty($_POST['playersSort'])){ 
      try{ 

       $sort=filter_input(INPUT_POST, 'playersSort', FILTER_SANITIZE_STRING); 
       if(!in_array($sort, $sorts)) throw new Exception('Unknown sort'); 
       $_SESSION['sort']=$sort; 


       /* 

        presumably the array ($svrconn ~ originally $serverConnectionArray or $serverArray?) 
        is used elsewhere in the page to display content??? 


        apply filter/sorting algorithms 
       */ 
       switch(strtolower($sort)){ 
        case 'players descending': 
         uasort($svrconn, function($a,$b) { 
          return $b['Players'] <=> $a['Players']; 

         }); 
        break; 
        case 'players ascending': 
         uasort($svrconn, function($a,$b) { 
          return $a['Players'] <=> $b['Players']; 
         }); 
        break; 
        case 'max players descending': 
         uasort($svrconn, function($a,$b) { 
          return $b['MaxPlayers'] <=> $a['MaxPlayers']; 
         }); 
        break; 
        case 'max players ascending': 
         uasort($svrconn, function($a,$b) { 
          return $a['MaxPlayers'] <=> $b['MaxPlayers']; 
         }); 
        break; 
       } 
      }catch(Exception $e){ 
       exit($e->getMessage()); 
      } 
     } 
    } 

?> 


<!doctype html> 
<html> 
    <head> 
     <meta charset='utf-8' /> 
     <title>Games n stuff</title> 
    </head> 
    <body> 
     <form method='post'> 
      <fieldset> 
       Game: 
       <select name='checkGame'> 
       <?php 

        $html=array(); 
        foreach($games as $value){ 
         $selected=trim(strtolower($_SESSION['game']))==trim(strtolower($value)) ? 'selected=true' : ''; 
         $html[]="<option value='$value' $selected>$value"; 
        } 
        echo implode(PHP_EOL, $html); 
       ?> 
       </select> 
       <input type='submit' name='submit' value='Filter' /> 
      </fieldset> 

      <fieldset> 
       <?php 

        $html=array(); 
        foreach($sorts as $value){ 
         $checked=(trim(strtolower($_SESSION['sort']))==trim(strtolower($value))) ? 'checked' : ''; 

         /* 
          having a hidden field means `playersSort` 
          will always be present in POSTed data 
          (unless someone is deliberately hijacking the form) 
         */ 
         if(empty($value))$html[]="<input type='hidden' name='playersSort' value='$value' />"; 
         else $html[]="<input type='radio' name='playersSort' value='$value' $checked>$value"; 
        } 
        echo implode(PHP_EOL, $html); 
       ?> 

       <input type='submit' name='submit' value='Sort' /> 
      </fieldset> 
     </form> 
    </body> 
</html> 
+0

うわー!あなたの時間と労力にとても感謝します。私はこれに関連して自分のコードを改善します。ありがとう!! – Leyer

0

問題は、この行です:

<input type="submitSort" name="submit" value="Sort" /> 

あなたはそれがsubmit

あるべきときにはnameフィールドを使用して提出の名前を変更することができますsubmitSortの種類にあなたの送信ボタンを設定しているが、タイプはsubmitボタンはず

のように動作するように submitにする必要があります

私も$_SESSIONを使用して助言する。ここポスト

は簡単な例である後のものを保存するためにvaribles:

それはDに最善の方法ではないかもしれませんOそれ、その概念を示すために(任意の補償を編集してください)

$_SESSION['game'] = ""; 
 
    
 
    if(isset($_POST['submit']) && $_POST['checkGame'] != 'Any') 
 
    { 
 
     $_SESSION['game'] = $_POST['checkGame']; 
 
    } 
 

 
    if ($_SESSION['game'] == "1") { $gameCOD = "selected"; } else $gameCOD = ""; 
 
    if ($_SESSION['game'] == "2") { $gameBAT = "selected"; } else $gameBAT = ""; 
 
    
 
    <form method="post"> 
 
    <select name="checkGame"> 
 
     <option value="1">Any</option> 
 
     <option value="2" <?php echo $gameCOD; ?> > COD </option> 
 
     <option value="3" <?php echo $gameBAT; ?> > BATTLEFIELD </option> 
 
    </select> 
 
    <input type="submit" name="submit" value="Filter"/> 
 
    </form>

+0

大丈夫です。最初のものと同じでなければならないのですか?私はそれを試みたが、それを押すと私のサイトが壊れる。私は " 通知:未定義のインデックス:checkGameのG:\ XAMPP \ htdocs \ PHPソース - クエリマスター\例\ list.php 11行目 注意:未定義のインデックス:checkGame G:\ XAMPP \ htdocs \ PHP-Source-Query-master \ Examples \ list.php 13行目」より多くのコードで投稿を更新します。ありがとう! – Leyer

+0

あなたのコードがちょっと混乱しているので、それは難しいと言えます:) – Jesus

+0

Haha okey:DちょうどPHPで始まったので恐ろしいです。 – Leyer

関連する問題