하나의 폼안에서 2개이상의 액션이 필요할때

좋은 방법들이 많이 있군요. 🙂
자바스크립트를 이용한 방법은 일단 제쳐 두고, 하나의 폼 안에 여러개의 submit 버튼을 이용한 경우를 정리해 보겠습니다.

1. submit 버튼의 name을 동일하게 한 경우.





myscript.php:
switch ($_POST[‘action’]) {
case ‘주소록에 기록’:

break;
case ‘스팸목록에 기록’:

break;
case ‘삭제’:

break;
}

2. submit 버튼의 name을 동일하게 한 경우 두번째 예제.





myscript.php:
$keys = array_keys($action);
$action = $action[0];
$match = “/[a-zA-Z0-9]+/”;
if (preg_replace($match, ”, $action)) die (“액션 오류!!”);
if (!file_exists(“./$action.php”)) die (“파일을 찾을 수 없음”);
else include “./$action.php”;

3. 이미지 버튼을 이용할 경우.





myscript.php:
if ($_POST[‘add_address_x’] { … }
else if ($_POST[‘add_spam_x’] { … }
else if ($_POST[‘remove_x’] { … }
else { … }

참고: 이미지 버튼의 경우 $_POST 배열에 [이미지_x] => 20, [이미지_y] => 12 이런식으로 들어가기 때문에 ‘_x’를 이미지 이름 뒤에 붙였습니다.

마지막으로 PHP의 경우 submit 버튼의 name에 직접 key=value&key2=value2 식으로 하던 것을 2번째 예에서 처럼 배열로 넘기는 것이 더 간결하고 효율적일 것 같습니다.

참고로 Perl에서 구현하여 사용하고 있는 것은 다음과 같습니다. 넘어 온 submit 버튼의 name 쿼리를 파싱하여 $IN에 넣어 사용합니다.
$query가 CGI.pm의 개체라고 가정합니다.
my $IN;
for ($query->param) {
for (split /&/) {
/^([^=]+)=(.*)/ or next;
my ($key, $val) = ($query->unescape($1), $query->unescape($2));

$query->param($key => $val);
}
}

foreach ($query->param) {
$IN->{$_} = join “”, $query->param($_);
}