-- Base de données: `poo`
--------------------------------------------------------
Structure de la table `images_joueurs`
CREATE TABLE IF NOT EXISTS `images_joueurs` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id_joueur` int(3) NOT NULL,
`path` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
-- Structure de la table `joueurs`
CREATE TABLE IF NOT EXISTS `joueurs` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nom` varchar(50) NOT NULL,
`prenom` varchar(50) NOT NULL,
`nationalite` varchar(50) NOT NULL,
`club` varchar(50) NOT NULL,
`age` int(2) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
mon fichier index.php
$cnx = mysql_connect("localhost", "root", "");
$db = mysql_select_db( "poo" );
$nom = "";
$prenom = "";
$age = "";
$nationalite = "";
$club = "";
if (isset($_POST['envoyer']))
{
$erreur = "";
$nom = $_POST['nom'];
$prenom = $_POST['prenom'];
$age = $_POST['age'];
$nationalite = $_POST['nationalite'];
$club = $_POST['club'];
if ((isset($_FILES["photo"])) and ($_FILES["photo"]['name'] <> '') and ($_POST['nom'] != "") and ($_POST['prenom'] != ''))
{ // on insert tous
// on commencer par les informations
$extensions_ok = array('png', 'PNG', 'gif', 'GIF', 'jpg', 'JPG', 'jpeg', 'JPEG');
$taille_max = 2097152;
$dossier = 'images/';
$taille= getimagesize($_FILES['photo']['tmp_name']);
$largeur=$taille[0];
$hauteur=$taille[1];
$erreur = '';
if( !in_array( substr(strrchr($_FILES["photo"]['name'], '.'), 1), $extensions_ok ) )
{
$erreur = "* Erreur dans dimensions, format ou la taille de l'image 1";
}
elseif ( ($largeur > 728) or ($hauteur > 725) ) // les dimensions maximum
{
$erreur = $erreur ." <br />* Erreur dans dimensions, format ou la taille de l'image 2";
}
elseif( file_exists($_FILES["photo"]['tmp_name']) and filesize($_FILES["photo"]['tmp_name']) > $taille_max)
{
$erreur = $erreur ." <br />* Erreur dans dimensions, format ou la taille de l'image 3";
}
if ( $erreur == '' )
{
// exetension de l'image
$extension = substr(strrchr($_FILES["photo"]['name'], '.'), 1);
// nom de l'image = nom_prenom de joueur
$joueur = $nom.' '.$prenom;
$joueur=str_replace(' ','_',$joueur); // j'enleve les espace dans le nom de l'entreprise
$nameImg = $joueur.".".$extension;
// Uploader L'image
if ($req =mysql_query('Insert into joueurs VALUES ("", "'.$nom.'", "'.$prenom.'", "'.$nationalite.'", "'.$club.'", "'.$age.'" )') or die (mysql_error()))
{
$idJoueur = mysql_insert_id();
$nameImg = $idJoueur.'_'.$joueur.".".$extension;
$path = $dossier.$nameImg;
if ($req2 = mysql_query('Insert into images_joueurs VALUES ("", "'.$idJoueur.'", "'.$path.'")') or die (mysql_error()))
{
move_uploaded_file($_FILES["photo"]['tmp_name'], $dossier . $nameImg); // Upoade la nouvelle image
$nom = "";
$prenom = "";
$age = "";
$nationalite = "";
$club = "";
$erreur = 'votre joueur est bien enregistre';
}
else
$erreur = 'erreur de la 2eme requête';
}
else
$erreur = 'erreur de la 1ere requête';
}
}
else
{
$erreur = 'le formulaire est incomplet';
}
}
echo '<form action="#" method="post" enctype="multipart/form-data" />
<input type="hidden" name="MAX_FILE_SIZE" value="2097152" />
'.$erreur.' <br />
<table>
<tr>
<td>Nom </td><td><input type="text" value="'.$nom.'" name="nom" /></td>
</tr>
<tr>
<td>prenom </td><td><input type="text" name="prenom" value="'.$prenom.'"/></td>
</tr>
<tr>
<td>Age </td><td><input type="text" value="'.$age.'" name="age" /></td>
</tr>
<tr>
<td>Nationalité </td><td><input type="text" name="nationalite" value="'.$nationalite.'"/></td>
</tr>
<tr>
<td>Club </td><td><input type="text" name="club" value="'.$club.'"/></td>
</tr>
<tr>
<td>photo </td><td><input type="file" name="photo" /></td>
</tr>
<tr>
<td><input type="submit" name="envoyer" value="Envoyer" /><td></td>
</tr>
</table>';
echo '<br/><br/><a href="listeJoueur.php" >Voir la liste des joueurs</a>';
fichier listeJoueur.php
$cnx = mysql_connect("localhost", "root", "");
$db = mysql_select_db( "poo" );
$query = mysql_query ('Select * FROM joueurs order by nom') or die (mysql_error());
echo '<table><tr>';
while ($res = mysql_fetch_object($query))
{
$query2 = mysql_query ('SELECT path from images_joueurs where id_joueur = '.$res->id.' ') or die (mysql_error());
$res2 = mysql_fetch_object($query2);
echo '<td> <center><img src="'.$res2->path.'" title="'.$res->nom.' '.$res->prenom.'" height="250px" width="200px" /><br />
'.$res->nom.' '.$res->prenom.' <br />
Age : '.$res->age.' ans <br/>
Nationalité : '.$res->nationalite.' <br />
Club : '.$res->club.' </center></td>';
}
echo '</tr></table>';
n'oubliez pas de créer un dossier "images" dans la même racine que les deux fichiers pour le transfert des images
class Player {
// tu déclares tes attributs
protected $_listImg = array();
// tu peux alimenter des attributs directement avec le constructeur, ou pas
public function __construct($listImg) {
$this->addImg($listImg);
}
// tu fais un setter pour tes attributs avec les traitements qui vont bien (cast, calcul, etc...)
// Ici on suppose que tu as créer une classe Image
public function addImg($listImg) {
// si on a pas un tableau d'image on le transforme en tableau, c'est plus simple... je suis fainéant
if (false === is_array($listImg)) {
listImg = array($listImg);
}
foreach($listImg as $img) {
$this->_listImg[] = $img;
}
}
// tu fais un getter pour récupérer tes attributs en dehors de ta classe
public function listImg() {
$this->_listImg;
}
}
// Pour utiliser tes classes
// on créer une liste d'image
$images[] = new Image();
$images[] = new Image();
$images[] = new Image();
// et le joueur
$player = new Player($images);
// Ensuite pour faire simple dans un premier temps, tu peux imaginer de créer une fonction save dans une classe dédié à la BD.
<?php
public function addImg($listImg) {
// si on a pas un tableau d'image on le transforme en tableau, c'est plus simple... je suis fainéant
if (false === is_array($listImg)) {
listImg = array($listImg);
}
foreach($listImg as $img) {
$this->_listImg[] = $img;
}
}
?>
ben franchement y'a moyen de faire plus simple et plus "optimisé"je suis fainéant
<?php
public function addImg($listImg) {
// si on a pas un tableau d'image on le transforme en tableau, c'est plus simple... je suis fainéant
if (false === is_array($listImg)) {
$this->_listImg[] = $listImg;
}
else {
$this->_listImg = array_merge($this->_listImg[] ,$listImg);
}
}
?>
c'est simple et plus rapide
// Un service technique PDO
// dans cette classe tu auras la partie "branchement" technique avec la base, et uniquement cette partie
// on peut imaginer une fonction générique pour des requêtes, select, insert, etc.
namespace \Tech\Pdo;
class PdoService
{
public function getInstance() {}
public function prepareQuery() {}
public function update() {}
public function listItem() {}
public function totoTataQuiVaBien() {}
//etc...
}
// Dans un second temps tu peux imaginer un service joueur
// dans cette classe tu aura tout ce qui a attrait au joueur et uniquement au joueur
namespace \Player;
class PlayerService
{
protected $_adapter;
// j'explique l'adapter plus bas, ici on imagine que par défaut ce sera \Tech\PdoService
public function __construct($adapter) {
$this->_adapter = $adapter;
}
// ici un exemple de comment tu va utiliser ta classe pdo
public function getPlayerById($id) {
$this->getAdapter()->getPlayerById($id);
public function getInstance() {}
}
// Dans un troisième temps tu mets en place un Adapter, ce qui va faire le lien entre ton PlayerService et ton PdoService.
// Voit l'adapter comme un passe plat, qui ne fera que transmettre les demande de requêtes vers le PdoService.
// fonctionner de cette manière te permet d'avoir le moins possible de dépendance en tes objets.
// Si par exemple tu travail en TDD tu peux facilement "transformer" ton adapter en Mock (un bouchon pour faire simple)
namespace \Player\Adapter;
class PlayerAdapter
{
public function getPlayerById($id) {
// ici je fais appel a une fonction générique getItem() de mon service PDO.
// je lui passe en paramètre $id qui est la valeur sur laquelle je veux filtrer
// 'table_player' pour lui dire dans quelle table executer la requête (il y a mieux que mettre en dur mais c'est pour l'exemple)
// et le champs sur lequel je veux effectuer le filtre
// je te conseil aussi fortement de bien nommer tes fonctions de manière générique
// par exemple getItem() ne retournera que 1 seul résultat, pour liste une collection tu peux imaginer une fonction listItem() etc.
return \Tech\Pdo\PdoService()::getInstance()->getItem($id, 'table_player', 'id');
}
// concrètement dans ton contrôleur tu auras quelque chose comme ceci
$player = \Player()::getInstance()-> getPlayerById($id);
}
Pour ce qui est gestion des adapter, singleton, tu peux passer par une classe mère qui te permettra de gérer tout ça de manière automatique.namespace \Player\Mock;
class Mock {
// ici on va moquer la fonction getPlayerById, on suppose pour notre exemple qu'elle renvoi un tableau array(id, name)
public function getPlayerById($id) {
return arrya('id' => 1, name => 'guitoup');
}
// et c'est tout ! en gros tu mets tes infos en dur... point.
// l'exemple n'est pas très parlant car la fonction n'a que peu de code "métier".
// Côté test unitaire tu auras quelque chose comme ceci :
class ServiceTest extends PHPUnit_Framework_TestCase
{
// tu créer ton player comme d'habitude, à la différence que tu lui passe l'adapter que tu veux ! dans le post précédent on avait supposer que par défaut on
// prenais \Player, cette fois on utilise \Player\Mock
$player = \Player()::getInstance(new \Player\Mock)-> getPlayerById($id);
$this->assertEquals($player['id'], 1);
$this->assertEquals($player['name'], 'guitoup');
}
Voili voilou