2010-07-13 10 views
2

나는 여기서 너트하려고한다. 나는 PHP로 $_POST을 시도하는 폼의 체크 박스 배열을 가지고있다. 확인란을 제외한 모든 게시물이 내 게시물에 잘 표시됩니다. 확인란이 DO 게시이지만 잘못된 순서로 표시됩니다. 예를 들어, 내가 checkbox[0]checkbox[2]을 원할 때 나는 실제로 checkbox[0]checkbox[1]을 얻습니다.PHP 체크 박스 문제

isset을 비롯한 여러 가지 방법으로 확인란의 값을 가져 왔지만 여전히 동일한 문제가 있습니다. 확인란을 실제로 선택하면 데이터베이스에 저장 될 체크 박스 값이 on이어야합니다.

내 코드는 다음과 같습니다. $in_production이 확인란입니다. 필요한 경우 확인란을 생성하는 코드도 제공 할 수 있습니다.

미리 감사드립니다.

if ($_GET['action'] == 'Edit_Product'){ 

    include("../dbinfo.php"); 

    $q_id = $_GET['q_id']; 

    for ($i = 0; $i < count($_POST['p_id']); $i++){ 

     $result = mysql_query('SELECT * FROM products WHERE q_id = '.$q_id); 
     $num = mysql_num_rows($result); 

     $p_id = ($_POST['p_id'][$i]); 
     $in_production = ($_POST['in_production'][$i]); 
     $p_name = ($_POST['p_name'][$i]); 
     $p_price = ($_POST['p_price'][$i]); 

     $p_name_conflict = FALSE; 

     for ($ii = 0; $ii < $num; $ii++){ 
      $row = mysql_fetch_array($result); 
      $p_name_conflict_check = $row['p_name']; 
      $p_id_conflict_check = $row['p_id']; 

      if($p_name_conflict_check == $p_name && 
       $p_id_conflict_check != $p_id){ 
       $p_name_conflict = TRUE; 
      } 

     } 

     if ($p_name_conflict == FALSE){ 
      $query = "UPDATE products SET p_name='$p_name', 
       p_price='$p_price', in_production='$in_production', 
       last_modified=CURDATE() WHERE p_id = '$p_id'"; 
      mysql_query($query); 
     } 

     else{ 
      $update_failures =+1; 
     } 

    } 

    mysql_close($link); 

    if($update_failures == 0){ 
     header("Location: Products_Updated.html"); 
    } 

    elseif ($update_failures != 0){ 
     header("Location: Products_Exist.php?update_failures=".$update_failures); 
    } 

} 

P. 나는 이유를 모르지만 코드 블록 아이콘이 현재는 존재하지 않으므로 ... 내 코드가 모두 아름답지는 않다. 또한, 내 코드가 엄청나게 비효율적이라는 것을 알고 있지만, 지금 당장이 코드를 작동 시키려고하고있다가 나중에 미세 조정하십시오. 나는 효율성 제안에 대해서도 개방적이지만이 질문에 대한 나의 주요 목표는 아니다.

편집 : 여기에 HTML에서 양식을 ...

 <form id="form" name="form" method="post" action="/Management/Products/Product_Management.php?action=Edit_Product&q_id=<?php echo "$q_id" ?>"> 

       <?php 

        include("../dbinfo.php"); 

        $result = mysql_query('SELECT * FROM products WHERE q_id =' . $q_id); 
        $num = mysql_num_rows($result); 
        mysql_close($link); 

        for ($i = 0; $i < $num; $i++){ 
         $row = mysql_fetch_array($result); 

         $p_id = $row['p_id']; 
         $p_name = $row['p_name'];    
         $p_price = $row['p_price']; 
         $in_production = $row['in_production']; 
         $date_added = $row['date_added']; 
         $last_modified = $row['last_modified']; 

         if($in_production == 'on'){ 
          $checked = 'checked'; 
         } 

         else{ 
          $checked = ''; 
         } 

         echo "<div>Product ID# " . $p_id . "<label style=\"font-style:italic\"> (Originally added on " . $date_added . ", last modified on " . $last_modified . ")</label></div><br/>"; 
         echo "<input id=\"p_id" . $p_id . "\" class=\"text\" type=\"hidden\" name=\"p_id[]\" value=\"" . $p_id . "\"/>"; 

         echo "<label>Product Name *</label><br/>"; 
         echo "<div><label style=\"font-style:italic\">(Product still in production <input type=\"checkbox\" name=\"in_production[]\"" . $checked . " style=\"width:15px\"/>)</label></div>";  
         echo "<input id=\"p_name" . $p_id . "\" class=\"text\" type=\"text\" name=\"p_name[]\" maxlength=\"20\" onfocus=\"on_focus(this)\" onblur=\"on_blur(this)\" value=\"" . $p_name . "\"/><br/><br/>"; 

         echo "<label>Product Price *</label><br/>"; 
         echo "<div><label style=\"font-style:italic\">(Without taxes)</label></div>"; 
         echo "<input id=\"p_price" . $p_id . "\" class=\"text\" type=\"text\" name=\"p_price[]\" maxlength=\"6\" onkeypress=\"return currency(this, event)\" onchange=\"currency_format(this)\" onfocus=\"on_focus(this)\" onblur=\"on_blur(this)\" value=\"" . $p_price . "\"/><br/><br/><br/><br/>"; 

        } 

       ?> 

      <input class="button" type="button" value="Submit" onclick="product_edit_form_check()"/><br/><br/> 

     </form> 

답변

3

양식을 만드는 방법을 볼 수 있도록 일부 HTML 파트를 게시 할 수 있다면 도움이 될 것입니다. 배열에 인덱스가없는 체크 박스를 생성하는 것처럼 보이므로 모든 체크 박스의 이름/ID는 "checkbox []"입니다. 인덱스는 신경 쓰지 않아도 괜찮습니다. 그러나 게시되면 배열의 번호가 매겨집니다. "0"에서 시작하여 "0"과 "2"가 체크 된 경우에도 "0"과 "1"이 게시되는 이유입니다.

HTML을 생성 할 때 "checkbox [0]", "checkbox [1]", "checkbox [2]"등과 같이 확인란의 이름/ID 번호를 지정하십시오. 그래서 체크 박스 0과 2를 체크하면 올바른 인덱스를 포함한 값을 게시해야합니다.

+0

나는이 시도를 줄 것이다,하지만 내 질문은 왜 다른 모든 게시물이 잘 작동하는지 ('checkbox [0]')와 같은 확인란에 필요한 대괄호 사이에있는 숫자입니다. 대괄호 사이에 숫자가 없으면 (이'other_inputs [])')? – ubiquibacon

+0

이것은 효과가 있고 쉬운 수정 이었지만 위에서 설명한 내 의견에서와 같이 확인란이있는 대괄호와 다른 입력이 아닌 대괄호 사이에 숫자를 지정해야하는 이유는 무엇입니까? HTML을 모든 입력에 대해 똑같은 방식으로 생성했습니다 ... 이치에 맞지 않습니다! – ubiquibacon

+0

알 수 있듯이 p_id, p_name 및 p_price는 확인란이 아니므로 아무 것도 입력하지 않아도 배열이 * 완전히 * 게시됩니다. Sohnee가 이미 지적했듯이 체크 박스가 선택되지 않으면 체크 박스가 제출되지 않으므로 HTML에 인덱스를 제공하지 않으면 체크 박스 [] - 배열의 번호가 다시 매겨집니다. – Select0r

3

는 HTML 체크 박스로 명심해야 할 것은 그들이 선택하는 경우 그들은 단지 값을 POST 것을입니다. 확인되지 않은 경우 게시되지 않습니다.

이 점을 염두에두고 각 체크 박스에 이름을 부여한 다음 POST에서 테스트하여 통과했는지 여부를 감지해야합니다.

if (isset($_POST['MyCheckbox'])) { 

} // else it wasn't checked! 
+0

체크 박스가 선택된 경우에만 값을 게시한다는 사실을 알고 있으며 값이 '켜짐'임을 이해합니다. 모든 체크 박스는 같은 배열에 있으므로'$ checkbox = ($ _POST [ 'checkbox'] [$ i]); '를 사용하여 for 루프에서 체크 박스의 값을 얻을 수 있어야합니다. 작업 중 ... – ubiquibacon

1

체크 박스의 HTML을 보여주십시오.

또한 SQL 인젝션 공격이 발생하기 때문에 사용자는 쿼리가 끝날 때까지 원하는 SQL을 얻을 수 있습니다. 이런 식으로 뭔가가 신뢰할 수없는 데이터로 무엇을해야하는지 설명 : 당신이 좋아하는 체크 박스의 이름을 선언하면

//we're expect a number, so ensure we get one 
$q_id = intval($_GET['q_id']); 

//get into the habit of quoting query params, 
//or better yet, use a wrapper library to help you 
$sql="select * from products where q_id='".mysql_real_escape_string($q_id)."'"; 
+0

intval을 사용한 후에도 이스케이프가 필요합니까? – Svish

+0

아니, 나는 좋은 습관을 설명하려고 노력했다. 흔히 매개 변수의 소스와 사용법은 다른 코드 블록이나 실제로는 다른 파일에 있으므로 항상 쿼리 매개 변수를 이스케이프 처리하는 습관을 가지는 것이 좋습니다. –

1

이 ([] p_id), 그것은 "나를 위해 그것을 열거 나 배열에 요소를 추가 해요"PHP 말처럼 . PHP 에서처럼 array [] = 't'; 다른 이름을 가진 폼 요소가 여러 개 있고 동기화 된 ID를 갖고 싶다면 HAVE 인덱스를 추가해야합니다. 그렇지 않으면 브라우저는 선택된 것만 전송할 수 있고 PHP는이를 연속적으로 열거하기 때문입니다.

p_id [INDEX] 등을 사용하여 색인을 지정할 수 있습니다. 여기서 색인은 무엇이든 (숫자 또는 영숫자를 제안합니다).

또한 확인란의 값을 변경할 수 있으므로 사용하는 것이 좋습니다. value = "1"로하면 도움이된다.

<input type="checkbox" name="p_id[0]" value="1" /> 

PHP에서 당신은

$_POST['p_id'] ===> array(0 => 1); 

등 caetera을 받게됩니다.

+0

원래 체크 박스의 값에'1' 또는'0'을 사용하고 있었는데, 체크 박스에'1'과'0'을 사용하면 JavaScript에서 잘 작동하기 때문입니다. 불행하게도 나는 PHP에서 작동하지 못했고, PHP에 체크 박스로 게시 된 값은 선택하면 'on'이고 선택하지 않으면 아무 것도 읽지 않습니다. 귀하의 설명 주셔서 감사합니다, 그것은 더 명확하게되고있다. – ubiquibacon