쿼리 결과를 바로 자바스크립 객체에 넣는 함수나 방법은 없나요?
본문
어제 비혼님이 알려 주신대로 아래와 같이 하니 쿼리 결과를 자바스크립 객체(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
!-->보통은 json_encode 를 사용합니다.
const obj = <?php json_encode($result)?>;
console.log(obj)
mysqli_query 로 받아도 값을 그대로 json_encode 할 시 오류가 날 수 있어요
mysqli_fetch_assoc 같은 함수로 한번 돌려야 할 듯