> 백엔드 개발 > PHP 문제 > PHP에서 mysqli 트랜잭션과 준비된 문을 사용하는 방법

PHP에서 mysqli 트랜잭션과 준비된 문을 사용하는 방법

醉折花枝作酒筹
풀어 주다: 2023-03-10 21:50:01
앞으로
1833명이 탐색했습니다.

MySQLi의 경우 트랜잭션과 준비된 명령문은 물론 MySQL 확장을 제거할 수 있는 자본입니다. 우리는 이전에 PDO의 트랜잭션과 준비된 명령문에 대해서도 배웠습니다. 따라서 여기서는 더 이상 이론에 대해 이야기하지 않고 직접 코드로 이동하여 MySQLi와 PDO에서 이 두 기능의 사용 차이를 살펴보겠습니다.

PHP에서 mysqli 트랜잭션과 준비된 문을 사용하는 방법

트랜잭션 처리

우선, MySQLi도 잘못된 명령문에 대한 예외를 보고하도록 해야 합니다. 이 기능은 PDO와 매우 다릅니다. PDO에서는 연결의 오류 보고 속성을 직접 지정할 수 있습니다. MySQLi에서는 예외를 발생시키려면 MySQLi_Driver 객체에 오류 속성을 지정해야 합니다. 분명히 MySQLi_Driver는 MySQLi의 드라이버 객체입니다.

// 使用异常处理错误情况
$driver = new mysqli_driver();
$driver->report_mode = MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT;
로그인 후 복사

이것은 MySQLi 확장을 사용할 때 모든 오류 메시지가 예외로 발생하도록 지정합니다.

다음 내용은 실제로 PDO와 매우 유사합니다.

try {
    // 开始事务
    $mysqli->begin_transaction();

    $mysqli->query("insert into tran_innodb (name, age) values ('Joe', 12)");
    $mysqli->query("insert into tran_innodb2 (name, age) values ('Joe', 12)"); // 不存在的表

    // 提交事务
    $mysqli->commit();

} catch (Exception $e) {
    // 回滚事务
    $mysqli->rollback();

    var_dump($e->getMessage());
    // string(44) "Table 'blog_test.tran_innodb2' doesn't exist"
}
로그인 후 복사

또한 트랜잭션을 시작하기 위해 Begin_transaction()을 사용합니다. 그런 다음 commint() 메서드를 통해 트랜잭션을 커밋합니다. 이 테스트 코드에서 두 번째 SQL 문은 오류를 보고하므로 catch에 들어가고 rollback()을 사용하여 트랜잭션을 롤백합니다.

문 전처리

일반적으로 트랜잭션 처리와 PDO는 큰 차이가 없으나, 준비된 문을 사용하는 방식과 PDO에는 약간의 차이가 있습니다. 첫 번째는 MySQLi의 자리 표시자가 ? 물음표 자리 표시자일 뿐이라는 것입니다. 또한, PDO의 BindValue() 메소드와 유사하지 않은 것은 단지 PDO의'bind_param()'뿐입니다.

$stmt = $mysqli->prepare("select * from zyblog_test_user where username = ?");

$username = 'aaa';
$stmt->bind_param("s", $username); // 绑定参数
$stmt->execute(); // 执行语句
$aUser = $stmt->fetch(); // 获取mysqli_result结果集对象

$username='bbb';
$stmt->bind_param('s', $username);
$stmt->execute();
$bUser = $stmt->fetch();

var_dump($aUser);
// array(4) {
//     ["id"]=>
//     int(1)
//     ["username"]=>
//     string(3) "aaa"
//     ["password"]=>
//     string(3) "aaa"
//     ["salt"]=>
//     string(3) "aaa"
//   }

var_dump($bUser);
// array(4) {
//     ["id"]=>
//     int(2)
//     ["username"]=>
//     string(3) "bbb"
//     ["password"]=>
//     string(3) "bbb"
//     ["salt"]=>
//     string(3) "123"
//   }
로그인 후 복사

코드에서 볼 수 있듯이,bind_param() 메소드의 사용도 PDO와 매우 다릅니다. 아래첨자가 필요하지 않지만 s 매개변수가 제공됩니다. 이 매개변수는 바인딩된 데이터의 유형을 나타내며, s는 문자열 유형입니다. 다른 유형에 대해서는 MySQLi_STMT 관련 내용을 공부할 때 더 자세히 알아볼 것입니다.

요약

사실 코드 수준에서 보면 대부분의 내용이 PDO와 매우 유사하지만 일부 매개변수가 다릅니다. 우리에게는 MySQLi를 기본 데이터베이스 작업으로 사용하는 일부 프레임워크를 캡슐화하거나 사용할 때 혼란을 피하기 위해 여전히 학습과 이해에 관한 것입니다.

테스트 코드:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/7.PHP中的MySQLi扩展学习(四)mysqli的事务与预处理语句.php
로그인 후 복사

추천 학습: php 비디오 튜토리얼

위 내용은 PHP에서 mysqli 트랜잭션과 준비된 문을 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
php
원천:segmentfault.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿