
SQL 문이 UPDATE 또는 DELETE 명령을 사용할 때, 한 번에 하나 이상의 행을 변경할 수 있다. PDOStatement 객체의 rowCount() 메서드는 영향받는 행의 수를 반환한다.
$sql = "UPDATE category SET navigation = 1 WHERE navigation = 0;"; $result = $pdo($pdo, $sql)->rowCount();
PDOStatement 객체의 execute() 메서드가 호출될 때, SQL 문이 실행되면 true를 반환하고 그렇지 않으면 false를 반환한다. 그러나 데이터베이스의 행이 변경되었는지는 알려주지 않는다.
SQL 문이 실행될 때 얼마나 많은 행이 변경되는지 확인하기 위해 PDOStatement 객체에는 변경된 행의 수를 반환하는 rowCount()라는 메서드가 있다.
rowCount() 메서드는 execute() 메서드 다음의 구문에서 호출되어야 하며 반환된 값을 변수에 저장할 수 있다.
일부 열의 값은 고유해야 한다. 예를 들어, 두 개의 카테고리가 동일한 이름일 수 없고, 두 명의 회원이 동일한 이메일 주소를 가질 수 없다.
try { pdo($pdo, $sql, $args); } catch (PDOException $e) { if ($e->errorInfo[1] === 1062) { // 값이 이미 사용되었음을 사용자에게 알린다. } else { throw $e; } }
try 블록에서 코드가 실행될 때 PDO가 예외를 발생하면, 이후의 catch 블록이 실행되고 예외 객체가 $e라는 변수에 저장된다.
PDOException 객체는 errorInfo라는 속성을 갖는다. 이것의 값은 오류에 대한 데이터의 인덱스 배열이다. 이 배열에서의 두 번째 요소는 오류 코드다.
오류 코드가 1062라면 고유성 제약으로 데이터가 저장되지 않으며 사용자에게 해당 값은 이미 사용되었음을 알려야 한다. 다른 오류 코드라면, throw 키워드를 사용하여 다시 예외가 발생해 디폴트 예외 처리 함수에 의해 처리된다.
트랜잭션은 일련의 SQL 문을 그룹화하는 데 사용된다. 모든 구문이 성공해야, 모든 변경사항이 데이터베이스에 저장된다. 구문 중 하나라도 실패하면 그 어떤 변경사항도 저장되지 않는다.
일부 작업은 하나 이상의 SQL 문이 필요하다. 이러한 각 SQL 문이 실행될 때, 이 각각을 오퍼레이션operation이라고 한다. 트랜잭션은 여러 데이터베이스 오퍼레이션을 포함하는 작업을 나타낸다.
하나 이상의 오퍼레이션을 트랜잭션에 통함함으로써 PDO는 트랜잭션의 모든 SQL 문이 성공적으로 실행되는지 확인할 수 있다.
만약에 예외가 발생하지 않았다면, 해당 변경사항을 데이터베이스에 커밋commit할 수 있다.
구문 실행에 문제가 있다면, PDO는 예외를 발생할 것이다. PHP 코드는 그 어떤 변경사항도 데이터베이스에 저장되지 않도록 PDO에 지시할 수 있다. 이것을 트랜잭션 롤백rolling back이라고 한다.
트랜잭션은 try 그리고 catch 블록을 사용하여 수행된다.
try 블록은 실행하고자 하는 코드를 포함한다.
catch 블록은 try 블록에서 예외가 발생할 때 예외를 처리하기 위해 사용된다.
try 블록 내부의 구문은 PDO에 다음을 지시한다.
트랜잭션 시작
트랜잭션을 구성하는 모든 개별 SQL 문 실행
변경사항을 데이터베이스에 커밋
구문을 실행하다가 예외가 발생하면, PHP 인터프리터는 즉시 이후의 catch 블록에 있는 코드를 실행한다. catch 블록은 다음을 수행한다.
PDO를 사용하여 데이터베이스가 수행한 변경사항을 롤백하여 트랜잭션이 시작되기 전과 동일한 데이터가 데이터베이스에 있게끔 한다.
예외를 다시 발생하여 디폴트 예외 처리 함수가 처리할 수 있게 한다.
이것은 모든 SQL 문이 실행되거나 try 블록에서 예외가 발생하면 어떠한 변경사항도 저장되지 않게 한다.
try { $pdo->beginTransaction(); // 여기에서 SQL 문을 실행한다. $pdo->commit(); } catch (PDOException $e) { $pdo->rollBack(); throw $e; }
트랜잭션은 다음과 같이 PDO 객체의 세 가지 메서드를 사용한다. 처음의 두 메서드는 try 블록 안에서 사용되며 세 번째 메서드는 catch 블록 안에서 사용된다.
beginTransaction() : 트랜잭션 시작
commit() : 변경사항을 데이터베이스에 저장
rollBack() : 트랜잭션의 변경사항 취소
출처 - 존 두켓, <백엔드 프로그래밍을 위한 PHP & MySQL>, Jpub, 2022