mysql / mysqli / mysqlnd : les extensions PHP pour MySQL

Le couple PHP / MySQL est devenu inséparable depuis quelques années maintenant… Mais la vie de couple n’est pas toujours facile. Il existe 3 façons d’unir ce couple :

  • ext/mysql : l’extension mysql classique (old school) que nous avons tous utilisés
  • ext/mysqli : l’extension mysql « improved » (sous entendu amélioré) interface object / prepared statement et autres nouveautés

Mais voilà, le hic c’est les fameuses connexions persistentes, depuis toujours on a tous désactiver cette possibilité allant même jusqu’à oublier qu’elle existait.

Mais voila MySQL AB a décidé de prendre le taureau par les cornes et de développer une libriairie de remplacement pour résoudre ces problèmes. c’est chose faite avec mysqlnd (Mysql native driver). cette librairies remplace la librairie libmysql qui se trouve dans PHP et elle est écrit directement par les équipes de MySQL.

pour en savoir plus

A tester !

Créer une table temporaire

Parfois, il est préférable ou nécessaire de passer par une table temporaire pour insérer / mettre a jour des données.
Ca vous permet d’insérer les données et eventuellement de vérifier la table temporaire avant de permutter les 2 tables.
Par exemple, vérifier que votre table comporte au moins 10 éléments ou n’est pas vide.

  1.  
  2. //j'efface la table temporaire si elle existe :
  3. $res=mysql_query("drop table if exists my_table_tmp");
  4. if ($res==false) die("Erreur mysql ".mysql_error());
  5.  
  6. //je récupére la structure de la table maitre
  7. $res=mysql_query("show create table my_table");
  8. if ($res==false) die("Erreur mysql ".mysql_error());
  9. $row=mysql_fetch_row($res);
  10. $create=$row[1];
  11.  
  12. //je substitue le nom de ma table maitre pour créer ma table temporaire
  13. $create=str_replace("my_table","my_table_tmp",$create);
  14. //je crée ma table temporaire.
  15. $res=mysql_query($create);
  16. if (!$res) die("Erreur mysql ".mysql_error());
  17.  

La requete utilisant RENAME TABLE est pratique pour ce cas :

  1.  
  2. RENAME TABLE my_table TO my_table_backup, my_table_tmp TO my_table;
  3.  

en PHP ca donne :

  1.  
  2. //Je permutte les tables
  3. $res=mysql_query("RENAME TABLE my_table TO my_table_backup, my_table_tmp TO my_table");
  4. if (!$res) die("Erreur mysql ".mysql_error());
  5.  

MySQL : testez le retour de mysql_connect, ou de mysqli->connect

Je reviens sur un problème qui m’a sauté aux yeux la semaine dernière, en effet en interrogeant Google on remarque que 797 000 pages (734 000 la semaine dernière) contiennent une erreur PHP car tout le monde pense que le serveur MySQL tourne toujours.. La preuve que non…

Je lance une grand campagne auprès de tous les webmasters PHP pour réduire ce nombre

Les news sur ce point seront disponible dans la catégorie MySQL Error Stop

Unissons nous pour faire reculer le fléau.

N’oublie pas l’indexation

Une notion que certains développeurs oublient parfois et une erreur de débutant que je vois régulièrement dans des scripts open source. Je vais prendre l’exemple (simplié a l’extrème) d’un blog avec des articles et des categories. J’ai une table avec un champ texte qui contient le texte de mon article, un identifiant (clé primaire) de l’article et une catégorie pour classer l’article (sous forme d’entier).

La création de la table donne ca :

  1. CREATE TABLE `test_index` (`id` INT NOT NULL ,`texte` TEXT NOT NULL ,`categorie` INT NOT NULL ,PRIMARY KEY ( `id` )) ENGINE = MYISAM ;

Tout va bien la plupart du temps mais quand la base commence a prendre du volume, certaines pages deviennent lentes. Dans notre cas, il s’agit de la page par categorie, c’est à dire la page qui regroupe tous les articles d’une même categorie.

La raison de cette lenteur est simple, MySQL est obligé de parcourir toute la table pour extraire les articles de la catégorie désirée.

Il faut donc ajouter un index sur le champ categorie pour accélérer les requetes du type

  1. SELECT * FROM test_index WHERE categorie='1';

Comment ajouter un index avec une commande MySQL :

  1. ALTER TABLE `test_index` ADD INDEX ( `categorie` )

Comment ajouter un index avec PHPMyAdmin :

1. Je choisis ma table

2. je vais dans le menu Structure

3. Je clique sur créer 1 index :

4. Je choisis « categorie » comme champ sur lequel je crée l’index.

5. Je clique sur Save pour enregistrer

6. Je vois la requete de création de l’index

7. mon index est affiché parmis la liste des index

Toutes mes requètes possibles sont optimisés :

  1. SELECT * FROM test_index WHERE id='2';
  2. SELECT * FROM test_index WHERE categorie='6';

Dernière remarque : il n’est jamais trop tard pour créer un index ! la création sera peut-être un peu plus longue que sur une table vide mais ce n’est pas interdit
« Il n’est jamais trop tard pour bien faire »

Et si MySQL était mort ?

Une chose assez importante auquel les développeurs ne pensent pas tout le temps : Avez vous verifié si votre serveur MySQL fonctionne correctement ? Est-ce que la fonction mysql_connect / mysqli_connect ne renvoit pas false ?

Je pense que beaucoup oublie cet étape, c’est comprehensible dans l’euphorie du développement. J’ai fait une petite requète sur Google et je vois tout simplement 734000 pages avec une erreur qui découle de ce problème…

C’est pas bien compliqué, il faut juste y penser !

  1.  
  2. $my=mysql_connect(...,...,...);
  3. if ($my===false)
  4. {
  5.   header("location: /mysql_out.php");
  6.   // a la rigueur on envoie un petit mail au webmaster pour le mettre au courant
  7.   mail(...,...,...,...);
  8.   exit;
  9. }

Allez je referai un petit point de temps en temps pour voir si ce nombre (734 000 pages sur Google) baisse un peu !

Youtube… en savoir plus

Depuis hier, vous avez commencer à mettre en place votre site de vidéo en ligne. Tout marche à la perfection mais avez-vous pensé à tout ? je ne sais pas…La référence en la matière est Youtube

Pour en savoir plus, sur l’architecture de Youtube, je vous propose de lire cet article High Scalability Youtube. Il donne un aperçu de l’architecture de ce site.

Il est important de penser dès le début à la montée en charge (redondance et multi-serveur). Il faut se poser les bonnes questions :

  • Ou est la limite de mon application ?
  • Quand mon serveur sera à saturation, comment inclure un deuxième serveur ?

Il vaut mieux avoir une idée dès le début sur ce genre de question, sinon il faudra complétement repenser l’application pour la montée en charge…. Souvent le fait de changer le serveur pour un plus puissant ne sera une solution qu’à court terme….

MySQL : On Duplicate Key UPDATE

Une problématique régulière sur un site consiste à mettre a jour des données. Parfois la donnée existe déjà et parfois elle n’existe pas.

Vous pouvez utiliser REPLACE mais le REPLACE est simplement un DELETE suivi d’un INSERT.

Exemple :

Je recois régulièrement les données d’une station météo. Parfois je recois la température, d’autre fois je recois l’humidité…si j’utilise REPLACE quand je mets à jour la température, je vais perdre l’humidité de la station X (X etant ma clé primaire, ma table comporte une ligne par station)

Deux méthodes sont possible :

  1. Je fais un SELECT pour savoir si la station a déjà des données et ensuite je fais soit un INSERT soir un UPDATE.
  2. J’utilise ON DUPLICATE KEY : INSERT INTO donnee_station SET temperature=15, station=’Nancy’ ON DUPLICATE KEY UPDATE temperature=15;

L’avantage de la deuxième méthode : cela réduit le code et je ne fais qu’une requete (meme si au niveau du serveur il en execute 2 :il essaye de faire INSERT si il recoit l’erreur Duplicate key Entry il fait UPDATE)

En résumé c’est plus facile est plus propre.

References:



Check out our best movie collection. Latest CD, DVD, HQ DVD movie downloads. Buy and download movies instantly.