자바스크립트안에서 php변수 쓰기 > 십년전오늘

십년전오늘

10년전 추억의 책장을 넘기며

자바스크립트안에서 php변수 쓰기 정보

자바스크립트안에서 php변수 쓰기

본문

자바스크립트안에서 php 변수 불러서 쓰는거 정말 헷갈리는군요.

전에도 한번 이 문제(무슨 문제였나 기억도 안나지만)가지고  엄청 씨름하다가 해결한적 있는데,
또 걸렸네.

이거 왜 이렇게 예상대로 안되는 걸까. 어쩔땐 되고 어쩔땐 안되고. 제대로 이해해서 쓸려니 머리가 이리저리 꼬이고...


댓글 전체

php 변수명만 자바스크립트에서 쓸때는 큰 문제가 없는데,
그안에서 echo나 document.write 같은것과 php변수명을 포함한 html 구문들을 같이 써줄때 문제가 가끔 발생하더군요. 그냥 봐서는 문제 생길이유가 없는거 같은데, 아무리 이렇게 저렇게 해봐도 원하는 결과는 안나오고...따로 고부분만 따다가 테스트해보면 그땐 또 제대로 되고...휴
그러게요.
그런식으로 하는데 어쩔때는 변수값이 제대로 전달이 안될때가 있어요.

머리가 나빠서 근본적으로 뭐가 문제인지 이해를 못해서,
하나 하나 단계단계마다 출력해서 어디가 문젠지 단계별로 검사하는 방법밖엔 생각을 못하니 시간이 많이 걸리네요..
자바스크립트 안에서 php변수를 쓴다는
말에는 어패가 많네요..

꼼수로..
MIME type를 이용해서 php파일을 javascript처럼 출력시키고
get 방식으로 인수를 전달해주면 됩니다.
그러나 이렇게하면 파일이 캐싱되지 못할 가능성이 크기때문에
사이트 속도가 저하될수 있어요..
php는 서버 언어고 html 및 javascript는 클라이언트 브라우져 언어입니다. 서로 같이 쓸 수 없어요.

서버 언어란 서버상에서 처리되는 것을 말하고 클라이언트 언어는 클라이언트에서 브라우져에서 보기 위해 필요한 언어입니다. 따라서 php는 이미 서버에서 처리해서 보내주면 나머지 html 및 javascript를 브라우져에서 보도록 짜는 겁니다. 서로 언어라고 같이 섞어 쓴다고 생각하면 오산입니다.

예로 var g4_path = '<?php echo $g4['path'];?>';이렇게 되어 있다면 <?php echo $g4['path'];?>는 서버에서 처리해서 값을 넘깁니다. 그값을 '.'이라면 var g4_path = '.';이렇게 클라이언트로 보내지는 거죠.

이와 관련해 쉽게 하는 실수를 예로 만들면,

var s = <?php echo $s;?>;
if (s < 10) <?php $b="10보다 작아요";?>;
if (s > 10) <?php $b="10보다 커요";?>;

여기서 $s 값을 5로 주었다고 할 때 $b는 "10보다 커요"가 됩니다. 그 이유는 php는 서버상의 언어이기 때문에 먼저 처리가 됩니다. 즉 서버에서는 html이든 javascript이든 간에 무조건 텍스트로 인식하고 그 사이에 있는 <?에서 ?>사이에 있는 부분만 처리합니다. 그러므로 클라이언트에 보내지는 값은 <?와 ?>여기 사이에 있는 구분은 이미 서버에서 처리된 채로 넘어오는 겁니다.

첫 줄에서 서버는 var s = 5;를 클라이언트에 보내기 위해 출력합니다. 이부분은 다 이해합니다.

두번째 줄에서는 서버상에서 변수 $b값에 '10보다 작아요'란 값이 적용됩니다. 그리고 클라이언트에 보내는 출력은 if (s < 10); 이렇게 됩니다. php에서 출력하라는 echo가 없기 때문에 그렇게 되죠.

그리고 마지막 줄에서 서버상에서 변수 $b값에 "10보다 커요"란 값이 입력됩니다.  역시 클라이언트로 보내주는 출력은 if (s > 10);이렇게만 나옵니다.

결론적으로 서버에서 <?와 ?>로 되어 있는 부분을 먼저 처리해서 클라이언트로 보내는 텍스트는
var s = 5;
if (s < 10);
if (s > 10);
이렇게 보내지면 브라우져에서 이 자바스크립트 언어를 구현하는 겁니다.
오 우 stackoverflow 수준 댓글인데요?  ㅎㅎ  .js + php 에 관한 질문들이 stackoverflow 에 정말 많이 올라오던데....

그냥 섞일 수 있는게 아니다. 하나는 server side 고 하나는 client side 니까. php 가 선 실행되고, .js 에서 받는거다.

저는 이부분만 이해합니다. ㅋㅋㅋㅋ
꼼수라는거 아는데요. 꼼수도 잘만 쓰면 너무 편리해서요. ㅎㅎ

꼼수로 써서 되게 할려니까 머리가 아픈거지요. 정석으로 하려면 훨씬 더 머리아플거같고 하니까 어떻게 이 꼼수를 실행되게 만들려다 보니까.

if (s < 10) <?php $b="10보다 작아요";?>;
if (s > 10) <?php $b="10보다 커요";?>;
==>
if (s < 10) document.write("<?php $b="10보다 작아요";?>;");
if (s > 10) document.write("<?php $b="10보다 커요";?>;");

요렇게 고치고 여러가지를 고려를 해도, 예상대로 안나올 때가 있어서 말이죠.

그래서 고칠때마다, 쏘스보기에서 쏘스를 봐가면서, 브라우저상에서 어떻게 해석되고 있는지를 체크해가면서 테스트하거든요. 그래도 쉽게 문제가 잘 안풀릴때가 있어서 골치 아픈거죠...
결국 스텝마다 출력해서 테스트해보니까,
자바스크립트에서 php변수를 잘못써서 문제가 생긴게 아니라,

인클루드를 여러단계에서 쓰다보니까, 원래의 변수의 패스를 제대로 찾아가지 못해서 생긴문제였네요. 애꿎은 자바스크립트만 탓했네요. 휴. 인클루드 정말 주의해서 써야겠네.
전체 134,672
십년전오늘 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT