2014-01-28 2 views
1

기본적으로 데이터베이스 테이블을 다시 만드는 페이지가 있으며 사용자가 한 번에 여러 레코드의 필드를 편집 할 수 있습니다. 그들은 저장을 누르면 올바른 필드 이름 배열에 내 모든 필드 이름을 유지하는 게시물을 제출합니다. 하나의 필드의 이름이 "테이블 _ [이름] []"입니다 즉이 나에게처럼 보이는 배열을 제공합니다 정확히 내가

["name"] => array(2) { 
     [0]=> "name 1" 
     [1]=> "name 2" 
} 

을 원하는 내가 편집 할 수있는 필드를 많이 가지고 방법에 대해 설명합니다. 그래서 내 질문 : 내 게시물 배열을 통해 루프 및 구조에서 비슷한 배열을 만드는 가장 좋은 방법은 무엇입니까.

$updates[1] => array{ 
    id => id from first record 
    name => name from first record 
    etc => remaining info from first record 
} 
[2] => array{ 
    id => id from second record 
    name => name from second record 
    etc => remaining info from second record 
} 

모든 단일 필드를 작성하는 것 외에 다른 작업을 수행하는 쉬운 방법이 있습니까?

+0

그래서 열을 기준으로 배열을 배열하고 행으로 그룹화 한 배열로 만들려합니다. – crush

+0

네, 그게 완벽한 방법이라고 생각합니다. – user3167249

+0

PHP/JS로 행의 인덱스를 설정하는 것이 좋습니다 (행이 어떤 것인지에 따라 다릅니다). 그러면 할 수 있습니다 : table_name [1] [name]. 더 깨끗한 방법입니다. (각 속성은 행과 연결되어 있습니다) – Loenix

답변

0

You can see this in action at IDEOne.com by clicking here.

나는 당신의 $_POST는 다음과 같은 형태 있으리라 믿고있어 :

$_POST = array(
    'id' => array(
     0 => 14, 
     1 => 15, 
     2 => 16 
    ), 
    'name' => array(
     0 => 'Jill', 
     1 => 'Jack', 
     2 => 'John' 
    ) 
); //I won't do any other columns because what's the point? 

그래서, 당신의 항목이 열을 기준으로 현재 집계됩니다. 행 단위로 집계하려고합니다.

다음은 간단한 해결책입니다. 모든 행에 id이 연결되어 있다고 가정하면 id을 몇 통 되돌려 받았는지 확인합니다. 지금

$total = sizeof($_POST['id']); 

,은 $ _POST 어레이 위에 루프 많은 시간 :

$rows = array(); 
for ($i = 0; $i < $total; $i++) { 
    $rows[] = array(
     'id' => $_POST['id'][$i], 
     'name' => $_POST['name'][$i] 
    ); 
} 

이제 $rows는 행 대신에 열별로 그룹화 정보로 채워된다.

성능 향상을 위해 콜백 및 기본 제공 배열 기능을 사용하여이 작업을 수행 할 수 있습니다.

이 논리를 많이 재사용하려는 경우 정적 함수에 배치하거나이 논리를 재사용/이동식 방식으로 수행 할 수있는 도우미 클래스를 작성하는 것이 좋습니다.


You can see this in action at this IDEOne.com demonstration by clicking here.

당신은 당신이 수동으로 입력받을 필드를 지정해야하고 싶지 않은 말을하는지. 그럴 수는 있지만 먼저 다음 질문을 해보십시오.

필드 만 $_POST에 존재한다고 합리적으로 보장 할 수 있습니까?

답변은 '아니요'이지만 대답은 '예'라고 대답하는 것입니다.

다시 말하지만, 우리는 거기에 얼마나 많은 행이 될 것입니다 우리를 알려주는 필드로 id를 사용합니다 :

$total = sizeof($_POST['id'])); 

$rows = array(); 
for ($i = 0; $i < $total; $i++) { 
    //This part changes. 
} 

지금의 내부에 우리의 루프, 우리는 $ _POST 배열을 통해 루프해야하고, 수 키 이름 :

for ($i = 0; $i < $total; $i++) { 
    $array = array(); //Create a blank array. 

    foreach ($_POST as $key => $value) { 
     $array[$key] = $value[$i]; //Add the key with it's value. Remember $value is an array here too. 
    } 

    $rows[] = $array; 
} 

내가 대답은 사용자가 그들이을 만들기 위해 클라이언트 (브라우저)에서 보내는 데이터를 조작 할 수 있기 때문에 위의 질문에 대한이 없습니다 말했다 이유 의도 한 것 이외의 일을하는 페이지 (예 : SQL 삽입, XSS 공격, 기능/서버 발견 등). 위의 예에서

, 사용자가 양식을 제출하지만, 같은 폼 요소를 추가하여 조작하는 경우 :

<input type="hidden" name="breakpage" value="true" /> 

당신은 이제하지 않은 $_POST 배열의 요소를해야합니다 배열 자체. $_POST 배열이 반복되면 페이지가 정의되지 않은 인덱스에 대한 오류를 던져서 사용자에게 에코됩니다. 오류 표시를 비활성화 할 수는 있지만 여전히 페이지가 작동하지 않습니다.

준비된 명령문을 사용하여 실제로 데이터베이스에 쓰고 값에서 XSS 시도를 확인한다고 가정 할 때, 이는 아마도 나쁠 것입니다.

이 문제를 해결하기 위해 $ _POST에서 허용되는 키 배열을 설정하고 $_POST 대신 반복 할 수 있습니다. 그러나, 당신은 명시 적으로 당신이 이것을 원하지 않는다고 말했습니다.

+0

이 솔루션을 사용하려면 모든 필드를 입력하고 입력해야합니다. 즉 field_name => $ _ 게시 [ 'field_name']. 그 부분을 우회하는 방법이 있습니까? 나는 거의 100 개의 필드 이름을 가지고있다. – user3167249

+0

필드 외에'$ _POST'에 어떤 것이 있는가? – crush

+0

아니요 모든 필드 – user3167249

관련 문제