La fonction de soumission automatique de PDO est activée sur MySQL avec la validation automatique désactivée
P粉011912640
2023-08-08 15:23:46
<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>
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 :
Vous pouvez le tromper en désactivant et en activant PDO::ATTR_AUTOCOMMIT :
Cela effectuera deux appels au serveur MySQL et devrait définir la valeur de validation automatique de MySQL sur 1