# MySQL/API

* Introduction
* PhpMyAdmin
* Parcourir les bases de données
* Spécifier les noms
* LDD, LMD et LCD
* Variables utilisateurs
* Alias
* Types de données
* Manipulation de base
** mysqldump
* Manipulation de table
* Manipulation de données
* Requêtes
* NULL
* Opérateurs
* Fonctions
* Procédures stockées
* Regex
* Bases de données spatiales
* Importer et exporter
* Réplication
* Optimisation
* API
* Sécurité
* Mots réservés
* Débogage
* Introduction
* PhpMyAdmin
* Parcourir les bases de données
* Spécifier les noms
* LDD, LMD et LCD
* Variables utilisateurs
* Alias
* Types de données
* Manipulation de base
** mysqldump
* Manipulation de table
* Manipulation de données
* Requêtes
* NULL
* Opérateurs
* Fonctions
* Procédures stockées
* Regex
* Bases de données spatiales
* Importer et exporter
* Réplication
* Optimisation
* API
* Sécurité
* Mots réservés
* Débogage
[ Modifier le sommaire ]
L'interface de programmation (API) MySQL permet aux applications d’interagir avec les bases de données.

## Optimisation
### Appels API
#### Connexions persistantes

En utilisant les connexions persistantes, plusieurs requêtes peuvent être exécutées sans reconnexion. C'est un gain de temps pour l'utilisateur, mais le serveur doit y allouer une partie de sa RAM pendant tout ce temps, ce qui peut le saturer, surtout quand tous ses sites le font.

#### Mémoire libre

Certaines requêtes enregistrent une ligne dans une variable. Cela peut donc avoir du sens de libérer cette mémoire un peu avant la fin du script, plutôt qu'à la toute fin.

#### Recherche de ligne

La plupart des APIs proposent deux types de recherches de ligne : en tableau (associatif ou pas) ou en objet.
Assigner les lignes dans un objet est plus lent, alors que le tableau non associatif est le plus rapide (et c'est le mieux si on ne prend qu'un seul champ par enregistrement).

#### API vs SQL

Généralement, les APIs ont des méthodes optimisées qui créent des commandes SQL et les envoient au serveur MySQL.

### Réduire les communications client/serveur

* Certains scripts utilisent deux requêtes pour extraire une table pivot. Les communications client/serveur étant toujours le facteur ralentissant des applications, il faut préférer une seule jointure à la place.
* Si toutefois plusieurs requêtes s'avèrent nécessaires, utiliser les connexions persistantes.
* Ne sélectionner que le minimum de champs (éviter *).
* Éviter d'inclure dans les commandes SQL des caractères inutiles (espaces, tabs, commentaires...).

#### CREATE ... SELECT, INSERT ... SELECT

Lors de création de nouvelle table depuis une existante, CREATE ... SELECT peut être utilisé.
Pour remplir une table existante, c'est INSERT ... SELECT ou REPLACE ... SELECT.

#### INSERT DELAYED

Certains scripts n'ont pas besoin de vérifier si les insertions se sont bien déroulées.
Dans ce cas, faire appel à INSERT DELAYED pour que le serveur n'attende pas.

#### REPLACE

Lors d'un DELETE précédé d'un INSERT, le serveur reçoit deux commandes SQL.
En revanche, avec REPLACE il n'en reçoit qu'une.
De plus, REPLACE DELAYED est possible.

### Autres techniques
#### Stocker les données dans des cookies

Parfois, des données de session sont stockées dans la base.
Cela nécessite un UPDATE et un SELECT à charge chargement de page.
Cela peut être évité avec les cookies (même si l'utilisateur peut refuser leur utilisation, ou bien lire leur contenu). Il faut éviter d'y stocker des mots de passe et leur attribuer un bref temps de vie sous peine de compromettre la vie privée de l'utilisateur.
Autre solution :
* Une fois l'utilisateur connecté sur le site, lancer CURRENT_TIMESTAMP et un ID au hasard ;
* Définir un cookie avec cet ID ;
* Quand l'utilisateur fait quelque chose qui nécessite de vérifier son identification :
* Mettre à jour le timestamp.

#### Créer du contenu statique

Quand un utilisateur lit du contenu dynamique (d'une base), un document HTML est généré.
Souvent, cette page ne contient pas de variable mais du contenu inséré une seule fois, sans mise à jour.
D'où l'idée de stocker des pages HTML statiques, supprimée puis regénérées lors des mises à jour de la base.

## PHP
### Pilotes

PHP possède les pilotes officiels suivant pour MySQL :
* mysql : ancien mais toujours utilisé dans les applications web ; c'est un module PHP procédural.
* mysqli : plus rapide, peut être utilisé comme un ensemble de classes ou comme une bibliothèque procédurale.
* PDO (PHP Data Objects) : utilise PDO, une couche abstraite pour interaction avec les bases, avec des pilotes pour MySQL et ODBC.
* PDO_MYSQL : propose des fonctionnalités MySQL avancées, et les émulent si absentes.
Les fonctions de ces pilotes utilisent l'API C. Elles peuvent utiliser MySQL Client Library ou mysqlnd, comme pilotes natifs pour PHP.
Parfois, activer mysql et mysqli peut causer des problèmes. Il est donc préférable d'en activer qu'un.
De plus, PHP possède une extension ODBC qui fonctionne avec MySQL.
PEAR est un framework PHP important qui prend en charge MySQL.

### register_globals et $_REQUEST

PHP a des variables d'environnement appelées register_globals. Depuis PHP 4.2, elles sont False par défaut, et ne doivent pas être activées. Dans PHP 5.3 la fonctionnalité est devenue obsolète et supprimée en PHP 5.4.0.
Cependant, si la version de PHP utilisée accepte register_globals, on peut vérifier s'il est activé lancer ini_get. Si c'est le cas, ini_set ne pourra pas le changer. Il y a deux façons de le faire :
* Éditer php.ini.
* Ajouter une ligne au .htaccess :
En fait si register_globals est True, un utilisateur peut arbitrairement ajouter des variables à votre script avec ce genre de commande :
Ne jamais utiliser le tableau $_REQUEST, lui préférer :
* $_ENV
* $_GET
* $_POST
* $_COOKIE
* $_SERVER
Cet ordre est celui suivi par PHP, mais il peut être modifié par variables_order.
Cela signifie que si votre script définit une variable serveur appelée "userid" et que l'application tente de la lire dans $_REQUEST, l'utilisateur peut prévenir en ajoutant une variable à la requête.