2013-10-06 2 views
0

여러 개의 드롭 다운 메뉴가 있습니다. 사용자가 제출 버튼을 클릭 할 때. 은 if 절의는 isset 기능은 triggerd하고 다음 코드는 어떻게해야 위의 코드는 사용자가 선택한이 선수의 이름을 반환 무엇 루프 내 쿼리 데이터베이스

if(isset($_POST["submit"])) 
    { 
    $player_id = $_REQUEST['players']; 
    var_dump ($player_id); 
      for($i=0; $i < sizeof($player_id); $i++) //query database with different player_id each time 
      { 
       foreach ($player_id as $id){ 
        $query = 'SELECT `name` FROM `player_info` 
        WHERE `player_id` = '.$id; 
        $return_names = mysql_query($query) or die(mysql_error()); 
              } 
         while($row = mysql_fetch_array($return_names)) 
         { 
          $selected[] = $row['name'];  
         }     
         var_dump($selected); 
        } 
       } 

실행됩니다. 나는 그것을 열 때 나는이 얻을 :

enter image description here

주의 내가 첫번째 위해서 var_dump에서 사용하는 $의 player_id 배열은 다른 player_id 값을 보유하고 있습니다. 내가 두 번째 배열 $에 위해서 var_dump를 수행 할 때

그러나 배열은 내가 문제가 foreach 루프에 의심의 값 "버거"

나는 데이터베이스를 쿼리하는 방법을 포함 선택했습니다. 누군가가 올바른 방향으로 나를 가리킬 수 있다면 크게 감사하겠습니다. 미리 감사드립니다.

+0

왜 u는'for'와'foreach' 루프를 모두 사용합니까? –

+0

이 스크립트는 SQL 주입에 매우 취약하다는 것을 말씀 드리고 싶습니다. http://en.wikipedia.org/wiki/SQL_injection –

답변

0

루프 for($i=0; $i < sizeof($player_id); $i++)는 과도한 루프입니다. 이 루프에서 $i을 사용하지 않으므로 필요하지 않습니다. 상상해보십시오. $ player_id 배열에 3 개의 항목이있는 경우 반복하고,이 루프의 모든 단계에서 foreach 루프를 사용하여 전체 $ player_id 배열을 한 번 더 반복합니다.

또한 안전하지 않은 메서드를 사용하여 쿼리에서 변수를 전달하고 있습니다. 가장 좋은 방법은 소득 $ _POST 변수를 숫자로 제안하면 int으로 변환하는 습관을 얻는 것입니다. 그것은 단지 하나의 문자열 $player_ids = array_map('intval', $_REQUEST['players']); 또는 $id = (int)$_POST['id'] 또는 $number = (int)$_GET['number'] 등입니다.

또 다른 것은 데이터베이스를 오버하면됩니다.모든 ID에 대해 별도의 쿼리를 작성하는 대신 IN 연산자와 함께 하나의 쿼리를 사용할 수 있습니다. 오른쪽에는 모든 ID가 쉼표로 결합됩니다.

코드의 또 다른 안전 변형은 다음과 같습니다

if (isset($_POST['submit'])) { 
    $player_ids = array_map('intval', $_REQUEST['players']); 

    //var_dump($player_ids); 

    $query = 'SELECT `name` 
     FROM `player_info` 
     WHERE `player_id` IN (' . implode(',', $player_ids) . ')'; 

    $return_names = mysql_query($query) or die(mysql_error()); 

    while ($row = mysql_fetch_assoc($return_names)) { 
     $selected[] = $row['name']; 
    } 

    //var_dump($selected); 
} 
+1

모범 사례 * 자리 표시 자 *를 사용하는 것이 좋습니다. –

+0

예, 맞았습니다. 답을 위해 자리 표시 자 사용에 대해 하나의 표를 추가했습니다. 그러나 * native * PHP는 placeholder를 사용할 기회를주지 않습니다. :) 또한 답변을 다시 작성합니다 :'$ names = $ db-> getCol ('SELECT name FROM player_info where (? a)', $ _POST [ 'players']); '. 이 변형은 더 많은 힘을 사용합니다.))))))) –

+1

확실하게 네이티브 PHP는 placeholder를 허용합니다. 사용자 정의 함수는 더 적은 * 네이티브 *입니다. 한 줄 변형은 읽기 쉽지 않습니다 * - 이것이 피해야하는 이유입니다. –

0

for 루프를 제거하면 올바르게 작동합니다. foreach을 사용하여 각 플레이어 ID를 반복하고 싶습니다. 밖에있는 for은 필요하지 않습니다.

2

힘을 사용하십시오, 루크! safeMysql 같은 추상화 라이브러리와 그것은 당신과 달리 코드

$sql = 'SELECT name FROM player_info WHERE player_id in (?a)'; 
$names = $db->getCol($sql,$_POST['players']); 

의 라인이 될 것입니다 - 그것은 주입에서 안전입니다.

0

본질적으로 동일한 루프를 두 번 실행합니다. 테이크 아웃

for($i=0; $i < sizeof($player_id); $i++){} 
-1

아무 이유없이 두 번 반복하고 있습니다.

또한 각 플레이어 ID에 대해 SELECT을 실행하는 동안 foreach 외부에서 결과를 반복하려고합니다. 즉, 마지막 반복 만 반복하게됩니다.

또한 최대 하나의 행을 생성하는 경우에만 SELECT에 반복이 필요하지 않습니다.

은 다음과 같이 그것을 시도 :

if(isset($_POST["submit"])) 
    { 
    $player_id = $_REQUEST['players']; 
    var_dump ($player_id); 
    foreach ($player_id as $id) 
    { 
    $query = 'SELECT `name` FROM `player_info` WHERE `player_id` = '.$id; 
    $return_names = mysql_query($query) or die(mysql_error()); 
    $row=mysql_fetch_array($return_names); // at most one -- or not? 
    if($row) 
     { 
     $selected=$row['name'];  
     var_dump($selected); 
     } 
    else 
     echo "Player with id $id not found in DB!"; 
    } 
    } 
+0

왜 downvote? – geomagas