call to a member function fetch_array() on boolean in php 오류가 나는데 그 이유를 모르겠습니다 0 4 3,844

by 다어려워 [MySQL] php error fetch_array [2019.06.25 10:44:23]


$sql = "SELECT center, 
COUNT(CASE 월 WHEN 1 THEN 1 END) m01, 
COUNT(CASE 월 WHEN 2 THEN 1 END) m02, 
COUNT(CASE 월 WHEN 3 THEN 1 END) m03, 
COUNT(CASE 월 WHEN 4 THEN 1 END) m04, 
COUNT(CASE 월 WHEN 5 THEN 1 END) m05, 
COUNT(CASE 월 WHEN 6 THEN 1 END) m06, 
COUNT(CASE 월 WHEN 7 THEN 1 END) m07, 
COUNT(CASE 월 WHEN 8 THEN 1 END) m08, 
COUNT(CASE 월 WHEN 9 THEN 1 END) m09, 
COUNT(CASE 월 WHEN 10 THEN 1 END) m10, 
COUNT(CASE 월 WHEN 11 THEN 1 END) m11, 
COUNT(CASE 월 WHEN 12 THEN 1 END) m12 
FROM (
SELECT center, MONTH(date) 월 FROM good 
WHERE code = '$code' AND date LIKE '2019%'
) a GROUP BY center";

$result = $conn->query($sql);
$row = $result->fetch_array();

PHP에서 생긴 오류인건지 DB랑 무슨 문제인건지 잘 모르겠는데 여기에다가 질문을 올려봅니다.

저번 글에 마농님이 해결해주신 query를 phpMyadmin으로 직접 입력하면 결과값을 가져옵니다.

문제는 PHP에 sql를 등록하고 result를 하면 값을 가져오지 못하더군요.

결과값은 num_row 값은 0으로 나오고 $result->fetch_array()에서 해당 아래의 오류가 발생이 됩니다

'call to a member function fetch_array() on boolean in php'

phpMyadmin에서는 정상적으로 작동이 되는데 왜 php에서는 작동이 안될까요?

참고로 다른 query문들은 정상적으로 작동이 되었습니다

by 마농 [2019.06.25 11:12:01]

1. sql 문장을 단순 문자열로 해서 사용하네요.
$code 를 연결하는 부분이 잘못인 듯 하네요.
문자 연결은 . 을 이용해야 합니다.
- 변경전 : code = '$code'
- 변경후 : code = '" . $code . "'
2. 조건을 문자열로 연결하여 동적으로 붙이는 것 보다는
prepare 를 이용해 바인드 변수로 처리하는것이 좋습니다.
http://docs.php.net/pdo.prepared-statements


by 다어려워 [2019.06.25 14:10:48]

다른 sql문장들은 문자열로 해도 되는데 이것만은 안되는게 이상하네요. 문자 연결도 . 을 사용했는데도 결과값을 못 불러옵니다

다른 방법을 찾아봐야 될 거 같은데 감이 안 잡히네요


by 다어려워 [2019.06.25 14:18:21]

해결했습니다. CASE 월 <= 이 한글이 PHP로 보낼 때 오류가 생기는거더군요.

월을 month으로 변경하니깐 쿼리가 무사히 보내지고 값도 잘 받아집니다

감사합니다


by 마농 [2019.06.25 16:44:06]

쿼리 작성시 date, month 등의 예약어 사용을 지양해야 합니다.
예약어 서용도 잠재적 요류 가능성을 가지고 있습니다.
예약어가 아닌 단어를 사용하기를 권장합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입