일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 가우스
- GPS
- Google Map
- MySQL
- node.js
- phonegap
- JSON
- jQuery
- appspresso
- PHP
- jsr 296
- oracle
- Android
- MFC
- rowspan
- Ajax
- ibsheet
- sencha touch
- Spring
- Struts
- Eclipse
- 선택적조인
- swingx
- dock
- JDOM
- WebLogic
- iBATIS
- PLSQL
- tomcat
- 전자정부프레임워크
Archives
- Today
- Total
Where The Streets Have No Name
Form 배열객체를 JavaScript 와 PHP 에서 공유하기 본문
◆ 바뻐서 다 읽기 힘든분을 위한 핵심 요약 ◆
form에서 name=abc[] 식으로 배열로 선언했어도
JavaScript에서 접근은 "abc[]" 문자열로 접근할 것..,
요약끝...
많은 분들이 form 객체에서 선언한 배열을
JavaScript와 PHP에서 함께 사용하기를 원합니다.
form에서는 같은 이름을 여러번 선언하면 배열로 선언되지만
이상하게 Submit으로 넘기면 PHP에서는 배열이 사라집니다.
<input type=text name=abc>
<input type=text name=abc>
<input type=text name=abc>
위처럼 form에서 선언하면 JavaScript 내에서 document.form.abc[2].value 식의
배열로 이상없이 접근이 되는데,
php에서는 $abc 라는 단일변수로만 넘어오게됩니다.
그래서 또다시 아래와같이 선언해 봅니다.
<input type=text name=abc[]>
<input type=text name=abc[]>
<input type=text name=abc[]>
위처럼 선언하면 PHP 쪽에서는 $abc[2] 식으로 배열접근이 가능하게 됩니다.
그러나 이번에는 자바스크립트에서 접근이 안되게 됩니다.
document.form.abc[2].value <- 실패
document.form.abc.value <- 실패
document.form.abc[][2].value <- 실패
이유가 뭘까요?
원인은 form 문에서는 애시당초 배열선언이 없기때문입니다.
그냥 같은 이름을 여러번 선언한 것이 배열이 될 뿐입니다.
<input type=text name=abc[]>
<input type=text name=abc[]>
<input type=text name=abc[]>
위 선언은 마치 배열을 선언한듯 하지만 사실을 배열이 아닙니다.
단순히 name="abc[]" 라는 문자열로 인식될 뿐입니다.
<input type=text name=abc[0][]>
<input type=text name=abc[][][][][]>
<input type=text name=abc[2][3]>
어떻게 선언하더라도 배열이 생성되지 않음을 유의하십시요..
그렇다면 이렇게 선언한것과 abc[] 로 선언한 것이 똑 같나요?
<input type=text name=abcde>
<input type=text name=abcde>
<input type=text name=abcde>
그렇습니다. 그 어떤 선언을 하더라도 form객체 자체는 배열로 선언되지
않습니다, 단순 문자열로만 선언될 뿐입니다..
다만 JavaScript 쪽에서 같은 이름이 중복되면 그 때 배열로 접근이 됩니다.
그리고 문자열에 [] 가 포함되면 접근할때 차이가 있습니다.
document.form.객체이름[2].value 식으로 접근을 해야 하는대
"abc[]" 로 선언한 것과 "abcde"로 선언한 것을 똑같이 표현하면
아래와같이 될 것입니다.
document.form.abc[][2].value
document.form.abcde[2].value
그러나 abc[][2] 는 자바스크립트에서 잘못 해석하여 2차원배열로 간주하게 됩니다.
바로 그것 때문에 서로 호환이 안되는 것입니다.
그것을 극복하려면 자바스크립트쪽에 문자열임을 알 수 있도록 조치를 해주어야 합니다.
document.form["abcde"][2].value
이렇게 해 주듯이 abc[] 역시 아래처럼 해 줍니다.
document.form["abc[]"][2].value
아래는 지금 설명을 검증하는 소스입니다.
-------- test.php ---------------------
<?
echo "JavaScript로 조립된 문자열 = $fulltel <br>";
echo "PHP로 새로 조립된 문자열 = ($tel[0]) $tel[1] - $tel[2] <br>";
?>
<html>
<<script> language=JavaScript>
function check_submit() {
// "tel[]" 은 배열이 아님을 유의하세요.....
for( var i = 0; i < 3; i ++ ) {
if( ! document.test["tel[]"][i].value ) {
alert("뭐가 빠져짜나~!");
document.test["tel[]"][i].focus();
return false;
}
}
x = document.test["tel[]"];
document.test.fulltel.value = x[0].value + "-" + x[1].value + "-" + x[2].value;
return true;
}
</<script>>
<body>
<form name=test action=<?=$PHP_SELF?> onsubmit="return check_submit();">
<input type=hidden name=fulltel>
<input type=text name=tel[]>-<input type=text name=tel[]>-<input type=text name=tel[]><input type=submit value="눌러">
</form>
</body>
</html>
form에서 name=abc[] 식으로 배열로 선언했어도
JavaScript에서 접근은 "abc[]" 문자열로 접근할 것..,
요약끝...
많은 분들이 form 객체에서 선언한 배열을
JavaScript와 PHP에서 함께 사용하기를 원합니다.
form에서는 같은 이름을 여러번 선언하면 배열로 선언되지만
이상하게 Submit으로 넘기면 PHP에서는 배열이 사라집니다.
<input type=text name=abc>
<input type=text name=abc>
<input type=text name=abc>
위처럼 form에서 선언하면 JavaScript 내에서 document.form.abc[2].value 식의
배열로 이상없이 접근이 되는데,
php에서는 $abc 라는 단일변수로만 넘어오게됩니다.
그래서 또다시 아래와같이 선언해 봅니다.
<input type=text name=abc[]>
<input type=text name=abc[]>
<input type=text name=abc[]>
위처럼 선언하면 PHP 쪽에서는 $abc[2] 식으로 배열접근이 가능하게 됩니다.
그러나 이번에는 자바스크립트에서 접근이 안되게 됩니다.
document.form.abc[2].value <- 실패
document.form.abc.value <- 실패
document.form.abc[][2].value <- 실패
이유가 뭘까요?
원인은 form 문에서는 애시당초 배열선언이 없기때문입니다.
그냥 같은 이름을 여러번 선언한 것이 배열이 될 뿐입니다.
<input type=text name=abc[]>
<input type=text name=abc[]>
<input type=text name=abc[]>
위 선언은 마치 배열을 선언한듯 하지만 사실을 배열이 아닙니다.
단순히 name="abc[]" 라는 문자열로 인식될 뿐입니다.
<input type=text name=abc[0][]>
<input type=text name=abc[][][][][]>
<input type=text name=abc[2][3]>
어떻게 선언하더라도 배열이 생성되지 않음을 유의하십시요..
그렇다면 이렇게 선언한것과 abc[] 로 선언한 것이 똑 같나요?
<input type=text name=abcde>
<input type=text name=abcde>
<input type=text name=abcde>
그렇습니다. 그 어떤 선언을 하더라도 form객체 자체는 배열로 선언되지
않습니다, 단순 문자열로만 선언될 뿐입니다..
다만 JavaScript 쪽에서 같은 이름이 중복되면 그 때 배열로 접근이 됩니다.
그리고 문자열에 [] 가 포함되면 접근할때 차이가 있습니다.
document.form.객체이름[2].value 식으로 접근을 해야 하는대
"abc[]" 로 선언한 것과 "abcde"로 선언한 것을 똑같이 표현하면
아래와같이 될 것입니다.
document.form.abc[][2].value
document.form.abcde[2].value
그러나 abc[][2] 는 자바스크립트에서 잘못 해석하여 2차원배열로 간주하게 됩니다.
바로 그것 때문에 서로 호환이 안되는 것입니다.
그것을 극복하려면 자바스크립트쪽에 문자열임을 알 수 있도록 조치를 해주어야 합니다.
document.form["abcde"][2].value
이렇게 해 주듯이 abc[] 역시 아래처럼 해 줍니다.
document.form["abc[]"][2].value
아래는 지금 설명을 검증하는 소스입니다.
-------- test.php ---------------------
<?
echo "JavaScript로 조립된 문자열 = $fulltel <br>";
echo "PHP로 새로 조립된 문자열 = ($tel[0]) $tel[1] - $tel[2] <br>";
?>
<html>
<<script> language=JavaScript>
function check_submit() {
// "tel[]" 은 배열이 아님을 유의하세요.....
for( var i = 0; i < 3; i ++ ) {
if( ! document.test["tel[]"][i].value ) {
alert("뭐가 빠져짜나~!");
document.test["tel[]"][i].focus();
return false;
}
}
x = document.test["tel[]"];
document.test.fulltel.value = x[0].value + "-" + x[1].value + "-" + x[2].value;
return true;
}
</<script>>
<body>
<form name=test action=<?=$PHP_SELF?> onsubmit="return check_submit();">
<input type=hidden name=fulltel>
<input type=text name=tel[]>-<input type=text name=tel[]>-<input type=text name=tel[]><input type=submit value="눌러">
</form>
</body>
</html>