Programmer en PHP

De Wiki Amis SH
Aller à la navigation Aller à la recherche



Le wiki : Accueil - Administrateur - Bureautique - Développeur - Intégrateur - Marketing - Multimédia - Objets numériques - Jeux - We make Hack


Programmer en PHP

Cette page propose des exemples de codes PHP procédurale et objet.
Avant de pouvoir programmer en PHP il est nécessaire d'avoir à disposition un serveur web comme Apache.
PHP doit avoir été installé sur le système d'exploitation : Installer PHP.

Programmation procédurale

Aficher les erreurs PHP sur une page

# Ajouter au début du code source :
ini_set('display_errors',1);

Identifier l'URL de provenance

// Récupérer l'URL de provenance à sauvegardée en PDF.
$URL=$_SERVER["HTTP_REFERER"];

Connaître le type d'une variable

$nb = 5;
echo gettype($nb);

Convertir une URL en UNICODE avec PHP

$URL = urlencode(utf8_encode($URL));

Remplacer le contenu entre deux balises

# Supprime les deux balises <titre> et leur contenu pour afficher "ceci chaine qui posera problème". 
<?php
$str = "ceci\n
<titre>est une </titre>\n
chaine\n
<titre>multiligne</titre>\n
qui posera problème";
echo $content = preg_replace("~<titre>(.*)</titre>~m","",$str) ;
?>

Interdire les caractères spéciaux dans une chaîne de caractères

$interdit=array(">", "<", " ", ":", "*","\\", "/", "|", "?", "\"", ",", "—", "!", "_", ".", "(", ")", "[", "]", "=", "+", "°", "~", "'", "#", "`" );
 $variable = str_replace($interdit,"-",$titre);

Remplacer des caractères

// Modèle des caractères accentués.
$cible = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ă', 'Ą','Ç', 'Ć', 'Č', 'Œ','Ď', 'Đ','à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ă', 'ą','ç', 'ć', 'č', 'œ','ď', 'đ','È', 'É', 'Ê', 'Ë', 'Ę', 'Ě','Ğ','Ì', 'Í', 'Î', 'Ï', 'İ','Ĺ', 'Ľ', 'Ł','è', 'é', 'ê', 'ë', 'ę', 'ě','ğ','ì', 'í', 'î', 'ï', 'ı','ĺ', 'ľ', 'ł','Ñ', 'Ń', 'Ň','Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ő','Ŕ', 'Ř','Ś', 'Ş', 'Š','ñ', 'ń', 'ň','ò', 'ó', 'ô', 'ö', 'ø', 'ő','ŕ', 'ř','ś', 'ş', 'š','Ţ', 'Ť','Ù', 'Ú', 'Û', 'Ų', 'Ü', 'Ů', 'Ű','Ý', 'ß', 'Ź', 'Ż', 'Ž','ţ', 'ť','ù', 'ú', 'û', 'ų', 'ü', 'ů', 'ű','ý', 'ÿ','ź', 'ż', 'ž','А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р','а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'р','С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я','с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я');

$rempl = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'A', 'A','C', 'C', 'C', 'CE','D', 'D','a', 'a', 'a', 'a', 'a', 'a', 'ae', 'a', 'a','c', 'c', 'c', 'ce','d', 'd','E', 'E', 'E', 'E', 'E', 'E','G','I', 'I', 'I', 'I', 'I','L', 'L', 'L','e', 'e', 'e', 'e', 'e', 'e','g','i', 'i', 'i', 'i', 'i','l', 'l', 'l','N', 'N', 'N','O', 'O', 'O', 'O', 'O', 'O', 'O','R', 'R','S', 'S', 'S','n', 'n', 'n','o', 'o', 'o', 'o', 'o', 'o','r', 'r','s', 's', 's','T', 'T','U', 'U', 'U', 'U', 'U', 'U', 'U','Y', 'Y','Z', 'Z', 'Z','t', 't','u', 'u', 'u', 'u', 'u', 'u', 'u','y', 'y','z', 'z', 'z','A', 'B', 'B', 'r', 'A', 'E', 'E', 'X', '3', 'N', 'N', 'K', 'N', 'M', 'H', 'O', 'N', 'P','a', 'b', 'b', 'r', 'a', 'e', 'e', 'x', '3', 'n', 'n', 'k', 'n', 'm', 'h', 'o', 'p','C', 'T', 'Y', 'O', 'X', 'U', 'u', 'W', 'W', 'b', 'b', 'b', 'E', 'O', 'R','c', 't', 'y', 'o', 'x', 'u', 'u', 'w', 'w', 'b', 'b', 'b', 'e', 'o', 'r');
// Remplacer les caractères accentués.
$variable = str_replace($cible, $rempl,$variable);
// Supprime les occurences successives du tiret.
$variable = preg_replace('#-{2,}#','-',$variable);
// Supprimer le dernier tiret de la chaîne.
$variable = substr($variable,0,strlen($variable)-1);
// Uniquement alphanumérique et tiret.
$variable = preg_replace('#[^a-z0-9-]+#i', '-',$variable);

Vérifier si un fichier existe

if (file_exists("$nom_fichier.pdf")) {
echo "Le fichier existe.";
} else {
echo "Le fichier n'existe pas.";
}

Passage de variable avec GET

echo "<center><a href=\"?delete=OUI\" target=\"_self\">Supprimer l'archive pour créer une nouvelle version avec le contenu actuellement en ligne sur la page</a>.</center>";
Ajouter un code de vérification qui exploite le retourne de la valeur GET.

Lister les fichiers pdf d'un dossier

$liste = glob('*.pdf');
 foreach ($liste as $document) {
 echo "<br/><a href=\"$document\" target=\"_$document\">$document</a>.";
 $taille = filesize($document);
 }

Convertir le poids d'un fichier en Octet vers une unité adaptée au poids total du fichier

// Convertir la taille du fichier en Octet vers la bonne unitée adaptée au poids total du fichier.    
 if ($taille < 1000) // octet
 {
  echo "$taille Octets";
 }
 else 
 {
     if ($taille < 1000000) // ko
     {
     $ko = round($taille/1024,2);
     echo "$ko Kilos";
     }
     else // Mo ou Go 
     {
       if ($taille < 1000000000) // Mo 
         {
         $mo = round($taille/(1024*1024),2);
         echo "$mo Mégas";
         }
         else // Go 
         {
         $go = round($taille/(1024*1024*1024),2);
         echo "$go Gigas";
         }
     }
 }

Récupérer une adresse mail dans une chaîne de caractères

A tester.
$pattern = '#[a-z0-9]+([._-]?[a-z0-9])*@[a-z0-9]+([.-]?[a-z0-9])*\.[a-z]{2,4}#i';
 $result = preg_match_all( $pattern, $source, $matches );
 echo '<pre>';
 print_r($matches);
 echo '</pre>';

Définir le code HTTP dans le header d'une page avec PHP

<?php
header("HTTP/1.1 403 Forbidden");
?>

Envoyer un mail avec PHPMailer

La classe PHP qui permet d'envoyer des mails s'appelle PHPMailer :
https://github.com/PHPMailer/PHPMailer

Envoyer une alerte mail à l'administrateur suite à une erreur 403

# Ajouter ce script dans le code PHP de la page erreur 403.
# Un mail distant est envoyé à l'administrateur.
# Un fichier de log local est également renseigné.
<?php
$headers ='From: "Visionduweb"<contacter@visionduweb.fr>'."\n";
$headers .='Reply-To: contacter@visionduweb.fr'."\n";
$headers .='Content-Type: text/html; charset="utf8"'."\n";
$headers .='Content-Transfer-Encoding: 8bit';

$message ='<html><head><title>Erreur 403</title></head><body>Alerte du script 403-forbidden.php pour prévenir d\'une erreur 403 sur www.visionduweb.fr

'; $message .='Heure : '.date("d/m/Y H:i").'
'; $message .='Page concernée : '.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].'
'; $message .='Page précédente (Si vide, la connexion est directe - Sinon un lien a été cliqué.) : '.$_SERVER['HTTP_REFERER'].'
'; $message .='Adresse IP du visiteur : '.$_SERVER['REMOTE_ADDR'].'
'; $message .='User agent : '.$_SERVER['HTTP_USER_AGENT'].'
'; $message .='</body></html>'; if(mail('contacter@visionduweb.fr', 'Erreur 403', $message, $headers)) { shell_exec ('sudo | echo "ERREUR 403 le `date +%d-%m-%y` à `date +%H:%M` - Le mail a été envoyé. ACTION RÉUSSIE." >> 403-forbidden-alerte.log'); } else { shell_exec ('sudo | echo "ERREUR 403 le `date +%d-%m-%y` à `date +%H:%M` - Le mail a été envoyé. ACTION EN ERREUR." >> 403-forbidden-alerte.log'); } ?>

Exécuter des commandes Shell depuis un script PHP

Créer un dossier avec PHP et Shell

# créer le fichier php qui va contenir le script Shell.
nano DossierShellPHP.php
# Ajouter les lignes suivantes dans le fichier.
<?php
shell_exec ('mkdir CreerUnDossier');
?>
# Lancer le script PHP va créer le dossier.
php DossierShellPHP.php

Récupérer et afficher le résultat d'une commande Shell exécutée par un script PHP

<?php
$CommandeShell = shell_exec ('ls -al');
echo "$CommandeShell";
?>

Fonctions PHP

fileperms(fichier.php)

La fonction fileperms(fichier.php) permet d'afficher les permissions appliquées au fichier.
<?php
echo fileperms("test.txt");
?>
# Affiche une sortie du type :
33206
 <?php
echo substr(sprintf("%o",fileperms("test.txt")),-4);
?>
# Affiche une sortie du type :
1777 
Source : https://www.w3schools.com/php/func_filesystem_fileperms.asp

Trouver l'age d'une personne à partir de sa date de naissance

function trouver_age($date)
{
 $d = strtotime($date);
 return (int) ((time() - $d) / 3600 / 24 / 365.242);
}

Programmation objet

Cache serveur HTML en PHP

 Source : http://www.darma.fr/code-source/optimisation-du-code-serveur/cache-serveur-html-php.php

DOMDocument

Récupérer le titre d'une page

libxml_use_internal_errors(true);
$doc = new DOMDocument();
$doc->loadHTMLFile($URL);
libxml_clear_errors();
$title = $doc->getElementsByTagName('title')->item(0);
$titre = $title->nodeValue;

Récupérer le contenu de balises avec Xpath

Quelques notes : https://buzut.fr/extraire-des-informations-du-dom-en-php
Xpath cheatsheet : https://devhints.io/xpath

Exemple 1

$new = new DOMDocument();
 @$new->loadHtml("$resultat");
 $xpath = new DOMXPath($new);
 //$domExemple = $xpath->query("//ul/li");
 //$domExemple = $xpath->query("//ul/li[@class='toclevel-1 tocsection-1']");
 //$domExemple = $xpath->query("//span[@class='tocnumber'] | //span[@class='toctext']");
 $toctext = $xpath->query("//span[@class='toctext']");
 $tocnumber = $xpath->query("//span[@class='tocnumber']");

 $i = 0;
 foreach ($toctext as $text) {
 $result[$i++] = $text->nodeValue;

 echo "$text->nodeValue";
 }

Exemple 2

Exemple 2, à tester.
Au lieu d'afficher les résultats de deux requêtes dans deux colonnes d'un tableau, on peut faire trois boucles pour afficher le résultat sur une seule ligne.
$queryXPath1 = '//div[@class="title"]'; //NOM
 $queryXPath2 = '//div[@class="price"]'; //PRIX
 
 $Liste_url = array('MAPAGE.html');
 
 foreach ($Liste_url as $url) 
 {
 $dom = new DOMDocument();
 @$dom->loadHTMLFile($url);
 $x = new DOMXPath($dom);
 
 //NOM
 $nodeList = $x->query($queryXPath1);
 $NOM=array();
 foreach ($nodeList as $node)
 {
 array_push($NOM, utf8_decode(urldecode($node->nodeValue.'</br></br>')));
 }
 
 //PRIX
 $nodeList = $x->query($queryXPath2);
 $PRIX =array();
 foreach ($nodeList as $node)
 {
 array_push( $PRIX , utf8_decode(urldecode($node->nodeValue.'</br></br>')));
 }
 }	
 
 /* traitements effectués, on passe a la présentation des données:*/
 for ($i=0; $i < (count($NOM)); $i++ )
 {
    echo $NOM[$i]." ".$PRIX[$i]."<br />";
 }

cURL

Récupérer le HTML d'une page

$wikipediaURL = "$URL";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $wikipediaURL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Vision du web (www.visionduweb.eu)');
$resultat = curl_exec ($ch);
curl_close($ch);

Regex

Motifs

^ correspond au début d'une ligne (juste avant le premier caractère)
$ correspond à la fin d'une ligne (juste après le dernier caractère)
. correspond à n'importe quel caractère unique
* correspond à aucune ou plusieurs occurrences du caractère qui précède
[ ] correspond à n'importe lequel des caractères cités entre les crochets
& prend la valeur du contenu du fichier avant modif = contenu fichier traité
Exemples de motifs :
/./ Récupère toutes les lignes contenant au moins un caractère.
/../ Récupère toutes les lignes contenant au moins deux caractères.
/^#/ Récupère toutes les lignes commençant par un #.
/^$/ Récupère toutes les lignes vides.
/}$/ Récupère toutes les lignes finissant par un }.
/} *$/ Récupère toutes les lignes finissant par un } suivi ou non d'espaces.
/[abc]/ Récupère toutes les lignes contenant un des caractères a, b ou c.
/^[abc]/ Récupère toutes les lignes commençant soit par un a, soit un b, soit un c.
Exemples : http://www.expreg.com/lire-Chaines-source

Exporter une page en PDF

Librairie

Librairie Dompdf

La librairie sur Github : https://github.com/dompdf/dompdf
On ne peut pas l'utiliser sur un hébergement mutualisé puisqu'il faut être en mesure d'installer ce programme sur le serveur.

Exemple pour exporter une page du wiki avec la librairie Dompdf

<?php
require_once 'extensions/dompdf/autoload.inc.php';
require_once 'extensions/dompdf/lib/html5lib/Parser.php';
require_once 'extensions/dompdf/lib/php-font-lib/src/FontLib/Autoloader.php';
require_once 'extensions/dompdf/lib/php-svg-lib/src/autoload.php';
require_once 'extensions/dompdf/src/Autoloader.php';
Dompdf\Autoloader::register();

// Récupérer la page courante du wiki
echo ($_SERVER["HTTP_REFERER"]);
$page = file_get_contents($_SERVER["HTTP_REFERER"]);

// Reference the Dompdf namespace
use Dompdf\Dompdf;

// Instantiate and use the dompdf class
$dompdf = new Dompdf();

// Modifier le code de la page HTML pour passer les URL des images en absolu.
$pasok=str_replace("/wiki/images", "https://www.visionduweb.eu/wiki/images","$page");

// Les images ne sont tout de même pas affichées et semblent rester en relatif.
$dompdf->loadHtml($pasok);

// (Optional) Setup the paper size and orientation
$dompdf->setPaper('A4', 'landscape');

// Render the HTML as PDF
$dompdf->render();

// Output the generated PDF to Browser
$dompdf->stream();
?>

Les images ne sont pas affichées avec un lien relatif

Deux alternatives à tester :
Utiliser un chemin absolu avec GNU/Linux.
<img src="/home/vagrant/projects/www/my-app/assets/images/logo.png">
Utiliser un chemin relatif à l'application avec un framework.
<img src="<?php echo APPPATH.'path-to-your-image.png'; ?>">

Librairie Pdflib

Source : http://www.pdflib.com/products/pdflib-family/
Il faut pouvoir l'installer sur le serveur PHP, ce qui n'est pas possible en mutualisé.

Librairie fpdf

# FPDF est une bibliothèque de fonctions permettant de manipuler des PDF.
# Elle permet de générer des PDF en le composant en utilisant les méthodes de la classe.
Peut être utilisée sur un hébergement mutualisé.
Source : http://www.fpdf.org

Librairie fpdi

FPDI is a collection of PHP classes facilitating developers to read pages from existing PDF documents and use them as templates in FPDF.
Source : https://packagist.org/packages/setasign/fpdi

Librairie TCPDF

Source : https://tcpdf.org
Cette librairie est très complète et génère un rendu vraiment propre.
Elle peut être utilisée sur un hébergement mutualisé.
Ce script me permet de proposer le téléchargement du sommaire de chaque page Mediawiki.
Voir à récupérer uniquement la page de mediawiki.
Voir à forcer le téléchargement.
Voir à intégrer les CSS.

Exporter le PDF vers un fichier

$pdf_string = $pdf->Output('wiki-tutoriel.pdf', 'S');
file_put_contents('./pdf/wiki-tutoriel.pdf', $pdf_string);
Source complémentaire : https://stackoverflow.com/questions/12304553/tcpdf-save-file-to-folder

Exemple de création de PDF

Exemple pour exporter le sommaire d'une page Mediawiki : Exporter le sommaire de Mediawiki sur une page PHP.

Librairie Html2pdf

Source : https://html2pdf.fr
Fonctionne bien pour les pages simples, mais pas pour les pages élaborées contenant des tableaux.
Exemples de réalisations : http://creersonsiteweb.net/page-php-convertir-page-web-html-en-pdf

Librairie Wkhtmltopdf

Source : https://wkhtmltopdf.org
Outil en ligne de commande open source (LGPLv3) pour convertir du HTML en PDF et divers formats d'image en utilisant le moteur de rendu Qt WebKit.
Exemple pour partager un classeur excel via le réseau : http://excel.engalere.com/question/147-partager-classeur-excel-reseau

Librairie Zend Pdf

Source : https://docs.roguewave.com
Source : https://framework.zend.com/manual/1.12/en/zend.pdf.html
Ce composant fait partie du Zend Framework. Il faut être à l'aise en programmation orientée objet.

API

API HTML 2 PDF Rocket

Source : https://www.html2pdfrocket.com
Always Free
$0 / Month
200 credits
5mb per PDF file
Create API Key.
// Créer la clé API depuis le site https://www.html2pdfrocket.com
$apikey = 'KEY';
$value = "https://www.google.com"; // a url starting with http or an HTML string.  see example #5 if you have a long HTML string
$result = file_get_contents("https://api.html2pdfrocket.com/pdf?apikey=" . urlencode($apikey) . "&value=" . urlencode($value));
file_put_contents('mypdf.pdf',$result);
Le taux de réussite pour la création de PDF est d'environ 70%, lors de la création de PDF provenant des pages de Mediawiki. Certaines pages ne sont pas générées.

API Mediawiki

API Mediawiki.

API Pdflayer

https://pdflayer.com
Un rendu propre des pages.
Les images de Mediawiki sont intégrées.
Un index est créé et permet de naviguer dans le PDF.
Les vidéos ne sont pas affichées en capture dans le PDF.
Les liens internes de Mediawiki ne sont pas réécrits avec le domaine. (Demander au support.)
Les contenus des liens de provenance ayant un accent ne sont pas générés. Enlever les accents des pages pour éviter ce problème. Un mail est envoyé au support dans ce sens.

API Pdfcrowd

L'API est payante mais les PDF peuvent également être créés en ligne depuis leur site web.
Source : https://pdfcrowd.com/doc/api/html-to-pdf/php/

API Phptopdf

Site officiel : http://phptopdf.com
Télécharger : http://phptopdf.com/api/download
S'enregistrer pour obtenir une clé API : http://phptopdf.com/signup/
30 Tokens sont offerts pour générer 30 fichiers PDF.
Le fichier n'est pas généré avec l'URL d'une page Mediawiki.
Sinon, cette API semble bien fonctionner.

PHP et la gestion des flux vidéos

La bibliothèque ffmpeg-php, bien que tout a fait fonctionnel, n'est plus maintenu.
Il y a une nouvelle bibliothèque PHP qui permet de manipuler les vidéos et qui permet de lancer les encodages depuis php.
Cette bibliothèque s'appelle php ffmpeg et est maintenu par SensioLabs, l'équipe qui est derrière Symfony.

Maintenir son code PHP

Outils pour les développeurs.

Créer une API avec PHP

Définition d'une API

Une API (Application programming interface) est une interface de programmation.
C'est une manière indirecte d'accéder à des données ou à une application externe.

Choisir un style d'architecture

Deux architectures pour les API du web :
SOAP est basé sur XML et comporte des structures standardisées de requêtes et réponses.
REST (Representational State Transfer.) avec une approche plus ouverte qui fournit de nombreuses conventions mais permet une grande liberté de décision au concepteur.

Documentations sur des API existantes

Facebook : https://developers.facebook.com/docs/graph-api/overview
Facebook : https://developers.facebook.com/docs/graph-api/using-graph-api?utm_source=zapier.com&utm_medium=referral&utm_campaign=zapier
Instagram : https://www.instagram.com/developer/endpoints/?utm_source=zapier.com&utm_medium=referral&utm_campaign=zapier
Marvel : https://developer.marvel.com
Twitter : https://developer.twitter.com/en/docs?utm_source=zapier.com&utm_medium=referral&utm_campaign=zapier
Twitter : https://developer.twitter.com/en/docs/tweets/post-and-engage/api-reference/post-favorites-create?utm_source=zapier.com&utm_medium=referral&utm_campaign=zapier

Sécurité

Faille include

Source : https://www.funinformatique.com/faille-include-comment-lexploiter-et-sen-proteger/

Bibliographie

Installer PHP.
 Cours PHP Accéléré - Version 0.9.1 - Gérard Rozsavolgyi - Septembre 18, 2017 : https://www.univ-orleans.fr/iut-orleans/informatique/intra/tuto/php/FastPHP.pdf
 Les bonnes pratiques PHP : https://blog.linagora.com/les-bonnes-pratiques-php/

Déployer du PHP avec Ansible

 Tutoriel : https://www.grafikart.fr/formations/deploiement-ansible-ansistrano/installation

Statistiques

Statistiques de performances : https://servebolt.com/articles/wordpress-5-0-php-7-2-vs-php-7-3-performance-and-speed-benchmark/

Scripts PHP

PHP sources : https://phpsources.net

NAVIGATION

PARTICIPER ET PARTAGER

Bienvenue sur le wiki de Amis SH.
De nombreuses pages sont partagées sur ce wiki.
Créer un compte utilisateur pour participer sur le wiki.
Les pages présentées sur le wiki évoluent tous les jours.
Certaines recherches sont peu abouties et incluent des erreurs.
Utiliser la recherche interne du wiki pour trouver votre contenu.
La page de discussion de Amis SH vous permet de poser vos questions.
Consulter le site amis-sh.fr pour installer votre propre serveur web.
Améliorer le contenu des pages avec vos retours depuis l'onglet discussion.
Ce contenu ne doit pas servir à nuire à autrui ou à un système informatique.
Protéger votre système Linux ou Windows avec cette page dédiée à la sécurité.

SOUTENIR CE WIKI

Soutenir le wiki avec un don en monnaie numérique :
AEON - Bitcoins - Bitcoins Cash - Bitcoins Gold - Bitcore - Blackcoins - Basic Attention Token - Bytecoins - Clams - Dash - Monero - Dogecoins - Ğ1 - Ethereum - Ethereum Classique - Litecoins - Potcoins - Solarcoins - Zcash

OBTENIR DE LA MONNAIE NUMERIQUE

Obtenir gratuitement de la monnaie numérique :
Miner de la cryptomonnaie.