마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

PHP <-> MySQL 데이터 넣으면 2개씩 들어가요

0 추천

초보 안드로이드 개발하는 사람입니다.

안드로이드에서 php로 데이터를 넘겨서 서버에 파일을 만들고 MySQL에도 insert 하려고 하는데,

서버에 파일은 1개씩만 잘 만들어 지는데 MySQL에서 2개씩 중복이 되서 들어갑니다.

예를 들어

이미지1.jpg 이미지2.jpg 이미지3.jpg 이미지1.jpg 이미지2.jpg 이미지3.jpg 이런 식으로 들어갑니다.

혹시 무슨 문제가 있는지 알 수 있을까요?

파일을 서버 폴더에 넣는 코드랑 DB에 넣는 코드는 이렇습니다.

for ($i = 0; $i < $NumOfImages; $i = $i + 1) {

        if (file_put_contents($path . "/{$ProductName}" . "_" . ($i+1) . ".jpeg", base64_decode($obj["Count".($i+1)]))) {
            
            $imageName = $ProductName . "_" . ($i + 1);
            
            if ($stmt = $conn->prepare("INSERT INTO images (imageName, ProductName, FilePath) VALUES (?, ?, ?)")) {

                $stmt->bind_param(
                    "sss", 
                    $imageName, 
                    $ProductName,
                    $path
                );
                $stmt->execute();
            } 
       } else {
           
            printf("The content is not exist");
            $response["success"] = false;
       }
    }

    if ($stmt = $conn->prepare("INSERT INTO product (
        ProductName, 
        ProductDesc, 
        ProductPrice, 
        ProductOwner, 
        tradeLocation,
        AddedDate) 
        VALUES (
            ?, 
            ?, 
            ?,
            ?, 
            ?,
            ?)")
        ) {

            $stmt->bind_param(
            "ssssss", 
            $ProductName, 
            $ProductDesc, 
            $productPrice,
            $productOwner, 
            $Location,
            $AddedDate
        );
        
        $stmt->execute();
        $response["success"] = true;
    }
    echo json_encode($response);
NewbHoony (210 포인트) 님이 2021년 12월 31일 질문
안드로이드 Q&A인데, PHP 질문이네요.^^
어쨋든, 말씀하신 증상으로 볼 떼 어디가 문제인지 단계적으로 디버깅을 하셔야 할 것 같아요.
먼저, 안드로이드에서 올라온 데이터가 중복으로 두건씩 올라오는지 체크해 보세요. 로직상으로 볼 때는 그럴 가능성이 제일 큰 것 같구요.
다음으로는, PHP에서 로직 실수로 같은 데이터를 두번 Insert했는지 확인하셔야 겠죠. 파일이 한개씩만 생기는 것은 파일의 경우는 같은 이름을 overwrite 했지만,  MySQL의 경우는 테이블의 키값을 사용하므로 같은 파일이름이라도 키값이(아마 자동증가 필드이신듯) 틀리면 두개씩 Insert를 했을 수 있을 것 같네요.
로그를 찍거나 브레이크 포인트를 걸어서 디버깅을 해보세요. NumOfImages 변수를 조사해 보면 실제로 몇개의 이미지 파일이 올라오는지 금방 확인이 가능하겠죠.

그리고 제가 PHP는 모르지만, 올리신 부분 중에 이미지를 생성하다가 에러가 나면 success = false를 리턴한 후 밑에있는 Product에 데이터를 넣는 부분은 실행하지 말아야 할 것 같은데요. 그리고 위의 코드는 전체가 트랜잭션으로 동작을 해야할 것 같은데, 그렇게 되지 않을 것 같은 생각이 드네요.

한가지 특이한건, 올리신 코드에서 for문이 닫히는 곳이 분명치 않은 것 같아요.

아랫처럼 product 바로 앞에서 닫히거나
for ($i = 0; $i < $NumOfImages; $i = $i + 1) {

} // <---
if ($stmt = $conn->prepare("INSERT INTO product (...)

JSON을 리턴하기 전에 닫으셔야 할 것 같은데, 아닌가요?
for ($i = 0; $i < $NumOfImages; $i = $i + 1) {

} // <---
echo json_encode($response);
답변 해 주셔서 감사합니다!. 안드로이드로 개발 연습을 하는데 php가 필요하다보니 php 질문도 같이 하게 되어버렸네요.
안드로이드에서는 중복해서 건내주지 않는걸 확인했으니 아마 php 내에서 문제가 있을 것 같습니다. 제가 php를 이번에 처음 접해보다보니 좀 어색해서 그런 문제가 생겼을 거 같아서 찾고 있는 중입니다. 코드상 문제점은 올리는 과정에서 들여쓰기가 잘못되있었습니다.
말씀해주신대로 계속 찾아보겠습니다.

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...