PHP PDO 전처리 문 및 트 랜 잭 션 사용

6242 단어 PHPPDO
전처리 문 기능
사전 처리 문 구 는 실행 할 문 구 를 준비 한 다음 PDOStatement 대상 을 되 돌려 주 는 것 이다.일반적으로 우 리 는 PDOStatement 대상 의 execute()방법 으로 이 문 구 를 실행 합 니 다.왜 예 처리 라 고 하 죠?이 문 구 를 여러 번 호출 할 수 있 고 자리 표시 자 를 통 해 문장의 필드 조건 을 바 꿀 수 있 기 때문이다.PDO 대상 을 직접 사용 하 는 query()나 exec()보다 사전 처리 효율 이 높 아 클 라 이언 트/서버 캐 시 조회 와 메타 정 보 를 조회 할 수 있 습 니 다.물론 더 중요 한 것 은 자리 차지 문자 의 응용 은 기본 적 인 SQL 주입 공격 을 효과적으로 방지 할 수 있다 는 것 이다.우 리 는 수 동 으로 SQL 문장 에 인용 부 호 를 추가 하지 않 고 예 처리 로 이 문 제 를 해결 할 필요 가 없다.이것 은 모두 가 배 운 지식 이자 우리 가 면접 에서 가장 흔히 볼 수 있 는 문제 중 하나 라 고 믿는다.

//    :name             PDOStatement   
$stmt = $pdo->prepare("select * from zyblog_test_user where username = :username", [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]);

var_dump($stmt);
// object(PDOStatement)#2 (1) {
//     ["queryString"]=>
//     string(57) "select * from zyblog_test_user where username = :username"
//   }

$stmt->execute([':username' => 'aaa']);
$aUser = $stmt->fetchAll();

$stmt->execute([':username' => 'bbb']);
$bUser = $stmt->fetchAll();

var_dump($aUser);
// array(1) {
//     [0]=>
//     array(8) {
//       ["id"]=>
//       string(1) "1"
//       [0]=>
//       string(1) "1"
//       ["username"]=>
//       string(3) "aaa"
//       ……

var_dump($bUser);
// array(1) {
//     [0]=>
//     array(8) {
//       ["id"]=>
//       string(1) "2"
//       [0]=>
//       string(1) "2"
//       ["username"]=>
//       string(3) "bbb"
//       ……
prepare()방법의 첫 번 째 매개 변 수 는 우리 가 실행 해 야 할 SQL 문장 입 니 다.이 코드 에서 우 리 는 xxx 형식의 자리 표시 자 를 사용 하기 때문에 prepare()방법 으로 되 돌아 오 는 PDOStatement 대상 의 execute()방법 을 호출 할 때 자리 표시 자의 값 을 지정 해 야 합 니 다.코드 에서 우 리 는 이 SQL 문 구 를 사용 하여 서로 다른 자리 표시 자 내용 을 바 꾸 어 두 번 의 조 회 를 실현 했다.
prepare()방법의 두 번 째 매개 변 수 는 되 돌아 오 는 PDOStatement 대상 을 위 한 속성 입 니 다.PDO 설정::ATTRCURSOR 는 PDO::CURSORSCROLL,스크롤 가능 한 커서 를 얻 을 수 있 습 니 다.일부 구동 에는 구동 급 옵션 이 있 습 니 다.prepare 에서 설정 합 니 다.PDO::ATTR_CURSOR 는 데이터베이스 커서 를 설정 하 는 형식 이 고 PDO::CURSORFWDONLY 는 커서 에 만 들 어 가 는 PDOStatement 대상 을 만 든 다 는 뜻 이다.이것 은 기본 커서 옵션 입 니 다.이 커서 는 가장 빠 르 고 PHP 에서 가장 자주 사용 하 는 데이터 접근 모드 이기 때 문 입 니 다.데이터베이스 커서 지식 은 여러분 이 스스로 관련 내용 을 찾 아 볼 수 있 습 니 다.
또한 PDOStatement 은 bindParam()방법 으로 자리 차지 문자 데 이 터 를 연결 할 수 있 으 며,PDOStatement 대상 과 관련 된 글 을 뒤에서 배 울 것 입 니 다.
이제 다시 한 번 사용 해 볼 까요?번호 대체 자 를 사용 하여 조 회 를 실현 합 니까?번호 점 위 부 호 는 바 인 딩 할 때 아래 표 형식 으로 바 인 딩 됩 니 다.

//    ?             PDOStatement   
$stmt = $pdo->prepare("select * from zyblog_test_user where username = ?", [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]);

$stmt->execute(['aaa']);
$aUser = $stmt->fetchAll();

var_dump($aUser);
// array(1) {
//     [0]=>
//     array(8) {
//       ["id"]=>
//       string(1) "1"
//       [0]=>
//       string(1) "1"
//       ["username"]=>
//       string(3) "aaa"
//       ……
물론 이런 사전 컴 파일 문 구 는 조회 문 구 를 제한 할 뿐만 아니 라 증가,삭제,수정 도 모두 가능 할 뿐만 아니 라 모두 자리 차지 문자 도 지원 한다.PHP 에서 데이터 베 이 스 를 조작 하 는 예 처리 문장 에는 상세 한 예시 가 있다.
실무 능력
사무 에 대해 서 는 모두 가 어느 정도 알 고 있 을 것 입 니 다.그래서 여기 서도 구체 적 인 개념 을 소개 하지 않 습 니 다.우 리 는 PDO 에서 업무 가 어떻게 실현 되 는 지 만 봅 니 다.우선 일이 없 는 상황 에서 무슨 일이 일어 날 지 살 펴 보 자. 

$pdo->exec("insert into tran_innodb (name, age) values ('Joe', 12)"); //     

$pdo->exec("insert into tran_innodb2 (name, age) values ('Joe', 12)"); //       PHP    
// Fatal error: Uncaught PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'blog_test.tran_innodb2' doesn't exist
이 두 표 가 동시에 갱신 되 어야 한다 고 가정 하지만 두 번 째 문 구 는 잘못 보고 되 었 다.업무 가 없 는 상황 에서 우리 의 첫 번 째 데 이 터 는 정상적으로 삽 입 될 것 이다.이것 은 우리 가 필요 로 하 는 결과 가 아니다.이 럴 때 는 두 시 계 를 동시에 성공 하거나 동시에 실패 할 수 있 도록 업무 능력 의 도움 이 필요 하 다.

try {
    //     
    $pdo->beginTransaction();

    $pdo->exec("insert into tran_innodb (name, age) values ('Joe', 12)");
    $pdo->exec("insert into tran_innodb2 (name, age) values ('Joe', 12)"); //      

    //     
    $pdo->commit();
} catch (Exception $e) {
    //     
    $pdo->rollBack();
    //       
    echo "Failed: " . $e->getMessage(), PHP_EOL;
    // Failed: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'blog_test.tran_innodb2' doesn't exist
}
우선 beginTransaction()방법 입 니 다.데이터 베 이 스 를 자동 으로 제출 하고 사 무 를 시작 하 는 것 입 니 다.이 방법 을 사용 한 후에 commt()나 rollBack()방법 을 만 나 야 이 사 무 를 닫 을 수 있 습 니 다.
commt()방법 은 조작 과정 에서 의외 의 사고 가 발생 하지 않 으 면 beginTransaction()이후 의 모든 데이터 조작 을 함께 포장 하여 제출 하 는 것 입 니 다.
rollBack()은 스크롤 백 데이터 입 니 다.begin Transaction()이후 의 한 문장 이나 코드 에 문제 가 생 겼 을 때 스크롤 백 전의 데이터 조작 으로 begin Transaction()이후 의 모든 문장 이 성공 하거나 실 패 했 음 을 보증 합 니 다.
바로 이렇게 세 개의 간단 한 함수 가 우 리 를 위해 전체 업무 조작 을 완성 했다.업무 에 대한 깊 은 학습 은 앞으로 MySQL 을 깊이 연구 할 때 다시 토론 할 것 입 니 다.여기 서 우리 가 주의해 야 할 것 은 PDO 대상 은 오류 모드 를 이상 을 던 지 는 것 으로 지정 하 는 것 이 좋 습 니 다.오류 모드 를 지정 하지 않 으 면 업무 중 에 발생 하 는 오 류 를 직접 보고 하지 않 고 오류 코드 를 되 돌려 줍 니 다.오류 코드 를 통 해 제출 하거나 스크롤 백 할 지 여 부 를 확인 해 야 합 니 다.이렇게 하면 이상 메커니즘 이 없 는 간결 하고 직관 적 이다.
총결산
우 리 는 PDO 의 전처리 와 업무 에 관 한 지식 을 간단하게 정리 하고 배 웠 으 며,이어서 PDOStatement 대상 과 관련 된 내용 에 대한 학습 에 들 어가 야 한다.PDOStatement 대상 은 PDO 의 예비 처리 대상,즉 일상적인 개발 에서 우리 가 접 할 수 있 는 가장 많은 데이터 조작 대상 이다.이것 은 중요 한 내용 이 니 여러분 들 은 해이 해 져 서 는 안 됩 니 다!
테스트 코드
이상 은 PHP PDO 전처리 문 및 사무 사용 에 대한 상세 한 내용 입 니 다.더 많은 PHP PDO 전처리 문 및 사무 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 시기 바 랍 니 다!

좋은 웹페이지 즐겨찾기