Trucs et astuces PHP (I)

• Comment afficher l'heure courante au format français* ?
• Comment connaître la taille d'un fichier situé sur un autre serveur ?
• Comment trouver une chaîne de caractères dans un fichier ?
• Comment activer et désactiver tous les messages d'erreur PHP ?
• Comment convertir une date Mysql au format français ?
• Comment calculer une date dans le futur ou le passé* ?
• Comment insérer une image dans Mysql ?
• Comment afficher dynamiquement les dimensions d'une image ?
• Comment afficher un montant au format monétaire français ?
• Comment récupérer le contenu de plusieurs cases à cocher ?
• Comment récupérer l'extension d'un fichier ?
• Comment connaitre à coup sûr le type d'un fichier sur UNIX* ?
• Comment mettre des données en cache pendant l'exécution d'un script* ?
• Comment retrouver l'url absolue de la page courante ?
• Comment alterner les couleurs des lignes d'un tableau HTML ?
• Comment afficher la coloration syntaxique d'une page PHP ?
• Comment supprimer les retours à la ligne d'une chaîne ?
• Comment afficher les retours à la ligne d'une chaîne en HTML ?
• Comment récupérer du contenu sur un site* ?
• Comment couper une chaine trop longue dans un forum ou un livre d'or ?

L'astérisque (*) signale une solution dépendante de la configuration du serveur.

 

Comment afficher l'heure courante au format français* ?

<?
setlocale("LC_TIME", "fr");
echo ucwords(strftime("%A %d %B %Y"));
?>
Affiche :
Samedi 20 Juillet 2002

 

Comment connaître la taille d'un fichier situé sur un autre serveur ?

<?
$fichier = join($fichier,file("http://www.site.com/index.php3"));
echo "La taille du fichier est de : ".strlen($fichier)." caractères";
?>

Affiche : La taille du fichier est de : 18405 caractères

 

Comment trouver une chaîne de caractères dans un fichier ?

<?
$fichier = join($fichier,file("index.php3"));
if(eregi("php",$fichier))
   echo "La chaîne a été trouvée";
else
   echo "La chaîne n'a pas été trouvée";
?>

Comment activer et désactiver tous les messages d'erreur PHP ?

Placez la directive error_reporting fixée à 0 avant tout autre code PHP. C'est une précaution utile une fois l'application terminée et prête à être livrée car les messages d'erreur PHP peuvent fournir des indications précieuses aux pirates. Placez la valeur à 15 pendant le développement pour controler que toutes les variables sont correctement initialisées.
<? error_reporting(0) ?>

Comment convertir une date Mysql au format français ?

<?
$date = "2000-12-31";
echo date("d/m/Y",strtotime($date));
?>

Affiche : 31/12/2000

 

Comment calculer une date dans le futur ou le passé ?

<?
setlocale("LC_TIME", "fr");
echo "Demain nous serons le 
".ucwords(strftime("%A %d %B %Y",mktime(0,0,0,date("m"),date("d")+1,date("Y"))))."
"; echo "Hier nous étions le ".ucwords(strftime("%A %d %B %Y",mktime(0,0,0,date("m"),date("d")-1,date("Y"))))."
"; echo "Le mois dernier nous étions le ".ucwords(strftime("%A %d %B %Y",mktime(0,0,0,date("m")-1,date("d"),date("Y"))))."
"; echo "Le mois prochain nous serons le ".ucwords(strftime("%A %d %B %Y",mktime(0,0,0,date("m")+1,date("d"),date("Y"))))."
"; echo "L'an dernier à la même époque nous étions le ".ucwords(strftime("%A %d %B %Y",mktime(0,0,0,date("m"),date("d"),date("Y")-1)))."
"; echo "L'an prochain à la même époque nous serons le ".ucwords(strftime("%A %d %B %Y",mktime(0,0,0,date("m"),date("d"),date("Y")+1)))."
"; ?>

Affiche :
Demain nous serons le Dimanche 21 Juillet 2002
Hier nous étions le Vendredi 19 Juillet 2002
Le mois dernier nous étions le Jeudi 20 Juin 2002
Le mois prochain nous serons le Mardi 20 Août 2002
L'an dernier à la même époque nous étions le Vendredi 20 Juillet 2001
L'an prochain à la même époque nous serons le Dimanche 20 Juillet 2003

 

Comment insérer une image dans Mysql ?


Soit une table "test" créée avec ces instructions (remarquer le champ de type BLOB devant contenir les données) :

# Structure de la table test

CREATE TABLE test (
   num_img int(10) unsigned DEFAULT '0' NOT NULL auto_increment,
   data_img blob NOT NULL,
   PRIMARY KEY (num_img),
   KEY num_img (num_img)
);

Le code suivant place les données binaires de l'image dans une variable (ici $data) et les sauvegarde dans le champ BLOB "data_img" puis les envoie au navigateur. Le type MIME est ici "image/jpeg", mais il est possible d'envoyer n'importe quel type de fichier (document PDF, Word...), pour forcer par exemple un téléchargement disponible uniquement d'après certaines conditions (inscription, paiement en ligne...).

<?
mysql_connect("localhost","","");
mysql_select_db("le_nom_de_votre_base");
$img = "image.jpg";
$fp = fopen($img,"r");
$data = fread($fp,filesize($img));
fclose($fp);
$data = addslashes($data);
mysql_query("INSERT INTO test (data_img) VALUES ('$data')"); 
//lecture des données
$result = mysql_query("SELECT data_img FROM test LIMIT 1");
header("Content-Type:image/jpeg");
$row = mysql_fetch_array($result);
echo $row["data_img"];
?>

Comment afficher dynamiquement les dimensions d'une image ?


<?
$size = getimagesize("image.jpg");
?>
<img src="image.jpg" <? echo $size[3] ?>>
<?
$size = getimagesize("http://www.site.com/image.jpg"); ?> <img src="http://www.site.com/image.jpg" <? echo $size[3] ?>>

 

Comment afficher un montant au format monétaire français ?


<?
echo number_format(1000000,2,","," ")." d'euros"
?>

Affiche : 1 000 000,00 d'euros

 

Comment récupérer le contenu de plusieurs cases à cocher ?


Pour récupérer les données d'un nombre indéterminé de champs de formulaire portant le même nom, ajoutez [] au nom de ces champs :

<form name="form1" action="formres.php">
    <input type="checkbox" name="tab[]" value="1">
    <input type="checkbox" name="tab[]" value="2">
    <input type="checkbox" name="tab[]" value="3">
    <input type="submit" name="Submit" value="Envoyer">
 </form>

La page fictive "formres.php", cible du formulaire, contiendra un tableau $tab indexé numériquement.
Exemples de parcours de tableau :

<?
while (list(, $v) = each ($tab)) {
   echo $v."<br>";
}
reset($tab);
foreach ($tab as $v) {
   echo $v."<br>";
}
?>

Affiche :
1
2
3
si les 3 cases ont été cochées.

 

Comment récupérer l'extension d'un fichier ?


<?
echo strrchr("image.jpg",".");
?>

Affiche : .jpg

 

Comment connaitre à coup sûr le type d'un fichier sur UNIX* ?

En exécutant la commande native Unix "file nom_fichier" qui renvoie des informations sur le fichier spécifié. En effet, le type MIME d'un fichier uploadé est fourni par le client web, ce qui constitue un trou de sécurité facile à contourner pour un pirate.
<?
if(is_uploaded_file($userfile)) {
   if(!ereg("text",exec(escapeshellcmd("file $userfile")))) {
      unlink($userfile);
      echo "Désolé, seuls les fichiers texte sont autorisés !";
   } else {
   move_uploaded_file($userfile, "/upload");
}
?>

 

Comment mettre des données en cache pendant l'éxécution d'un script* ?


Normalement readfile() affiche intégralement le contenu du fichier lu. Cet exemple filtre les données pour n'en récupérer que la partie qui nous intéresse avant de l'afficher :

<?
function get_meteo ($sortie) {
if (eregi("<!--debut meteo -->(.*)<!--fin meteo -->", $sortie, $meteo))
return "<pre>".strip_tags($meteo[0])."</pre>";
}
ob_start("get_meteo");
readfile("http://www.site.com/meteo.php?ville=Perpignan");
ob_end_flush(); ?>

 

Comment retrouver l'url absolue de la page courante* ?


<?
echo "http://".$SERVER_NAME.$PHP_SELF;
?>

 

Comment alterner les couleurs des lignes d'un tableau HTML ?


<?
mysql_connect("localhost","",""); mysql_select_db("le_nom_de_votre_base"); $result = mysql_query("SELECT * FROM test"); $bgcoul = array("#B9B9FF", "#9999FF"); $i=0; echo "<table>"; while($i<mysql_num_rows($result)) { $row = mysql_fetch_object ($result); echo "<tr bgcolor=".$bgcoul[$i%2]."><td>".$row->nom."</td></tr>"; $i++; } echo "</table>"; ?>

 

Comment afficher la coloration syntaxique d'une page PHP ?


Cette fonction est à utiliser avec précautions, le contenu du fichier pouvant révéler des informations critiques comme les mots de passe d'accès aux bases de données...

<?
highlight_file("script.php");
?>

Affiche :

<?
$bgcoul 
0;
echo 
"<table>";
while(
$row mysql_fetch_array($result)) {
   
$bgcoul = !$bgcoul;
   
$bgcoul "#B9B9FF" "#9999FF";
   echo 
"<tr bgcolor=".$bgcoul."><td>".$row["nom"]."</td></tr>";
}
echo 
"</table>";
?>

 

Comment supprimer les retours à la ligne d'une chaîne ?


A appliquer avant toute comparaison de chaîne provenant d'un fichier. Chaque ligne d'un fichier contenant un caractère invisible de fin en plus (représenté par "\n" ou "\r"), la comparaison d'une ligne avec une autre chaîne échouera systématiquement si ce caractère n'est pas supprimé.

Soit un fichier texte contenant ces lignes :

php
asp
jsp
html

Le code php suivant affichera :

<?
$fp = fopen("mots_cle.txt","r");
while(!feof($fp)) {
   if(chop(fgets($fp,4096)) == "php") {
      echo "La chaîne 'php' a été trouvée";
      break;
   }   
}
fclose($fp);
?>

 

Comment afficher les retours à la ligne d'une chaîne en HTML ?


<?
$paragraphe = "ligne1\nligne2\nligne3\n";
echo nl2br($paragraphe);
?>

Affiche :
ligne1
ligne2
ligne3

 

Comment récupérer du contenu sur un site* ?


<?
function get_meteo ($sortie) {
if (eregi("<!--debut meteo -->(.*)<!--fin meteo -->", $sortie, $meteo))
return "<pre>".strip_tags($meteo[0])."</pre>";
}
ob_start("get_meteo");
readfile("http://www.site.com/meteo.php?ville=Perpignan");
ob_end_flush(); ?>

Récupère les données de la météo délimitées par les commentaires <!--debut meteo --> et <!--fin meteo --> sur un site et les affiche sur le votre. Attention au copyright !

 

Comment couper une chaine trop longue dans un forum ou un livre d'or ?


<?
$mot = "Merciiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii !";
$mot = wordwrap( $mot, 30, "<br>", 1);
echo $mot;
?>

Affiche :
Merciiiiiiiiiiiiiiiiiiiiiiiiii
iiiiiiiiiiiiiiiiiiii !