PDO의 자동 제출 기능은 자동 커밋이 꺼진 MySQL에서 활성화됩니다.
<p>저는 PDO만 사용하는 레거시 PHP 코드 베이스에 배정되었습니다.
연결은 다음 패턴을 사용하여 수행됩니다.
;
<pre class="lang-php Prettyprint-override"><code>// MySQL 데이터베이스에 연결
$con = new mysqli($host, $user, $password, $database);
// 연결 확인
if ($con->connect_error) {
die("연결 실패: " . $con->connect_error);
}
$con->자동 커밋(true);
<p>그리고 해당 자동 커밋(true)을 사용하면 MySQL 서버가 SET autocommit = 0으로 구성된 경우에도 예상대로 작동합니다. </p><p>이제 일반 SQL에서 준비된 명령문으로 마이그레이션하려고 하므로 다음과 같이 작성했습니다.</p><p><br /></p>
<pre class="lang-php Prettyprint-override"><code>$dsn = "mysql:host=$host;dbname=$database";
$pdo = 새 PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, true);
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);
<p>아래의 예제 함수</p>
<pre class="lang-php Prettyprint-override"><code>함수 updateTeam($pdo, $name, $id)
{
노력하다 {
$데이터 = [
'이름' => $이름,
'id' => $id
];
$sql = "업데이트 팀 SET 이름 = :name WHERE id=:id";
$stmt = $pdo->prepare($sql);
$stmt->실행($data);
// $pdo->커밋();
}
잡기(PDOException $e) {
db::$pdo->롤백();
error_log('실패: ' . $e->getMessage() );
}
잡기 (예외 $exc) {
db::$pdo->롤백();
error_log('실패: ' . $exc->getMessage());
}
}
<p>제출하지 마세요. 작동하려면 $pdo->commit();의 주석 처리를 제거해야 하는데, 응용 프로그램의 모든 쿼리 문을 변경해야 하기 때문에 원하지 않습니다.
PDO 구성에서 무엇을 놓쳤나요? 나는 var_dump($pdo->query('SELECT @@autocommit')->fetchAll()); 을 시도했고 결과는 </p><p><code></code>< /p>
<pre class="brush:php;toolbar:false;">array(1) { [0]=> array(2) { ["@@autocommit"]=> [0]=> 문자열(1) "0" } }</pre>
<p><br /></p>