묻고답하기
mysql 와, mysqli_innodb 의 차이점??
2014.08.02 14:12
이슈를 처리를 하기 위해서, 해당 링크에서 아래쪽의 필요한 내용을 DB에 기록하도록 만들었었습니다.
코드는 해당 링크의 아래쪽을 통해서 확인하시면 되는데,xe/files/db.config.php' 에서
db_type` 에 따라서 너무나 다른 디버깅 내용을 나타내서 한참을 해맸었습니다.
처음에 mysqli_innodb
을 썼을때 다음과 같은 디버깅 코드를 확인했습니다.
[2014-08-02 14:03:48 modules/attendance/attendance.model.php:554] attendanceModel->insertAttendance() - mem(1.89MB)
Object Object
(
[error] => -1
[message] => Prepared statement failed: INSERT INTO `xe_attendance`
(`attendance_srl`, `regdate`, `member_srl`, `ipaddress`, `greetings`, `today_point`, `today_random`, `att_random_set`, `perfect_m`, `present_y`)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Array
(
[0] => mysqli_stmt Object
(
[affected_rows] => 0
[insert_id] => 0
[num_rows] => 0
[param_count] => 10
[field_count] => 0
[errno] => 2031
[error] => No data supplied for parameters in prepared statement
[error_list] => Array
(
[0] => Array
(
[errno] => 2031
[sqlstate] => HY000
[error] => No data supplied for parameters in prepared statement
)
)
[sqlstate] => HY000
[id] => 17
)
[1] => isissiiss
[2] => 157
[3] => 20140802140348
[4] => 4
[5] => 127.0.0.1
[6] => ㅁㄴㅇㅁㄴㅇ
[7] => 24
[8] => 0
[9] => N
[10] => N
)
[variables] => Array
(
[_query] => INSERT INTO `xe_attendance`
(`attendance_srl`, `regdate`, `member_srl`, `ipaddress`, `greetings`, `today_point`, `today_random`, `att_random_set`, `perfect_m`, `present_y`)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
[_elapsed_time] => 0.00034
)
[httpStatusCode] =>
)
여기서 해석이 안되어서 다른분들에게도 물어봤는데 정확한 값을 모르고, [1] => isissiiss
의 영향으로attendance_srl
부터 한칸씩 밀려서 DB가 기록되는 경우가 생겨버리더군요..
다른분에게 요청을 드렸을때 아마 mysqli 의 잔버그일것 같다는 내용을 듣고 db.config.php
에서 디비타입을 바꿔봤습니다mysql
으로 바꿧더니
[2014-08-02 14:01:10 modules/attendance/attendance.model.php:554] attendanceModel->insertAttendance() - mem(1.70MB)
Object Object
(
[error] => 1054
[message] => Unknown column 'N' in 'field list'
[variables] => Array
(
[_query] => INSERT INTO `xe_attendance`
(`attendance_srl`, `regdate`, `member_srl`, `ipaddress`, `greetings`, `today_point`, `today_random`, `att_random_set`, `perfect_m`, `present_y`)
VALUES (155, '20140802140110', 4, '아이피라숨김', 'ㅁㄴㅇ', 24, N, 0, 'N', 'N')
[_elapsed_time] => 0.00026
)
[httpStatusCode] =>
)
이렇게 디버깅 코드가 뜨더군요..
debugPrint 를 시켰을 때 각각의 DB_type 의 따라 왜이렇게 차이가 나는건가요?
댓글 4
-
銀童
2014.08.02 16:28
-
BJ람보
2014.08.02 17:28
디버깅을 위해서라면 기본적으로 mysql 으로만 쓰는것이 재일 좋은건가요?
-
달려맨no1
2014.08.06 00:47
銀童님의 말씀처럼, prepared statement를 사용하여 쿼리를 날릴땐 거의 패턴이 비슷합니다.
먼저 sql을 열거하고, 각 값들을 ?로 하여 치환하죠.
이 ?에 해당하는 값들을 배열에 넣어두고 쿼리를 요청하는데...위소스를 보면 (`attendance_srl`요청하는데
[1] => isissiiss이attendance_srl의 값인데.. 먼가 쫌 이상하네요.그리고, 디버깅을 위해서 기본적으로 mysql으로만 사용하는 것이 제일 좋은지는 잘 모르겠습니다만,편의상으로는 좋지 않을까요? -
BJ람보
2014.08.06 00:55
잘 보시면,
[1] => isissiiss
이 값으로 인해서인지 무엇때문인지 모르겟지만 한칸씩 미뤄졌던 부분이죠..
암튼, 이부분의 디버깅이 안됬던 이유가.. 디폴트값으로 쿼리.xml 파일에서 숫자를 줘야하는 곳에서 문자를 입력해서 있던 문제였습니다..
이게 mysql에서는 정확하게 이유가 나와서 확인하고 수정을했지요, 하지만, mysqli에서는 정확한 디버깅이 뜨지 않아서 조금 해맷엇지요 ..T^T
mysqli 는 sql injection 등을 막기위한 보안장치가 쿼리에 포함되어있어서 그렇습니다.