JSON 공부하다 막혀서 질문 좀 드립니다. ^^;

JSON 공부하다 막혀서 질문 좀 드립니다. ^^;

QA

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는 쓸 일이 있는지 잘 모르겠네요. 제 경험상으로는 거의 없었습니다.

왕계란 님 자세한 설명 감사합니다.
근데, 제가 초보다 보니 위 설명을 보고도 해결을 못 했네요.ㅎ
왕계란 님 말씀 참고해 limit값만 넘기게 수정해봤는데도 여전히 먹통이네요.




a.php (서버 처리)

<?php
header("Content-Type: application/json; charset=UTF-8");
$obj = json_decode($_GET['x'], false);
$conn = new mysqli("localhost", "root", "autoset", "mw7");
$stmt = $conn->prepare("SELECT mb_name FROM g5_member LIMIT ?");

$stmt->bind_param("i", $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 />
[]





b.php (브라우저 화면)

<p id="demo"></p>

<script>
var obj, dbParam, xmlhttp, myObj, x, txt = "";
obj = { "limit":10 };
dbParam = JSON.stringify(obj);
xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
  if (this.readyState == 4 && this.status == 200) {
    myObj = JSON.parse(this.responseText);
    for (x in myObj) {
      txt += myObj[x].mb_name + "<br>";
    }
    document.getElementById("demo").innerHTML = txt;
  }
};
xmlhttp.open("GET", "b.php?x=" + dbParam, true);
xmlhttp.send();
</script>

[에러내용] 없음



다만, a.php 에러 내용 경우, ajax로 넘어논 값을 처리하는 방식이므로
a.php로 바로 접속하면 위 에러가 뜨는 건 당연한 것 같습니다.


<script>
obj = { "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", "test.php?x=" + dbParam, true);
xmlhttp.send();
</script>
<div id="demo"></div>

a.php


<?php
$obj = json_decode($_GET["x"], false);
$conn = new mysqli("localhost", "id", "pw", "db"); // DB 연결정보
$stmt = $conn->prepare("SELECT wr_subject FROM g5_write_free LIMIT ?");
$stmt->bind_param("i", $obj->limit);
$stmt->execute();
$result = $stmt->get_result();
$outp = $result->fetch_all(MYSQLI_ASSOC);
echo json_encode($outp);

test.php

혹시나 해서 링크 주신 걸 복사해서 테스트 하니 정상적으로 나옵니다.
http://exam.dothome.co.kr/a.php

a.php 에서는
Undefined index: x, $_GET["x"]의 값으로 선언된게 없습니다.

그리고

bind_param << 이 함수 사용하면서 에러가 나온다고 하네요;;

a.php 자체로 접속하면 선언 안 된게 정상 같아요.
원래 b.php로 접속을 하면 ajax로 a.php로 파라미터를 보내 a.php에서 처리 후 다시 결과값을 가져오는 식이라...

문제는 bind_param 부분 같긴한데....에러 내용을 봐도 어떻게 고쳐야할지 감이..^^;;

bind_param 쓰시는법 다시좀 봐보셔야할것 같습니다.

설명을 보니까 그냥 변수이름만 써주지 다른건 아닌 것 같습니다.

"INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"

이렇게 쓰던 것을 

$stmt->bind_param("sss", $firstname, $lastname, $email);

이렇게 간편하게 작성한다는 것 같습니다... s s s 는 각각의 필드에 대하여 스트링이라는 의미이고. SQL문을 만드는것 뿐이지 그 이상도 이하도 아닌 것 같습니다.

그리고 해당 함수 내에서 변수를
 $obj->table 이런식으로 사용하지마세요.
obj의 table 이라는 값을 말하고 싶은거라면 $obj['table'] 이라고 해야하지 않나요?
선언 할 때에만 $obj => 쓰지 않나용??

bind_param 에 보면

limit 는 s 인 문자가 아니라. d 인 숫자가 되어야 할것 같네요

값이 정확한지 한번 찍어보세요

$stmt = $conn->prepare("SELECT mb_name FROM ? LIMIT ?"); // 가져올 필드
$stmt->bind_param("ss", $obj->table, $obj->limit);

이 사이에


$stmt = $conn->prepare("SELECT mb_name FROM ? LIMIT ?"); // 가져올 필드
var_dump($obj);

$stmt->bind_param("ss", $obj->table, $obj->limit);
로 확인해보시는게 더 좋을것 같네요

b.php 접속 시 아작스로 a.php 파일로 값을 보내 다시 결과값을 가져오는 방식이라
var_dump()로 값을 확인하는 게 ...쉽지 않네요.


일단, 말씀하신대로 넣고 b.php 접속 후 a.php 파일 접속해 확인해보니 null 찍혀있어용.
다만, 이게 위에 말씀드린대로 form 방식이 아니라 ajax 방식이라 당연한 결과 같아요.

답변을 작성하시기 전에 로그인 해주세요.
전체 145
QA 내용 검색
filter #json ×

회원로그인

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