Serveur d'impression

PHP Master | Migrer de l'extension MySQL vers PDO – Serveur d’impression

Le 3 mai 2019 - 6 minutes de lecture

Ce guide est un aperçu pratique qui vous aidera à commencer la migration de votre code PHP existant de l’utilisation de l’ancienne extension MySQL vers l’extension d’abstraction de la base de données PDO la plus récente. Je n'entrerai pas dans toutes les fonctionnalités disponibles avec PDO, mais je volonté partagez avec vous les méthodes de base que vous aurez besoin de connaître et proposez quelques astuces pour que votre migration soit aussi rapide et simple que possible.

Tout d’abord, vous devez comprendre où se situe PDO dans l’écosystème PHP. Il existe actuellement trois manières de s’interfacer avec une base de données MySQL de PHP: la première avec l’extension MySQL, la seconde avec l’extension MySQLi et la troisième avec PDO.

L'extension MySQL est la plus ancienne des trois et était l'option originale utilisée par les développeurs pour communiquer avec MySQL. L'extension est maintenant déconseillée au profit des deux autres alternatives en raison des améliorations apportées aux nouvelles versions de PHP et de MySQL.

MySQLi est l'extension «améliorée» permettant de travailler avec des bases de données MySQL. Il tire parti des fonctionnalités disponibles dans les versions les plus récentes du serveur MySQL, expose au développeur une interface orientée fonction et une interface orientée objet, ainsi que quelques autres choses astucieuses. Si PDO ne convient pas à votre projet, il s’agit de l’extension que vous devriez utiliser.

PDO est l’extension la plus récente, qui signifie «Objets de données PHP». PDO offre une API qui consolide la plupart des fonctionnalités qui étaient auparavant réparties entre les principales extensions d’accès à la base de données, à savoir MySQL, PostgreSQL, SQLite, MSSQL, etc. expose les objets de haut niveau permettant au programmeur de travailler avec les connexions, les requêtes et les jeux de résultats de la base de données, et les pilotes de bas niveau assurent la communication et la gestion des ressources avec le serveur de base de données. La discussion et le travail vont bon train dans PDO et cela est considéré comme la méthode appropriée pour travailler avec des bases de données dans un code professionnel moderne.

Dans la mesure du possible, je recommande aux personnes d’éviter les intermédiaires pour ainsi dire et de migrer de l’extension MySQL vers PDO plutôt que vers MySQLi. PDO offre une API cohérente pour travailler avec diverses bases de données. Vous n’avez donc pas besoin de modifier votre code PHP si vous devez utiliser une autre base de données. De plus, bien que l’extension MySQLi soit actuellement maintenue, il est toujours possible qu’elle soit déconseillée à l’avenir. Choisir de migrer vers PDO maintenant signifie que vous n’aurez pas à migrer plus tard et à mettre à jour votre code deux fois. J'utilise PDO et vous devriez aussi!

Installation et configuration de PDO

Une fois que vous avez décidé de moderniser votre code, vous devez vous assurer que PDO est correctement configuré et configuré. Comme je l'ai déjà mentionné, PDO se compose de deux parties: l'extension elle-même qui expose l'interface et un pilote de bas niveau spécifique à la base de données. Des pilotes existent pour une liste croissante de bases de données, y compris MySQL.

PDO et le pilote spécifique à SQLite doivent faire partie de l'installation PHP par défaut à partir de la version 5.1.0 et le pilote spécifique à MySQL doit toujours être installé, mais la plupart des distributions Linux ont souvent des idées différentes sur la manière dont PHP doit être compilé et empaqueté. En fait, bon nombre des principales distributions regroupent désormais l'extension MySQL, l'extension MySQLi et le pilote PDO MySQL dans le même package. Il est probable que si vous utilisez MySQL sur un tel système, PDO est probablement déjà configuré pour vous.

  • Ubuntu construit PHP avec PDO (mais ne compresse pas le pilote SQLite par défaut) et regroupe les extensions et le pilote MySQL. Vous pouvez installer les extensions et le pilote en lançant sudo apt-get install php5-mysql.
  • Fedora regroupe également les extensions et le pilote, mais regroupe PDO en tant que module chargeable. Fonctionnement sudo yum installer php-mysql installe les extensions et le pilote MySQL et le php-pdo package sera automatiquement inclus en tant que dépendance.
  • SUSE est la seule distribution des trois qui construit PHP de la manière recommandée par l'équipe PHP en ce qui concerne PDO; ils construisent PHP avec PDO et inclure le pilote SQLite. yast2 --installe php5-mysql installera les extensions MySQL et le pilote dont vous avez besoin.

Sous Windows, tous les pilotes PDO sont inclus dans le dossier ext qui a été créé lors de l’installation de PHP à partir de l’archive binaire précompilée. Il vous suffit de mettre à jour votre php.ini en ajoutant ou en supprimant la ligne de commentaire:

extension = php_pdo_mysql.dll

Il est toujours possible de compiler vous-même les pilotes dans le pire des cas. Assurez-vous que les bibliothèques MySQL et les autres fichiers de développement sont installés et accessibles dans votre environnement de construction, car la plupart des problèmes rencontrés par les utilisateurs lors de la compilation d’un résultat résultent de l’impossibilité pour le compilateur de trouver différents liens ou fichiers d’en-tête.

Requête de base

Le flux de travail de base permettant d’utiliser les fonctions de l’extension MySQL pour travailler avec une base de données peut être considéré comme un processus en 5 étapes:

  1. Établissez une connexion au serveur de base de données et sélectionnez la base de données avec laquelle vous allez travailler
  2. Construire une requête pour envoyer le serveur
  3. Envoyer la requête
  4. Itérer sur les résultats renvoyés
  5. Libérer les ressources utilisées par le résultat et éventuellement la connexion à la base de données
<? php
// Étape 1: Établir une connexion
$ db = mysql_connect ("localhost", "testusr", "secretpass");
mysql_select_db ("testdb", $ db);

// Étape 2: Construire une requête
$ query = "SELECT * FROM foo WHERE bar = '". mysql_real_escape_string ($ zip). "'";

// Étape 3: envoyer la requête
$ result = mysql_query ($ query, $ db);

// Étape 4: Itérer sur les résultats
while ($ row = myql_fetch_assoc ($ result)) 
    print_r ($ row);


// Étape 5: Libérer les ressources utilisées
mysql_free_result ($ result);
mysql_close ($ db);

Avec PDO, le même processus peut être suivi et ressemble à ceci:

quote ($ zip);

// Étape 3: envoyer la requête
$ resultat = $ db-> query ($ query);

// Étape 4: Itérer sur les résultats
while ($ row = $ result-> fetch (PDO :: FETCH_ASSOC)) 
    print_r ($ row);


// Étape 5: Libérer les ressources utilisées
$ result-> closeCursor ();
$ db = null;

Le processus de connexion au serveur et de sélection de la base de données avec PDO est effectué à l'aide d'un DSN au lieu du myql_connect () et mysql_select_db (). Un DSN est une abréviation de «Nom de la source de données», qui est une chaîne identifiant le pilote PDO à utiliser pour communiquer avec la base de données et transmettant toute information de connexion essentielle, telle que le serveur hôte, le port de connexion et le nom de la base de données. Selon votre base de données, le format du DSN que vous fournissez peut varier. Les principaux composants nécessaires à chaque pilote sont documentés sur php.net, mais malheureusement, ils sont parfois difficiles à trouver. Je recommande d’utiliser la fonction de recherche du site pour rechercher le terme «DSN» dans la documentation en ligne.

Notez également que AOP :: quote () les deux évasions et cite une valeur alors que mysql_real_escape () n'échappe que la valeur. N'oubliez pas cela pour ne pas vous retrouver avec des guillemets supplémentaires dans la requête finale et ne vous grattez pas la tête pour savoir d'où ils viennent.

Parfois, vous pouvez vous en sortir sans libérer la ressource de résultat avec mysql_free_result (), Je vous recommande de ne pas prendre de telles habitudes paresseuses lorsque vous utilisez le mode AOP. Si vous avez toujours un résultat à partir d'un SÉLECTIONNER requête qui n'a pas appelé closeCursor () encore et vous essayez de faire un INSÉRER ou METTRE À JOUR sur la table, la modification peut échouer en silence et vous vous retrouverez à vous gratter la tête. Mieux vaut prendre l'habitude de faire les choses correctement pour éviter des situations frustrantes par la suite.

Creuser (légèrement) plus profondément

Ce qui a été couvert jusqu’à présent est suffisant pour vous permettre de commencer à migrer votre application PHP de MySQL vers PDO le plus rapidement et le moins douloureusement possible, mais le PDO ne se limite pas à ce que je vous ai montré. Je voudrais également souligner quelques autres fonctionnalités PDO que vous pouvez trouver utiles: instructions préparées et traitement des erreurs.

Déclarations préparées

Une instruction préparée est une représentation d'une requête en tant qu'objet. L'avantage de représenter une requête en tant qu'objet est que vous pouvez y associer une logique supplémentaire qui serait autrement difficile à gérer pour une représentation sous forme de chaîne à plat. Par exemple, vous pouvez spécifier des espaces réservés dans une requête qui sont ensuite liés aux variables de votre script. Ceci est utile si vous exécutez la même requête plusieurs fois pour satisfaire la requête mais avec des paramètres différents. La requête n'a besoin d'être préparée qu'une seule fois, mais peut être exécutée plusieurs fois avec des valeurs différentes lorsque la valeur des variables change.

prepare ("INSERT INTO users (prenom, prenom, email) VALEURS (: nom,: lname,: email)");

// lie les noms d'espace réservé à des variables de script spécifiques
$ query-> bindParam (": fname", $ firstName);
$ query-> bindParam (": lname", $ lastName);
$ query-> bindParam (": email", $ email);

// attribue des valeurs aux variables spécifiques et exécute la requête
foreach ($ utilisateurs en $ u) 
    $ firstName = $ u["first_name"];
    $ lastName = $ u["last_name"];
    $ email = $ u["email"];
    $ query-> execute ();

Il n'est pas nécessaire que les paramètres soient cités ou échappés avec les instructions préparées car le pilote sous-jacent cite et échappe automatiquement les paramètres liés à votre place. Pour cette raison, de nombreuses personnes préfèrent utiliser des instructions préparées pour se protéger des vulnérabilités d'injection SQL, même si la requête n'est exécutée qu'une seule fois.

La gestion des erreurs

Vous pouvez spécifier l’un des trois paradigmes de gestion des erreurs différents avec PDO en utilisant PDO :: setAttribute () pour définir le mode de traitement des erreurs.

setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION);

Les modes sont:

  • Mode silencieux (PDO :: ERRMODE_SILENT) – définit le code d'erreur interne mais n'interrompt pas l'exécution du script (paramètre par défaut)
  • Mode d'avertissement (PDO :: ERRMODE_WARNING) – définit le code d'erreur et déclenche un message E_WARNING
  • Mode d'exception (PDO :: ERRMODE_EXCEPTION) – définit le code d'erreur et lève un objet PDOException

Quel que soit le mode défini, un code d’erreur interne est défini et vous pouvez le vérifier à l’aide des touches code d'erreur() et errorInfo () méthodes de la AOP et PDOStatement objets. Ce sont analogues à mysql_errno () et mysql_error (). code d'erreur() renvoie une chaîne de 5 caractères telle que définie dans la norme ANSI SQL-92. errorInfo () est généralement plus utile car il retourne un tableau qui inclut un message d'erreur en plus du code à 5 caractères.

query ($ query);
$ error = $ db-> errorInfo ();
si (! is_null ($ error[2])) 
    echo "La requête a échoué!". $ error[2];

...

Si vous utilisez le mode exception, une description de ce qui ne va pas est disponible dans l’objet exception. getMessage () méthode.

query ($ query);
    ...

catch (PDOException $ e) 
    echo $ e-> getMessage ();

Résumé

Vous devez maintenant disposer des connaissances de base nécessaires pour démarrer la migration de l'ancienne extension MySQL vers la nouvelle extension PDO. Vous avez constaté que, même si la plupart du temps, PDO est déjà disponible, il est facile à configurer si, pour une raison quelconque, ce n’est pas le cas. Vous avez également constaté à quel point il est facile de se connecter à un serveur de base de données MySQL, d'émettre des requêtes et de recevoir les résultats. Bien sûr, ce n’était qu’un aperçu pratique; Pour en savoir plus sur ce que PDO peut offrir et sur la façon dont vous pouvez en tirer parti, je vous encourage à lire la documentation disponible sur php.net.

Image via Dirk Ercken / Shutterstock

Commentaires

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.