mercredi 23 janvier 2013

Accès aux bases de données

Exercice 1

1) Créez la base de données mysql zendbdd en utilisant le script SQL de l'annexe 1

2) Créez l'utilisateur zenduser avec pour mot de passe qp56 ayant les droits nécessaires pour accéder à la base de données zendbdd

3) Configurez le fichier /www/htdocs/examples/ZendConfig.ini afin de connecter vos scripts PHP avec la base de données zendbdd via l'utilisateur zenduser


Exercice 2

1) Créez le fichier /www/htdocs/examples/ZendDB_fetchAll.php et exécutez la requête SELECT userNom, userPrenom FROM user en utilisant la méthode fetchAll


Exercice 3

1) Créez le fichier /www/htdocs/examples/ZendDB_fetchOne.php et exécutez la requête SELECT userPrenom FROM user WHERE userNom='Danilo' en utilisant la méthode fetchOne


Exercice 4

1) Créez le fichier /www/htdocs/examples/ZendDB_fetchRow.php et exécutez la requête qui permet d'afficher les userNom et userPrenom de 3 utilisateurs dans une boucle for en utilisant la méthode fetchRow


Exercice 5

1) Dans le fichier /www/htdocs/examples/ZendDB_insert.php et en utilisant la méthode insert, insérez le film Skyfall ayant obtenu 6954203 entrées au Box Office dans la table film


Exercice 6

1) Dans le fichier /www/htdocs/examples/ZendDB_update.php et en utilisant la méthode update, définissez l'utilisateur ayant pour userID 1 en tant qu'administrateur en donnant la valeur 1 au champ userIsAdmin


Exercice 7

1) Dans le fichier /www/htdocs/examples/ZendDB_delete.php et en utilisant la méthode delete, supprimez le film ayant pour filmID 1


Exercice 8

1) Dans le fichier /www/htdocs/examples/ZendDB_Abstract.php et en utilisant la class Zend_Db_Table_Abstract créez les modèles TUser et TFilm des tables user et film

2) Utilisez le modèle TUser pour afficher tous les noms des utilisateurs de la table user.


Exercice 9

1) Dans le fichier /www/htdocs/examples/ZendDB_AbstractSelect_SQL.php et en utilisant le modèle TUser, exécuter la requête SELECT userPrenom FROM user afin de récupérer uniquement les prénoms des utilisateurs.


Exercice 10

1) Dans le fichier /www/htdocs/examples/ZendDB_AbstractSelect_find.php utilisez la méthode find de TUser pour afficher le nom de l'utilisateur 1


Exercice 11

1) En utilisant le modèle TUser, changez le nom de l'utilisateur ayant pour clé primaire 2 en "Bond"


Exercice 12

1) Toujours en utilisant le modèle TUser, insérez le nouveau membre ayant pour nom Cruz et pour prénom Penélope


Exercice 13

1) Ecrivez la fonction InfosUser dans la méthode TUser qui permet d'afficher le nom et le prénom de l'utilisateur dont la clé primaire (userID) est passé en paramètre de la fonction


Exercice 14

1) Ecrivez la fonction recupAdmin dans la méthode TUser qui permet d'afficher le nom des administrateurs


Annexe 1

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Base de données: `zendbdd`
--

-- --------------------------------------------------------

--
-- Structure de la table `film`
--

CREATE TABLE `film` (
  `filmID` int(11) NOT NULL AUTO_INCREMENT,
  `filmTitre` varchar(100) NOT NULL,
  `filmBoxOfficeFr` int(11) NOT NULL,
  PRIMARY KEY (`filmID`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

--
-- Contenu de la table `film`
--

INSERT INTO `film` (`filmID`, `filmTitre`, `filmBoxOfficeFr`) VALUES
(1, 'The Ghost Writer', 1047958);

-- --------------------------------------------------------

--
-- Structure de la table `user`
--

CREATE TABLE `user` (
  `userID` int(11) NOT NULL AUTO_INCREMENT,
  `userNom` varchar(50) NOT NULL,
  `userPrenom` varchar(50) NOT NULL,
  `userIsAdmin` int(1) NOT NULL,
  PRIMARY KEY (`userID`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

--
-- Contenu de la table `user`
--

INSERT INTO `user` (`userID`, `userNom`, `userPrenom`, `userIsAdmin`) VALUES
(1, 'Danilo', 'Paul', 0),
(2, 'Desplat', 'Alexandre', 0),
(3, 'Lewis', 'Damian', 0),
(4, 'Cranston', 'Bryan', 0),
(5, 'Norton', 'Edward', 0);

Correction de l'exercice 1

Zend_Db et ses autres sous classes proposent une interface de connexion aux bases de données permettant de se connecter et d’interagir avec la plupart des SGBD du marché.

Reprenons notre ZendConfig.ini

$ nano /www/htdocs/examples/ZendConfig.ini

On indique nos paramètres en utilisant la structure suivante :

[app]
database.adapter = pdo_mysql
database.params.dbname = zendbdd
database.params.charset = utf8

[dev : app]
database.params.host = localhost
database.params.username = zenduser
database.params.password = qp56

[prod : app]
database.params.host = my.prod.host
database.params.username = zenduser
database.params.password = qp56

On enregistre et on quitte


Correction de l'exercice 2

La méthode fetchAll permet de récupérer tous les résultats de la requête.

On créé notre nouveau fichier

$ nano /www/htdocs/examples/ZendDB_fetchAll.php

Et on y place notre script :

<?php

header('Content-type: text/html; charset=utf-8');

require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();
$loader->setFallbackAutoloader(true);

// Chargement de notre fichier de configuration
$configFile = dirname(__FILE__) . '/ZendConfig.ini';
$config = new Zend_Config_Ini($configFile, 'dev');

// On créé le lien avec la base de données
$db = Zend_Db::factory($config->database);


// On lance notre requête via un fetchAll
$query = "SELECT userNom, userPrenom FROM user";
$result = $db->fetchAll($query);

// On affiche le résultat
Zend_Debug::dump($result);


Correction de l'exercice 3

La méthode fetchOne permet de retourner la première colonne du premier jeu de résultats.

$ nano /www/htdocs/examples/ZendDB_fetchOne.php
<?php

header('Content-type: text/html; charset=utf-8');

require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();
$loader->setFallbackAutoloader(true);

// Chargement de notre fichier de configuration
$configFile = dirname(__FILE__) . '/ZendConfig.ini';
$config = new Zend_Config_Ini($configFile, 'dev');

// On créé le lien avec la base de données
$db = Zend_Db::factory($config->database);

// On lance notre requête via un fetchOne
$query = "SELECT userPrenom FROM user WHERE userNom='Danilo'";
$result = $db->fetchOne($query);

// On affiche notre résultat
echo $result;


Correction de l'exercice 4

La méthode fetchRow nous permet de récupérer le premier jeu de résultat.

$ nano /www/htdocs/examples/ZendDB_fetchRow.php
<?php

header('Content-type: text/html; charset=utf-8');

require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();
$loader->setFallbackAutoloader(true);

$configFile = dirname(__FILE__) . '/ZendConfig.ini';
$config = new Zend_Config_Ini($configFile, 'dev');

$db = Zend_Db::factory($config->database);

// Notre requête
$query = "SELECT userPrenom, userNom
FROM user
WHERE userID=:id";

for ($i = 1 ; $i <= 3 ; $i++)
{
    // On défini notre paramètre
    $binds = array('id'=>$i);

    // On récupére notre résultat dans un fetchRow
    $result = $db->fetchRow($query, $binds);

    // On affiche notre résultat
    echo $result['userPrenom'].' '.$result['userNom'].'
'; }

Correction de l'exercice 5

$ nano /www/htdocs/examples/ZendDB_insert.php
<?php

header('Content-type: text/html; charset=utf-8');

require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();
$loader->setFallbackAutoloader(true);

$configFile = dirname(__FILE__) . '/ZendConfig.ini';
$config = new Zend_Config_Ini($configFile, 'dev');

$db = Zend_Db::factory($config->database);

try {
    $data = array('filmTitre' => 'Skyfall', 'filmBoxOfficeFr' => 6954203);
    $count = $db->insert("film", $data);
    echo $count . " film(s) inséré(s)";
}
catch (Zend_Db_Exception $e)
{
    printf("erreur de requête : %s", $e->getMessage());
}


Correction de l'exercice 6

$ nano /www/htdocs/examples/ZendDB_update.php
<?php

header('Content-type: text/html; charset=utf-8');

require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();
$loader->setFallbackAutoloader(true);

$configFile = dirname(__FILE__) . '/ZendConfig.ini';
$config = new Zend_Config_Ini($configFile, 'dev');

$db = Zend_Db::factory($config->database);

$updated = $db->update("user", array('userIsAdmin' => 1), 'userID=1');
echo $updated . " enregistrement(s) affecté(s)";


Correction de l'exercice 7

$ nano /www/htdocs/examples/ZendDB_delete.php
<?php

header('Content-type: text/html; charset=utf-8');

require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();
$loader->setFallbackAutoloader(true);

$configFile = dirname(__FILE__) . '/ZendConfig.ini';
$config = new Zend_Config_Ini($configFile, 'dev');

$db = Zend_Db::factory($config->database);

$conditions = array("filmID=1");
$deleted = $db->delete("film", $conditions);
echo $deleted . " enregistrement(s) supprimé(s)";


Correction de l'exercice 8

$ nano /www/htdocs/examples/ZendDB_Abstract.php
<?php

header('Content-type: text/html; charset=utf-8');

require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();
$loader->setFallbackAutoloader(true);

$configFile = dirname(__FILE__) . '/ZendConfig.ini';
$config = new Zend_Config_Ini($configFile, 'dev');

$db = Zend_Db::factory($config->database);

// $db est l’objet de connexion Zend_Db_Adapter
Zend_Db_Table_Abstract::setDefaultAdapter($db);

/**
* Modèle associé à la table user
*/
class TUser extends Zend_Db_Table_Abstract
{
    protected $_name = 'user';
    protected $_primary = 'userID';
}

/**
* Modèle associé à la table film
*/
class TFilm extends Zend_Db_Table_Abstract
{
    protected $_name = 'film';
    protected $_primary = 'filmID';
}

// On créé notre objet
$table = new TUser;

// On place nos utilisateurs dans la variable $users
$users = $table->fetchAll();

// On affiche les utilisateurs par le biais d'un foreach
foreach ($users as $user)
{
    echo $user->userNom.'</br>';
}


Correction de l'exercice 9

Par défaut fetchAll() utilise une requête de type SELECT *. Ainsi le résultat mis dans $users est un Rowset.

Pour sélectionner nous même les colonnes et les conditions que l'on souhaite, nous pouvons utiliser une requête SQL :

$ nano /www/htdocs/examples/ZendDB_AbstractSelect_SQL.php
<?php

header('Content-type: text/html; charset=utf-8');

require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();
$loader->setFallbackAutoloader(true);

$configFile = dirname(__FILE__) . '/ZendConfig.ini';
$config = new Zend_Config_Ini($configFile, 'dev');

$db = Zend_Db::factory($config->database);

// $db est l’objet de connexion Zend_Db_Adapter
Zend_Db_Table_Abstract::setDefaultAdapter($db);

/**
* Modèle associé à la table user
*/
class TUser extends Zend_Db_Table_Abstract
{
    protected $_name = 'user';
    protected $_primary = 'userID';
}

$table = new TUser;
$sql = "SELECT userPrenom FROM user";
$users = $table->getAdapter()->fetchAll($sql, null, Zend_Db::FETCH_OBJ);
foreach ($users as $user)
{
    echo $user->userPrenom.'</br>';
}

Zend_Db_Table_Select est verrouillé sur la table qui lui a donné naissance (via la méthode select()). Il n’est pas possible avec cet objet de sélectionner des colonnes ne faisant pas partie de la table de référence. Il est en revanche possible de créer des jointures.

Dans le cas où l'on souhaite qu'un seul enregistrement nous soit retourné, l'utilisation de fetchRow est recommandé et notre code aurait été le suivant :

$table = new TUser;
$sql = "SELECT userPrenom FROM user WHERE userID = 1";
$user = $table->getAdapter()->fetchRow($sql, null, Zend_Db::FETCH_OBJ);

Zend_Debug::dump($user);

echo $user->userPrenom.'</br>';

Correction de l'exercice 10

$ nano /www/htdocs/examples/ZendDB_AbstractSelect_find.php
<?php

header('Content-type: text/html; charset=utf-8');

require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();
$loader->setFallbackAutoloader(true);

$configFile = dirname(__FILE__) . '/ZendConfig.ini';
$config = new Zend_Config_Ini($configFile, 'dev');

$db = Zend_Db::factory($config->database);

// $db est l’objet de connexion Zend_Db_Adapter
Zend_Db_Table_Abstract::setDefaultAdapter($db);

/**
* Modèle associé à la table user
*/
class TUser extends Zend_Db_Table_Abstract
{
    protected $_name = 'user';
    protected $_primary = 'userID';
}

$table = new TUser;
$membres = $table->find(1);
$membre = $membres->current();

// Affiche le nom de l’utilisateur ayant la clé primaire (userID) 1
echo $membre->userNom;

Il est aussi possible de passer un tableau d’entiers à la méthode find(), elle cherchera alors les enregistrements dont les clés primaires sont celles spécifiées.


Correction de l'exercice 11

Modifions le nom de l’occurrence ayant pour clé primaire 2 :

$table = new TUser;
$membres = $table->find(2);
$membre = $membres->current();

// Affiche le nom de l’utilisateur ayant la clé primaire (userID) 2
$membre->userNom = "Bond";

$membre->save();

Correction de l'exercice 12

Pour enregistrer une nouvelle occurrence :

$table = new TUser;

// Création d’un objet Row vierge
$nvoMembre = $table->createRow();

// Remplissage de l’objet créé
$nvoMembre->userPrenom = 'Penélope';
$nvoMembre->userNom = 'Cruz';

$nvoMembre->save();

Correction de l'exercice 13

$ nano /www/htdocs/examples/ZendDB_AbstractSelect_methode.php
<?php

header('Content-type: text/html; charset=utf-8');

require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();
$loader->setFallbackAutoloader(true);

$configFile = dirname(__FILE__) . '/ZendConfig.ini';
$config = new Zend_Config_Ini($configFile, 'dev');

$db = Zend_Db::factory($config->database);

// $db est l’objet de connexion Zend_Db_Adapter
Zend_Db_Table_Abstract::setDefaultAdapter($db);

/**
* Modèle associé à la table user
*/
class TUser extends Zend_Db_Table_Abstract
{
    protected $_name = 'user';
    protected $_primary = 'userID';

    public function InfosUser ($pID) {
  
        $membres = $this->find($pID);
        $membre = $membres->current();

        return $membre->userPrenom.' '.$membre->userNom.'<br/>';
  
    }

}

$table = new TUser;
echo $table -> InfosUser(2);


Correction de l'exercice 14

<?php

header('Content-type: text/html; charset=utf-8');

require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();
$loader->setFallbackAutoloader(true);

$configFile = dirname(__FILE__) . '/ZendConfig.ini';
$config = new Zend_Config_Ini($configFile, 'dev');

$db = Zend_Db::factory($config->database);

// $db est l’objet de connexion Zend_Db_Adapter
Zend_Db_Table_Abstract::setDefaultAdapter($db);

/**
* Modèle associé à la table user
*/
class TUser extends Zend_Db_Table_Abstract
{
    protected $_name = 'user';
    protected $_primary = 'userID';

    public function InfosUser ($pID) {
  
        $membres = $this->find($pID);
        $membre = $membres->current();

        return $membre->userPrenom.' '.$membre->userNom.'</br>';
  
    }

    public function recupAdmin () {
  
        $sql = "SELECT userNom FROM user WHERE userIsAdmin = 1";
        $user = $this->getAdapter()->fetchAll($sql, null, Zend_Db::FETCH_OBJ);
        return $user;

    }

}

$table = new TUser;
$users = $table -> recupAdmin();
foreach ($users as $user)
{
    echo $user->userNom.'</br>';
}

1 commentaire: