2017-12-03 5 views
0

내 웹 사이트에 하나의 선택 상자와 하나의 라디오 버튼 세트가 있습니다. radiobutton을 변경 한 후 selectbox의 값을 유지하려고합니다. 나는 선택 박스에서 값을 유지하기 위해 관리했습니다하지만 난 다른 라디오 버튼을 누를 때이 오류를두 게시물 뒤에 select 값을 유지하는 방법은 무엇입니까?

"checkGame 라인 (13)에 공지 사항 : 정의되지 않은 인덱스 : checkGame 줄에 11

공지 사항 : 정의되지 않은 인덱스"를 얻을 이 라인

if(isset($_POST['submit']) && $_POST['checkGame'] != 'Any') 
    { 
     $game = $_POST['checkGame']; 
     $sql="SELECT ipaddress, port FROM servers WHERE game=('$game')"; 
     $result=mysqli_query($con,$sql); 
      $result=mysqli_query($con,$sql); 
      while ($row=mysqli_fetch_array($result)) { 
      array_push($serverConnectionArray, ["address" =>$row['ipaddress'], "port" =>$row['port']]); 
    } 
    } 
    if(isset($_POST['playersSort'])) 
    { 
     if($_POST['playersSort'] == 'Players Descending') 
     { 
       uasort($serverArray, function($a, $b) { 
       return $b['Players'] <=> $a['Players']; 
       }); 
     } 
     if($_POST['playersSort'] == 'Players Ascending') 
     { 
       uasort($serverArray, function($a, $b) { 
       return $a['Players'] <=> $b['Players']; 
       }); 
     } 
     if($_POST['playersSort'] == 'Max Players Descending') 
     { 
       uasort($serverArray, function($a, $b) { 
       return $b['MaxPlayers'] <=> $a['MaxPlayers']; 
       }); 
     } 
        if($_POST['playersSort'] == 'Max Players Ascending') 
     { 
       uasort($serverArray, function($a, $b) { 
       return $a['MaxPlayers'] <=> $b['MaxPlayers']; 
       }); 
     } 
    } 

    <form method="post"> 
    Game: 
    <select name="checkGame"> 
     <option value="Any"<?php if (isset($game) && $game=="Any") echo "selected";?>>Any</option> 
     <option value="Garrys Mod"<?php if (isset($game) && $game=="Garrys Mod") echo "selected";?>>Garrys Mod</option> 
     <option value="Counter Strike Global Offensive"<?php if (isset($game) && $game=="Counter Strike Global Offensive") echo "selected";?>>Counter Strike Global Offensive</option> 
     <option value="Counter Strike Source"<?php if (isset($game) && $game=="Counter Strike Source") echo "selected";?>>Counter Strike Source</option> 
     <option value="Team Fortress 2"<?php if (isset($game) && $game=="Team Fortress 2") echo "selected";?>>Team Fortress 2</option> 
    </select> 
    <input type="submit" name="submit" value="Filter"/> 
    </form> 

    <form action="" method="post"> 
     <input type="radio" name="playersSort" value="Players Descending">Players Descending 
     <input type="radio" name="playersSort" value="Players Ascending">Players Ascending 
     <input type="radio" name="playersSort" value="Max Players Descending">Max Players Descending 
     <input type="radio" name="playersSort" value="Max Players Ascending">Max Players Ascending 
     <input type="submit" name="submit" value="Sort" /> 
    </form> 
+0

두 번째 양식은 아무런 영향을 미치지 않거나 적어도 양식을 제출할 때 처리되는 코드를 공유하지 않았습니다. 당신은 생각했을 텐데, 단지 하나의 형식 만 가질 수있었습니다! 또한 SQL은 SQL 주입에 취약합니다. – RamRaider

+0

두 번째 양식의 코드를 추가했습니다. 두 가지 형식의 이유는 다른 위치에 코드를 갖고 싶었 기 때문에 지금 다시 생각했습니다. 나는 아마 아직도 한 가지 형태로 그것을 가질 수 있습니다 ... 감사합니다! 취약점을 해결하기 위해 수행 할 수있는 작업은 무엇입니까? – Leyer

+0

방금 ​​하나의 양식을 사용했을 때 모든 것이 작동했습니다. 나는 지체되었다.오전 3시에 코드를 작성하면 안됩니다. 건배! 그래도 취약점에 대해 듣고 싶습니다. – Leyer

답변

0

그때 시간을 보냈다 잠시 동안 코드를보고 SQL 주입을 방지 할 필요성을 언급 한 후 (어떤 보상으로 수정하시기 바랍니다) 개념을 표시 또는 다음을 함께 묶어 두는 것 - 처음에는 코드가 prepared statement을 어떻게 사용하는지 보여주기위한 것이었지만 결국 아래에서 볼 수있게되었습니다. 이것의 아무 것도는 시험되지 않는다 그래서 여기 저기에 통어론 과실이 있을지도 모르다 - 나가 용의성이있는 명백하게 될 것이다.

두 가지 형태가 있다는 것은 내 마음에 전혀 들지 않았습니다. 여기서는이 두 가지를 결합했으며 sort 라디오 버튼은 값이 0 인 숨겨진 필드가 있습니다. 라디오 버튼이 선택되지 않으면 아이디어가 나타납니다. 제출 된 값은 항상 0입니다. 이는 POST 배열을 처리 할 때 유용합니다.

처리가 완료되기 전에 각 게임의 이름이 배열로 정의됩니다. POST 된 값이 유효한지 확인할 수 있으며 SELECT 메뉴 옵션과 RADIO 버튼을 동적으로 생성 할 수 있습니다. SESSION 변수 ('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" /> 
다음

내 코드입니다3210

당신은 submit

을해야 할 때 이름을 변경할 수 있습니다 submitSort의 유형에 버튼을 제출하여 설정할하여 name 필드를 사용하여 제출하지만 형식은 제출 버튼처럼 작동하는 submit을 할 필요가해야

것은 그것은 D에 가장 좋은 방법은되지 않을 수 있습니다

나는 또한 $_SESSION 여기 포스트

후 물건을 저장하는 varibles 사용 권합니다 것은 빠른 예입니다 그것은 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

오케이. 첫 번째 것과 동일해야합니까? 나는 그것을 시도했지만 그것을 눌렀을 때 내 사이트가 깨진다. " Notice : 정의되지 않은 인덱스 : checkGame G : \ XAMPP \ htdocs \ PHP-Source-Query-master \ Examples \ list.php 11 행 Notice : G : \ XAMPP \ htdocs \ PHP-Source-Query-master \ Examples \ list.php on line 13 "내 게시물을 더 많은 코드로 업데이트합니다. 감사! – Leyer

+0

흠 당신의 코드가 조금 혼란스러워서 말하기 힘들다. – Jesus

+0

하하 okey : D 그냥 PHP로 시작 했어. 아마 끔찍해. – Leyer

관련 문제