테스트 사이트 - 개발 중인 베타 버전입니다

쿼리 결과를 바로 자바스크립 객체에 넣는 함수나 방법은 없나요? 채택완료

도레미 3년 전 조회 1,849

어제 비혼님이 알려 주신대로 아래와 같이 하니 쿼리 결과를 자바스크립 객체(obj)에 넣고 잘 인식합니다..

 

<?php

$conn = mysqli_connect("localhost", "user", "pass", "db");

$sql = "SELECT id, name FROM students";

$result = mysqli_query($conn,$sql);

$rs = '';

while($rs = $result->fetch_array(MYSQLI_ASSOC)) {

  if ($rs != "") {$rs .= ",";}

  $rs .= '{"id":"' . $rs["id"] . '",';

  $rs .= '"name":"'. $rs["name"]. '"}';

}

$rs ='{"students":['.$rs.']}';

echo $rs;

?></p>

<p><script>

const obj = <?=$rs?>;

alert(obj.student[1].name); // 2번째 학생명 

</script>

 

그런데 잘 되고 나니 또 욕심이 생깁니다. 위 쿼리의 결과값인 $result 도 어차피 배열이잖아요?

궂이 while 반복문으로 문자열($rs)로 출력한뒤 다시 객체로 만들지 않고, $result 자체를 바로 자바스크립 배열이나 객체로 변환해서 사용할 수 있는 방법은 없나요?

 

결과를 js 에서만 사용할 것이면 궂이 중간과정 없이 결과자체를 js배열이나 객체로 바꾸고 사용하면 좋지 않나 싶어서요. 예를들어 아래처럼 말이죠.(물론 아래와 같이 하니 에러가 발생합니다.)

 

<?php

$conn = mysqli_connect("localhost", "user", "pass", "db");

$sql = "SELECT id, name FROM students";

$result = mysqli_query($conn,$sql); // 결과가 배열에 다 들어 있다.

?></p>

<p><script>

const obj = <?=$result?>; //- 여기서 $result 를 js 배열로 바꿔주는 함수 같은거 없을까???

alert(obj[1][1]);  //??

</script>

 

오늘도 명쾌한 답변을 받았으면 좋겠습니다...^^

 

댓글을 작성하려면 로그인이 필요합니다.

답변 2개

채택된 답변
+20 포인트
B
3년 전

[1] 이전 질문 댓글 마지막 줄,

"PHP에서 편하게 배열에 할당, JavaScript 쪽에 json_encode() 함수 이용한 값 출력해 사용하면 됩니다."

 

해당 함수의 설명 및 예제 참고했으면 금방 해결되었을 문제군요.

 

+ json_encode()

- https://www.php.net/manual/en/function.json-encode.php

- http://docs.php.net/manual/kr/function.json-encode.php

 

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

 

[2] 질문의 코드 문제. 따로 처리했어야 합니다.

$rs = ''; // 빈 값 while($rs = $result->fetch_array(MYSQLI_ASSOC)) {   if ($rs != "") {$rs .= ",";}

 

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

 

[3] 어쨌거나 질문의 형태대로 할당 및 출력을 원하면 아래처럼 하면 됩니다.

</p>

<p><?php

$conn = mysqli_connect('localhost', 'user', 'pass', 'db');</p>

<p>$conn->set_charset('utf8mb4'); // 또는 utf8

$sql = "SELECT id, name FROM students";

$result = $conn->query($sql); // 편하게</p>

<p>$data = ['student'=>[]]; // 질문의 구조</p>

<p>while($row = $result->fetch_assoc()) { // 반복

    $data['student'][] = $row; // 차례대로 할당

}</p>

<p>?></p>

<p><script>

const obj = <?=json_encode($data,  JSON_UNESCAPED_UNICODE)?>; // \ud55c\uae00 > 한글</p>

<p>console.log(obj);</p>

<p>alert(obj.student[0].id + ", " + obj.student[0].name); // 첫 번째 학생 아이디, 이름

</script></p>

<p>

 

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

 

[4] $data = []; while ( … ) { $data[] = $row; } 처럼 할당하면

obj[0].id, obj[0].name / obj[1].id, obj[1].name / … 접근입니다.

번거롭게 student 들어갈 필요가 있나 싶어 참고로 추가.

 

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

 

[5] DB에서 제공하는 JSON 타입이 있습니다. 설명 및 예제 참고.

 

+ MariaDB

- https://mariadb.com/kb/en/json-data-type/

 

+ MySQL

- https://dev.mysql.com/doc/refman/8.0/en/json.html

로그인 후 평가할 수 있습니다

답변에 대한 댓글 5개

도레미
3년 전
감사합니다.
결국 while 반복문과 fetch_assoc 는 써야 하는군요..
저는 쿼리로 받은 $result 자체도 배열인 만큼 반복문 없이 통째로 js의 배열로 변환하는 방법이 없나 해서 올린 질문입니다.

그리고 제가 students 를 넣은 이유는 객체 하나에 이것 저것 많이 넣고 찾는 공부 좀 하느라 그랬습니다.

그래도 이제 알았으니 속은 후련합니다.
다시 한 번 감사드립니다..^^
B
BiHon
3년 전
"쿼리로 받은 $result 자체도 배열인 만큼" > 배열 아닙니다.

+ mysqli::query / mysqli_query
- https://www.php.net/manual/en/mysqli.query.php#refsect1-mysqli.query-returnvalues
도레미
3년 전
아~ 저는 fetch_assoc 로 하나씩 가져 오는 것을 보고 $result 도 당연히 2차원 배열 같은 것인 줄 알았습니다..

이제 확실하게 의문이 풀렸군요...^^
도레미
3년 전
찾았습니다.
fetch_all() 을 사용하니 반복문 없이 몽땅 변환되는군요...ㅎ
비혼님 덕분에 많은 것을 알았습니다..^^

[code]
$result = mysqli_query($conn,$sql);
$rs = $result->fetch_all(MYSQLI_ASSOC);

<script>
const obj = <?=json_encode($rs)?>;
</script>
[/code]
B
BiHon
3년 전
레코드 많을 때 사용하면 문제될 수 있으니 그 부분만 주의하면 됩니다.

댓글을 작성하려면 로그인이 필요합니다.

C
3년 전

보통은 json_encode 를 사용합니다.

</p>

<p>const obj = <?php json_encode($result)?>;</p>

<p>console.log(obj)</p>

<p>

mysqli_query 로 받아도 값을 그대로 json_encode 할 시 오류가 날 수 있어요 mysqli_fetch_assoc 같은 함수로 한번 돌려야 할 듯

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

도레미
3년 전
감사합니다.
결과 전체를 가져오려면 결국 while 같은 반복문은 사용해야 하는군요...

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인