
À l'heure où les magazines spécialisés dans l'informatique se font rares, j'aimerais vous parler de PHP Solutions, un magazine numérique gratuit entièrement consacré au PHP.
16 déc. 2010

À l'heure où les magazines spécialisés dans l'informatique se font rares, j'aimerais vous parler de PHP Solutions, un magazine numérique gratuit entièrement consacré au PHP.
22 oct. 2010

L'installation de Symfony peut paraître compliquée et périlleuse, si bien que bon nombre de développeurs n'osent pas se lancer dans son utilisation. En réalité elle se révèle être d'une simplicité sans égal, mais suit un processus spécifique où chaque étape est essentielle et ne doit pas être oubliée.
29 oct. 2009
Étant en train de mettre en place un forum PHPBB, je me suis rapidement confronté aux problèmes d'ajout de modules qui, sur PHPBB, sont loin d'être automatisés. Ayant pris l'habitude des installations de plugins sous Dotclear, ça change... Bref. Il m'était nécessaire d'installer un module de gestion de galerie et je me suis tourné vers PHPBB Gallery qui connaît une certaine popularité. Après 60 minutes de procédure d'installation et après avoir découvert les fonctionnalités de cet excellent module, je me suis heurté à quelques difficultés. En effet, ce module étant doté d'un système de notation, je voulais afficher la note moyenne de chaque membre pour toutes les photos qu'il a mis en ligne, afin que chacun sache où se situer en terme de "performance". Malheureusement, cette fonctionnalité n'est pas disponible de base, dans la version 1.0.3. Je l'ai donc développée.

Voici la procédure :
1. Le traitement
a - Tout d'abord nous allons nous occuper du traitement, c'est à dire le calcul de la moyenne de chaque membre. Pour ceci, rendez-vous à la racine de votre forum et ouvrez le fichier viewtopic.php avec votre éditeur PHP préféré. Cherchez-y le bout de code suivant :
$user_cache[$poster_id] = array( 'joined' => '', 'posts' => '',
Et remplacez-le par celui-ci :
$user_cache[$poster_id] = array( 'joined' => '', 'posts' => '', 'rates_average' => '',
On ajoute tout simplement un élément dans le tableau user afin d'y renseigner la moyenne des notes. Ici, on est dans le cas où l'utilisateur qui poste n'a pas de compte, on ne lui attribue donc pas de valeur.
b - Ensuite, recherchez ce code :
$user_sig = ''; // We add the signature to every posters entry because enable_sig is post dependant if ($row['user_sig'] && $config['allow_sig'] && $user->optionget('viewsigs')) { $user_sig = $row['user_sig']; }
Et placez-y juste avant (donc au début du else) le code suivant :
// Moyenne des notes $sql_rates_average = 'SELECT ROUND(AVG(m),1) AS rates_average, rate_image_id FROM (SELECT rate_image_id, AVG(rate_point) as m FROM '.GALLERY_RATES_TABLE.' GROUP BY rate_image_id) AS td WHERE rate_image_id IN (SELECT image_id FROM '.GALLERY_IMAGES_TABLE.' WHERE image_user_id = '.$poster_id.')'; $result_rates_average = $db->sql_query($sql_rates_average); $row_rates_average = $db->sql_fetchrow($result_rates_average); $user_rates_average = $row_rates_average['rates_average']; $db->sql_freeresult($result_rates_average);
C'est tout simplement la requête SQL qui va récupérer les notes de toutes les photos de chaque utilisateur et va en faire la moyenne. À noter que la moyenne est calculée en fonction des moyennes de chaque photo et non pas en fonction de toutes les notes reçues par l'utilisateur.
c - Ensuite, recherchez ce code :
$user_cache[$poster_id] = array( 'joined' => $user->format_date($row['user_regdate']), 'posts' => $row['user_posts'],
Et remplacez-le par celui-ci :
$user_cache[$poster_id] = array( 'joined' => $user->format_date($row['user_regdate']), 'posts' => $row['user_posts'], 'rates_average' => $user_rates_average,
Comme dans l'étape a, cette étape consiste à rajouter un élément dans le tableau de l'utilisateur afin de lui attribuer sa moyenne de notes. Il s'agit ici des utilisateurs enregistrés, on peut donc leur attribuer une valeur.
d - Enfin, recherchez ce code :
'POSTER_JOINED' => $user_cache[$poster_id]['joined'], 'POSTER_POSTS' => $user_cache[$poster_id]['posts'],
Et remplacez-le par le code suivant :
'POSTER_JOINED' => $user_cache[$poster_id]['joined'], 'POSTER_POSTS' => $user_cache[$poster_id]['posts'], 'POSTER_RATES_AVERAGE' => $user_cache[$poster_id]['rates_average'],
Ici, on attribue simplement une référence texte à la valeur de la moyenne des notes, afin de l'afficher dans le squelette (c'est une gestion de template ordinaire).
Maintenant que la moyenne de chaque membre est calculée, il reste à l'afficher au bon endroit.
2. L'affichage
e - Tout d'abord, rendez-vous dans le fichier language > fr > common.php et recherchez ce bout de code :
'READING_FORUM' => 'Consulte les sujets dans %s', 'READING_GLOBAL_ANNOUNCE' => 'Consulte une annonce globale',
Et remplacez-le par celui-ci :
'RATES_AVERAGE' => 'Moyenne des notes', 'READING_FORUM' => 'Consulte les sujets dans %s', 'READING_GLOBAL_ANNOUNCE' => 'Consulte une annonce globale',
Encore une fois, on attribue une référence à une chaîne de caractère afin de l'afficher dans le squelette.
f - Ensuite, rendez-vous dans styles > votre style (prosilver par exemple) > template > viewtopic_body.html et recherchez ce bout de code :
<!-- IF postrow.POSTER_POSTS != '' --><dd><strong>{L_POSTS}:</strong> {postrow.POSTER_POSTS}</dd><!-- ENDIF -->
et remplacez-le par celui-ci :
<!-- IF postrow.POSTER_POSTS != '' --><dd><strong>{L_POSTS}:</strong> {postrow.POSTER_POSTS}</dd><!-- ENDIF --> <!-- IF postrow.POSTER_RATES_AVERAGE != '' --><dd><strong>{L_RATES_AVERAGE}:</strong> {postrow.POSTER_RATES_AVERAGE}</dd><!-- ENDIF -->
Ici, on renseigne tout simplement nos références dans notre squelette, ce qui permet d'afficher toutes nos informations.
La manipulation est terminée ! Théoriquement, vous devriez voir la moyenne des notes de chaque membre en dessous leur avatar (comme sur l'image en haut du billet), sous réserve qu'ils aient posté des photos et que celles-ci aient été notées ;).
Si vous avez des questions et/ou des remarques, n'hésitez pas !
30 janv. 2009
Je vous avais récemment parlé de TV 4 IT, votre source d'information audiovisuelle. Je reviens vers vous avec une nouvelle web tv : PHPTV.

Cette web tv est toute jeune (juillet 2008) et représente surtout la seule web tv PHP. Au programme, une vidéo en ligne tous les mois qui traite de PHP sous tous ses angles (forums, manifestations, programmation pure etc.).
Je vais pas vous en dire plus, et vous conseille dès maintenant de vous rendre sur PHPTV ! N'oubliez pas de vous inscrire à la newsletter ;)
13 déc. 2008
Je vous propose un petit script PHP afin d'exporter facilement vos données SQL en .CSV ou .XLS. C'est simple, compréhensible, et surtout, facile à mettre en place ;)
<?php // Inclusion des paramètres de connexion à votre base de données require_once('config.php'); // Titre des colonnes de votre fichier .CSV ou .XLS $fichier = "Nom; Prenom; Mail; Adresse"; $fichier .= "\n"; // Requête SQL $sql = "SELECT * FROM personnes"; $req = mysql_query($sql); // Enregistrement des résultats ligne par ligne while($row = mysql_fetch_object($req)) { $fichier .= "".$row->nom.";".$row->prenom.";".$row->mail.";".$row->adresse."\n"; } // Déclaration du type de contenu header("Content-type: application/vnd.ms-excel"); header("Content-disposition: attachment; filename=Personnes.csv"); // Remplacer .csv par .xls pour exporter en .XLS print $fichier; exit; ?>
Si vous remarquez une erreur qui s'est glissée dans le script ou si vous avez une question, n'hésitez pas à m'en faire part à la suite de ce sujet ;)
02 déc. 2008
Le but de ce tuto est de vous donner toutes les cartes afin que vous puissiez envoyer des emails de type "texte" ou "HTML" via PHP. Il ne se veut pas exhaustif, mais suffisamment complet pour répondre à la demande d'au moins 90% d'entre vous. J'estime que seules les personnes expérimentées auront besoin de créer des applications plus complexes (je généralise, mais c'est majoritairement le cas).
Ce tuto se veut succin mais pertinent. J'irai droit au but. L'envoi de Mail requiert la connaissance de paramètres, d'une syntaxe particulière... Soit vous l'apprenez par cœur, soit vous mettez ce tuto en marque page, il se révélera très pratique ;) Trêve de blabla. On y va.
1. Envoi de mail texte
L'envoi de mail se fait grâce à la fonction mail(). Elle prend au minimum 3 paramètres : le destinataire, le sujet et le message.
<?php /*---- Déclaration des paramètres ----*/ $destinataire = "destinataire@gmail.com"; // Pour plusieurs destinataires, les séparer par une virgule $sujet = "Tuto - Envoi de mail"; /*---- Déclaration du message ----*/ $message = "Mon Message"; /*---- Envoi du mail ----*/ mail($destinataire, $sujet, $message); ?>
Grâce à un 4ème paramètre (optionnel), l'entête, il vous est possible de renseigner davantage d'informations, tels que l'adresse email de l'expéditeur, ou encore la priorité du mail.
<?php /*---- Déclaration des paramètres ----*/ $destinataire = "destinataire@gmail.com"; // Pour plusieurs destinataires, les séparer par une virgule $expediteur = "contact@jchristophe.fr"; $sujet = "Tuto envoi de mail"; /*---- Déclaration de l'entête ----*/ $entete = "From: $expediteur \n"; // Adresse de l'expéditeur $entete .= "Reply-to: $expediteur \n"; // Adresse de réponse $entete .= "Cc: destinataire1@gmail.com \n"; // Destinataire(s) en copie cachée $entete .= "Bcc: destinataire2@gmail.com \n"; // Destinataire(s) en mode caché $entete .= "X-Priority: 1 \n"; // Priorité du mail. 5 = basse, 3 = normal, 1 = urgent /*---- Déclaration du message ----*/ $message = "Mon Message"; // Pour sauter une ligne, écrire : \n /*---- Envoi du mail ----*/ mail($destinataire, $sujet, $message, $entete); ?>
2. Envoi de mail html
Pour envoyer un mail au format HTML, il suffit de déclarer le Content-Type du mail dans son entête. Vous pourrez ensuite utiliser toutes vos balises HTML dans votre message.
<?php /*---- Déclaration des paramètres ----*/ $destinataire = "destinataire@gmail.com"; // Pour plusieurs destinataires, les séparer par une virgule $expediteur = "contact@jchristophe.fr"; $sujet = "Tuto envoi de mail"; /*---- Déclaration de l'entête ----*/ $entete = "From: $expediteur \n"; // Adresse de l'expéditeur $entete .= "Reply-to: $expediteur \n"; // Adresse de réponse $entete .= "Cc: destinataire1@gmail.com \n"; // Destinataire(s) en copie cachée $entete .= "Bcc: destinataire2@gmail.com \n"; // Destinataire(s) en mode caché $entete .= "X-Priority: 1 \n"; // Priorité du mail. 5 = basse, 3 = normal, 1 = urgent $entete .= "Content-Type: text/html \n"; // Type du mail : HTML /*---- Déclaration du message ----*/ $message = "<html><body>"; $message .= "<strong>Mon Texte Gras</strong><br />"; $message .= "<font color=\'#ff0000\'>Mon Texte Rouge</font>"; $message .= "</body></html>", /*---- Envoi du mail ----*/ mail($destinataire, $sujet, $message, $entete); ?>
Concernant l'affichage des images, n'oubliez pas de renseigner l'url complète de votre image, que vous avez, au préalable, hébergé sur un serveur ;)
3. Envoi de mail avec pièce(s) jointe(s)
<?php /*---- Déclaration des paramètres ----*/ $destinataire = "contact@jchristophe.fr"; // Pour plusieurs destinataires, les séparer par une virgule $expediteur = "contact@jchristophe.fr"; $sujet = "Tuto envoi de mail"; $delimiteur = md5(uniqid(rand())); // Création d'un numéro unique, qui délimitera les différents blocs du mail $piecejointe = "candidat.pdf"; // Déclaration du fichier à envoyer en tant que pièce jointe $contenupiecejointe = file_get_contents($piecejointe); // Récupération du contenu du fichier $contenupiecejointe = chunk_split(base64_encode($contenupiecejointe)); // Conversion du fichier : respect du format RFC 2045 $typepiecejointe = filetype($piecejointe); // Récupération du type du fichier /*---- Déclaration de l'entête ----*/ $entete = "From: $expediteur \n"; $entete .= "Reply-to: $expediteur \n"; $entete .= "Cc: destinataire1@gmail.com \n"; $entete .= "Bcc: destinataire2@gmail.com \n"; $entete .= "X-Priority: 1 \n"; $entete .= "MIME-Version: 1.0 \n"; $entete .= "Content-Type: multipart/mixed; boundary=\"$delimiteur\" \n"; // Déclaration du type du mail et du délimiteur $entete .= " \n"; /*---- Déclaration du message ----*/ $message = "--$delimiteur \n"; // Séparation du bloc "entete" et du bloc "message" par notre délimiteur $message .= "Content-Type: text/html; charset=\"iso-8859-1\" \n"; // Déclaration du type du message ainsi que la charte de codage $message .= "Content-Transfer-Encoding:8bit\n"; // Déclaration du type de codage $message .= "\n"; $message .= "<strong>Mon Texte Gras</strong><br />"; $message .= "<font color=\"#ff0000\">Mon Texte Rouge</font>"; $message .= "\n"; /*---- Insertion de la pièce jointe ----*/ $message .= "--$delimiteur \n"; // Séparation du bloc "message" et du bloc "pièce jointe" par notre délimiteur $message .= "Content-Type: $typepiecejointe; name=\"$piecejointe\" \n"; // Déclaration du type et du nom de la pièce jointe $message .= "Content-Transfer-Encoding: base64 \n"; // Déclaration du type de codage $message .= "Content-Disposition: attachment; filename=\"$piecejointe\" \n"; // attachment = pièce jointe = fichier à sauvegarder $message .= "\n"; $message .= $contenupiecejointe." \n"; // Insertion du fichier $message .= "\n"; $message .= "--$delimiteur"; // Délimitation de la fin de la pièce jointe, et du mail /*---- Envoi du mail ----*/ mail($destinataire, $sujet, $message, $entete); ?>
Et voilà ! Je pense avoir été assez précis, explicite et pertinent. Cependant, si vous avez des questions sur des éléments relatifs à l'envoi de mail en PHP présents, ou pas, dans ce tuto, je me ferai un plaisir de répondre dans la limite de mes compétences ;)
N'hésitez pas à réagir ;)
Rapide tuto sur l'extension PDO désormais incluse dans les nouvelles versions de PHP (depuis la 5.1 me semble-t-il). Qu'est-ce-que PDO ? C'est une extension qui permet de fournir une interface d'abstraction à l'accès de données, ce qui signifie que l'on utilise les mêmes fonctions pour exécuter des requêtes ou récupérer les données quelque soit la base de données utilisée.
On va vite voir comment mettre ça en place :
Avant toute chose, et comme nous avions l'habitude de le faire dans les anciennes versions de PHP, il faut renseigner les informations du serveur et de la base de données.
<?php $login = 'login'; $mdp = 'mdp'; // Pour MySQL : $bdd = 'mysql:host=localhost;dbname=mabase'; // Pour SQLite : $bdd = 'sqlite:/chemin_vers_fichier_de_configuration'; // Pour PostgreSQL $bdd = 'pgsql:host=localhost port=4444 dbname=mabase user=login password=mdp'; // Pour Oracle $bdd = 'OCI:dbname=mabase', 'login', 'mdp'; ?>
Rien de difficile à comprendre. Le seul problème réside dans la syntaxe, que l'on a pas l'habitude de voir. Ensuite vient la connexion à la bdd.
<?php $login = 'login'; $mdp = 'mdp'; $bdd = 'mysql:host=localhost;dbname=mabase'; try { $cnx = new PDO($bdd, $login, $mdp); } catch (PDOException $error) { die("Erreur de connexion : " . $error->getMessage() ); } $cnx = null; // Fermeture de la connexion ?>
Pour ceux qui n'ont pas l'habitude de gérer les exceptions de cette manière, avec try et catch, je vous renvois à la documentation PHP disponible ici : www.php.net. Et maintenant, intéressons nous aux requêtes. Concernant les requêtes les plus utilisées, PDO distingue deux types de requêtes : les requêtes renvoyant un résultat (SELECT...) et les requêtes ne renvoyant pas de résultat (INSERT...). Cette distinction n'était pas présente dans les versions antérieures de PHP (mysql_query était utilisé pour tout type de requête). Voyons comment PDO gère ceci :
<?php $login = 'login'; $mdp = 'mdp'; $bdd = 'mysql:host=localhost;dbname=mabase'; try { $cnx = new PDO($bdd, $login, $mdp); } catch (PDOException $error) { die("Erreur de connexion : " . $error->getMessage() ); } // Requête sans renvoi de résultat $req = "INSERT INTO clients (pseudo, mail) VALUES ('toto, 'toto@gmail.com')"; $cnx->exec($req); // Requête avec renvoi de résultat(s) $req = "SELECT * FROM clients"; $res = $cnx->query($req); $cnx = null; // Fermeture de la connexion ?>
Il est bon de noter qu'en cas d'erreur, les fonctions exec() et query() renvoient FALSE.
Maintenant que nous avons sélectionné nos enregistrements, il faut les récupérer. Nous avions l'habitude des mysql_fetch_array, mysql_fetch_object... Avec PDO, nous ne sommes pas dépaysés, mais la syntaxe est différente. Là voici :
<?php $login = 'login'; $mdp = 'mdp'; $bdd = 'mysql:host=localhost;dbname=mabase'; try { $cnx = new PDO($bdd, $login, $mdp); } catch (PDOException $error) { die("Erreur de connexion : " . $error->getMessage() ); } // Requête sans renvoi de résultat $req = "INSERT INTO clients (pseudo, mail) VALUES ('toto, 'toto@gmail.com')"; $cnx->exec($req); // Requête avec renvoi de résultat(s) $req = "SELECT * FROM clients"; $res = $cnx->query($req); while ($row = $res->fetch(PDO::FETCH_NUM)){} // PDO::FETCH_NUM renvoie un tableau avec des clefs numériques. // PDO::FETCH_ASSOC renvoie un tableau associatif. // PDO::FETCH_BOTH renvoie un tableau associatif avec des clefs numériques. // PDO::FETCH_OBJ renvoie une instance de stdClass. $cnx = null; // Fermeture de la connexion ?>
J'ai mentionné dans l'exemple les constantes les plus utilisées, il y a en tout 17 méthodes permettant de "récolter" les enregistrements d'une base de données.
Nous arrivons au terme de ce tutoriel d'initiation à PDO. J'espère qu'il vous servira dans vos futurs scripts PHP ;)
Pour de plus amples informations à propos de PDO, je vous renvois à la documentation PHP, comme a son habitude, très bien expliquée. Rendez-vous ici : www.php.net
« billets précédents - page 1 de 2