MySQLi의 경우 트랜잭션과 준비된 명령문은 물론 MySQL 확장을 제거할 수 있는 자본입니다. 우리는 이전에 PDO의 트랜잭션과 준비된 명령문에 대해서도 배웠습니다. 따라서 여기서는 더 이상 이론에 대해 이야기하지 않고 직접 코드로 이동하여 MySQLi와 PDO에서 이 두 기능의 사용 차이를 살펴보겠습니다.
우선, 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!