En PHP, l'utilisation de PDO (objets de données PHP) pour effectuer des opérations de base de données est une pratique courante et recommandée. Surtout lors de l'exécution des opérations SQL par lots, la fonction PDO :: EXEC est souvent utilisée pour exécuter des instructions SQL non quey, telles que l'insertion , la mise à jour ou la suppression . Cependant, lorsque vous utilisez PDO :: Exec pour les opérations par lots, il existe des goulots d'étranglement de performances et des problèmes potentiels auxquels il faut faire attention. Une évasion raisonnable peut assurer l'efficacité et la stabilité du programme.
La fonction PDO :: EXEC est utilisée pour exécuter une ou plusieurs instructions SQL qui ne renvoient pas l'ensemble de résultats. Sa valeur de retour est le nombre de lignes affectées. Les exemples sont les suivants:
<?php
$pdo = new PDO('mysql:host=m66.net;dbname=testdb;charset=utf8', 'username', 'password');
$sql = "DELETE FROM users WHERE last_login < '2023-01-01'";
$affectedRows = $pdo->exec($sql);
echo "Supprimé $affectedRows D'ACCORD";
?>
Avis:
Exec ne peut pas être utilisé pour exécuter des instructions de sélection qui renvoient les ensembles de résultats.
Si l'instruction SQL ne parvient pas à s'exécuter, EXEC renvoie false .
De nombreux débutants épisseront directement plusieurs instructions SQL lors de l'exécution de l'insertion ou des mises à jour par lots et les exécuteront via un seul exécutif . Par exemple:
<?php
$sql = "INSERT INTO users (name, age) VALUES ('Alice', 25);";
$sql .= "INSERT INTO users (name, age) VALUES ('Bob', 30);";
$pdo->exec($sql);
?>
Bien que cette méthode d'écriture soit possible, elle a les lacunes suivantes:
Le risque d'injection SQL est élevé <br> L'épissage directement des données peut facilement causer des problèmes de sécurité, en particulier lorsque les données proviennent de l'entrée de l'utilisateur.
Les performances peuvent ne pas être élevées <br> Plusieurs instructions SQL sont fusionnées et exécutées, et la charge d'analyse de la base de données est lourde et peut faire attendre les verrous.
Il est difficile de localiser si quelque chose ne va pas <br> Si une instruction SQL échoue, EXEC ne peut pas vous dire lequel a échoué.
Les opérations par lots sont recommandées pour exécuter des packages dans les transactions, réduisant le nombre de soumissions de base de données et améliorant les performances:
<?php
$pdo->beginTransaction();
try {
foreach ($dataList as $data) {
$sql = "UPDATE users SET age = {$data['age']} WHERE name = '{$data['name']}'";
$pdo->exec($sql);
}
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
echo "échouer: " . $e->getMessage();
}
?>
Les transactions garantissent que toutes les opérations réussissent ou échouent, améliorant la cohérence des données.
Combiner préparer et exécuter pour éviter l'injection de SQL, et peut réutiliser les modèles de déclaration pour améliorer l'efficacité:
<?php
$stmt = $pdo->prepare("INSERT INTO users (name, age) VALUES (:name, :age)");
$pdo->beginTransaction();
foreach ($dataList as $data) {
$stmt->execute([':name' => $data['name'], ':age' => $data['age']]);
}
$pdo->commit();
?>
Cela évite les problèmes causés par l'épissage de SQL.
Si la base de données le prend en charge, vous pouvez fusionner plusieurs instructions d'insertion dans un insert par lots:
<?php
$values = [];
$params = [];
foreach ($dataList as $index => $data) {
$values[] = "(:name$index, :age$index)";
$params[":name$index"] = $data['name'];
$params[":age$index"] = $data['age'];
}
$sql = "INSERT INTO users (name, age) VALUES " . implode(',', $values);
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
?>
Les inserts par lots réduisent le nombre d'interactions de base de données et améliorent considérablement les performances.
Bien que la fusion de lots de fusion SQL puisse améliorer l'efficacité, des instructions SQL trop importantes peuvent également conduire à une dégradation des performances, dépassant même les limites de base de données. Risser raisonnablement la taille du lot, comme le traitement de 500 éléments de données à la fois, pour éviter d'être trop grand en même temps.
Évitez d'épisser directement plusieurs exécutions SQL et faites attention à la sécurité et au positionnement incorrect.
Utilisez les opérations de lots de plis de transaction pour réduire les frais généraux de soumission et assurer l'intégrité des données.
Il est recommandé d'utiliser des instructions de prétraitement pour empêcher l'injection de SQL et améliorer l'efficacité.
Utilisez l'insertion par lots SQL Merge pour réduire le nombre d'interactions de base de données.
Contrôlez la quantité de données dans chaque lot d'opérations pour éviter les problèmes de performances causés par un SQL excessif.
L'utilisation de ces méthodes peut rationnellement éviter efficacement les goulots d'étranglement des performances lors de l'utilisation de PDO :: Exec pour effectuer des opérations SQL par lots et améliorer l'efficacité et la sécurité des opérations de base de données.