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 : instructions préparées ou cache de requêtes ? Que devriez-vous privilégier ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-11 03:08:09894parcourir

PDO MySQL: Prepared Statements or Query Cache? Which Should You Prioritize?

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 :

  • L'émulation des instructions préparées de PDO offre de meilleures performances.
  • Les instructions préparées natives de MySQL améliorent la sécurité contre SQL injection.
  • Les instructions préparées natives de MySQL fournissent un meilleur rapport d'erreurs.

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

  • Les déclarations préparées natives entraînent un coût fixe lors de la préparation. Ainsi, si une instruction préparée n'est pas réutilisée, les instructions préparées émulées peuvent offrir un léger avantage en termes de performances.
  • Les plans de requête pour les instructions préparées natives peuvent être mis en cache et partagés, mais cela n'est pas connu dans MySQL.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn