Médiaforma

All posts in PHP MySQL

Pour se connecter à une base de données MySQL, nous utiliserons une approche objet avec l’extension PDO (PHP Data Object). La technique étudiée ici est utilisable sur d’autres bases de données. Par exemple PostgreSQL ou Oracle.

Activer PDO

Avant de pouvoir utiliser PDO, vous devez activer cette extension. En principe, elle devrait être activée par défaut par WampServer. Pour le vérifier, cliquez sur l’icône de WampServer dans la zone de notification, pointez PHP puis Extensions PHP. Une coche devrait être affichée devant php_pdo_mysql, comme dans la figure ci-contre.

Si l’extension php_pdo_mysql n’est pas précédée d’une coche, cliquez dessus, fermez puis redémarrez WampServer. L’extension php_pdo_mysql devrait maintenant être activée.

Remarque
Si vous n’utilisez pas WampServer, vous pouvez activer/désactiver l’extension php_mysql en agissant sur le fichier php.ini (dossier Apache 2.x.x\bin\). Recherchez la ligne contenant le terme “php_pdo_mysql”. Supprimez le “;” qui la précède pour activer l’extension ou insérez un “;” pour la désactiver. Ici par exemple, l’extension php_pdo_mysql est active :


Arrivés à ce point dans la formation, vous utilisez couramment les fonctions du langage PHP. Mais saviez-vous que le langage SQL possède ses propres fonctions ? Ces dernières pourront être utilisées dans des requêtes pour affiner les recherches.

Il existe deux types de fonctions SQL :

  • Les fonctions scalaires. Elles s’appliquent à chacune des valeurs qui lui sont passées. Quelques exemples : UPPER(), LOWER(), LENGTH(), ROUND().
  • Les fonctions d’agrégat. Elles effectuent des calculs sur une table et retournent un résultat. Quelques exemples : AVG(), SUM(), MAX(), MIN(), COUNT().

Voyons comment utiliser ces fonctions sur des exemples précis.

Nous allons convertir en minuscules les valeurs du champ CustomerID et en majuscules les valeurs du champ Country de la table northwind . Voici la table northwind avant et après la conversion :

Pour arriver à ce résultat, vous utiliserez les fonctions scalaires LOWER() et UPPER() :

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Utilisation de fonctions SQL</title>
    <style>
      td { padding-right: 30px;}
    </style>
  </head>
  <body>
    <?php
      try {
        $base = new PDO('mysql:host=localhost; dbname=northwind', 'root', '');
      }
      catch(exception $e) {
        die('Erreur '.$e->getMessage());
      }
      $base->exec("SET CHARACTER SET utf8");
      $retour = $base->query('SELECT LOWER(CustomerID) as CustomerID_min, UPPER(Country) as Country_maj FROM customers');
      echo "<table>";
      while ($data = $retour->fetch()){
        echo "<tr><td>".$data['CustomerID_min']."</td>";
        echo "<td>".$data['Country_maj']."</td></tr>";
      }
      echo "</table>";
      $base = null;
    ?>
  </body>
</html>

Exécutons ce code dans WAMP Server. Le résultat est bien conforme à ce qui était attendu.

Un autre exemple. Supposons que vous vouliez connaître la valeur moyenne du champ Quantity de la table order_details de la base de données northwind.

Vous utiliserez pour cela la fonction d’agrégat AVG() :

SELECT AVG(Quantity) FROM order_details;

Pour saisir facilement cette requête, rien de tel que l’interface d’administration phpMyAdmin. Cliquez sur la base de données northwind dans le volet gauche. Basculez sur l’onglet SQL. Entrez la requête dans la zone dédiée, puis cliquez sur Exécuter. Le résultat est immédiatement affiché dans la partie inférieure de la fenêtre.


Exercice

  1. Affectez le mot de passe ‘secret’ à l’utilisateur root
  2. Annulez le mot de passe de l’utilisateur root
  3. Créez l’utilisateur Pierre sur le serveur localhost
  4. Affectez le mot de passe ‘monpass’ à l’utilisateur Pierre
  5. Affectez tous les privilèges à l’utilisateur Pierre sur les tables de la base localhost
  6. Supprimez l’utilisateur Pierre

Solution

Faites une pause dans la vidéo et répondez à ces six questions. Vous pourrez reprendre le visionnage de la vidéo pour prendre connaissance des solutions.

Affectation du mot de passe ‘secret’ à l’utilisateur root

Pour savoir à quel serveur est attaché l’utilisateur root, on utilise la commande suivante :

select host, user from mysql.user;

Voici la réponse retournée par MySQL :


L’utilisateur root est donc rattaché au serveur ‘::1’.

Il suffit maintenant d’utiliser la commande suivante pour affecter le mot de passe ‘secret’ à l’utilisateur root :

set password for 'root'@'::1' = PASSWORD('secret');

Suppression du mot de passe affecté à l’utilisateur root

Utilisez la commande suivante :

set password for 'root'@'::1' = PASSWORD('');

Création de l’utilisateur Pierre sur le serveur localhost

Utilisez la commande suivante :

CREATE USER 'Pierre'@'localhost';

Vérifiez que cet utilisateur a bien été créé avec la commande suivante :

SELECT host, user FROM mysql.user;

Affectation d’un mot de passe à l’utilisateur Pierre

Lancez la commande suivante :

SET PASSWORD FOR 'Pierre'@'localhost' = PASSWORD('monpass');

Affectation de privilèges à l’utilisateur Pierre sur les tables de la base localhost

Utilisez la commande suivante :

GRANT ALL PRIVILEGES ON localhost.* TO 'Pierre'@'localhost' IDENTIFIED BY 'monpass';

Suppression de l’utilisateur Pierre

Utilisez la commande suivante :

DROP USER 'Pierre'@'localhost';

Vérifiez que l’utilisateur Pierre a bien été supprimé avec cette commande :

SELECT host, user FROM mysql.user;

 


Plusieurs commandes SQL peuvent être utilisées pour :

  • créer un utilisateur ;
  • lui affecter des droits pour déterminer ce qu’il peut faire ;
  • supprimer un utilisateur.

Voici les commandes les plus courantes.

Commande Effet
USE mysql;

SELECT * FROM user;

Liste les utilisateurs MySQL
SELECT * FROM mysql.user; Une variante monoinstruction des deux commandes précédentes
USE mysql;

SELECT host, user FROM user;

Affiche les champs host et user des utilisateurs MySQL
SELECT host, user FROM mysql.user; Une variante monoinstruction des deux commandes précédentes
SELECT current_user(); Affiche le nom de l’utilisateur en cours
CREATE USER ‘nom’@’serveur’; Crée l’utilisateur nom sans mot de passe sur le serveur spécifié. Par exemple :

CREATE USER ‘Pierre’ @ ‘localhost’;

CREATE USER ‘nom’@’serveur’ IDENTIFIED BY ‘p’; Crée l’utilisateur avec le mot de passe p sur le serveur spécifié. Par exemple :

CREATE USER ‘Paul’@’localhost’ IDENTIFIED BY ‘monpass’;

GRANT ALL PRIVILEGES ON base.*

TO ‘nom’@’serveur’

IDENTIFIED BY ‘passe’;

Donne à l’utilisateur nom sur le serveur spécifié avec le mot de passe spécifié le droit d’accéder à la base de données base. Par exemple :

GRANT ALL PRIVILEGES ON testconsole.* TO ‘Pierre’@’localhost’;

SHOW GRANTS; Affiche les droits du compte utilisé pour se connecter au serveurcreatedatabase
DROP USER ‘nom’@’base’; Supprime l’utilisateur nom de la base spécifiée. Par exemple :

DROP USER ‘pierre’@’localhost’;

SET PASSWORD FOR ‘nom’@’base’ = PASSWORD(‘pass’); Affecte le mot de passe pass à l’utilisateur nom de la base de données base.

 

Remarque

Si vous avez perdu le mot de passe de l’utilisateur root, suivez la procédure décrite ici pour le réinitialiser :

http://www.commentcamarche.net/forum/affich-23919767-se-connecter-a-wampserver


Jusqu’ici, les conditions utilisées dans la clause WHERE étaient élémentaires. Le langage SQL permet cependant d’indiquer de façon précise les éléments à sélectionner en utilisant un ou plusieurs opérateurs dans la clause WHERE. Vous pouvez utiliser les opérateurs suivants :

Opérateur Description Exemple
= Egal à WHERE prenom=’Jean’
<> Différent de WHERE prenom<>’Pierre’
> Supérieur à WHERE visites>15
< Inférieur à WHERE total<100
>= Supérieur ou égal à WHERE visites>=100
<= Inférieur ou égal à WHERE prix<=25
BETWEEN A l’intérieur de la plage spécifiée WHERE prix BETWEEN 10 AND 20
NOT BETWEEN A l’extérieur de la plage spécifiée WHERE date NOT BETWEEN #10/01/2013# AND #10/06/2013#
LIKE Compatible avec le modèle spécifié WHERE prenom LIKE ‘P%’
    WHERE prenom LIKE ‘%re%’
IN Egal à une des valeurs spécifiées WHERE prix in (10, 20, 30)
AND ET logique WHERE ville=’Paris’ AND prix<1000
OR OU logique WHERE prix<100 OR visites>1000
NOT NON logique WHERE prenom NOT IN (‘Jean’, ‘Pierre’)

 


Utilisez la console MySQL pour effectuer les actions suivantes :

  1. Créez la base de données testconsole
  2. Créez la table testtable composée des champs suivants :
Champ Type
nom varchar(50)
prenom varchar(50)
compteurVisite smallint
derniereVisite timestamp

 

  1. Affichez la structure de la table.
  2. Ajoutez les valeurs suivantes dans la table testtable :
Pierre, Dubur, 34, NOW()
 Chantal, Garnier, 128, NOM()
 Jean, Dupont, 2, NOW()
 Belle, Vercor, 45, NOW()
  1. Lister les données contenues dans la table
  2. Affecter la valeur 200 au champ compteurdevisite de Jean Dupont
  3. Supprimer l’enregistrement de Pierre Dubur
  4. Compter le nombre d’enregistrements dans la table testtable
  5. Supprimer la base de données testconsole
USE testconsole


Il est temps de passer à la pratique. Dans cette partie, vous allez écrire plusieurs scripts pour faire vos armes en POO PHP. Pour cela, nous allons travailler sur une classe spécialisée dans le traitement des chaînes de caractères. Cette classe contiendra plusieurs méthodes permettant de simplifier les manipulations des chaines de caractères.

Pour définir une classe, il suffit d’utiliser le mot class suivi du nom de la classe. Par exemple :

class chainePlus {
  // Une ou plusieurs instructions
}

Pour définir les propriétés de la classe, vous utiliserez le mot-clé :

  • public si la propriété doit être accessible dans la classe, les classes dérivées et les objets ;
  • private si la propriété doit être accessible dans la classe seulement ;
  • protected si la propriété doit être accessible dans la class et ses classes dérivées.

Par exemple :

private $nomProp;

Où nomProm est le nom d’une propriété.

Pour définir des fonctions membres, vous utiliserez cette syntaxe :

public function nom(){
  // Une ou plusieurs instructions
  // $this->nomProp permet d'accéder à la propriété nomProp
}
Remarque
Par convention, il est préconisé de sauvegarder la classe sous le nom nomClasse.class.php (où nomClasse est le nom de la classe).