Vous êtes ici : Accueil > Archives > Tutoriels > PHP et MySQL > Fonctions MySQL de PHP, suite

< Retour
Fonctions MySQL, suite
1er script par l'exemple

Fonctions MySQL de PHP, suite

mises à jour : 21+22.08.2004, 30.07.2005

Autres fonctions MySQL de PHP, pas vitales, mais qu'il est toujours bon de connaitre ou, au moins, de savoir qu'elles existent !


mysql_insert_id()

$nouvel_identifiant = mysql_insert_id();

paramètres :
-

résultat :
Un entier.

> permet de récupérer le nouvel identifiant créé dans un champ MySQL ayant l'option auto_increment activé (c'est le cas de la plupart des clés primaires des tables).
Attention, avertissement ! Attention ! cette fonction doit être appellée immédiatement après la fonction mysql_query() (>>) ayant exécuté la requete SQL « INSERT INTO ... ». Elle ne fonctionne donc pas si mysql_query() (>>) exécute des requêtes « UPDATE », « DELETE » ou tous simplement « SELECT »...


exemple :

En supposant que nous utilisons la même table de personnes qu'au chapitre précédent (>>), nous allons insérer un nouveau nom.

<?php
$execution = mysql_query( "INSERT INTO `personnes` ( `prenom`, `nom` ) VALUES ( 'Emmanuel', 'Stern' );" );
$nouvel_id = mysql_insert_id();
echo "La personne qui vient d'être ajoutée a reçu l'identifiant n°" . $nouvel_id . ".<br />\n";
?>

Ce qui devrait nous dire « La personne qui vient d'être ajoutée a reçu l'identifiant n°5. », au vu de l'existant de la table...


voir aussi

SQL standard > manipulation de données > >> syntaxe INSERT

mysql_affected_rows()

$nombre_lignes_concernees = mysql_affected_rows();

paramètres :
Optionnel. Prends par défaut la dernière utilisation de mysql_query() (>>), et je crois qu'il est possible de lui fournir un identifiant de ressource MySQL...

résultat :
Un entier.

> permet de retourner le nombre de tuples MySQL affectés par un « UPDATE » ou un « DELETE ».
> Attention, pour les requêtes « SELECT », il faut se servir de mysql_num_rows() (>>), et ce même si un bug de la version 4.0.× permet de se servir du mysql_affected_rows() sur une requête « SELECT », mais comme je ne sait pas si le bug à été corrigé dans les versions 4.1+, ne vous servez que de ce qui à été fait pour ça !
Attention, avertissement ! Attention ! attention, il se peut que votre nombre de lignes affectées soit à zéro si vous faites un « UPDATE » d'un champ en remplacant son ancienne valeur par exactement la même chose ! C'est bizarre, mais c'est dû à MySQL, pas à PHP.


exemple :

<?php
mysql_query( "UPDATE personnes SET nom = 'Stairn' WHERE personne_id = 5" );
$nb_modif = mysql_affected_rows();
echo $nb_modif . " personne(s) ont été mises à jour.<br />";

$execution = mysql_query( "UPDATE personnes SET prenom = 'Cédric' WHERE personne_id = 3;" );
$nb_modif = mysql_affected_rows();
echo $nb_modif . " personne(s) ont été mises à jour.<br />";
?>

Dans le premier cas, on remplace « Stern » par « Stairn », nous aurons donc pour mysql_affected_rows() la valeur de 1. Par contre, dans le deuxième cas, nous remplacons « Cédric » par « Cédric », et bien que cette requête soit correcte, mysql_affected_row() retournera comme valeur 0, car il n'y a pas de changement du contenu.


voir aussi

SQL standard > manipulation de données > >> syntaxe UPDATE
SQL standard > manipulation de données > >> syntaxe DELETE

mysql_free_result()

mysql_free_result( $curseur );

paramètres :
$curseur est un identifiant de ressource MySQL crée par mysql_query() (>>).

résultat :
Libère la mémoire allouée par MySQL pour stocker le résultat, la fameuse ressource...

> À utiliser juste après la dernière utilisation de votre curseur par une fonction mysql_result() (>>) ou mysql_fetch_*() (>>), mysql_free_result() libère la mémoire utilisée par la ressource créée en amont par mysql_query() (>>).
> Très pratique pour avoir un code propre (création d'une ressource, utilisation, puis libération), elle est cependant peut usitée.
> Elle a été adoptée sur ce site dès que j'ai reçu en l'espace de 24 heures une demi-douzaine d'alertes « utilisation excessive de CPU ». Depuis, plus rien ;-))


exemple :

<?php
$curseur = mysql_query( "SELECT nom, prenom FROM personnes ORDER BY nom" );
while( $un_element = mysql_fetch_array( $curseur ) )
{
echo "- " . $un_element["nom"] . ", " . $un_element["prenom"] . "<br />\n";
}
mysql_free_result( $curseur );
?>

mysql_close()

mysql_close();

paramètres :
Prends automatiquement en compte la dernière connexion ouverte.

résultat :
Ferme la connexion à la base de données...

> Ferme la connexion ouverte avec mysql_connect() (>>).
> mysql_close() est une des fonctions MySQL les moins utilisées, car il y implicitement une fermeture de connexion à la fin de l'execution du script, dès que la dernière balise ?> est interprêtée par le serveur.
> Elle est par contre très utile dès lors que vous jonglez avec deux bases de données, situées sur des serveurs différents et avec des identifiants différents (c'est tout de même assez rare dans le cadre de petits projets ou de sites web classiques...). Vous devez alors ouvrir puis fermer la connexion au fur et à mesure de votre script et de ses besoins.


> Optimisation des Bases MySQL

Après avoir effectué un grand nombre d'insertions et de suppressions dans une base MySQL, il se peut qu'elle se retrouve dans un état plus ou moins pitoyable. En effet, il y des espaces de stockage qui sont libérés et qui ne sont pas ré-alloués spontanément.

La solution consiste à exécuter une requête MySQL un peu spéciale, qui est disponible via l'interface PHPmyAdmin, mais que l'on peut très bien intégrer directement dans le code :

<?Php
mysql_query( "OPTIMIZE TABLE nom_de_la_table" );
?>

Rien ne vous empêche de mettre plusieurs noms de tables, en les séparant avec des virgules. Ainsi, et grâce à cette ligne de code insérée juste après vos requêtes « DELETE », les performances de MySQL seront toujours au top !