Circum Blog

Circum Net – IT – Conseils pratiques

SQLite: récupération d’un résultat dans un objet spécifique

PHP, SQLite

La méthode setFetchMode de la librairie PDO permet de récupérer, dans un objet spécifique, une ligne résultat d’une requête SQL (SELECT).

En fixant le premier argument de cette méthode à PDO::FETCH_CLASS et en lui fournissant le nom d’une classe (définie préalablement), c’est cette dernière qui va être invoquée et ses propriétés vont être affectées avec les valeurs des champs correspondant (le constructeur est également appelé). Voici un code fonctionnel qui illustre cela.

PDO::FETCH_CLASS

<?php
class Movie
    {
    public $title;
    public $director;
    public $description;
    public $year;

    // Les propriétés de l'objet sont fixées par PDO avant l'appel au constructeur
    // Le constructeur peut ensuite prendre le relais et intervenir sur les propriétés
    function __construct()
        {
        $this->title = strtoupper($this->title);
        }
    }

try
    {
    $dbh = new PDO('sqlite:./movies');

    $sql = 'SELECT * FROM movies';
    $stmt = $dbh->query($sql);

    // Retourne une nouvelle instance de la classe demandée
    // Le mapping est fait entre les champs et les propriétés
    $stmt->setFetchMode(PDO::FETCH_CLASS, 'Movie');

    while($obj = $stmt->fetch())
        {
        echo $obj->title . ' - ' . $obj->director . PHP_EOL;
        }

    }
catch(PDOException $e)
    {
    echo $e->getMessage();
    }
?>


MySQL et le fichier journal

Bases de données, MySQL

Démarré avec le paramètre ‘–log-bin[=file_name]’, le serveur mysql enregistre dans un fichier de logs (fichier journal) toutes le commandes SQL ayant donné lieu à des modifications de données.

L’intérêt d’un tel fichier, dans le cadre d’une politique de backup du serveur, est de pouvoir plus facilement récupérer les dernières opérations sur les données en cas d’arrêt brutal du système (coupure d’alimentation, plantage du système, etc.). Il constituera la source pour la ré-exécution des requêtes qui ont eu lieu après la dernière sauvegarde.

Lancement via la ligne de commande :

> bin\mysqld-nt –log-bin standalone

L’activation du système de logging peut également être réalisée via le fichier de configuration du serveur (my.ini ou my.cnf) en y ajoutant –sous la rubrique [mysqld]- la clause suivante :

set-variable=log-bin=[dir_path]

exemple :

set-variable=log-bin=c:/mysql/data

Si aucun nom de fichier n’est précisé en argument alors le système utilise et stocke les informations dans un fichier portant le nom de la machine hôte suivi du suffixe ‘-bin’. Le répertoire par défaut pour l’écriture de ce fichier est le répertoire de données du serveur (‘data’ ou ‘var’).

Il est possible d’analyser le contenu du fichier de logs avec l’utilitaire ‘mysqlbinlog’ qui se trouve dans le répertoire ‘bin’ de votre installation.

> bin\mysqlbinlog E:\dbdata\mysql\GRD-Laptop-bin.001

Pour rafraîchir, sauvegarder et remettre à zéro les fichiers de logs, il faut utiliser l’exécutable ‘mysqladmin’.

> bin\mysqladmin flush-logs



Requête multi-bases de données

Bases de données, MySQL

En MySQL, il est tout-à-fait possible de mettre en relation (jointure) plusieurs bases de données afin de répondre à une requête d’information.

Pour réaliser cela, rappelons d’abord qu’une jointure se fait en imposant l’égalité des valeurs d’une colonne d’une table à une colonne d’une autre table. Dans notre cas, il suffira d’indiquer clairement au compilateur la provenance de chacune des colonnes concernées par la mise en relation. Ainsi, chaque colonne devra être précédée du nom de la base de données (suivi d’un point) et du nom de la table (suivi d’un point).

db_name.table.name.column_name

Exemple d’une requête multi-bases

SELECT db1.clients.nom, db1.clients.adresse, db2.membres.statut
FROM db1.clients, db2.membres
WHERE db2.membres.cotisation IS ‘OK’ AND db1.clients.id = db2.membres.id


Regrouper et compter les valeurs identiques

Bases de données, MySQL

Voici un exemple de code SQL supporté par MySQL permettant de repérer dans une table les enregistrements qui présentent des valeurs identiques pour certains champs.

Sélection sur base de champs à valeurs identiques:

SELECT name, count(name) as cnt
from students
group by name
having cnt > 1
order by cnt;

Cette requête met en évidence les noms (valeur du champ “name”) qui se retrouvent à plusieurs reprises dans la table des étudiants (“students”).

Réponse :

+-----------------------+-----+
| name                  | cnt |
+-----------------------+-----+
| Lewis                 |   2 | 
| Brown                 |   2 | 
| Scott                 |   2 | 
| Williams              |   2 | 
| Harper                |   3 | 
| Bartlet               |   4 | 
| Sanchez               |   6 | 
| Bush                  |   9 | 
+-----------------------+-----+


Sélection enregistrée dans un fichier

Bases de données, MySQL

La commande ‘SELECT’ accompagnée de l’option ‘INTO OUTFILE’ permet d’enregistrer les lignes de réponses obtenues pour la requête dans un fichier sur disque.

Syntaxe:

SELECT … INTO OUTFILE ‘nom_du_fichier’ [options_exportation];

Exemple d’utilisation :

mysql> SELECT * FROM users INTO OUTFILE ‘/temp/save1.csv’ FIELDS TERMINATED BY ‘|’ LINES TERMINATED BY “\r\n”;

Cette instruction a pour résultat la sélection de tous les attributs de la table ‘users’ et l’enregistrement des lignes de réponse dans le fichier ‘/temp/save1.csv’. Si le chemin d’accès du fichier de sauvegarde n’est pas absolu la sauvegarde s’effectue dans le répertoire de données de la DB (ex : /mysql/data/nom_de_la_db).

Contenu du fichier save1.csv :

1|Albert|Olivier|Olivier.Albert@sky.net|admin
2|Decy|Serge|Serge.Decy@sealife.be|admin
3|Callet|Anne||support
4|Licour|Luc|Luc.Licour@laposte.be|guest

Pour s’assurer de la consistance de l’enregistrement sur disque à partir d’un SELECT on peut également utiliser les commandes LOCK et UNLOCK TABLES :

mysql> LOCK TABLES users READ;
mysql> SELECT * FROM users INTO OUTFILE ‘/Temp/save1.csv’;
mysql> UNLOCK TABLES;