La fonction de soumission automatique de PDO est activée sur MySQL avec la validation automatique désactivée
P粉011912640
P粉011912640 2023-08-08 15:23:46
0
1
500
<p>Je viens d'être affecté à une base de code PHP héritée qui utilisait uniquement PDO. </p><p>La connexion s'effectue selon le modèle suivant : </p><p><br /></p> <pre class="lang-php Prettyprint-override"><code>// Se connecter à la base de données MySQL $ con = nouveau mysqli ($ hôte, $ utilisateur, $ mot de passe, $ base de données); // Vérifier la connexion si ($con->connect_error) { die("Échec de la connexion : " . $con->connect_error); } $con->autocommit(true); </code></pre> <p>Et l'utilisation de cet autocommit(true) fonctionne comme prévu même si le serveur MySQL est configuré avec SET autocommit = 0. </p><p>Maintenant, j'essaie de migrer du SQL normal vers les instructions préparées, j'ai donc écrit ceci</p><p><br /></p> <pre class="lang-php Prettyprint-override"><code>$dsn = "mysql:host=$host;dbname=$database"; $pdo = nouveau PDO($dsn, $user, $password); $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, true); $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1); </code></pre> <p>et l'exemple de fonction ci-dessous</p> <pre class="lang-php Prettyprint-override"><code>fonction updateTeam($pdo, $name, $id) { essayer { $données = [ 'nom' => $nom, 'id' => $id ]; $sql = "UPDATE teams SET name = :name WHERE id=:id"; $stmt = $pdo->prepare($sql); $stmt->exécuter($data); // $pdo->commit(); } attraper (PDOException $e) { db::$pdo->rollback(); error_log('Échec : ' . $e->getMessage() ); } catch (Exception $ exc) { db::$pdo->rollback(); error_log('Échec : ' . $exc->getMessage()); } } </code></pre> <p>Ne pas soumettre. Je dois décommenter $pdo->commit(); pour que cela fonctionne, ce que je ne veux pas car cela m'oblige à modifier chaque instruction de requête dans l'application. </p><p>Qu'ai-je manqué dans la configuration PDO ? J'ai essayé var_dump($pdo->query('SELECT @@autocommit')->fetchAll()); et le résultat était </p><p><code></code>< /p> <pre class="brush:php;toolbar:false;">array(1) { [0]=> array(2) { ["@@autocommit"]=> [0]=> chaîne(1) "0" } }</pre> <p><br /></p>
P粉011912640
P粉011912640

répondre à tous(1)
P粉799885311

La validation automatique de PDO est différente de la validation automatique de MySQL. Cela signifie que si vous définissez la valeur par défaut de autocommit sur 0 dans votre configuration MySQL, cela ne modifiera pas la valeur par défaut de PDO::ATTR_AUTOCOMMIT. La valeur par défaut de PDO::ATTR_AUTOCOMMIT est toujours vraie.

La modification de la valeur de PDO::ATTR_AUTOCOMMIT par la même valeur ou toute autre valeur qui n'est pas un booléen ou un entier sera ignorée. Cela signifie que les deux opérations sont sans opération :

$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, true); // 因为默认值是true
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1); // 转换为布尔值true,与默认值相同

Vous pouvez le tromper en désactivant et en activant PDO::ATTR_AUTOCOMMIT :

$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, false);
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, true);

Cela effectuera deux appels au serveur MySQL et devrait définir la valeur de validation automatique de MySQL sur 1

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal