Le blog de ALF-Solution

Lecture de données

Maintenant que nous savons établir une connexion à la base données, voyons comment on peut lire des données depuis celle-ci. Pour cela nous avons besoin d'une base de données et d'une table avec quelques enregistrement dans celle-ci. Voici le script qui permet de créer la table et les instructions SQL pour pouvoir insérer quelques données. Je vous renvoi à la documentation de MySQL pour voir comment exécuter un script SQL.

CREATE SCHEMA `framework` ;

CREATE TABLE `employee` (
  `id` int NOT NULL AUTO_INCREMENT,
  `first_name` varchar(100) NOT NULL,
  `last_name` varchar(100) NOT NULL,
  `job_title` varchar(100) DEFAULT NULL,
  `salary` double DEFAULT NULL,
  `notes` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `employee` (`first_name`, `last_name`, `job_title`, `salary`) VALUES 
                       ('Robin', 'Jackman', 'Software Engineer', 5500),
                       ('Taylor', 'Edward', 'Software Architect', 7200),
                       ('Vivian', 'Dickens', 'Database Administrator', 6000),
                       ('Harry', 'Clifford', 'Database Administrator', 6800),
                       ('Eliza', 'Clifford', 'Software Engineer', 4750),
                       ('Nancy', 'Newman', 'Software Engineer', 5100),
                       ('Melinda', 'Clifford', 'Project Manager', 8500),
                       ('Harley', 'Gilbert', 'Software Architect', 8000);

Au début de ce billet nous avons dit qu'il y avait deux classes, autre que celle pour la connexion à la base de données, qui sont Table et TableRow. Nous allons voir comment nous pouvons utiliser ces deux classes.

La classe Table

La première chose à savoir, est que vous pouvez soit utiliser la classe, enfin certaines des fonctions de la classe, de manière statique ou bien après avoir déclarer l'objet via l'instruction new. Enfin avant d'utiliser la classe, vous devez savoir ce que vous souhaitez faire, ou plutôt ce que vous voulez comme résultat et comment vous allez faire pour y arriver. Pour la première question, vous devez savoir si le résultat que vous souhaitez avoir sera un et un seul enregistrement ou bien au contraire plusieurs enregistrement. Quant à la deuxième question, à savoir comment vous voulez faire votre recherche, vous pouvez soit rechercher via l'identifiant unique du record, et donc le champ id qui est obligatoirement la PRIMARY KEY (clé primaire) de notre table ou via une requête SQL pour laquelle vous spécifierez soit tout l'instruction SQL, à savoir, par exemple, SELECT `id`, `first_name`, `last_name` from `employee` where `job_title`= ''Database Administrator ou bien simplement en donnant le nom de la table, et uniquement la 'where clause'. Voyons tout cela par l'exemple ce sera bien plus parlant.

Commençons par rechercher un enregistrement sur base de sa clé primaire de manière statique. Ceci se fera comme suit :

/* Rechecher de l'employé avec l'ID = 1 */
$employee = Table::FetchById('employee', 1);

Ok, mais maintenant comment est-ce que l'on peut voir le contenu des différents champs ? Là aussi il y a plusieurs façons. Soit vous connaissez le nom des champs et vous les affichez sur base de leur nom :

/* Affiche le contenu du champ `first_name` via le nom champ */
echo $employee->First_name;

soit sur base du numéro de colonne du champ,

/* Affiche le contenu du champ `first_name` via le numéro de colonne du champ */
echo $employee->get(1);

mais attention le premier champ se trouvant à la position 0, il faut donc pour afficher le deuxième champ bien utiliser get(1) au lieu de get(2).

Dans les deux méthodes, à chaque fois, ce sera la valeur "Robin" qui sera affichée. Il n'y a pas plus simpe, n'est-ce pas ?

En fait, sans le savoir, vous avez déjà utilisé la classe TableRow car la méthode FetchById renvoi un objet de type TableRow si un enregristrement correspondant à la clé primaire passée en deuxième arguments a été trouvé, si non c'est la valeur false qui est renvoyée.

Vous pouvez télécharger le code en cliquant sur ce lien (13 Ko)

C'est bien, nous pouvons rechercher un enregistrement, mais voyons comment on peut rechercher un ensemble d'enregistrement. Ici aussi il y a plusieurs possibilités. Nous allons les passer en revues, en partant d'un exemple que je détaillerai, ensuite on ne changera que la partie permettant de faire la recherche, le reste du code restera toujours le même, c'est aussi ça une des facilités dans l'utilisation du framework d'ALF-Solution.

Dans l'exemple précédant nous avions utilisé la fonction FetchById de la classe Table. Il existe deux fonctions similaires à savoir Fetch et FetchFirst prenant comme paramètres le nom de la table et optionnelement une where clause permettant de définir les critères de recherches. Si vous omettez la where clause, alors c'est tout le contenu de la table qui sera renvoyé pour la fonction Fetch et le premier et uniquement le premier enregsitrement pour la méthode FetchFirst.

/* Rechercher tous les enregistrements de la table employee */
$employees = Table::Fetch('employee');

L'exécution de la ligne dans l'exmple ci-avant ferta que la variable $employees contiendra un tableau avec toutes les enregistrements de la table employee. On pourra afficher son contenu, par exemple, avec une boucle foreach comme montré ci-dessous.

foreach ($employees as $employee){
    echo $employee->First_name.' '.$employee->Last_name.'
';
}

L'affichage dans votre navigateur devra être le suivant :

Robin Jackman
Taylor Edward
Vivian Dickens
Harry Clifford
Eliza Clifford
Nancy Newman
Melinda Clifford
Harley Gilbert

Reprenons notre exemple et voyons comment on peut filtrer les données. Imaginons que nous souhaitons ne lister que les employés ayant un salaire supérieur à 6 000 $. Pour cela il faudra simplement ajouter une whre clause comme suit :

/* Rechercher tous les employés ayant un salaire > 6000$ */
$employees = Table::Fetch('employee', 'where salary > 6000');

foreach ($employees as $employee){
    echo $employee->First_name.' '.$employee->Last_name.'
';
}

On peut bien sûr mettre la where clause dans une variable, comme par exemple $query et y faire référence dans l'apple de la fonction Fetch. Notre exemple devient alors

/* Rechercher tous les employés ayant un salaire > 6000$ */
$query = 'where salary > 6000';
$employees = Table::Fetch('employee', $query);

Le résultat de ces deux derniers exemple étant à chaque fois

Taylor Edward
Harry Clifford
Melinda Clifford
Harley Gilbert

Ce qui est bien correct car si on regarde les données que l'on a inséré dans la table au début de cette publication on peut bien voir que Taylor gagne 7200$, que Harry gagne 6800$ et que Melinda et Harkey gagne 8500$.

Regardons maintenant d'un peu plus près le contenu de la variable $employee et puis de la variable $employees à l'aide de la fonction print_r de PHP.

TableRow Object
(
    [_position:protected] => 
    [array_value:protected] => Array
        (
            [0] => TableRow Object
                (
                    [_position:protected] => 
                    [array_value:protected] => Array
                        (
                            [Id] => 2
                            [First_name] => Taylor
                            [Last_name] => Edward
                            [Job_title] => Software Architect
                            [Salary] => 7200
                            [Notes] => 
                        )

                    [_tablename:data:private] => employee
                    [dblink:data:private] => DB Object
                        (
                            [host:DB:private] => localhost
                            [db:DB:private] => framework
                            [user:DB:private] => root
                            [pass:DB:private] => 
                            [link:DB:private] => 
                            [result:DB:private] => PDOStatement Object
                                (
                                    [queryString] => select * from employee where salary > 6000
                                )

                            [typeDB:DB:private] => mysql
                            [oPdo:DB:private] => PDO Object
                                (
                                )

                            [currentSQL:DB:private] => select * from employee where salary > 6000
                        )

                    [array_operator:protected] => Array
                        (
                            [Id] => =
                            [First_name] => =
                            [Last_name] => =
                            [Job_title] => =
                            [Salary] => =
                            [Notes] => =
                        )

                    [array_andor:protected] => Array
                        (
                            [Id] => AND
                            [First_name] => AND
                            [Last_name] => AND
                            [Job_title] => AND
                            [Salary] => AND
                            [Notes] => AND
                        )

                    [orderBy:protected] => 
                )

            [1] => TableRow Object
                (
                    [_position:protected] => 
                    [array_value:protected] => Array
                        (
                            [Id] => 4
                            [First_name] => Harry
                            [Last_name] => Clifford
                            [Job_title] => Database Administrator
                            [Salary] => 6800
                            [Notes] => 
                        )

                    [_tablename:data:private] => employee
                    [dblink:data:private] => DB Object
                        (
                            [host:DB:private] => localhost
                            [db:DB:private] => framework
                            [user:DB:private] => root
                            [pass:DB:private] => 
                            [link:DB:private] => 
                            [result:DB:private] => PDOStatement Object
                                (
                                    [queryString] => select * from employee where salary > 6000
                                )

                            [typeDB:DB:private] => mysql
                            [oPdo:DB:private] => PDO Object
                                (
                                )

                            [currentSQL:DB:private] => select * from employee where salary > 6000
                        )

                    [array_operator:protected] => Array
                        (
                            [Id] => =
                            [First_name] => =
                            [Last_name] => =
                            [Job_title] => =
                            [Salary] => =
                            [Notes] => =
                        )

                    [array_andor:protected] => Array
                        (
                            [Id] => AND
                            [First_name] => AND
                            [Last_name] => AND
                            [Job_title] => AND
                            [Salary] => AND
                            [Notes] => AND
                        )

                    [orderBy:protected] => 
                )

            [2] => TableRow Object
                (
                    [_position:protected] => 
                    [array_value:protected] => Array
                        (
                            [Id] => 7
                            [First_name] => Melinda
                            [Last_name] => Clifford
                            [Job_title] => Project Manager
                            [Salary] => 8500
                            [Notes] => 
                        )

                    [_tablename:data:private] => employee
                    [dblink:data:private] => DB Object
                        (
                            [host:DB:private] => localhost
                            [db:DB:private] => framework
                            [user:DB:private] => root
                            [pass:DB:private] => 
                            [link:DB:private] => 
                            [result:DB:private] => PDOStatement Object
                                (
                                    [queryString] => select * from employee where salary > 6000
                                )

                            [typeDB:DB:private] => mysql
                            [oPdo:DB:private] => PDO Object
                                (
                                )

                            [currentSQL:DB:private] => select * from employee where salary > 6000
                        )

                    [array_operator:protected] => Array
                        (
                            [Id] => =
                            [First_name] => =
                            [Last_name] => =
                            [Job_title] => =
                            [Salary] => =
                            [Notes] => =
                        )

                    [array_andor:protected] => Array
                        (
                            [Id] => AND
                            [First_name] => AND
                            [Last_name] => AND
                            [Job_title] => AND
                            [Salary] => AND
                            [Notes] => AND
                        )

                    [orderBy:protected] => 
                )

            [3] => TableRow Object
                (
                    [_position:protected] => 
                    [array_value:protected] => Array
                        (
                            [Id] => 8
                            [First_name] => Harley
                            [Last_name] => Gilbert
                            [Job_title] => Software Architect
                            [Salary] => 8000
                            [Notes] => 
                        )

                    [_tablename:data:private] => employee
                    [dblink:data:private] => DB Object
                        (
                            [host:DB:private] => localhost
                            [db:DB:private] => framework
                            [user:DB:private] => root
                            [pass:DB:private] => 
                            [link:DB:private] => 
                            [result:DB:private] => PDOStatement Object
                                (
                                    [queryString] => select * from employee where salary > 6000
                                )

                            [typeDB:DB:private] => mysql
                            [oPdo:DB:private] => PDO Object
                                (
                                )

                            [currentSQL:DB:private] => select * from employee where salary > 6000
                        )

                    [array_operator:protected] => Array
                        (
                            [Id] => =
                            [First_name] => =
                            [Last_name] => =
                            [Job_title] => =
                            [Salary] => =
                            [Notes] => =
                        )

                    [array_andor:protected] => Array
                        (
                            [Id] => AND
                            [First_name] => AND
                            [Last_name] => AND
                            [Job_title] => AND
                            [Salary] => AND
                            [Notes] => AND
                        )

                    [orderBy:protected] => 
                )

        )

    [_tablename:data:private] => employee
    [dblink:data:private] => DB Object
        (
            [host:DB:private] => localhost
            [db:DB:private] => framework
            [user:DB:private] => root
            [pass:DB:private] => 
            [link:DB:private] => 
            [result:DB:private] => PDOStatement Object
                (
                    [queryString] => select * from employee where salary > 6000
                )

            [typeDB:DB:private] => mysql
            [oPdo:DB:private] => PDO Object
                (
                )

            [currentSQL:DB:private] => select * from employee where salary > 6000
        )

    [array_operator:protected] => Array
        (
        )

    [array_andor:protected] => Array
        (
        )

    [orderBy:protected] => 
)

Wouaw, c'est quoi tout cela ? Simplifions un peu pour bien comprendre

TableRow Object
(
    [_position:protected] => 
    [array_value:protected] => Array
        (
            [0] => TableRow Object
            [1] => TableRow Object
            [2] => TableRow Object
            [3] => TableRow Object
        )
    [_tablename:data:private] => employee
    [dblink:data:private] => DB Object
    [array_operator:protected] => Array
    [array_andor:protected] => Array
    [orderBy:protected] => 
)

Ah c'est déjà plus simple. Nous retrouvons d'abord _position qui est une variable qui contiendra la position courrante de l'enrgistrement sur lequel on se trouve quand on utilise les fonction key, next, previous, current et seek. Ensuite on a un tableau array_value dont chaque élément est un objet de type TableRow. C'est dans ce tableau que se trouve les données que l'on souhaite avoir. On a après cela le nom de la table qui est contenu dans la variable _tablename, dblink un objet de type DB, ensuite deux tableaux, array_operator et array_andor, sur lesquels je reviendrai plus tard et pour finir la variable orderBy qui comme son nom l'indique peut contenir une clause pour le tri a effectuer sur les enregistrement, j'y reviendrai aussi un peu plus tard, mais revenons d'abord au contenu du tableau array_value. Je l'ai dit, il contient pour chaque enregistrement de la table un objet de type TableRow. Voici le contenu du premier élément de ce tableau :

[0] => TableRow Object
                (
                    [_position:protected] => 
                    [array_value:protected] => Array
                        (
                            [Id] => 2
                            [First_name] => Taylor
                            [Last_name] => Edward
                            [Job_title] => Software Architect
                            [Salary] => 7200
                            [Notes] => 
                        )

                    [_tablename:data:private] => employee
                    [dblink:data:private] => DB Object
                        (
                            [host:DB:private] => localhost
                            [db:DB:private] => framework
                            [user:DB:private] => root
                            [pass:DB:private] => 
                            [link:DB:private] => 
                            [result:DB:private] => PDOStatement Object
                                (
                                    [queryString] => select * from employee where salary > 6000
                                )

                            [typeDB:DB:private] => mysql
                            [oPdo:DB:private] => PDO Object
                                (
                                )

                            [currentSQL:DB:private] => select * from employee where salary > 6000
                        )

                    [array_operator:protected] => Array
                        (
                            [Id] => =
                            [First_name] => =
                            [Last_name] => =
                            [Job_title] => =
                            [Salary] => =
                            [Notes] => =
                        )

                    [array_andor:protected] => Array
                        (
                            [Id] => AND
                            [First_name] => AND
                            [Last_name] => AND
                            [Job_title] => AND
                            [Salary] => AND
                            [Notes] => AND
                        )

                    [orderBy:protected] => 
                )

Dans un premier temps ce qui nous intéresse est [array_value:protected], car c'est dans cette partie que l'on retrouvera la structure de la table, à vrai dire le résultat du query

[array_value:protected] => Array
                        (
                            [Id] => 2
                            [First_name] => Taylor
                            [Last_name] => Edward
                            [Job_title] => Software Architect
                            [Salary] => 7200
                            [Notes] => 
                        )

Array_value est donc un tableau qui contient le nom des différents champs et leur valeur respective. Dans notre exemple,on voit donc que l'on a les champs id, first_name, last_name, job_title, salary et notes ainsi que leur valeur respective 2, Taylor, Edward, Software Architect, 7200 et "" (rien ou Null).

<<< Connexion à la base de données

^^^ Sommaire  

 


par Admin ALF-Solution Publié le 02/02/2015 22:29:11 Modifié le 09/02/2015 12:58:47 Commentaires 0 0 J'aime