====== TD14 : On commence (enfin) les choses sérieuses ====== Pour ce TD, vous devez avoir lu (et compris, et expérimenté) ces deux cours sur la programmation orienté objet en PHP : [[http://www.atelierphp.net/lesson_08_classes/lesson_08.php|AtelierPHP]] et [[http://g-rossolini.developpez.com/tutoriels/php/cours/?page=poo|G. Rossolini]]. Une petite séance de questions/réponses est prévue en début de cours pour compléter les questions que vous pourrez vous poser. ====== reCAPTCHA, utilisation d'un objet simple ====== [[http://www.google.com/recaptcha|reCAPTCHA]] est un objet très simple à utiliser qui permet de générere des CAPTCHA. En vous basant sur [[http://code.google.com/apis/recaptcha/docs/php.html|la documentation]], créez un formulaire d'inscription qui utilise reCAPTCHA. Demandez à l'utilisateur de saisir * un login * un password * une adresse e-mail * recopier le code qui s'affiche dans le captcha Si tous les champs sont remplis, si le captcha a été correctement saisi et si le login n'est déjà pas déjà utilisé, créez un nouvel utilisateur dans la base de données. En utilisant une base MVC, créez un fichier subscribe.php (et un ou plusieurs templates appropriés) qui va gérer l'ensemble du processus d'inscription. ====== FPDF, manipulation d'un objet de création de PDF ====== Le premier objet que nous allons manipuler est [[http://www.fpdf.org/|FPDF]], c'est un objet de création de PDF. En vous basant sur cette architecture, faites un script de demande de devis qui génère un PDF. Ce script est constitué d'un formulaire comme le [[td10]] mais au lieu de stocker le résultat dans une base de données va permettre de télécharger un fichier PDF qui reprend l'ensemble des informations saisies. Placez les librairies FPDF dans le dossier /lib/ Générez un PDF de commande comme ceci (enfin c'est l'esprit quoi) {{:ressources:php:commande.pdf|}} ====== PDO ====== Petit screencast à regarder à la maison pour s'initier à PDO: [[http://www.youtube.com/watch?v=XQjKkNiByCk&feature=bf_prev&list=EC23A4AFEA46A5CB23]] ===== connexion ===== ==== connexion simple ==== === Méthode fonctionnelle === Avant, comme dans le [[td03]] ou même dans les fichiers mvc du [[td10]], on utilise les fonctions [[phpfn>mysql_connect]] et [[phpfn>mysql_select_db]] $link = mysql_connect('localhost', 'mysql_user', 'mysql_password'); $db_selected = mysql_select_db('nuancier', $link); === Méthode PDO === Avec PDO, on utilise un objet PDO qui a sa syntaxe propre. $dbo = new PDO('mysql:host=localhost;dbname=nuancier','mysql_user','mysql_password'); Les avantages : * c'est plus court * ça permet de se connecter à d'autres bases que MySQL * c'est plus classe :-) ==== connexion avec variables et gestion d'erreurs ==== === Méthode fonctionnelle === Dans le fichier config : $db = array(); $db['host'] = 'localhost'; $db['user'] = 'gaspard'; // utilisateur $db['pass'] = 'xxxx'; //password $db['base'] = 'nuancier'; //nom de la base de donnee Dans la fonction database_connect() : $link = mysql_connect($db['host'], $db['user'], $db['pass']); if(!$link) { die('Not connected : ' . mysql_error()); } $db_selected = mysql_select_db($db['base'], $link); if(!$db_selected) { die('base inaccessible : ' . mysql_error()); } === Méthode PDO === Dans le fichier config : ça ne change pas. Dans la fonction database_connect() try{ $db['object'] = new PDO('mysql:host='.$db['host'].';dbname='.$db['base'],$db['user'],$db['pass']); } catch (Exception $e){ die('Erreur : '.$e->getMessage()); } ===== requêtes ===== ==== Sans paramètre ==== Par exemple quand on veut récupérer tous les enregistrements. === méthode fonctionnelle === $res = mysql_query("SELECT nom FROM nuancier"); === PDO === Il est conseillé de préparer la requête avant de l'executer. $query =$db['object']->prepare("SELECT nom FROM nuancier"); $query->execute(); ==== Avec paramètres ==== Par exemple quand on veut récupérer un enregistrement par **id**. === méthode fonctionnelle === $id =mysql_real_escape_string($_GET['id'],$link); $res = mysql_query("SELECT nom FROM nuancier WHERE id=$id"); === PDO === $query =$db['object']->prepare('SELECT nom FROM nuancier WHERE id = :id'); $query->execute(array(':id'=> $_GET['id'])); ===== Afficher les résultats ===== ==== un seul résultat ==== === méthode fonctionnelle === $color = mysql_fetch_array($res, MYSQL_ASSOC); // dans le template echo $color['nom']; === pdo === $color = $query->fetch(PDO::FETCH_OBJ); // dans le template echo $color->nom; ==== plusieurs résultats ==== === méthode fonctionnelle === $colors=array(); while ($row = mysql_fetch_array($res, MYSQL_ASSOC)){ $colors[] = $row['nom']; } // dans le template for($i=0;$i === pdo === $colors = $query->fetchAll(PDO::FETCH_OBJ); // dans le template for($i=0;$inom; } ===== Code final ===== Récapitulatif du code pour afficher plusieurs résultats en utilisant la méthode objet avec PDO, une douzaine de lignes: // connexion try{ $db['object'] = new PDO('mysql:host='.$db['host'].';dbname='.$db['base'],$db['user'],$db['pass']); } catch (Exception $e){ die('Erreur : '.$e->getMessage()); } // requête $query =$db['object']->prepare("SELECT nom FROM nuancier"); $query->execute(); $colors = $query->fetchAll(PDO::FETCH_OBJ); // template for($i=0;$inom; } ====== SQLite ====== SQLite est un moteur de gestion de bases de données simples le moteur SQLite est intégré dans PHP depuis sa version 5. C'est très facile à mettre en place, pas besoin de serveur, il suffit de générer un fichier de base de données sqlite. Vous trouverez facilement des tutos pour l'utilisation de SQLite comme sur [[http://www.switchonthecode.com/tutorials/php-tutorial-creating-and-modifying-sqlite-databases|switchonthecode.com]] ou sur [[http://www.scriptol.com/sql/sqlite-tutorial.php|scriptol.com]] Pour pratiquer, enregistrez par exemple les infos des commandes de l'exercice précédent.