PDO mysql : 삽입이 성공했는지 확인하는 방법


96

PDO를 사용하여 레코드 (mysql 및 PHP)를 삽입하고 있습니다.

$stmt->bindParam(':field1', $field1, PDO::PARAM_STR);
$stmt->bindParam(':field2', $field2, PDO::PARAM_STR);
$stmt->execute();

레코드가 중복되어 삽입되지 않은 경우와 같이 성공적으로 삽입되었는지 알 수있는 방법이 있습니까?

편집 : 물론 데이터베이스를 볼 수 있지만 프로그래밍 방식의 피드백을 의미합니다.

답변:


140

PDOStatement->execute()성공하면 true를 반환합니다. PDOStatement->errorCode()오류를 확인할 수도 있습니다.


1
execute () 값을 어떻게 봅니까?
Mallow 2011 년

29
더 이상 이와 같지 않습니다. $ value = $ stmt-> execute (); ($ 값) {// TRUE} 다른 {// 거짓}의 경우
Ólafur Waage

23
아니면 그냥 할 수 있습니다if ($stmt->execute()) { //true }
Gavin

2
인가 PDOStatement->execute()PDOStatement->errorCode()서로 완전히 일치? PDOStatement->errorCode()뭔가가 있지만 PDOStatement->execute()사실을 반환 하는 상황 이 있습니까? 아니면 PDOStatement->execute()거짓을 반환하지만 PDOStatement->errorCode()아무것도 없을 때 ?
datasn.io

1
새로운 레코드가 삽입되지 않은 경우에도 그러나 INSERT도 마찬가지 반환 무시
Koffeehaus

24

PDO에 가장 권장되는 오류 모드가 ERRMODE_EXCEPTION이므로 직접 execute()결과 확인이 작동 하지 않습니다 . 코드 실행이 다른 답변에서 제공되는 조건에 도달하지 않기 때문에.

따라서 PDO에서 쿼리 실행 결과를 처리 할 수있는 세 가지 시나리오가 있습니다.

  1. 성공을 알리기 위해 확인이 필요하지 않습니다. 프로그램 흐름을 유지하십시오.
  2. 예기치 않은 오류를 처리하려면 동일하게 유지하십시오. 즉각적인 처리 코드가 필요하지 않습니다. 데이터베이스 오류의 경우 예외가 발생하고 사이트 전체의 오류 처리기로 버블 링되어 결국 일반적인 500 오류 페이지가 발생합니다.
  3. 중복 기본 키와 같은 예상 오류를 처리하려면이 특정 오류를 처리 할 특정 시나리오가있는 경우 try..catch연산자 를 사용하십시오 .

일반 PHP 사용자의 경우 약간 낯설게 들립니다. 작업의 직접적인 결과를 확인하지 않는 것이 어떻습니까? -그러나 이것이 예외가 작동하는 방식입니다. 다른 곳에서 오류를 확인합니다. 한 번에 모든. 매우 편리합니다.

따라서 간단히 말해서 일반 코드에서는 오류 처리가 전혀 필요하지 않습니다. 코드를 그대로 유지하십시오.

$stmt->bindParam(':field1', $field1, PDO::PARAM_STR);
$stmt->bindParam(':field2', $field2, PDO::PARAM_STR);
$stmt->execute();
echo "Success!"; // whatever

성공하면 그렇게 알려주고, 오류가 발생하면 애플리케이션이 그러한 경우에 표시하는 일반 오류 페이지를 보여줍니다.

오류를보고하는 것 이외 의 처리 시나리오가있는 경우에만try..catch 연산자에 삽입 문을 넣고 예상 한 오류인지 확인하고 처리하십시오. 또는-오류가 다른 경우- 예외를 다시 발생시켜 사이트 전체 오류 처리기가 일반적인 방식으로 처리 할 수 ​​있도록합니다. 다음은 PDO를 사용한 오류 처리에 대한기사 의 예제 코드입니다 .

try {
     $pdo->prepare("INSERT INTO users VALUES (NULL,?,?,?,?)")->execute($data);
} catch (PDOException $e) {
    if ($e->getCode() == 1062) {
        // Take some action if there is a key constraint violation, i.e. duplicate name
    } else {
        throw $e;
    }
}
echo "Success!";

위의 코드에서 우리는 어떤 조치를 취하기 위해 특정 오류를 확인하고 프로그래머에게보고 될 다른 오류 (예 : 테이블 없음)에 대한 예외를 다시 발생시킵니다.

다시 말하지만, 사용자에게 "당신의 삽입이 성공했습니다"와 같은 것을 알리기 위해 어떠한 조건도 필요하지 않습니다.


"성공"의 의미는 무엇입니까? 새 행이 삽입되었음을 의미합니까, 아니면 오류가 없음을 의미합니까?
Martin AJ

INSERT 쿼리의 경우 거의 동일합니다.
당신의 상식

당신이 맞아요 .. query()기능 에 대해 말씀해 주 시겠습니까? query()대신 try-catch를 사용할 수 있습니까 prepared()->execute()?
Martin AJ

3
처음에 삽입에 query ()를 사용해서는 안됩니다. Insert는 입력이 있음을 의미하고 inpout은 준비해야 함을 의미합니다.
당신의 상식

1
MySQL을 사용, 나는 $ 전자> ERRORINFO [1] == 1062은 삽입이 실패했음을 확인하는 경우 $ 전자> getCode ()가 항상 23000이기 때문에, 확인했다
tronman가


9

업데이트 쿼리가 현재 데이터베이스 레코드와 일치하는 값으로 실행되면 영향을받은 행이없는 $stmt->rowCount()경우 반환 0됩니다. if( rowCount() == 1 )성공 여부를 테스트 해야하는 경우 업데이트가 실패하지 않았지만 값이 이미 데이터베이스에 있으므로 변경되지 않았을 때 실패했다고 생각할 것입니다.

$stmt->execute();
if( $stmt ) return "success";

위반 된 고유 키 필드로 레코드를 업데이트하려고 할 때이 기능이 작동하지 않았습니다. 쿼리는 성공을 반환했지만 다른 쿼리는 이전 필드 값을 반환합니다.


3
레코드를 삽입해야하는 경우 가장 좋은 방법은 다음과 같이 확인하는 것입니다. ............................. ..... .................. if($stmt->execute() && ($stmt->rowCount()>0))
jave.web

4

행 개수를 테스트 할 수 있습니다.

    $sqlStatement->execute( ...);
    if ($sqlStatement->rowCount() > 0)
    {
        return true;
    }

문서에 대한 참조는 항상 @YourCommonSense에 도움이됩니다. "이 동작이 모든 데이터베이스에 대해 보장되는 것은 아니며 이식 가능한 애플리케이션에 의존해서는 안됩니다."라고되어 있지만 첫 번째 선택으로 제한되고 두 번째로이 게시물의 주제 인 mysql에 대해 지원됩니다.
크래프터

브라우저의 주소 표시 줄에 "pdo rowcount"를 입력하고 첫 번째 링크를 클릭하십시오. 그것은 주석보다 적은 입력을합니다
당신의 상식

1
@crafter 맞습니다. 그것은 rowCount ()가 SELECT쿼리 에 대해 신뢰할 수 없다고 말합니다 (그리고 거기에서도 문서는 여러 쿼리 에 대해 이야기 합니다). 작동하기에 괜찮아 보이는 DELETE, INSERT또는 에 대한 내용이 없습니다 UPDATE(질문에 대한 질문이었습니다 INSERT). 그러나 나는 PDO를 처음 접했고 내가 틀렸고 누군가 다른 참조가 있다면 여기에 적어주세요. 위의 세 가지 명령에 대해 실제 단점이 있는지 확인하고 싶습니다.
StanE 2011

1

자동 증가와 함께 ID를 기본 키로 사용

$stmt->execute();
$insertid = $conn->lastInsertId();

증분 id는 첫 번째 레코드에서도 항상 0보다 크므로 항상 id coz에 대한 true 값이 0보다 큰 경우 PHP에서 true를 의미합니다.

if ($insertid)
   echo "record inserted successfully";
else
   echo "record insertion failed";

테이블에 자동 증가 필드가 필요하지 않으면 어떻게합니까?
당신의 상식

누가 dun? 당신? 널리 사용되는 RESTFul API를 사용하면 자동 증분 ID가 필수와 같습니다.
점퍼 rbk

누군가가 기본 및 자동 증가 또는 다른 시퀀스 열이없는 이유는 무엇입니까? 확인 방법이 필요한 경우 순차적 열을 추가합니다. 이 솔루션이 아닌 경우 추가하지 마십시오. 그것은 나에게 좋은 것입니다. 저는 항상 순차 및 자동 증가 열을 사용하므로 항상 쿼리가 성공했는지 테스트하는 방법이 있습니다.
Samuel Ramzan

0

PDOStatement-> execute ()는 예외를 발생시킬 수 있습니다.

그래서 당신이 할 수있는 것은

try
{
PDOStatement->execute();
//record inserted
}
catch(Exception $e)
{
//Some error occured. (i.e. violation of constraints)
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.