JSON 공부하다 막혀서 질문 좀 드립니다. ^^;
본문
걍 공부 차원에서 하는 것이니,,,, 학구열 있으신 분만 살펴봐 주세용. ^^
https://www.w3schools.com/js/js_json_php.asp
위 페이지 하단 쯤 PHP Database 편 공부 중인데,
해당 코드를 가져와 일부만 수정해서 테스트 해봤습니다.
실제로 그누보드 DB와 연결해 값을 불러오는 걸 연습 중입니다.
(g5_member 회원 정보 테이블에서 값 가져오는 연습 중)
파란색 부분은 위 좌표에 소개된 코드이고,
갈색 코드는 제 오토셋 정보에 맞게 제가 수정한 것입니다.
오토셋10 (php7210 환경)에서 테스트.
a.php 파일 내용
<?php
header("Content-Type: application/json; charset=UTF-8");
$obj = json_decode($_GET["x"], false);
$conn = new mysqli("localhost", "root", "autoset", "mw7"); // DB 연결정보
$stmt = $conn->prepare("SELECT mb_name FROM ? LIMIT ?"); // 가져올 필드
$stmt->bind_param("ss", $obj->table, $obj->limit);
$stmt->execute();
$result = $stmt->get_result();
$outp = $result->fetch_all(MYSQLI_ASSOC);
echo json_encode($outp);
?>
[출력내용]
<br /> <b>Notice</b>: Undefined index: x in <b>C:\AutoSet10\public_html\mw7\a.php</b> on line <b>3</b><br /> <br /> <b>Fatal error</b>: Uncaught Error: Call to a member function bind_param() on boolean in C:\AutoSet10\public_html\mw7\a.php:7 Stack trace: #0 {main} thrown in <b>C:\AutoSet10\public_html\mw7\a.php</b> on line <b>7</b><br />
b.php 파일 내용
<p id="demo"></p>
<script>
var obj, dbParam, xmlhttp;
obj = { "table":"g5_member", "limit":10 };
dbParam = JSON.stringify(obj);
xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("demo").innerHTML = this.responseText;
}
};
xmlhttp.open("GET", "a.php?x=" + dbParam, true);
xmlhttp.send();
</script>
에러내용
Fatal error: Uncaught Error: Call to a member function bind_param() on boolean in C:\AutoSet10\public_html\mw7\a.php:7 Stack trace: #0 {main} thrown in C:\AutoSet10\public_html\mw7\a.php on line 7
어디가 잘못 된걸까요? ㅎ
답변 4
아마도 지금 바인딩을 하려는 곳이 테이블명이 포함되어서 그런 게 아닌가 싶네요.
링크로 주신 부분을 가 봤는데 제가 모르는 부분일 수도 있어서 잘못된 정보일 수도 있지만 지금까지 본 예제들과 제 경험상 왜 테이블명까지 바인딩하는지는 잘 모르겠습니다. 저런 예제는 본 적도 없구요.
저는 주로 pdo를 사용하는데 아마 mysqli도 마찬가지가 아닐까 싶습니다.
바인딩이 가능한 부분은 테이블명을 제외한 곳이라 보시면 돼요.
그래서 인터넷이나 책에 나와 있는 예제 구문이 모두 테이블명 이후일 겁니다.
SELECT * FROM 테이블명 WHERE a = ? AND b = ? ORDER BY ? LIMIT ?
INSERT INTO 테이블명 a = :aaaa, b = :bb
$stmt = $conn->prepare("SELECT mb_name FROM g5_write_free LIMIT ?"); // 가져올 필드
$stmt->bind_param("i", 10);
참고로 bind_param의 첫 번째 매개변수에는 s(문자열), i(정수)를 주로 쓴다 보시면 됩니다.
다른 d, b는 쓸 일이 있는지 잘 모르겠네요. 제 경험상으로는 거의 없었습니다.
a.php 에서는 Undefined index: x, $_GET["x"]의 값으로 선언된게 없습니다.
그리고
bind_param << 이 함수 사용하면서 에러가 나온다고 하네요;;
bind_param 쓰시는법 다시좀 봐보셔야할것 같습니다.
설명을 보니까 그냥 변수이름만 써주지 다른건 아닌 것 같습니다.
"INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"
이렇게 쓰던 것을
$stmt->bind_param("sss", $firstname, $lastname, $email);
이렇게 간편하게 작성한다는 것 같습니다... s s s 는 각각의 필드에 대하여 스트링이라는 의미이고. SQL문을 만드는것 뿐이지 그 이상도 이하도 아닌 것 같습니다.
bind_param 에 보면
limit 는 s 인 문자가 아니라. d 인 숫자가 되어야 할것 같네요