쿼리 결과를 바로 자바스크립 객체에 넣는 함수나 방법은 없나요? 채택완료
어제 비혼님이 알려 주신대로 아래와 같이 하니 쿼리 결과를 자바스크립 객체(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개
[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
답변에 대한 댓글 5개
+ mysqli::query / mysqli_query
- https://www.php.net/manual/en/mysqli.query.php#refsect1-mysqli.query-returnvalues
이제 확실하게 의문이 풀렸군요...^^
fetch_all() 을 사용하니 반복문 없이 몽땅 변환되는군요...ㅎ
비혼님 덕분에 많은 것을 알았습니다..^^
[code]
$result = mysqli_query($conn,$sql);
$rs = $result->fetch_all(MYSQLI_ASSOC);
<script>
const obj = <?=json_encode($rs)?>;
</script>
[/code]
댓글을 작성하려면 로그인이 필요합니다.
보통은 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개
결과 전체를 가져오려면 결국 while 같은 반복문은 사용해야 하는군요...
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인
결국 while 반복문과 fetch_assoc 는 써야 하는군요..
저는 쿼리로 받은 $result 자체도 배열인 만큼 반복문 없이 통째로 js의 배열로 변환하는 방법이 없나 해서 올린 질문입니다.
그리고 제가 students 를 넣은 이유는 객체 하나에 이것 저것 많이 넣고 찾는 공부 좀 하느라 그랬습니다.
그래도 이제 알았으니 속은 후련합니다.
다시 한 번 감사드립니다..^^