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

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

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

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

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



답변

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


답변

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!";

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

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


답변

의 반환 값을보고 시도 execute하고, TRUE성공 및 FALSE실패.


답변

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

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

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


답변

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

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


답변

자동 증가와 함께 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";


답변

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

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

try
{
PDOStatement->execute();
//record inserted
}
catch(Exception $e)
{
//Some error occured. (i.e. violation of constraints)
}