Maison >base de données >tutoriel mysql >PDO MySQL : instructions préparées ou cache de requêtes ? Que devriez-vous privilégier ?
PDO MySQL : exploitez le cache de requêtes et la sécurité des instructions préparées
MySQL propose à la fois des instructions préparées natives et un cache de requêtes pour l'optimisation et la sécurité. Cependant, la question se pose : lesquels doivent être prioritaires dans les configurations PDO ?
Démystifier les mythes
La perception commune est la suivante :
Cependant, ces instructions peuvent ne pas être vraies avec les versions récentes de MySQL et PHP.
Performances vs sécurité
En termes de performances, les versions MySQL 5.1.17 ou supérieures permettent la mise en cache des requêtes avec préparé déclarations. Par conséquent, il est possible d'exploiter à la fois les performances et la sécurité avec les nouvelles versions de MySQL et PHP.
En ce qui concerne la sécurité, les instructions préparées natives n'offrent aucune protection supplémentaire contre l'injection SQL. PDO échappe déjà aux valeurs des paramètres de requête et ce processus n'est pas affecté par le paramètre EMULATE_PREPARES.
Rapport d'erreurs
Les instructions préparées natives déclenchent des erreurs de syntaxe lors de la préparation, alors qu'elles sont préparées avec émulation les instructions reportent ces erreurs au moment de l’exécution. Cela affecte le code que vous écrivez, en particulier avec PDO::ERRMODE_EXCEPTION.
Considérations supplémentaires
Recommandation
Pour les anciennes versions de MySQL et PHP, il est recommandé d'émuler les instructions préparées. Cependant, pour les versions plus récentes, des instructions préparées natives doivent être utilisées (en désactivant l'émulation).
Fonction de connexion PDO personnalisée
Vous trouverez ci-dessous un extrait de code pour une connexion PDO. fonction avec des paramètres optimaux :
function connect_PDO($settings) { $emulate_prepares_below_version = '5.1.17'; $dsnpairs = []; foreach ($settings as $k => $v) { if ($v !== null) { $dsnpairs[] = "{$k}={$v}"; } } $dsn = 'mysql:'.implode(';', $dsnpairs); $dbh = new PDO($dsn, $settings['user'], $settings['pass']); $serverversion = $dbh->getAttribute(PDO::ATTR_SERVER_VERSION); $emulate_prepares = (version_compare($serverversion, $emulate_prepares_below_version, '<')); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, $emulate_prepares); return $dbh; }
En tirant parti de cette fonction ou en la personnalisant selon vos préférences spécifiques, vous pouvez atteindre l'équilibre idéal entre performances et sécurité dans vos connexions AOP.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!