2011-05-10 3 views
1

사용자 환경 설정의 마스터 목록을 유지 관리하는 PHP/MySQL 응용 프로그램을 작성 중이며 그 목록에서 항목을 제거하려고 노력했습니다. 현재 응용 프로그램은 항목 목록을 생성하고 사용자가 이전에 선택한 항목 옆에 체크 표시를 한 다음 사용자는 선택 항목을 변경 (체크 표시를 추가 또는 제거) 한 다음 다시 제출할 수 있습니다. 이 양식은 사용자가 확인한 항목에 대해서만 supplyid를 제출합니다.

표시되지 않은 선택 항목이 먼저 표시되고 데이터베이스의 항목을 삽입/업데이트하는 코드가 있으므로 목록이 정렬되어 있지만 사용자가 선택하지 않은 항목을 삭제하는 방법을 찾는 데 문제가 있습니다. (그리고 지금은 supplyid를 반환하지 않습니다).

이 시점에서 필자는 목록에 이전에 포함 된 결과 만 반환하도록 MySQL 쿼리를 작성했습니다 (제거 할 필요가있는 유일한 결과이므로). 배열에있는 항목이 필요합니다 어떤 $ _POST 결과와도 일치하지 않는 쿼리에 의해 반환됩니다. 이전에 포함 된 항목의 $ _POST 결과와 배열을 성공적으로 비교했지만, 일치하지 않는 결과를 다시 얻으려는 부분에서 논리가 잘못되었다는 것을 알 수 있습니다. 일치하는 항목을 볼 수는 있지만 가능성을 제거하는 방법을 모르겠습니다. 나는 이것에 대해 완전히 잘못된 방향으로 가고 있는가?

$iduser = $_SESSION["iduser"]; 
$possibleresults = $_POST["possibleresults"]; 
$sql_onlist = "select supply.idsupply from supply, kit 
        where supply.class = 'basic' 
         and kit.iduser = '".$iduser."' 
         and supply.idsupply = kit.idsupply"; 

$possible_delete = $connection->query($sql_onlist); 

//for each record we know is already in the database, check to make sure it has been checked, otherwise delete 
for ($i=0; $i<$possibleresults; $i++) { 
$count = 0; 
$item_delete = $possible_delete->fetch_assoc(); 
if ($_POST['item_'.$i.'']) { 
    $idsupply = $connection->real_escape_string($_POST['item_'.$i.'']); 
//if there is a match, increase the counter 
if ($idsupply == $item_delete["idsupply"]) { 
    $count++; 
    //this does successfully return a count = 1 - idsupply = number for all rows which should have matches 
     echo "count = ". $count . " - idsupply = " . $idsupply; 
}   
    //this statement doesn't work because it doesn't know which idsupply 
    if ($count < 1) { 
     $idsupply = $item_delete["idsupply"]; 
     $sql_delete = "delete from kit 
        where idsupply = '".$idsupply."' 
        and iduser = '".$iduser."'"; 
    $result_delete = $connection->query($sql_delete); 
    } 
} 
+0

가지고 방금 (당신이 체크 박스를 보여 주었다) 당신이를 처음로드하는 데 사용 같은 PARAMS와 목록을 다시로드하고 그에 대해 비교하는 시도? – JohnP

+0

모든 옵션을 삭제하는 것이 더 쉬우 며 확인 된 옵션 만 읽으면됩니다. 그것은 본질적으로 당신이하려고하는 것입니다 – JohnP

답변

0

성령 아니네, 무엇 얽힌 혼란 같은 것을 필요가 있다고 생각? 우리 모두에게 아무런 걱정이 없습니다. :)

그래서 나는 일단 당신이 진정으로 작동하는 알고리즘을 가지고 있다면 코드가 그 주위에 함께 온다고 생각합니다. 그럼 문제를 분석해 보겠습니다.

  • 주요 목표는 사용자 설정을 저장하는 것입니다.

  • 양식과 확인란을 사용하면 현재 설정을 표시하고 사용자가 현재 설정을 변경할 수 있습니다. 이것은 충분히 우아합니다.

  • POST 된 설정 (일명 POST 배열에서 새 설정 가져 오기)의 목록을 생성하고 그 결과를 배열 또는 연결된 목록과 같은 전용 데이터 컨테이너에 저장합니다.

  • 일단 새 설정 목록이 있으면 해당 목록을지도로 사용하여 데이터베이스 테이블 내의 다양한 필드를 설정/설정 해제해야합니다.

  • 모든 사용자의 목록을 가져가 변수가 일치하는 경우, 또 다른 데이터 결과를 기록보고, 다른 데이터 컨테이너에

  • 이 경우에 비교하여 케이스를 수행한다는 저장하는 데이터베이스의 설정을 저장 컨테이너에 저장하거나 데이터베이스에 즉시 쓰십시오.

  • 사람이 읽을 수있는 결과를 사용자에게 제시하십시오.

    참고 : 덧붙여 말하자면, 이미 알고 있을지 모르지만 isset($_POST['mychkbox1'])을 사용하고 양수 값을 반환하면 해당 확인란이 선택되었습니다. isset()이 false를 반환하면 확인란이 설정되지 않았거나 존재하지 않습니다. 내가 이미 말했듯이 아마 당신은 이미 그것을 알았지 만, 나는 그것을 거기 던져 넣는 것 같았습니다.

    행운

시간

+0

하루의 빛에 대한 답은 모든 기록을 삭제하지 않고도 내가해야 할 일을 통해 당신의 대답이 나왔습니다. (이 경우 다른 곳에서 테이블에 저장된 필드가 있고 숨겨진 입력으로 필드를 전달하지 않으면 작동하지 않습니다. 그들은 잃어 버렸습니다) 또는 전적으로 테이블을 재구성 (비록 그것이 내가 "구석에 나를 그린"이라는 가난한 형태의 디자인이라고 인정하지만!) 너무 감사드립니다! – Becca

+0

@Becca, 기꺼이 도와 드리겠습니다 :) 프로그래밍 할 때 따라야 할 가장 좋은 규칙 중 하나는 "Occam 's Razor"입니다. "가장 간단한 해결책은 가장 정확한 해결책입니다."라는 개념입니다. 당신이 모퉁이에서 벗어난 것처럼 들리고 도로에서 다시 운이 좋다! – hypervisor666

2

이 문제에 대한 몇 가지 해결책이 있습니다. 여기 제가 전에 사용했던 몇 가지 전략이 있습니다.

- 는 사용자의 환경 설정
대단히 효율적이지를 업데이트 모든 항목마다 삭제하지만, 구현하기가 쉽다. 그들이 선호도를 저장할 때마다 먼저 '확인되지 않은'값이 무엇이든간에 데이터베이스의 모든 값을 설정하십시오. 그런 다음 기본 설정을 저장합니다.

- 가 바로 체크 박스 전에 숨겨진 입력 요소를 넣으면되지 ​​않은 상자에 값
을주고 확인란과 동일한 이름을주고, 그 값을 제출 숨겨진 요소 확인란이 선택되지 않을 때마다. 예 :

<input type='hidden' name='box1' value='off' /> 
<input type='checkbox' name='box1' value='on' /> 

이렇게하면 데이터베이스에서 설정 해제 할 ID를 알 수 있습니다.

더 많은 데이터베이스 지향 솔루션이있을 수 있지만 귀하의 구조에 대해 더 자세히 알아야합니다.

+0

Gah, 똑같은 대답으로 20 초 동안 맞습니다. – Phil

+0

+1은 숨겨진 필드 트릭에 대해 알지 못했습니다. 나는 들판을 생성하는 케이크를 알아 차 렸지만 결코 두 가지 사실을 연결하지 않았다. – JohnP

+0

고마워! 그것은 깔끔한 트릭입니다 (2am이 아니었을 때 구현하려고합니다 ...) 한편, 삭제/다시 추가 작업은 아름다운 것입니다! – Becca

0

나는 확실히 당신의 코드를 이해하지 못했지만, 내가 좀 어 코너에 자신을 그린 ...이

$to_keep = array(); 
for ($i=1 ; $i < 10 ; $i++) { 
    // Add ids of elements we want to save 
    $to_keep[] = $i; 
} 
if ($to_keep) { 
    mysql_query("DELETE FROM table WHERE id NOT IN (". implode(',', $to_delete) . ")"); 
} 
관련 문제