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

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

QA

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

답변 2

본문

어제 비혼님이 알려 주신대로 아래와 같이 하니 쿼리 결과를 자바스크립 객체(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 같은 함수로 한번 돌려야 할 듯

답변을 작성하시기 전에 로그인 해주세요.
QA 내용 검색
질문등록
  • 질문이 없습니다.
전체 0
© SIRSOFT
현재 페이지 제일 처음으로