Changer la date de modification et de dernier accès d’un fichier

Source : http://fr.php.net/manual/fr/function.touch.php

bool touch ( string filename [, int time [, int atime]] )

touch() tente de forcer la date de modification du fichier désigné par le paramètre filename à la date de spécifiée par le paramètre time. Si time est omis, c’est l’heure courante qui est utilisée. Si le troisième paramètre time est fourni, il est utilisé comme date de dernier accès. Notez bien que la date de dernier accès est modifiée, quelque soit le nombre de paramètres.

Si le fichier n’existe pas, PHP tente de le créer. Cette fonction retourne TRUE en cas de succès, FALSE en cas d’échec.

AVERTISSEMENT : Il n’est pour le moment pas possible de changer la date de modification d’un dossier avec cette fonction sous Windows.

Exemple avec touch() :

<?php
if ( touch($NomDeFichier) ) {
echo "La date de modification de $NomDeFichier a été fixée à maintenant";
} else {
echo "Désolé, il est impossible de changer la date de modification de $NomDeFichier";
}
?>

Crypter (un mot de passe…)

Différentes méthodes : crypt() ; sha1() ; md5()

md5() est considérée la moins sûre et crypt() la plus sûre.

Syntaxe de crypt() :
crypt('chaine_a_crypter','clé');

La « clé » (ou « salt », « sel ») permet :

  1. d’obtenir chaque fois la même chaine de caractères résultante
  2. d’éviter les caractères spéciaux (autres que chiffres ou lettres)

Texte défilant

voir ou générer un script sur www.editeurjavascript.com

Attention : le script brut de sortie peut être à nettoyer  ! (vérifier quotes, syntaxe, balises…)

un exemple du code généré :


<style type="text/css">
.ejs_scroll {
font-size:11px;
font-family:Verdana;
color:#000000;
text-decoration:none
}
</syle>

<script type="text/javascript">

/*
SCRIPT EDITE SUR L'EDITEUR JAVASCRIPT
http://www.editeurjavascript.com
*/

ejs_scroll_largeur = 400;
ejs_scroll_hauteur = 200;
ejs_scroll_bgcolor = '#FFFFFF';
/* Mettre ici le chemin de l'image de fond */
ejs_scroll_background = "";
/* Mettre ici le temps en secondes */
ejs_scroll_pause_seconde = 5;

ejs_scroll_message = new Array;

ejs_scroll_message[0]='<a class="ejs_scroll" href="http://www.fb-graphic.com">Lien vers un site</a>'
ejs_scroll_message[1]='<a class="ejs_scroll" href="http://www.fb-graphic.fr">Un autre site</a>';
function d(texte)
{
document.write(texte);
}

d('<div id="ejs_scroll_relativ" style="position:relative;width:'+ejs_scroll_largeur+';height:'+ejs_scroll_hauteur+';background-color:'+ejs_scroll_bgcolor+';background-image:url('+ejs_scroll_background+'">');
d('<div id="ejs_scroll_cadre" style="position:absolute;width:'+(ejs_scroll_largeur-8)+';height:'+(ejs_scroll_hauteur-8)+';top:4;left:4;clip:rect(0 '+(ejs_scroll_largeur-8)+' '+(ejs_scroll_hauteur-8)+' 0)">');
d('<div id="ejs_scroller_1" class="ejs_scroll" style="position: absolute; left: 0pt; top: 0pt;">'+ejs_scroll_message[0]+'</div>');
d('<div id="ejs_scroller_2" class="ejs_scroll" style="position: absolute; left: 0pt;">'+ejs_scroll_message[1]+'</div>');
d('</div></div>');

ejs_scroll_mode =1;
ejs_scroll_actuel = 0;

function ejs_scroll_start()
{
if(ejs_scroll_mode == 1)
{
ejs_scroller_haut = "ejs_scroller_1";
ejs_scroller_bas = "ejs_scroller_2";
ejs_scroll_mode = 0;
}
else
{
ejs_scroller_bas = "ejs_scroller_1";
ejs_scroller_haut = "ejs_scroller_2";
ejs_scroll_mode = 1;
}
ejs_scroll_nb_message = ejs_scroll_message.length-1;
if(ejs_scroll_actuel == ejs_scroll_nb_message)
ejs_scroll_suivant = 0;
else
ejs_scroll_suivant = ejs_scroll_actuel+1;
if(document.getElementById)
document.getElementById(ejs_scroller_bas).innerHTML = ejs_scroll_message[ejs_scroll_suivant];
ejs_scroll_top = 0;
if(document.getElementById)
setTimeout("ejs_scroll_action()",ejs_scroll_pause_seconde*1000)
}

function ejs_scroll_action()
{
ejs_scroll_top -= 1;
document.getElementById(ejs_scroller_haut).style.top = ejs_scroll_top;
document.getElementById(ejs_scroller_bas).style.top = ejs_scroll_top+ejs_scroll_hauteur;
if((ejs_scroll_top+ejs_scroll_hauteur) > 0)
setTimeout("ejs_scroll_action()",10)
else
ejs_scroll_stop()
}

function ejs_scroll_stop()
{
ejs_scroll_actuel = ejs_scroll_suivant;
ejs_scroll_start()
}

window.onload = ejs_scroll_start;
</script>

Les listes

L’affichage par défaut des listes et lignes de listes peut varier d’un navigateur à l’autre – il faut toujours tester et stabiliser avec des margin et padding explicites :

  • une marge (margin) par défaut est créée dans IE.
  • une marge intérieure (padding) par défaut est créée dans les navigateurs « sains ».

Réécriture d’url – variables

références : httpd.apache.org – v. aussi https://craym.eu/tutoriels/…

Création et utilisation de « références » (autrement dit, des variables, réutilisables dans le code htaccess) (v. httpd.apache.org) :
En utilisant des parenthèses dans les lignes de condition (RewriteCond) ou de règle de réécriture (RewriteRule), on crée des références qui peuvent être résumées et rappelées par %N ou $N (« N » représentant le rang de la variable, dans l’ordre de création de ces variables).

%N : variables issues des lignes conditionnelles
$N : variables issues des lignes de règles de réécriture

Ex. :

RewriteEngine On
RewriteCond %{HTTP_HOST} !fb-graphic.com [NC]
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ http://www.fb-graphic.com/$1?domaine=%1 [L]

traduction :

  • si l’hôte n’est pas fb-graphic.com
  • et si l’hôte commence par www.
  • on réécrit www.exemple.tld(/x) en
    http://www.fb-graphic.com/(x)?domaine=exemple.tld

Réécriture d’url – départ

références :
www.webmaster-hub.com
www.magneto.be
https://craym.eu/tutoriels/…

On commence toujours le htaccess de réécriture d’url par le code suivant (cf. références) :

Options +FollowSymlinks
RewriteEngine on

On écrit éventuellement une ou plusieurs lignes de conditions de redirection sous la forme :

RewriteCond %{HTTP_HOST} !www.fb-graphic.com [OR]
RewriteCond %{QUERY_STRING} !^123456$ [NC]

([OR] et [NC] sont des exemples de « flags »)

On écrit la règle de réécriture sous la forme :

RewriteRule ^(.*)\.htm$ $1.php [L]

la première partie (^(.*)\.htm$) représente ce qui doit être réécrit ; elle peut utiliser les expressions régulières et des variables
^ signifie « début de la chaîne obligatoirement »
$ signifie « fin de la chaîne obligatoirement »
la deuxième partie ($1.php) indique la forme de réécriture souhaitée ; elle peut utiliser des variables
$1 représente une variable

Pour une régle sans réécriture d’url, on utilise le signe -.
Exemple : RewriteRule \.(gif|jpg|png)$ - [F,L]

Réécriture d’url – flags (drapeaux)

références :
www.webmaster-hub.com
httpd.apache.org

[L] Celui-ci vous semble familier, comme nous l’avons vu dans notre précédent exemple. Il mérite toutefois une précision. Lorsque le module de réécriture est actif, les règles sont lues séquentiellement et l’URL est comparée ligne à ligne avec le premier argument de celles-ci jusqu’à la dernière.
Si une réécriture est effectuée, c’est la forme réécrite qui sera utilisée en entrée pour les règles suivantes.
Le flag [L] permet de sortir prématurément de la boucle.
[R]
[R=code]
Dans ces deux formes une redirection est effectuée.
Si l’argument code n’est pas précisé, une redirection 302 (déplacé temporairement) est effectuée. Si vous souhaitez faire savoir au navigateur/robot qu’une page a été remplacée définitivement, utiliser le code 301 comme dans :
RewriteRule ^ancien\.html$ http://domaine.tld/nouveau.html [R=301,L]
Dans ce cas précis, une réécriture « externe » s’impose (utilisation de http://…)
[F] Forbidden – interdit. Retourne un code 403, par exemple :
RewriteRule ^secret.html$ – [F]
[NC] NoCase, ou « insensible à la casse ». La règle suivante :
RewriteRule ^script\.php$ programme.php [NC,L]
S’appliquera aussi bien à script .php, SCRIPT.PHP ou ScRiPt .PhP
[G] Gone.
Cette page n’existe plus et retourne une entête http 410
[N] Force l’analyse et l’exécution de toutes les règles en repartant du début de la liste. Ici encore, comme expliqué plus haut ([L]), c’est l’URL modifiée après exécution de la dernière règle qui est utilisée en entrée, et non l’URL originelle. Attention aux boucles infinies !
[C] Chain, chaînage avec la ou les règles suivantes jusqu’à la première règle ne se terminant pas par [C]
Apache interprète ce flag comme suit : s’il y a réécriture (la règle est vérifiée), la règle suivante est exécutée avec la chaîne réécrite en entrée.
Si la règle ne se vérifie pas, toutes les règles qui suivent jusqu’à la première ne comportant pas le flag [C] ne sont pas appliquées.
[QSA] Query String Append. Rajoute le QUERY_STRING à la fin de l’expression, après la réécriture. À réserver pour la dernière règle de réécriture. Utilisée le plus souvent avec le flag [L], comme dans [QSA,L]

Réécriture d’url – manipuler les QUERY_STRING

QUERY_STRING = paramètres d’url

Avec le flag [QSA] on indique à la règle de réécriture qu’elle doit ajouter en fin d’url (et, le cas échéant, à la suite des paramètres existants dans la réécriture, avec « & ») les paramètres de l’url d’origine (avant réécriture).
Sans drapeau [QSA], le QUERY_STRING demandé par la réécriture remplace automatiquement celui d’origine, sinon, celui d’origine est automatiquement ajouté (si l’url réécrite n’en demande pas un nouveau donc) (ceci dépend peut-être des réglages de serveur).
Pour forcer la disparition de tout QUERY_STRING, il suffit de faire terminer la réécriture par un point d’interrogation et ne pas mentionner [QSA].

Exemples :

RewriteRule ^.* http://www.fb-graphic.com/trouve.php [QSA,L]
=> Une page cherche.php?objet=stylo deviendra http://www.fb-graphic.com/trouve.php?objet=stylo

RewriteRule ^.* http://www.fb-graphic.com/trouve.php?trousse [QSA,L]
=> Une page cherche.php?objet=stylo deviendra http://www.fb-graphic.com/trouve.php?trousse&objet=stylo

RewriteRule ^.* http://www.fb-graphic.com/trouve.php?trousse [L]
=> Une page cherche.php?objet=stylo deviendra http://www.fb-graphic.com/trouve.php?trousse

RewriteRule ^.* http://www.fb-graphic.com/trouve.php? [L]
=> Une page cherche.php?objet=stylo » deviendra http://www.fb-graphic.com/trouve.php

Créer un cookie pour un domaine différent

Un cookie n’est valide et lisible que pour l’hôte (domaine) qui l’a créé.

L’utilisation d’une chaîne optionnelle « domain » dans setcookie en php (v. fr.php.net/manual) ou dans document.cookie (JavaScript) n’est pas probante voire est totalement impossible.

Une solution consiste à appeler une page du domaine ciblé (B) dans une page html du domaine initial (A) dans un <object>, la page appelée contenant le script de création de cookie. Ce cookie sera automatiquement attaché au domaine B.

Si la page appelée doit être masquée dans la page « mère », on peut appliquer à l’<object> des dimensions h. et l. et des marges négatives de mêmes valeurs. Un simple style display:none rend inopérant le script dans certains navigateurs (Google Chrome) et l’idée de masquer <object> en le plaçant simplement dans le header n’est pas valable dans tous les navigateurs.

Outils – validateurs, testeurs

Les validateurs du W3C :

validation htmlvalidation css

Testeurs divers en ligne :

CSS – tester la typo courante : http://typetester.maratz.com/
Accessibilité : http://validateur-accessibilite.apinc.org/

Tester les sites sur les anciens navigateurs :

Pour utiliser plusieurs versions d’Internet Explorer en même temps :

http://www.my-debugbar.com/wiki/IETester/HomePage

Archives de navigateurs :

http://www.oldversion.com/
http://browsers.evolt.org/
http://sillydog.org/narchive/
http://mac.oldapps.com/browsers.php

Vous pouvez trouver quelques-unes des principales archives des navigateurs les plus courants dans ce répertoire : http://www.fb-graphic.com/-archives/navigateurs/

E-mail avec pièce jointe

d’après www.phpcs.com/codes/ENVOI-MAIL-AVEC-PIECE-JOINTE_26501.aspx (+ exemple d’envoi de 2 pièces-jointes) :

<?php

// function mail_attachement($to , $sujet , $message , $fichier , $typemime , $nom , $reply , $from){
$to = "destinataire@domaine.tld";
$sujet = "test envoi pj";
$message = "un test";
$fichier = "test.jpg";
$typemime = "image/jpeg";
$nom = "test.jpg";
$reply = "expediteur@domaine.tld";
$from = "expediteur@domaine.tld";

$limite = "_parties_".md5(uniqid (rand()));

$mail_mime = "Date: ".date("l j F Y, G:i")."\n";
$mail_mime .= "MIME-Version: 1.0\n";
$mail_mime .= "Content-Type: multipart/mixed;\n";
$mail_mime .= " boundary=\"----=$limite\"\n\n";

// Le message en texte simple pour les navigateurs qui n acceptent pas le HTML
$texte = "This is a multi-part message in MIME format.\n";
$texte .= "Ceci est un message est au format MIME.\n";
$texte .= "------=$limite\n";
$texte .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
$texte .= "Content-Transfer-Encoding: 7bit\n\n";
$texte .= $message;
$texte .= "\n\n";

// le fichier
$attachement = "------=$limite\n";
$attachement .= "Content-Type: $typemime; name=\"$nom\"\n";
$attachement .= "Content-Transfer-Encoding: base64\n";
$attachement .= "Content-Disposition: attachment; filename=\"$nom\"\n\n";

$fd = fopen( $fichier, "r" );
$contenu = fread( $fd, filesize( $fichier ) );
fclose( $fd );
$attachement .= chunk_split(base64_encode($contenu));

$attachement .= "\n\n\n------=$limite\n";
// return mail($to, $sujet, $texte.$attachement, "Reply-to: $reply\nFrom: $from\n".$mail_mime);
mail($to, $sujet, $texte.$attachement, "Reply-to: $reply\nFrom: $from\n".$mail_mime);
// }

?>

Récupérer url et ses paramètres

Récupérer url et paramètres passés dans l’url (REQUEST_URI, QUERY_STRING…)

Pour récupérer l’url de la page :<?php echo $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; ?>
<?php echo $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']; ?>

Pour récupérer la chaîne de caractères (valeurs de variables…) passés dans l’url après le  » ? » : $_SERVER['QUERY_STRING'] :

exemple :

<?php
if ( ($_SERVER['QUERY_STRING']) == '' ) {
// si l'url ne contient aucun parametre (donnees apres un point d'interrogation),
// on fait une redirection :
header('Location: index.php?rubrique1');
}
?>

Redirection

<?php
if ( ($_SERVER['QUERY_STRING']) == '' ) {
// si l'url ne contient aucun parametre (donnees apres un point d'interrogation),
// on fait une redirection :
header('Location: index.php?rubrique1');
}
?>

La commande pour rediriger une url est simplement :

header('Location: chemin_souhaite')

header() doit être appelée avant que le moindre contenu ne soit envoyé, soit par des lignes HTML habituelles dans le fichier, soit par des affichages PHP.

Internet Explorer 6 : patch IE7 de Dean Edwards

Corrections apportées à IE 6 et IE 5.5 par ce patch :

  • transparence des images PNG
  • box model
  • positionnement fixe d’éléments
  • directives Mini et Maxi
  • marges automatiques
  • sélecteurs avancés, pseudo-classes avancés

voir aussi :

http://www.christopher-jablonski.com/fr/reperes/
https://sourceforge.net/
http://dean.edwards.name/IE7/install.html
http://dean.edwards.name/IE7/usage/
http://www.estvideo.com/

Notes importantes à propos de la transparence PNG

Le patch de Dean Edwards agit uniquement :

  • sur les images se terminant par « -trans.png »
  • sur les images dont la hauteur et la largeur sont mentionnées !

boîtes flottantes (propriété « float »)

Voir un modèle de boîtes flottantes.

Remarques :

  • « Quand vous définissez pour un élément une mention sur float (cours du texte) vous devez définir aussi une mention sur width (Largeur) » – dixit selfhtml
    note : « width » peut être réglé sur « auto ».
  • Pour que le bloc contenant les boites flottantes englobe graphiquement (vérifier avec une bordure par ex.) tout son contenu :
    • il suffit qu’un objet quelconque avec la propriété clear: both vienne à la suite des blocs flottants dans le même bloc contenant
    • ou que le bloc contenant ait la propriété overflow: hidden

    il est utile de lui attribuer la propriété overflow: hidden;.

clear (suite pour le cours du texte)

Avec clear : on peut interrompre le cours du texte pour en forcer la poursuite sous l’élément/le passage entouré. Les données suivantes sont possibles :

clear: left impose pour float: left la poursuite en dessous.
clear: right impose pour float: right la poursuite en dessous.
clear: both impose dans chaque cas la poursuite dessous.
clear: none n’impose pas de poursuite dessous. (réglage normal).

Un exemple

le css :

#conteneur {
	padding: 5px;
	background: #F8F8F8;
	border: 1px solid #666666;
	width: 380px;
	overflow: hidden; /* étend la hauteur du bloc pour contenir tous les blocs flottants */
}
.float {
	width: auto; /* mention width indispensable si mention float présente */
	background: #FFFFFF;
	border: 1px solid #000000;
	float: left;
	padding: 5px;
	margin: 2px;
}

le html :

<div id="conteneur">
	<div class="float">bloc flottant</div>
	<div class="float">bloc flottant</div>
	<div class="float">bloc flottant</div>
	<div class="float">bloc flottant</div>
	<div class="float">bloc flottant</div>
	<div class="float">bloc flottant</div>
	<div class="float">bloc flottant</div>
</div>

À propos du mode « quirks »

référence : http://www.w3.org/International/

« Les navigateurs grand public actuels peuvent afficher un fichier HTML soit en mode « standard » soit en mode « quirks ». Cela signifie que des règles d’affichage différentes seront appliquées au fichier, la première se conformant à une interprétation du comportement attendu conforme aux standards du w3C, la seconde se conformant à d’autres attentes basées sur le comportement non standard des anciens navigateurs. […] »

Centrer verticalement un élément

C’est LA galère du CSS (lorsqu’on cherche à appliquer le centrage vertical sur des objets de hauteur variable).

voir l’article d’Alsacreations sur le sujet

Le plus intéressant est parfois de se résoudre à recourir à une cellule de tableau pour centrer verticalement un élément – parfois d’ailleurs la seule façon d’obtenir exactement le résultat voulu :

<table>
<tr><td style="vertical-align:middle"><img src="image.jpg"></td></tr>
</table>

Internet Explorer 6 : PNG 24 bits (transparents)

On peut utiliser la méthode avec filter + AlphaImageLoader :

objet {
filter:progid:DXImageTransform.Microsoft.AlphaImageLoader([Enabled], sizingMethod, src)
}

avec pour sizingMethod la valeur scale (l’image s’étire pour couvrir la surface de l’objet) ou crop (dimension originale fixe)

références :

http://msdn.microsoft.com/en-us/library/ms532969(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms532920(VS.85).aspx

Autres méthode pour les PNG-24 ici : sur le blog de la blonde.

Transparence

un article : http://css-tricks.com/css-transparency-settings-for-all-broswers/

div.transparent {
	opacity: 0.5;
	filter:alpha(opacity=50);
	-moz-opacity:0.5;
	-khtml-opacity: 0.5;
}

opacity : 0.5; est la norme CSS
filter:alpha(opacity=50); est spécifique à IE
-moz-opacity : 0.5; pour les navigateurs « Mozilla » anciens (Netscape…)
-khtml-opacity : 0.5; pour les navigateurs « khtml » anciens (Safari 1.x…)

Le contenu d’un bloc transparent devient normalement lui aussi transparent.

Restriction d’accès

rappel : pour être reconnus les fichiers doivent être téléchargés en mode ascii !

Syntaxe du fichier .htaccess (v. Selfhtml, phpdebutant…) :

Digest :

# fichier .htaccess pour le répertoire prive

AuthType Basic
AuthName "espace prive"
AuthUserFile /usr/local/etc./htdocs/www/lesite/prive/.htpasswd
AuthGroupFile /usr/local/etc./htdocs/www/lesite/prive/.htgroups
require user  Audrey Christian Antoine
require group techniciens

note à propos du chemin réel sur le serveur (décrit à AuthUserFile et AuthGroupFile) :

il est possible de connaître ce chemin à l’aide de php. Il suffit de créer un fichier php avec le code <?php echo realpath("index.php"); ?> (s’il n’y a pas de fichier index.php dans le répertoire de ce fichier, indiquer un fichier existant ou encore ce fichier lui-même).

Pour limiter la protection (cf. Selfhtml) :

# Fichier .htaccess pour le répertoire prive

AuthType Basic
AuthName "espace-Service"
AuthUserFile /usr/local/etc/httpd/htdocs/www.lesite.com/prive/.htpasswd
AuthGroupFile /usr/local/etc/httpd/htdocs/www.lesite.com/prive/.htpasswd.htgroups

<Files *.htm>
require user  Audrey Christian Antoine
require group techniciens
</Files>

selfhtml : « Dans le repère d’ouverture, derrière la parenthèse pointue d’ouverture, peut figurer soit Files, comme dans l’exemple ci-dessus, soit Limit. Derrière, vous pouvez faire uniquement une mention restrictive. Avec *.htm comme dans l’exemple, vous limitez la protection aux fichiers HTML. Avec une mention comme secret.htm ce seul et unique fichier serait protégé. Avec Limit vous pouvez limiter la méthode d’accès par exemple à GET ou bien à POST. »

Syntaxe du fichier .htpassword :

# Fichier d'utilisateurs pour le repertoire "prive"

Audrey:INGoUvP4QNWNM
Michel:INw2mPEH.owe2
Christelle:INt4TUI7dOlQ6
Fanny:IN0w9l5E2Rltw
Norbert:INP0Mscg62Cbg
Diane:INbi/z9y/ogns
Christine:INmkm1zgB8qGk
Gaspard:INeRD/cUQIFP6
Christian:INL8hI.TVvsds
Antoine:INEyrT70PYPlo

Les mots de passe sont cryptés.
Attention : Free n’autorise pas le cryptage des mots de passe.

Syntaxe du fichier .htgroups :

# Fichier de groupe pour le repertoire "prive"

techniciens: Gaspard Diane Christelle