프로그래밍

[PHP&Android 연동] Column count doesn’t match value count at row 1 오류 해결하기

안드로이드 앱에서 사용자 데이터 저장을 위해 php 서버를 AWS에 구축하여 api를 개발중이다. 화면에서 보낸 데이터는 정상인데, api 서버에서 Column count doesn’t match value count at row 1 메세지가 리턴되어 JSONException 오류가 발생되었다.

org.json.JSONException: Value {"statusMsg":"Column count doesn't match value count at row 1"} of type org.json.JSONObject cannot be converted to JSONArray
at org.json.JSON.typeMismatch(JSON.java:112)
at org.json.JSONArray.<init>(JSONArray.java:98)
at org.json.JSONArray.<init>(JSONArray.java:110)
at com.test.stock.network.RequestApi$1.onResponse(RequestApi.java:193)
at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall$1.lambda$onResponse$0$retrofit2-DefaultCallAdapterFactory$ExecutorCallbackCall$1(DefaultCallAdapterFactory.java:89)
at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall$1$$ExternalSyntheticLambda0.run(Unknown Source:6)
at android.os.Handler.handleCallback(Handler.java:958)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:230)
at android.os.Looper.loop(Looper.java:319)
at android.app.ActivityThread.main(ActivityThread.java:9063)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:588)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103)


오류가 발생된 php코드 일부는 다음과 같다.

.......이상 생략        
$sql = "SELECT max(stock_seq) + 1 as MAX_SEQ FROM stock_price WHERE email = ?";
        $stmt = $dbcon->prepare($sql); //쿼리 준비 prepare 
        $stmt->bind_param('s', $userId); //'s' : 바인딩 매개변수의 데이터 유형 s:문자열 , i: integer, d:double, b-blob
        $stmt->execute();
        $result = $stmt->get_result();
        $stmt->close(); 
        $row_cnt = $result->num_rows; 
    
        while($row = $result->fetch_assoc()) {  //fetch_assoc 필드명을 인덱스로 배열을 반환. , fetch_row: 0부터 시작하는 인덱스로 접근
            $MAX_SEQ = $row['MAX_SEQ'];  
        }

        if( $MAX_SEQ == null) $MAX_SEQ = 1;

        $sql = "INSERT INTO stock_price (email, stock_seq, srtn_cd, buy_amt, buy_date ) 
                VALUES (?,?,?,?)";
        $stmt = $dbcon->prepare($sql); //쿼리 준비 prepare
        $stmt->bind_param('sssdd', $userId, $MAX_SEQ, $srtn_cd, $buy_amt, $sell_amt, $buy_date, $sell_date, $profit, $memo, $buy_quantity, $sell_quantity); //'s' : 바인딩 매개변수의 데이터 유형 s:문자열
        $stmt->execute(); 
        $regCnt = $stmt->affected_rows;  // //몇 건이 insert/update/delete 되었는지 확인
        $stmt->close();

........이하생략

오류 원인은 $sql = “INSERT INTO stock_price (email, stock_seq, srtn_cd, buy_amt, buy_date ) VALUES (?,?,?,?)”; 부분에 있다.

insert 하려는 테이블의 컬럼 갯수와 values 값으로 넘겨줄 파라미터 갯수 지정에 ? 하나가 누락되어 발생되었다.

오류 해결된 스크립트는 다음과 같다.

$sql = "INSERT INTO stock_price (email, stock_seq, srtn_cd, buy_amt, buy_date ) VALUES (?, ?, ?, ?, ?)"; 

error: Content is protected !!