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

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

QA

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

본문

어제 비혼님이 알려 주신대로 아래와 같이 하니 쿼리 결과를 자바스크립 객체(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;
?>
<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); // 결과가 배열에 다 들어 있다.
?>
<script>
const obj = <?=$result?>; //- 여기서 $result 를 js 배열로 바꿔주는 함수 같은거 없을까???
alert(obj[1][1]);  //??
</script>

 

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

 

이 질문에 댓글 쓰기 :

답변 2

[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] 어쨌거나 질문의 형태대로 할당 및 출력을 원하면 아래처럼 하면 됩니다.


<?php
$conn = mysqli_connect('localhost', 'user', 'pass', 'db');
$conn->set_charset('utf8mb4'); // 또는 utf8
$sql = "SELECT id, name FROM students";
$result = $conn->query($sql); // 편하게
$data = ['student'=>[]]; // 질문의 구조
while($row = $result->fetch_assoc()) { // 반복
    $data['student'][] = $row; // 차례대로 할당
}
?>
<script>
const obj = <?=json_encode($data,  JSON_UNESCAPED_UNICODE)?>; // \ud55c\uae00 > 한글
console.log(obj);
alert(obj.student[0].id + ", " + obj.student[0].name); // 첫 번째 학생 아이디, 이름
</script>

 

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

 

[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

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

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

그래도 이제 알았으니 속은 후련합니다.
다시 한 번 감사드립니다..^^

찾았습니다.
fetch_all() 을 사용하니 반복문 없이 몽땅 변환되는군요...ㅎ
비혼님 덕분에 많은 것을 알았습니다..^^


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

<script>
  const obj = <?=json_encode($rs)?>;
</script>

보통은 json_encode 를 사용합니다.


const obj = <?php json_encode($result)?>;
console.log(obj)


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

답변을 작성하시기 전에 로그인 해주세요.
전체 123,165 | RSS
QA 내용 검색

회원로그인

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