1. Préambule

2. Généralités

3. Installation

4. Apprentissage

5. PHP : Nombres

6. PHP : Chaines

7. PHP : Tableaux

8. PHP : Variables

9. PHP : Classes

10. PHP : Constantes

11. PHP : Fonctions

12. PHP : Dates

13. PHP : Fichiers

14. PHP : Réseau

15. PHP : Cookies

16. PHP : Sessions

17. PHP : Math

18. PHP : Mail

19. PHP : Regex

20. PHP : Database

21. PHP : Divers

22. PHP : Erreurs

23. PHP : Sécurité

24. Formulaires

25. Outils et solutions

26. Scripts et applications

27. Remerciements


1. Préambule

Contenu de cette section

1.1 Présentation

Cette FAQ (Foire Aux Questions ou Frequently Asked Questions) traite de PHP.

Elle a pour but de répondre aux interrogations d'ordre général, mais aussi aux problèmes que peuvent poser l'installation, l'apprentissage et la programmation de ce langage.

1.2 Rédaction

L'ensemble du document a été rédigé et mis en page à l'aide de phpFAQTory. Cet outil permet de simplifier la rédaction et la maintenance d'un document de type FAQ, HOW-TO, ou de tout autre document articulé autour d'une logique : Index, Chapitre, Question / Réponse.

Basé sur PHP et MySQL, phpFAQTory est librement disponible sous licence GPL sur le site PHPIndex (http://archives.phpindex.com/projets/projets_presentation.php3?n=2).

Une version de démonstration est visible sur http://phpfaqtory.phpindex.com (login : guest / password : guest).

1.3 Distribution

Il n'existe qu'un seul site officiel de distribution de ce document : le site PHPIndex (http://archives.phpindex.com). C'est le seul site sur lequel vous êtes certain de trouver la dernière version de ce document.

1.4 Formats

Ce document est disponible en plusieurs formats :

- HTML Simple : une page unique
- HTML Multiple : index + une page par chapitre
- XML

Une version de cette FAQ dans ces différents formats est disponible sur PHPIndex (http://archives.phpindex.com/faq/)

D'autres formats sont susceptibles de voir le jour ultérieurement.

1.5 Améliorations

Si vous souhaitez améliorer ce document en y ajoutant de nouveaux chapitres, de nouvelles questions/réponses ou tout simplement me faire part de corrections, merci de m'envoyer vos suggestions par email (webmaster@phpindex.com).

1.6 Remarques

Quelques remarques concernant PHP et ce document :

- On ne le répétera jamais assez, PHP est un langage de script coté serveur. A ce titre, ne cherchez pas l'utiliser dans le cadre de traitements pour lesquels il n'est pas fait, en particulier coté client. Par exemple, récupérer la résolution écran d'un internaute venant visiter votre site. PHP n'est pas fait pour cela.

- Le langage PHP est souvent associé à MySQL (SGBDR) et à Apache (serveur HTTP). Ceci n'est pas une obligation ou une règle stricte. Mais uniquement le reflet d'une certaine popularité des ces différentes solutions.

- Ce document ne détaille pas avec précision les étapes d'installation de PHP. Ceci volontairement et pour au moins 2 raisons :

• l'expérience montre que vouloir détailler les étapes d'installation de PHP ne permet pas de prendre en compte l'ensemble des cas de figures tant la disparité des systèmes est importante.

• il existe désormais des solutions (packages et autres assistants) permettant d'installer PHP, MySQL et Apache relativement facilement. Et ceci, tant sous Unix que sous Windows.

1.7 Licence

Toute reproduction ou représentation, intégrale ou partielle, par quelque procédé que ce soit, des pages publiées dans le présent document, faite sans le consentement de l'auteur, est illicite et constitue une contrefaçon.

Seules sont autorisées les copies prévues à l'article L.122-5 du Code de la Propriété Intellectuelle, ainsi que :

1. La redistribution et la représentation à des fins pédagogiques dans un cadre scolaire ou universitaire ;

2. La redistribution, à titre gracieux uniquement, sur le lieu de travail du copiste d'une version imprimée de l'oeuvre, sous réserve que soient clairement mentionnés le nom de l'auteur et l'URL de la version officielle du document. Toute exploitation contre rétribution est explicitement interdite.


2. Généralités

Contenu de cette section

2.1 Qu'est-ce que PHP

PHP est un langage de script. Ses nombreux atouts (code directement intégré aux pages HTML, richesse des fonctions, facilité de connexion à l'ensemble de SGBD du marché, etc.) en font une solution idéale pour le développement de sites Web dynamiques.
Mais il peut également servir de langage de script classique, à l'image de Perl, afin d'assurer tous type de traitement système, administratif, etc.
Pour finir, il est même possible d'utiliser PHP afin d'écrire des applications GUI classiques à l'aide de solutions comme PHP-GTK (http://gtk.php.net/).

2.2 Que veux dire PHP

A l'origine, PHP signifiait "Personal Home Page". Désormais, il désigne "PHP Hypertext Preprocessor", le premier P désignant lui même PHP. Il s'agit donc d'un acronyme récursif :)

2.3 Quelles sont les différences entre PHP/FI, PHP3, PHP4

PHP/FI (Personal Home Page / Form Interpreter) fût la première version officielle de PHP (tout est parti d'une librairie Perl à l'origine).

PHP3 résulte d'une réécriture complète de PHP/FI.

PHP3 et PHP/FI ne sont plus officiellement supportés. Néanmoins, ils persistent encore en particulier chez certains hébergeurs.

Quant à PHP4, il résulte à son tour d'une réécriture de PHP3 et utilise le moteur Zend. C'est la branche courante de PHP.

Documentation :

What's New in PHP 4: Overview
http://www.zend.com/zend/whats-new.php

Under The Hood of PHP 4
http://www.zend.com/zend/art/under-php4-hood.php

2.4 Sur quelle architecture puis-je faire tourner PHP

Principalement Unix et NT.
Dans la mesure ou Mac OSX repose sur un noyau BSD, il est également possible de le déployer sur ce système.

2.5 Qu'est ce qui le distingue des ASP

En premier lieu, PHP et les ASP sont très proches dans la philosophie et la mise en oeuvre (code directement intégré aux pages HTML).

Comparé à PHP3, les ASP se montrent parfois plus rapides et implémentent un concept très utile, celui des sessions. Les sessions ne sont pas supportées en natif par PHP3, même si de multiples solutions existent (PHPLib : http://phplib.netuse.de/).

Comparé à PHP4, ces différences s'estompent. Ce dernier gagne en rapidité et introduit à son tour le concept de sessions.

Notons aussi que les ASP sont largement inféodés au monde Win32, même si des solutions Unix existent (ChiliSoft : http://www.chilisoft.com/)

PHP quant à lui est disponible sous NT comme sous Unix.

Enfin, précisons que PHP dispose d'un plus grand nombre de fonctions, s'interface aisément avec des librairies et outils externes. En particulier, il est en mesure de s'interfacer, le plus souvent en natif, avec l'ensemble des SGBD standards du marché. Les ASP ne proposent qu'une approche ODBC, bien moins performante.

2.6 Qu'est ce qui le distingue de Perl

L'approche est différente. De plus Perl existe depuis beaucoup plus longtemps que PHP. Il en résulte une importante base de connaissance (scripts, librairies et modules, documentations, etc.). Perl a su s'imposer comme standard.

Dans le cadre d'un développement de site Web dynamique, PHP est certainement plus adapté. Le développement se montre généralement plus rapide et plus facile à maintenir. Alors qu'un script Perl (très mal ou au contraire très bien écrit) peut s'avérer délicat à faire évoluer par quelqu'un d'autre que son auteur.

Comparé à PHP3, Perl est parfois plus rapide pour certaines opérations (manipulation de select volumineux dans une base, par exemple).

Précisons enfin que PHP sait s'inspirer des bonnes choses du monde Perl. A ce titre, le projet PEAR (PEAR: PHP Extension and Add-on Repository) peut-être vue comme l'équivalent du CPAN du monde Perl.

2.7 Quels sont ses avantages

Richesse des fonctions, facilité d'interconnexion avec les principaux SGBD du marché, syntaxe simple (proche du C), support des sessions, etc.

2.8 Quels sont ses inconvénients

Sans doute le fait qu'il ne s'agisse que d'un langage interprété offrant parfois des temps de réponse discutables.
Mais dans l'ensemble PHP s'en sort bien. Et les améliorations au fur et à mesure des versions sont notables.

A ce titre, PHP4 offre des temps de réponses bien meilleurs. De plus, il peut être couplé à des solutions diverses permettant d'améliorer encore plus les performances (optimiseur, cache, etc.)

Optimiser :

Zend Optimizer
http://www.zend.com/store/products/zend-optimizer.php

Cache :

Zend Cache
http://www.zend.com/store/products/zend-cache.php
AfterBURNER*Cache
http://bwcache.bware.it/cache.htm
APC Alternative PHP Cache
http://apc.communityconnect.com/
phpCache
http://0x00.org/php/phpCache/

2.9 Puis-je faire tourner mes scripts PHP3 avec PHP4

Oui. Quelques différences existent, mais elles sont infimes et ne devraient pas perturber vos scripts si vous choisissez de passer de PHP3 à PHP4.


3. Installation

Contenu de cette section

3.1 Où se procurer PHP

Sur le site officiel de PHP (http://www.php.net) ou auprès de l'un des nombreux miroirs comme celui de l'Université Michel de Montaigne BORDEAUX III (http://fr.php.net) ou de Nexen (http://fr2.php.net).

3.2 Comment installer PHP sous Windows

Consulter la documentation :
http://www.php.net/manual/fr/install-windows.php

3.3 Comment installer PHP sous Linux

Consulter la documentation :
http://www.php.net/manual/fr/install.linux.php

3.4 Comment installer PHP sous Mac OSX

Consulter la documentation :
http://www.php.net/manual/fr/install.macosx.php

3.5 Comment vérifier l'installation de PHP

Un bon réflexe consiste à faire à tester le script suivant :

<?php
phpinfo()
?>
Gardez ce script dans un coin, le résultat retourné par la fonction phpinfo() vous servira régulièrement.

3.6 Est-il possible de faire cohabiter PHP3 et PHP/FI

Oui ! Mais la chose n'a que peu d'intérêt...

3.7 Est-il possible de faire cohabiter PHP3 et PHP4

Oui ! Et cette approche semble plus justifiée que de chercher à faire cohabiter PHP3 et PHP/FI.
Afin de faire cohabiter PHP3 et PHP4, plusieurs méthodes existent.

Une première méthode consiste à compiler l'un des deux en qualité de module d'apache (par exemple PHP3) et l'autre en CGI.

Pensez à modifier le fichier de configuration d'Apache, en ajoutant les bons AddType. Exemple,

# PHP4 en CGI
AddType application/x-httpd-php .php
Action application/x-httpd-php /cgi-bin/php4.cgi
# PHP3 en Module
AddType application/x-httpd-php3 .php3

Une seconde méthode consiste à compiler l'un et l'autre en versioning. Plus d'info sur :

http://www.php.net/manual/cs/html/migration.html#migration.php4.with-php3

3.8 Où se trouve le fichier php.ini

A la base, ce fichier se prénomme php3.ini-dist avec PHP3 (respectivement php.ini-dist avec PHP4) et se trouve avec les sources de PHP.
A l'issue de la compilation, une fois édité et modifié, il faut le renommer en php3.ini avec PHP3 (respectivement php.ini avec PHP4), puis le placer sous /usr/local/lib afin qu'il soit pris en compte.
Le répertoire /usr/local/lib est le chemin par défaut.

3.9 Comment modifier le chemin par défaut du fichier php.ini

Par défaut, le php.ini se trouve sous le répertoire /usr/local/lib. Mais il est possible de préciser un chemin lors de la compilation (./configure) en précisant l'option --with-config-file-path=/path

Plus d'info sur :
http://archives.phpindex.com/articles/articles_lire.php3?element=7

3.10 Est-il possible d'installer PHP avec IIS

Oui.
Consulter la documentation :
http://www.php.net/manual/fr/install.iis.php

3.11 Est-il possible d'installer PHP avec PWS

Oui.
Consulter la documentation :
http://www.php.net/manual/fr/install.iis.php

3.12 Est-il possible d'installer PHP avec Xitami

Oui.
Consulter la documentation :
http://www.php.net/manual/fr/install.xitami.php

3.13 Est-il possible d'installer PHP avec Netscape Enterprise Server

Oui.
Consulter la documentation :
http://www.php.net/manual/fr/install.netscape-enterprise.php

3.14 Est-il possible d'installer PHP avec OmniHttpD

Oui.
Consulter la documentation :
http://www.php.net/manual/fr/install.omnihttpd.php

3.15 Comment enlever X-Powered-By: PHP/4.0.0 Content-type: text/html

Ce problème apparaît avec certaines version Win32 de PHP4. Supportant MySQL en natif, il faut commenter la ligne mysql_php.dll dans le fichier php.ini (mettre un ; devant mysql_php.dll).

3.16 Existe t-il des packages d'installation sous Windows

Oui. Et ils sont nombreux et de qualité variable.
On peut citer en particulier :

- EasyPHP : http://www.manucorp.com/
- QuickPHP : http://quickphp.online.fr/
- PHP EasyWindows Installer : http://php.weblogs.com/easywindows/
- PHPTriad : http://sourceforge.net/projects/phptriad/

3.17 Existe t-il des packages d'installation sous Linux

Oui. On peut citer en particulier LinuxEasyInstaller (http://www.phpmylinux.net/index.php3?rub=lei)

Notez aussi que la plupart des distributions Linux disposent de packages d'installation de PHP (Mandrake, Red Hat ou encore Debian).

3.18 Puis-je voir la liste complète des options de configuration de PHP

Oui, encore et toujours dans la documentation :
http://www.php.net/manual/fr/install.configure.php

3.19 Puis-je retrouver l'ensemble des options de compilation de la version de PHP que j'utilise

Oui. Un simple phpinfo() permet de retrouver les options de compilation de la version de PHP en cours.

3.20 Que désigne les terminologies suivantes : Module Statique, Module Dynamique, CGI

Elles correspondent à différents types d'installation de PHP avec Apache.
En module statique (--with-apache), PHP est compilé avec Apache. Le binaire Apache résultant d'une telle compilation "embarque" le module PHP.
En module dynamique (--with-apxs), PHP est compilé avec Apache, mais constitue un module indépendant.
Enfin, en CGI (--without-apache), PHP est compilé en marge d'Apache. On parle aussi de mode "stand alone".

3.21 Que choisir : Module Statique, Module Dynamique, CGI

Si vous optez pour une compilation de PHP en module statique (--with-apache), attendez-vous à obtenir un binaire Apache assez volumineux. PHP sera directement embarqué dans ce binaire. De plus, ce type de configuration sera plus complexe à maintenir et faire évoluer. En effet, si vous décidez de mettre à jour votre version de PHP, il faudra également recompiler Apache.

A l'inverse, avec une compilation de PHP en module dynamique (--with-apxs), vous gagnez en souplesse. Seul PHP devra être recompilé afin de basculer d'une version à une autre, ou afin d'embarquer de nouvelles librairies. Et ceci, indépendamment d'Apache.

Le mode CGI (--without-apache) est certainement le plus lourd. De plus, il impose certaines restriction (comme l'absence du support des mécanismes d'identification/authentification HTTP).


4. Apprentissage

Contenu de cette section

4.1 Où trouver de la documentation officielle

Sur le site officiel de PHP (http://www.php.net) ou auprès de l'un des nombreux miroirs comme celui de l'Université Michel de Montaigne BORDEAUX III (http://fr.php.net) ou de Nexen (http://fr2.php.net).

4.2 Où trouver des sites traitant de PHP

Oui. Et ils sont nombreux.
Des listes de sites sont maintenues sur :

- http://www.php.net/links.php
- http://archives.phpindex.com/annuaire/annuaire_index.php3
- http://dmoz.org/Computers/Programming/Languages/PHP/
- http://directory.google.com/Top/Computers/Programming/Languages/PHP/

Quelques sites majeurs :

- PHP (http://www.php.net)
- Zend (http://www.zend.com)
- PHPBuilder (http://www.phpbuilder.com)

Pour les anglophobes, on peut en particulier citer :

- PHPInfo (http://www.phpinfo.net)
- Zone Suivante (http://www.zonesuivante.com)
- PHPIndex (http://archives.phpindex.com)

Ces sites rassemblent une foultitude de ressources PHP et permettent de pointer rapidement vers des tutoriaux, exemples et scripts.

4.3 Où trouver des tutoriaux traitant de PHP

Il existe quelques tutoriaux sur le Web. Les plus complets abordent le langage dans son ensemble. C'est en particulier le cas pour :

- Le tutorial de Leo West (http://lwest.free.fr/doc/php/tutorial.php3)
- Le tutorial de Christophe Lauer (http://www.linux-france.org/article/devl/php3/tut/php3_tut1.html)
- Le site phpDebutant (http://d2expert.free.fr/phpdebutant/)

4.4 Où trouver des exemples de scripts en PHP

La documention officielle de PHP en contient.
Il est également intéressant d'aller sur des sites comme :

Quelques sites majeurs :

- PHP (http://www.php.net)
- Zend (http://www.zend.com)
- PHPBuilder (http://www.phpbuilder.com)

Pour les anglophobes, on peut en particulier citer :

- PHPInfo.net (http://www.phpinfo.net)
- Zone Suivante (http://www.zonesuivante.com)
- PHPDebutant (http://d2expert.free.fr/phpdebutant/)
- PHPIndex (http://archives.phpindex.com)

Ces sites rassemblent une foultitude de ressources PHP et permettent de pointer rapidement vers des tutoriaux, exemples et scripts.

4.5 Existe t-il des ouvrages traitant de PHP

Oui. Et ils sont nombreux.
Des listes d'ouvrages sont maintenues sur :

- http://www.php.net/books.php
- http://archives.phpindex.com/annuaire/annuaire_partiel.php3?sous_categorie=700&categorie=700

Pour les anglophobes, on peut en particulier citer :

- "Programmation Web avec PHP", Eyrolles (218.50 F).
- "Programmation en PHP4", Campus Press (229 F).
- "Pages Web dynamiques avec ASP, PHP, SQL", Campus Press (135 F).
- "Vos premiers pas avec PHP 4", OEM (58 F).
- "Pratique de MySQL et PHP", O'Reilly (190 F).
- "PHP 4 Développement d'application Web", Campus Press (169 F).
- "L'intro PHP 4", Campuss Press (149 F).
- "PHP Professionnel", Eyrolles (349 F).
- "Grand Livre PHP4 & MySQL", Micro Application (209 F).

4.6 Existe t-il des newsgroups traitant de PHP

Oui.

En anglais :
On peut citer le alt.php et le alt.php.sql. Sans oublier également le serveur de news news.php.net.

En français :
On peut citer le fr.comp.infosystemes.www.auteurs.php
Et dans une moindre mesure, le fr.comp.applications.sgbd (dédié aux SGBD) et le fr.comp.infosystemes.www.serveurs (dédié aux serveur HTTP type Apache).


5. PHP : Nombres

Contenu de cette section

5.1 Comment convertir un nombre dans un autre type

Bien souvent, le plus simple est de faire un cast, comme en langage C.
Exemple :

<?php
$mon_double= 2.345678; 
echo $mon_double; 
echo "n"; 
echo (int)$mon_double; 
echo "n"; 
?>
L'autre solution consiste à utiliser la fonction settype().
Exemple :

<?php
$mon_double = 2.345678; 
echo $mon_double; 
echo "n"; 
settype ($mon_double, integer); 
echo $mon_double; 
echo "n"; 
?>
Le champ d'utilisation de cette fonction va bien plus loin, puisque d'une façon générale, elle permet de convertir n'importe quelle variable dans un autre type (integer en string, string en double, etc.).

Documentation :
http://www.php.net/manual/fr/function.settype.php

5.2 Comment convertir de binaire à décimal

Par les fonctions bindec() et decbin().
Exemple :

<?php
$nombred=123; 
echo decbin($nombred); 
echo "n"; 

$nombreb="1011"; 
echo bindec($nombreb); 
echo "n"; 
?>
Documentation :
http://www.php.net/manual/function.bindec.php
http://www.php.net/manual/function.decbin.php

5.3 Comment convertir d'hexadécimal à décimal

Par les fonctions hexdec() et dechex().
Exemple :

<?php
$nombred=123; 
echo dechex($nombred); 
echo "n"; 

$nombreh="20"; 
echo hexdec($nombreh); 
echo "n"; 
?>
Documentation :
http://www.php.net/manual/fr/function.hexdec.php
http://www.php.net/manual/fr/function.dechex.php

5.4 Comment formater l'affichage de mes nombres

A l'aide de la fonction number_format().

Exemple :

<?php
$pi=3.14159265358979323846;
echo number_format($pi, 2);
?>
Documentation :
http://www.php.net/manual/fr/function.number-format.php

5.5 Comment savoir si un nombre est pair ou impair

Il y a de nombreuses solutions afin de tester la parité d'un nombre.

En utilisant l'opérateur modulo,

<?php
...
if ($nombre % 2 == 0) 
echo "$nombre est un nombre pair"; 
else 
echo "$nombre est un nombre impair"; 
...
?>
En controlant le bit de poids faible,
<?php
...
if($nombre & 1) 
echo "$nombre est un nombre impair"; 
else 
echo "$nombre est un nombre pair"; 
...
?>

6. PHP : Chaines

Contenu de cette section

6.1 Comment connaître la taille d'une chaine

En utilisant la fonction strlen().
Exemple :

<?php
$chaine="bonjour"; 
echo strlen($chaine); 
?>
Documentation :
http://www.php.net/manual/fr/function.strlen.php

6.2 Comment concaténer deux chaines

Avec PHP3 (et versions ultérieures), en utilisant l'opérateur . (point).

Exemple :

<?php
$chaine1="bon"; 
$chaine2="jour"; 
echo $chaine1.$chaine2; 
?>
Avec PHP/FI, utiliser l'opérateur + (plus).

6.3 Comment remplacer une occurrence dans une chaine

En utilisant la fonction str_replace().

Exemple :

<?php
$chaine="tout est rouge"; 
$chaine=str_replace("rouge", "bleu", $chaine); 
echo $chaine; 
?>
Documentation :
http://www.php.net/manual/fr/function.str-replace.php

6.4 Comment convertir une chaine en majuscule ou minuscule

En utilisant les fonctions srttolower() et strtoupper().

Exemple :

<?php
$chaine="MiXeD CaSe"; 
$echo strtolower($chaine); 
$echo strtoupper($chaine); 
?>
Documentation :
http://www.php.net/manual/fr/function.strtolower.php
http://www.php.net/manual/fr/function.strtoupper.php

6.5 Comment forcer le premier caractère d'une chaine en majuscule

A l'aide de la fonction ucfirst().

Documentation :
http://www.php.net/manual/fr/function.ucfirst.php

6.6 Comment forcer le premier caractère de chaque mot d'une chaîne en majuscule

A l'aide de la fonction ucwords().

Documentation :
http://www.php.net/manual/fr/function.ucwords.php

6.7 Comment supprimer les espaces présents en début de chaine

En utilisant la fonction ltrim().

Exemple :

<?php
$chaine=" Ceci est un test", 
$echo $chaine; 
$echo ltrim($chaine); 
?>
Documentation :
http://www.php.net/manual/fr/function.ltrim.php

6.8 Comment supprimer les espaces présents en début et fin de chaine

En utilisant la fonction trim().

Exemple :

<?php
$chaine="    Ceci est un test   ", 
$echo $chaine; 
$echo trim($chaine); 
?>
Documentation :
http://www.php.net/manual/fr/function.trim.php

6.9 Comment supprimer les espaces présents en fin de chaine

En utilisant la fonction rtrim().

Exemple :

<?php
$chaine="Ceci est un test   ", 
$echo $chaine; 
$echo rtrim($chaine); 
?>
Documentation :
http://www.php.net/manual/fr/function.rtrim.php

6.10 Comment remplacer rapidement les \n en <br>

En utilisant la fonction nl2br().

Exemple :

<?php
$chaine="Ceci est un test\n", 
$echo $chaine; 
$echo nl2br($chaine); 
?>
Documentation :
http://www.php.net/manual/fr/function.nl2br.php

6.11 Comment découper une chaine en fonction d'un séparateur

En utilisant la fonction explode().

Exemple :

<?php
$chaine = "Nom|Prenom|Adresse"; 
$champs = explode ("|", $chaine); 

$boucle=0; 
while ($boucle < sizeof($champs)) { 
    echo $champs[$boucle]; 
    echo "n"; 
    $boucle++; 
} 
?>
Documentation :
http://www.php.net/manual/fr/function.explode.php

6.12 Comment remplacer un $ dans une chaine

A l'aide de la fonction str_replace(),

<?php
$chaine="je remplace le signe $ par autre chose"; 
$chaine=str_replace("$", "USD", $chaine); 
print $chaine; 
?>
Et si vous tenez absolument à utiliser les regex, la syntaxe doit être,

<?php
$chaine="je remplace le signe $ par autre chose"; 
$chaine= ereg_replace ("$","USD",$chaine); 
print $chaine; 
?>
Documentation :
http://www.php.net/manual/fr/function.str-replace.php
http://www.php.net/manual/fr/function.ereg-replace.php

6.13 Comment supprimer les tags HTML et PHP présents dans un chaine

A l'aide de la fonction strip_tags().

Documentation :
http://www.php.net/manual/fr/function.strip-tags.php

6.14 Comment supprimer les tags HTML et PHP présents dans un chaine à l'exception de certains

A l'aide de la fonction strip_tags() et en précisant les tags à préserver.

Exemple :

<?php
$chaine="<body><html><hr><b><i>Ceci est un exemple</i></b></html></body>";
$chaine= strip_tags($chaine,"<hr>,<i>");
print $chaine;
?>
Documentation :
http://www.php.net/manual/fr/function.strip-tags.php

6.15 Comment obtenir le code ASCII d'un caractère

A l'aide de la fonction ord().

Documentation :
http://www.php.net/manual/fr/function.ord.php

6.16 Comment afficher un caractère à partir de son code ASCII

A l'aide de la fonction chr().

Documentation :
http://www.php.net/manual/fr/function.chr.php

6.17 Comment afficher le n-ième caractère d'une chaine

Une chaine n'est rien d'autre qu'un tableau à une dimension. Le premier caractère est indicé 0 et le dernier (n-1) ou n est la longueur de la chaine (que l'on peut obtenir par la fonction strlen()).

Exemple :

<?php
$chaine = "Ceci est un test.";
echo $chaine[0];
// retournera C
echo $chaine[strlen($chaine)-1];
// retournera .
?>

6.18 Comment afficher les n premiers caractères d'une chaine

A l'aide de la fonction substr().

Exemple :

<?php
$chaine = "Ceci est un test.";
echo substr($chaine,0,4);
// retournea "Ceci"
?>
Documentation :
http://www.php.net/manual/fr/function.substr.php

6.19 Comment afficher les n derniers caractères d'une chaine

A l'aide de la fonction substr().

Exemple :

<?php
$chaine = "Ceci est un test.";
echo substr($chaine,-4);
// retournea "est."
?>
Documentation :
http://www.php.net/manual/fr/function.substr.php

6.20 Comment inverser une chaine

A l'aide de la fonction strrev().

Documentation :
http://www.php.net/manual/fr/function.strrev.php

6.21 Comment remplacer les caractères accentués d'une chaine par leurs équivalents non accentués

En utilisant la fonction strtr().

Exemple :

<?php
$chaine="père noël et oeufs de pâques";
echo strtr($chaine, "èëâ", "eea");
?>
Documentation :
http://www.php.net/manual/fr/function.strtr.php

6.22 Puis-je faire l'inverse d'un htmlentities

L'exemple suivant vous y aidera peut-être :

<?php
$chaine="<body><html><br><b>bonjour</b></html></body>";
echo "Phase 1 (avant htmlentities) : ".$chaine."\n";
$chaine=htmlentities($chaine);
echo "Phase 2 (apres htmlentities) : ".$chaine."\n";
$tmp = array_flip (get_html_translation_table (HTML_SPECIALCHARS));
$chaine = strtr($chaine,$tmp);
echo "Phase 3 : ".$chaine."\n";
?>

6.23 Comment compter le nombre d'occurrences d'une sous chaine dans une chaine

Avec PHP4, à l'aide de la fonction substr_count().

Exemple :

<?php
$chaine="Je ne lis pas la doc";
print substr_count($chaine, "e");
// retournera 2
?>
Documentation :
http://www.php.net/manual/fr/function.substr-count.php

6.24 Comment supprimer les \ (anti-slash) dans une chaine

A l'aide de la fonction stripslashes().

Documentation :
http://www.php.net/manual/fr/function.stripslashes.php

6.25 Est-il possible d'ajouter un retour à la ligne automatique tout les n caractères

Oui. Par exemple, à l'aide de la fonction wordwrap().

Exemple :

<?php
$chaine="Parfois il m'arrive de lire la doc, mais pas assez pour découvrir ce genre de fonction qui peut s'avérer vraiment utile";
echo wordwrap($chaine,20);
?>
Cet exemple retournera,

Parfois il m'arrive
de lire la doc, mais
pas assez pour
découvrir ce genre
de fonction qui peut
s'avérer vraiment
utile

Documentation :
http://www.php.net/manual/fr/function.wordwrap.php

6.26 Comment puis-je afficher plusieurs fois la même chaine

Les solutions sont multiples. Il est par exemple possible de boucler sur un echo ou un print.
Une autre méthode consiste à utiliser str_repeat(), si vous disposez de PHP4.

Exemple :

<?php
echo str_repeat("+-",20);
// Retournera : +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- 
?>
Documentation :
http://www.php.net/manual/fr/function.str-repeat.php

6.27 La fonction strpos ne semble pas fonctionner

La fonction strpos() pose depuis longtemps un problème en PHP.

Cette fonction, pourtant très utile, recherche une occurrence dans une chaine et retourne la position de cette première occurence si elle est trouvée. Dans le cas contraire, elle retourne false.

Problème : le premier élément d'une chaine (donc d'un tableau, car une chaine est un tableau...) étant indicé 0, cette fonction semble également retourner false si l'occurrence cherchée se trouve en tout début de chaine !

Il est donc délicat de distinguer le cas d'une occurrence n'ayant pas été trouvée, du cas ou l'occurrence se trouve en début de chaine.

Une solution consiste à tester finement la valeur retournée par strpos().

Si on affiche cette valeur, on constate qu'une occurrence non trouvée retourne une chaine vide et qu'une occurrence trouvée en début de chaine retourne 0. L'idée consiste donc à ne plus tester false, mais si la valeur retounée est un entier ou non.

Exemple :

<?php
        $chaine = "Demain il fera beau"; 
        $occurrence = Array("il", "elle", "Demain"); 

        while (list($element, $valeur) = each($occurrence)) { 
                print $valeur." : "; 
                $pos = strpos($chaine,$valeur); 
                print $pos." -> "; 
                if (is_int($pos)==false) 
                        print "J'ai pas trouvé"; 
                else 
                        print "J'ai trouvé"; 
                print "\n"; 
        } 
?>
Cet exemple retournera :

il : 7 -> J'ai trouvé
elle : -> J'ai pas trouvé
Demain : 0 -> J'ai trouvé

Documentation :
http://fr.php.net/manual/fr/function.strpos.php

7. PHP : Tableaux

Contenu de cette section

7.1 Puis-je manipuler des tableaux associatifs comme en Perl

Oui.

7.2 Comment obtenir le nombre d'éléments d'un tableau

En utilisant la fonction sizeof().

Documentation :
http://www.php.net/manual/fr/function.sizeof.php

7.3 Comment obtenir le nombre d'éléments d'un tableau multidimensionnel

Toujours avec sizeof().

Ce qu'il faut comprendre c'est que dans un tableau multidimensionnel, chaque élément est lui-même un tableau. Il suffit donc d'appliquer la fonction sizeof() à la dimension qui vous intéresse. Exemple :

echo sizeof($montableau[3]);

Documentation :
http://www.php.net/manual/fr/function.sizeof.php

7.4 Comment trier un tableau

A l'aide des fonction sort(), rsort(), asort() et arsort().

Exemple :

<?php
$fruits=array("citron","orange","banane","pomme"); 
sort($fruits); 
for(reset($fruits); strcmp($key=key($fruits), ""); next($fruits)) { 
echo "fruits[$key]=".$fruits[$key]."\n"; 
} 
?>
Documentation :
http://www.php.net/manual/fr/function.sort.php
http://www.php.net/manual/fr/function.asort.php
http://www.php.net/manual/fr/function.rsort.php
http://www.php.net/manual/fr/function.arsort.php

7.5 Comment supprimer les doublons dans un tableau

Tout dépend si vous utilisez PHP3 ou PHP4.

Avec PHP3, le code suivant pourra peut-être vous y aider :

<?php
$a=array("1","7","4","poire","7","0","poire","citron"); 
while(list($k,$v)=each($a)) $b[$v]++; 
while(list($k,$v)=each($b)) echo $k."\n"; 
?>
Avec PHP4, vous pouvez utiliser la fonction array_unique().

Documentation :
http://www.php.net/manual/fr/function.array-unique.php

7.6 Comment fusionner deux tableaux

Tout dépend si vous utilisez PHP3 ou PHP4.

Avec PHP3, la fonction suivante pourra peut-être vous y aider :

<?php
function uniqueArray($array) { 

for ($i=0,$n=count($array);$i<$n;$i++) 
$u_array[$array[$i]] = 1; 

reset($u_array); 
for ($i=0,$n=count($u_array);$i<$n;$i++) { 
$unduplicated_array[] = key($u_array); 
next($u_array); 
} 

return $unduplicated_array; 
} 
?>
Avec PHP4, vous pouvez utiliser la fonction array_merge().

Documentation :
http://www.php.net/manual/fr/function.array-merge.php

7.7 Comment retourner un tableau depuis une fonction

En utilisant return, tout simplement.

Exemple :

<?php
function test()
{
        $fruit=array("pomme", "poire", "cerise", "fraise");
        return $fruit;
}

$tableau=test();

while(list($key,$val)=each($tableau))
{
        echo $val;
        echo "\n";
}
?>

7.8 Comment inverser un tableau

Tout dépend si vous utilisez PHP3 ou PHP4.

Avec PHP3, la fonction suivante pourra peut-être vous y aider :

<?php
...
function reverseArray($in_array)
{
    $size = count($in_array);
    end($in_array)
    for ($i=0; $i<$size; ++$i)
    {
        $key = key($in_array);
        $out_array[$key] = $in_array[$key];
        prev($in_array);
    }

    return $out_array;
}
...
?>
Avec PHP4, vous pouvez utiliser la fonction array_reverse().

Documentation :
http://www.php.net/manual/fr/function.array-reverse.php

7.9 Comment dupliquer un tableau

Le plus simplement du monde. Il suffit de faire ainsi,

<?php
...
$fruit1=array("pomme", "poire", "cerise", "fraise");
$fruit2=$fruit1;
...
?>

7.10 Comment transformer un tableau en chaine

En utilisant la fonction implode().

Documentation :
http://www.php.net/manual/fr/function.implode.php

7.11 Est-il possible de passer un tableau en argument d'une script à un autre

Ce n'est pas possible directement. Par contre, il est possible de passer une chaine.
Une méthode consiste donc à utiliser les fonctions implode() et explode().
La fonction implode() permet de grouper dans une chaine, l'ensemble des éléments stockés dans un tableau en les séparant par un séparateur défini.
La fonction explode() effectue l'opération inverse et permet de reconstruire un tableau dont les éléments sont stockés dans une chaine, séparés par un séparateur défini.
Exemple :

<?php
$a=array("un", "deux", "trois"); 

$temp=implode("|", $a); 
echo "temp=".$temp."n"; 

$b=explode("|", $temp); 
while(list($k,$v)=each($b)) echo "b[$k]=".$v."n"; 
?>
Une approche similaire consiste à utiliser les fonctions serialize() et unserialize().
Exemple :

<?php
$a=array("un", "deux", "trois"); 

$temp=serialize($a); 
echo "temp=".$temp."n"; 

$b=unserialize($temp); 
while(list($k,$v)=each($b)) echo "b[$k]=".$v."n"; 
?>
Pour finir, il est toujours possible de passer les éléments un par un par les méthodes POST ou GET.
Exemple :

/path/to/monscript.php3?tableau[]=arg1&tableau[]=arg2&etc.

Documentation :
http://www.php.net/manual/fr/function.implode.php
http://www.php.net/manual/fr/function.explode.php
http://www.php.net/manual/fr/function.serialize.php
http://www.php.net/manual/fr/function.unserialize.php

7.12 Comment obtenir la plus grande valeur contenue dans un tableau

A l'aide de la fonction max().

Exemple :

<?php
$tableau=array("102","23","12","167","17");
echo max($tableau);
// Retournera : 167
?>
Documentation ;
http://www.php.net/manual/fr/function.max.php

7.13 Comment obtenir la plus petite valeur contenue dans un tableau

A l'aide de la fonction min().

Exemple :

<?php
$tableau=array("102","23","12","167","17");
echo min($tableau);
// Retournera : 12
?>
Documentation ;
http://www.php.net/manual/fr/function.min.php

7.14 Comment afficher le dernier élément d'un tableau

A l'aide de la fonction end().

Exemple :

<?php
$tableau=array("pomme", "poire", "cerise", "framboise");
echo end($tableau);
// Retournera "franboise"
?>
Documentation :
http://www.php.net/manual/fr/function.end.php

7.15 Comment afficher le premier élément d'un tableau

A l'aide de la fonction reset().

Exemple :

<?php
$tableau=array("pomme", "poire", "cerise", "framboise");
echo reset($tableau);
// Retournera "pomme"
?>
Documentation :
http://www.php.net/manual/fr/function.reset.php

7.16 Comment obtenir la soustraction de 2 tableaux

Avec PHP4, en utilisant la fonction array_diff().

Exemple :

<?php
$array1 = array ("pomme", "poire", "cerise");
$array2 = array ("pomme", "fraise");
$result = array_diff ($array1, $array2);

while (list($key, $val)=each($result)) {
echo $val."\n";
}
?>

Retournera "poire" et "cerise", car "pomme" existe dans le second tableau.

Documentation :
http://www.php.net/manual/fr/function.array-diff.php

7.17 Comment obtenir l'intersection de 2 tableaux

Avec PHP4, en utilisant la fonction array_intersect().

Exemple :

<?php
$array1 = array ("pomme", "poire", "cerise");
$array2 = array ("fraise", "pomme");
$result = array_intersect ($array1, $array2);

while (list($key, $val)=each($result)) {
echo $val."\n";
}
?>
Retournera "pomme" car seul "pomme" existe dans les 2 tableaux.

Documentation :
http://www.php.net/manual/fr/function.array-intersect.php

8. PHP : Variables

Contenu de cette section

8.1 Comment savoir si une variable existe

En utilisant la fonction isset().

Documentation :
http://www.php.net/manual/fr/function.isset.php

8.2 Comment détruire une variable

En utilisant la fonction unset(). Notez qu'il n'est jamais inutile de détruire une variable qui ne servira plus (afin de libérer de la mémoire).

Documentation :
http://www.php.net/manual/fr/function.unset.php

8.3 PHP tient-il compte de la casse des caractères dans les noms de variables

Oui ! Ainsi, $chaine ou $Chaine permet d'adresser deux variables bien distinctes.
Notez enfin que PHP supporte les caractères accentués dans les noms de variable.

8.4 Qu'est-ce qu'une variable de variables

Un exemple sera plus simple pour expliquer ce concept si pratique :

<?php
$test = "hello"; 
$ma_variable = "test"; 

print $$ma_variable; 

// ou bien 
print ${$ma_variable}; 

// ou encore 
print ${"test"}; 

// affichera 'hello' 
?>

8.5 Qu'est-ce qu'une variable de fonction

Un exemple sera plus simple pour expliquer ce concept :

<?php
$chaine = "Bonjour tout le monde ! C'est super !"; 
$variable = "addslashes"; 

echo $variable($chaine); 
// Bonjour tout le monde ! C\'est super ! 
?>

8.6 Qu'est-ce qu'une variable locale

Lorsque vous déclarez une variable dans une fonction, cette variable n'est définie que dans celle ci. On dit que cette variable est locale. On parle aussi de portée ou de scope local.

Exemple :

<?php
function test() {
$chaine="bonjour";
}
$chaine="bonsoir";
test()
echo $chaine;
?>
La portée de $chaine, définie dans la fonction test() est locale à cette fonction. Elle est limitée à celle ci. Même après un appel à la fonction test(), notre variable $chaine définie dans le corps principal du script continue à retourner "bonsoir".

Les scopes de ces deux variables portant pourtant le même nom sont bien distincts.

8.7 Qu'est-ce qu'une variable globale

Lorsque vous déclarez une variable dans le corps d'un script, cette variable est définie pour l'ensemble du script. On dit que cette variable est globale. On parle aussi de portée ou de scope global.

Exemple :

<?php
$chaine="bonsoir";
include "lib.inc.php3";
echo $chaine;
?>
La portée de $chaine, définie ici est globale à l'ensemble du script. Elle est même visible et peut-être manipulée depuis un script embarqué par un include ou un require.

Par contre, cette variable ne sera pas visible directement depuis une fonction. Les fonctions gérant un scope local, limité à celles-ci.

8.8 Qu'est-ce qu'une variable static

Lorsque vous déclarez une variable dans une fonction, cette variable n'est définie que dans celle ci. On dit que cette variable est locale. On parle aussi de portée ou de scope local.
De plus, par défaut, cette variable à une durée de vie limité à cette fonction. Pour remédier à ceci, vous pouvez la rendre static. Dans ce cas, le scope sera préservé et la variable locale retrouvera sa valeur antérieure lors d'un nouvel appel à la fonction dont elle dépend.

Exemple :

<?php
function inutile() {
$compteur=0;
echo $compteur;
$compteur++;
}

function utile() {
static $compteur=0;
echo $compteur;
$compteur++;
}

inutile();
utile();
inutile();
utile();
inutile();
utile();
?>
Ce code retournera 000102. Que s'est-il passé ?

A chaque appel de notre fonction inutile(), la variable locale $compteur est initialisée à 0, puis affichée, puis incrémentée. Cette fonction est stupide. Elle affichera toujours 0.

A l'inverse, notre fonction utile() définie la variable locale $compteur comme static. Sa valeur est donc préservée dans le scope local. Elle est initialisée à 0 une première fois. Puis réellement incrémentée. Nous avons réalisé ici un compteur.

8.9 Comment modifier une variable globale depuis une fonction

Question légitime, puisque nous venons de voir que les fonctions utilisent des variables locales dont le scope ou la portée est limité à celles-ci.

En fait, il existe plusieurs méthodes.

Méthode 1 :
En déclarant global, la ou les variables dont vous voulez éteindre le scope ou la portée.

<?php
function addition($a, $b) {
global $resultat;
$resultat=$a+$b;
}
$a=2;
$b=12;
$resultat=0;
addition($a,$b);
echo $resultat;
?>
Méthode 2 :

En utilisant le tableau associatif $GLOBALS.

<?php
function addition($a, $b) {
$GLOBALS["resultat"]=$a+$b;
}
$a=2;
$b=12;
$resultat=0;
addition($a,$b);
echo $resultat;
?>
Méthode 3 :

En utilisant un passage d'argument par référence.

<?php
function addition($a, $b, &$resulat) {
$resultat=$a+$b;
}
$a=2;
$b=12;
$resultat=0;
addition($a,$b);
echo $resultat;
?>

8.10 Comment définir une super variable globale persistante d'un script à un autre

Une sorte de super variable globale ? :) Et oui, une variable même globale est perdue lorsque le script dans lequel elle est définie se termine.

En fait, les solutions sont multiples :
- passer la variable de script en script,
- utiliser les cookies,
- utiliser les sessions.

La solution utilisant les sessions est de loin la meilleure.

8.11 Dois-je déclarer mes variables en PHP

Non.

8.12 Quelles sont les valeurs par défaut de variables non initialisées

Question intéressante.
A vrai dire, cela dépend du type de variables. Les valeurs par défaut sont,

- type numérique : 0.00
- type chaine : "" équivalent à NULL
- type booléen : false équivalent à 0
- type tableau : NULL avec une taille à 0

8.13 Puis-je déclarer une variable dont le nom commence par un chiffre

Non !

8.14 Comment connaître le type d'une variable

A l'aide de la fonction gettype().

Exemple :

<?php
$chaine = "bonjour";
echo gettype($chaine);
// Retournera : string
?>
Documentation :
http://www.php.net/manual/fr/function.gettype.php

9. PHP : Classes

Contenu de cette section

9.1 Où trouver des informations sur PHP et la POO (Programmation Orienté Objets)

Quelques ressources en vrac :

An Introduction to Classes : http://zend.com/zend/tut/class-intro.php
Accessing Databases with Class : http://www.devshed.com/Server_Side/PHP/Class/
Classes and PHP : http://www.phpbuilder.com/columns/rod19990601.php3
Object Oriented Programming in PHP : http://php.vamsi.net/article/3/1

Sans oublier la documentation :
http://www.php.net/manual/fr/language.oop.php

9.2 Puis-je utiliser include et require dans la définition d'une classe

Non !

9.3 Comment passer une instance de classe d'un script à un autre

Il est possible de serializer l'instance et de la passer par les méthodes GET ou POST. Ou encore, de la stocker dans une session.

9.4 L'héritage est-il supporté

Oui, même dans PHP3 ou il n'était pourtant pas documenté.

9.5 Le polymorphisme est-il supporté

Oui.

9.6 Existe t-il une notion de destructeur d'instance de classe

Faites un simple unset().

Documentation :
http://www.php.net/manual/fr/function.unset.php

9.7 Comment depuis une classe dérivée, appeler une méthode de la classe parente

Tout simplement en faisant ceci :

$this->nom_de_la_methode_parente();

9.8 Comment accéder à une variable globale depuis une classe

De la même manière que l'on accède à une variable globale depuis une fonction. En utilisant l'opérateur global.

Exemple :

<?php
class Test {
         function inutile() {
             global $chaine;
             print $chaine;
         }
}

$chaine = "bonjour";

$test =new Test;
$test->inutile();
?>

10. PHP : Constantes

Contenu de cette section

10.1 La notion de constante existe t-elle avec PHP

Oui !

10.2 Comment déclarer une constante

A l'aide de la fonction define().

Exemple :

<?php
define ("PHP", "PHP Hypertext Preprocessor");
echo PHP;
?>
Documentation :
http://fr.php.net/manual/fr/function.define.php

10.3 Puis-je définir un tableau comme étant une constante

Non !
Une constante ne peut-être qu'une donnée scalaire.
A ce titre, une constante ne peut pas être un tableau ou un objet.

Documentation :
http://fr.php.net/manual/fr/function.define.php

10.4 PHP tient-il compte de la casse des caractères dans les noms de constantes

Par défaut, oui !
Mais il est possible de le paramètrer lors de la création de chaque constante. A ce titre, define() peut recevoir en ultime argument, la valeur 0 (défaut) ou 1. Si cet argument est initialisé à 1, PHP ne tiendra pas compte de la casse pour cette constante.

Exemple :

<?php
define ("ZOPE", "Z Object Publishing Environment",1);
define ("PHP", "PHP Hypertext Preprocessor");
echo ZOPE;
echo "\n";
echo zope;
echo "\n";
echo PHP;
echo "\n";
echo php;
?>
Ici, la constante ZOPE est définie de façon à ne plus prendre en compte la casse.
Ainsi, ZOPE et zope permettront de pointer vers la même constante.

Documentation :
http://fr.php.net/manual/fr/function.define.php

10.5 Je n'arrive pas à redéfinir une constante

Comportement logique et normal.
Une constante, comme son nom le laisse entendre, n'est pas prévue pour être modifiée. La première définition sera celle qui servira à initialiser la constante. Les suivantes seront sans effet.

Exemple :

<?php
define ("ZOPE", "Z Object Publishing Environment"); 
define ("ZOPE", "Z Object");
echo ZOPE; 
// retournera toujours "Z Object Publishing Environment"
?>
Documentation :
http://fr.php.net/manual/fr/function.define.php

10.6 Existe t-il des constantes prédéfinies

Oui ! Et certaines peuvent se montrer fort utiles.
On peut en particulier citer :

- __FILE__ : retourne nom du fichier qui est actuellement exécuté
- __LINE__ : retourne la ligne en court d'exécution
- TRUE : vrai booléen
- FALSE : faux booléen
- PHP_VERSION : version de PHP
- PHP_OS : nom du système d'exploitation

Sans oublier un certain nombre de constantes mathématiques. Exemple :

- M_PI : 3.14159265358979323846
- M_E : 2.7182818284590452354

Documentation :
http://www.php.net/manual/fr/language.constants.php
http://www.php.net/manual/fr/ref.math.php

10.7 Comment vérifier qu'une constante existe

A l'aide de la fonction defined().

Documentation :
http://www.php.net/manual/fr/function.defined.php


11. PHP : Fonctions

Contenu de cette section

11.1 Comment retourner un tableau depuis une fonction

En utilisant return, tout simplement.

Exemple :

<?php
function test() 
{ 
$fruit=array("pomme", "poire", "cerise", "fraise"); 
return $fruit; 
} 

$tableau=test(); 

while(list($key,$val)=each($tableau)) 
{ 
echo $val; 
echo "\n"; 
} 
?>

11.2 Comment passer un tableau à une fonction

Le plus simplement du monde.
Exemple :

<?php
function inutile($tableau) { 

while(list($key,$val)=each($tableau)) 
{ 
echo $val; 
echo "\n"; 
} 

} 

$fruit=array("pomme", "poire", "cerise", "fraise"); 
inutile($fruit);
?>

11.3 Qu'est-ce qu'un passage par valeur et par référence

Par défaut, lorsque vous passez une variable à une fonction, vous effectuez un passage par valeur. C'est à dire que vous passez à la fonction non pas la variable elle-même, mais uniquement la valeur de cette variable. Cette valeur sert alors à initialiser une nouvelle variable locale à la fonction et dont la portée ou le scope est limité à celle-ci.

Mais vous pouvez aussi passer une variable par référence (on dit aussi par adresse). Ce type de passage s'effectue en plaçant un & (esperluette) devant la variable à passer par référence. Dans ce cas, ce n'est pas la valeur de la variable qui est passée, mais l'adresse de cette variable. A ce titre, toute modification de cette variable dans la fonction influencera la valeur de la variable globale.

Pas clair ? Exemple :

<?php
function addition_valeur($a, $b, $resultat) {
$resultat=$a+$b;
}

function addition_reference($a, $b, &$resultat) {
$resultat=$a+$b;
}

$a=2;
$b=12;
$resultat=0;

addition_valeur($a,$b,$resultat);
echo $resultat;

echo "\n";

addition_reference($a,$b,$resultat);
echo $resultat;
?>
La fonction addition_valeur() reçoit l'ensemble de ses arguments par valeur. Pour des raisons de portée (voir le chapitre sur les variables), on voit que $resultat vaut toujours 0 après l'appel de cette fonction.
Par contre, la fonction addition_reference() reçoit la variable $resultat par référence (notez la présence du & devant la variable, au niveau de la déclaration de cette fonction). Après l'appel de cette fonction, notre variable globale, $resultat, vaut 14.

11.4 PHP tient-il compte de la casse des caractères dans les noms de fonctions

Non !

Exemple :

<?php
function inutile() {
 echo "Fonction inutile";
}
inutile();
iNuTiLe();
?>
Dans les 2 cas, PHP appelera la même fonction inutile().

11.5 Puis-je initialiser des arguments par défaut

Oui.

Exemple :

<?php
function test($chaine, $boucle=1) {
        for($i=1; $i<=$boucle; $i++) {
                echo $chaine."\n";
        }
}

test("cerise");
test("fraise", 10);
?>

11.6 Puis-je obtenir le nombre d'arguments passés à une fonction

Oui, avec PHP4. Vous pouvez alors utiliser la fonction func_num_args().

Exemple :

<?php
function test() {
    $nombre = func_num_args();
    echo "Nombre d'arguments: $nombre\n";
}
test (a, b, c, d);    // retournera "Nombre d'arguments: 4"
?>
Documentation :
http://www.php.net/manual/fr/function.func-num-args.php

11.7 Puis-je lister les arguments passés à une fonction

Oui, avec PHP4. Vous pouvez alors utiliser la fonction func_num_args().

Exemple :

<?php
function test() { 
        $arg=func_get_args();
        while(list($key,$val)=each($arg)) {
                echo "L'argument $key est: " .$val . "<br>\n";
        }
} 
test (a, b, c, e); 
?>
Documentation :
http://www.php.net/manual/fr/function.func-get-args.php

11.8 Est-il possible de tester l'existence d'une fonction

Oui. A l'aide de la fonction function_exists().

Exemple :

<?php

function inutile() {
}

if(function_exists("inutile"))
echo "existe";
else
echo "n'existe pas";
// retournera "existe"
?>
Documentation :
http://www.php.net/manual/fr/function.function-exists.php

12. PHP : Dates

Contenu de cette section

12.1 Comment obtenir le jour de l'année sous forme de nombre

En utilisant la fonction date() et le format "z".

Exemple :

<?php
$jour=date("z"); 
$jour++; 
echo $jour; 
?>
Remarque :
Le 1er Janvier valant 0, il faut incrémenter $jour.

Documentation :
http://www.php.net/manual/fr/function.date.php

12.2 Comment obtenir le jour du mois sous forme de nombre

En utilisant la fonction date() et
- le format "d" avec les zeros (de 01 à 31).
- le format "j" sans les zeros (de 1 à 31).

Exemple :

<?php
$jour=date("d"); 
echo $jour; 
?>
Documentation :
http://www.php.net/manual/fr/function.date.php

12.3 Comment obtenir le jour de la semaine sous forme de nombre

En utilisant la fonction date() et le format "w".

Exemple :

<?php
$jour=date("w"); 
$jour++; 
echo $jour; 
?>
Remarque :
La valeur retournée va de "0" (dimanche) à "6" (samedi).

Documentation :
http://www.php.net/manual/fr/function.date.php

12.4 Comment obtenir l'indice du mois sous forme de nombre

En utilisant la fonction date() et
- le format "m" avec les zeros (de 01 à 12).
- le format "n" sans les zeros (de 1 à 12).

Exemple :

<?php
$mois=date("m"); 
echo $mois; 
?>
Documentation :
http://www.php.net/manual/fr/function.date.php

12.5 Comment obtenir l'indice de la semaine sous forme de nombre

En utilisant la fonction strftime() et
- le format "%U" en considérant le premier dimanche de l'année comme le premier jour de la première semaine.
- le format "%W" en considérant le premier lundi de l'année comme le premier jour de la première semaine

Exemple :

<?php
$semaine=strftime("%U"); 
echo $semaine; 
?>
Documentation :
http://www.php.net/manual/fr/function.strftime.php

12.6 Comment obtenir le nombre de jour dans un mois

En utilisant la fonction date() et le format "t".

Exemple :

<?php
$jour=date("t"); 
echo $jour; 
?>
Documentation :
http://www.php.net/manual/fr/function.date.php

12.7 Comment obtenir le nombre de jours entre 2 dates

Le code suivant pourra peut-être vous y aider,

<?php
$Date1 = mktime( 0, 0, 0, $Mois1, $Jour1, $Annee1 ); 
$Date2 = mktime( 0, 0, 0, $Mois2, $Jour2, $Annee2 ); 

$nbJour = ($Date2 - $Date1) / (60*60*24); 

print $nbJour; 
?>

12.8 Comment obtenir la date dans X jours

Le code suivant pourra peut-être vous y aider,

<?php
$delta = 10; // dans 10 jours 
$ma_date = getdate(mktime()+($delta*24*3600)); 
$annee = $ma_date[year]; 
$mois = $ma_date[mon]; 
$jour = $ma_date[mday]; 
print "$jour/$mois/$annee"; 
?>

12.9 Comment contrôler la validité d'une date

A l'aide de la fonction checkdate(). Elle prend comme argument, le mois, le jour et l'année. Si la date est valide, cette fonction retourne true. Sinon false.

Documentation :
http://www.php.net/manual/fr/function.checkdate.php

12.10 Comment contrôler si une année est bissextile ou non

En utilisant la fonction date() et le format "L". Si l'année est bissextile, cette fonction retourne true. Sinon false.

Exemple :

<?php
if(date("L"))
        print "L'année ".date("Y")." est bissextile";
else
        print "L'année ".date("Y")." n'est pas bissextile";
?>

12.11 Comment convertir une date sous la forme AAAA-MM-JJ vers JJ-MM-AAAA

Le code suivant pourra peut-être vous y aider :

<?php
$madate="2001-04-07";
list($a,$m,$j)=explode("-",$madate); 
$date="$j-$m-$a";
echo $date;
?>
Ou encore, à l'aide des regex :

<?php
$madate="2001-04-07";
$date=eregi_replace("([0-9].*)-([0-9].*)-([0-9].*)" ,"\\3-\\2-\\1" , $madate);
echo $date;
?>

13. PHP : Fichiers

Contenu de cette section

13.1 Puis-je créer un fichier vide

Oui. A l'aide de la fonction touch().
Exemple :

<?php
touch("monfichier.dat") 
?>
Documentation :
http://www.php.net/manual/fr/function.touch.php

13.2 Comment compter le nombre de ligne dans un fichier

Le code suivant pourra peut-être vous y aider :

<?php
$fichier="nom_de_mon_fichier"; 
$ligne=file($fichier); 
echo sizeof($ligne); 
?>

13.3 Comment obtenir la taille d'un fichier

A l'aide de la fonction filesize().

Exemple :

<?php
echo filesize("monfichier.dat") 
?>
Documentation :
http://www.php.net/manual/fr/function.filesize.php

13.4 Puis-je contrôler l'existence d'un fichier

Oui. A l'aide de la fonction file_exists().

Documentation :
http://www.php.net/manual/fr/function.file-exists.php

13.5 Comment lire la totalité d'un fichier

Le code suivant pourra peut-être vous y aider :

<?php
$file="monfichier"; 
$contenu = fread(fopen($file, "r"), filesize($file)); 
echo $contenu; 
?>
Le contenu total du fichier est alors stocké dans une chaine (ici, $contenu).

Il peut également être pratique de récupérer l'intégralité du fichier dans un tableau. Ce tableau contiendra alors chaque ligne du fichier. Vous pouvez le faire comme ceci :

<?php
$contenu_array = file("monfichier"); 
?>
Documentation :
http://www.php.net/manual/fr/function.file.php

13.6 Est-il possible de verrouiller un fichier

Oui. A l'aide de la fonction flock().

Documentation :
http://www.php.net/manual/fr/function.flock.php

13.7 Comment lister les fichiers d'un répertoire

A l'aide de la fonction readdir().

Exemple :

<?php
$handle=opendir('.');
while ($file = readdir($handle)) {
    if ($file != "." && $file != "..") {
        echo "$file\n";
    }
}
closedir($handle);
?>
Documentation :
http://www.php.net/manual/fr/function.readdir.php

13.8 Comment renommer un fichier

A l'aide de la fonction rename().

Documentation :
http://www.php.net/manual/fr/function.rename.php

13.9 Comment supprimer un fichier

A l'aide de la fonction unlink().
Notez également qu'un alias de cette fonction existe. A savoir delete().

Documentation :
http://www.php.net/manual/fr/function.unlink.php
http://www.php.net/manual/fr/function.delete.php

13.10 Comment inverser les lignes d'un fichier

Le code suivant pourra peut-être vous y aider :

<?php
$fichier = file("input.dat");
$i = count($fichier);
$cnt = $i;
touch("output.dat");
$fp=fopen("output.dat", 'a');
for(;$cnt >= 0;$cnt--)
 {
 fputs ($fp,"$fichier[$cnt]");
 }
fclose($fp);
?>

13.11 Comment puis-je modifier le pointeur de fichier

A l'aide de la fonction fseek().

Documentation :
http://www.php.net/manual/fr/function.fseek.php

13.12 Comment placer le pointeur de fichier au début

A l'aide de la fonction rewind().

Documentation :
http://www.php.net/manual/fr/function.rewind.php

13.13 Comment connaître la position du pointeur de fichier

A l'aide de la fonction ftell().

Documentation :
http://www.php.net/manual/fr/function.ftell.php


14. PHP : Réseau

Contenu de cette section

14.1 Comment résoudre une adresse IP en nom de domaine

A l'aide de la commande gethostbyaddr().

Exemple :

<?php
$ip = $REMOTE_ADDR; 
echo gethostbyaddr($ip); 
?>
Documentation :
http://www.php.net/manual/fr/function.gethostbyaddr.php

14.2 Comment résoudre un nom de domaine en adresse IP

A l'aide de la commande gethostbyname().

Exemple :

<?php
$host = "www.php.net"; 
echo gethostbyname($host); 
?>
Documentation :
http://www.php.net/manual/fr/function.gethostbyname.php

14.3 Comment obtenir l'adresse IP du client

A l'aide de la variable $REMOTE_ADDR.

Attention :

- l'adresse IP retournée par $REMOTE_ADDR peut ne pas correspondre à l'adresse IP du client, voir même, être vide. Cela arrive parfois lorsque le client est caché derrière un proxy. Vous pouvez tenter de contourner ce problème en manipulant la variable $HTTP_X_FORWARDED_FOR plutôt que $REMOTE_ADDR.

- il est déconseillé de développer un système fiable d'identification/authentification, basé sur un détection de l'adresse IP du client. Comme déjà dit ici, l'IP retournée n'est pas toujours celle du client. De plus, un même client est susceptible d'hériter de plusieurs IP différentes. Enfin, IPv4 n'offre aucune garantie niveau sécurité (une IP peut être usurpée). N'adopter donc ce type d'approche dans des cas bien précis. Préférez de loin les sessions par exemple.

14.4 Puis-je faire un WHOIS en PHP

Un article traite de ce sujet sur l'excellent site DevShed (http://www.devshed.com/Server_Side/PHP/whois/)

14.5 Puis-je envoyer un fichier par FTP en PHP

Oui. L'idéal est de disposer d'une version de PHP compilée avec l'option --with-ftp. Cette option de compilation donne accès aux commandes de base permettant de se connecter à un serveur FTP distant et d'y soumettre des commandes.

A défaut, certains auront peut-être l'idée de passer par les sockets. Bon courage ! FTP est un protocole particulier qui met en oeuvre 2 canaux (canal de données et canal de commandes).

Documentation :
http://www.php.net/manual/fr/ref.ftp.php

14.6 Comment faire un ping

Le mieux est encore de passer par exec() ou système() afin d'invoquer la commande ping de votre OS.

Exemple :

<?php
exec("ping -c 10 www.php.net", $list); 
for ($i = 0; $i < count($list); $i++) 
print $list[$i]."<br>"; 
?>
Documentation :
http://www.php.net/manual/fr/function.exec.php
http://www.php.net/manual/fr/function.system.php

15. PHP : Cookies

Contenu de cette section

15.1 Comment créer un cookie

A l'aide de la fonction setcookie().

Voici quelques exemples,

setcookie ("MonCookie", "Test");
setcookie ("MonCookie", "10", time()+3600);

Documentation :
http://www.php.net/manual/fr/function.setcookie.php

15.2 Ma création de cookies ne semble pas fonctionner

Les cookies faisant partie de l'en-tête HTTP, ils doivent être manipulés (créés, modifiés ou supprimés) avant qu'une quelconque sortie soit envoyée au navigateur (echo, balise HTML, etc.).

15.3 Ca ne marche toujours pas

Il arrive parfois que des problèmes apparaissent avec certains navigateurs si l'argument path (4 ème argument) de la fonction setcookie() n'a pas été initialisé. Tentez par exemple d'initialiser cet argument avec comme chemin "/".

15.4 Je n'arrive pas à détruire un cookie

En théorie, il suffit de passer à la fonction SetCookie(), le nom du cookie à détruire (et uniquement le nom). En pratique, il est vivement recommandé de procéder autrement en indiquant une date d'expiration périmée. Exemple,

setcookie("MonCookie", "", time()-48*3600, "/");

Documentation :
http://www.php.net/manual/fr/function.setcookie.php

15.5 Suis-je limité en nombre de cookie

Oui, mais cette limite semble dépendre du navigateur. En général, pas plus de 20 (stockés coté client).

15.6 Comment savoir si le navigateur client accepte les cookies

Voici une méthode. A partir d'un premier script (script1.php3), vous envoyez un cookie au client et vous redirigez le client vers un second script (script2.php3). Dans ce second script, vous tentez de relire votre cookie. S'il existe, c'est que la navigateur du client accepte les cookies.

Code de script1.php3,

<?php
SetCookie("test", "1"); 
Header("Location: script2.php3"); 
?>
Code de script2.php3,

<?php
if(isset($test)) 
echo "Le client accepte les cookies :)"; 
else 
echo "Le client n'accepte pas les cookies :("; 
?>

15.7 Puis-je créer et manipuler un même cookie au cours du même script

Non ! La création du cookie ne prendra effet qu'une fois le script terminé.

15.8 Qu'est-ce qu'un cookie persistant et non persistant

Un cookie persistant est caractérisé par au moins deux paramètres : une valeur et un délai d'expiration précis. Il sera écrit sur le disque du poste client et y restera tant que le délai d'expiration ne sera pas périmé.

A l'inverse, un cookie non persistant n'est pas caractérisé par un délai d'expiration précis. Le cookie persistera tant que le client n'aura pas fermé son navigateur (et ses éventuels navigateurs fils). On parle parfois de cookies de session. Ce type de cookie n'est pas écrit sur le disque du client et persiste uniquement en mémoire.

Exemple de création de cookie persistant,
setcookie ("MonCookie", "10", time()+3600*24*365*100);
Ce cookie persistera 100 ans (osons).

Exemple de création de cookie non persistant,
setcookie ("MonCookie", "Test");
Ce cookie persistera jusqu'à ce que le client ferme son navigateur.

15.9 Où puis-je trouver plus d'infos sur le concept des cookies

Sur le site de Netscape (à l'origine du concept des cookies) :
http://www.netscape.com/newsref/std/


16. PHP : Sessions

Contenu de cette section

16.1 Puis-je gérer les sessions avec PHP3

Oui. Mais ce concept n'est pas géré en natif par PHP3. Vous pouvez choisir d'écrire votre propre système de gestion de session. Ou opter pour l'une des solutions suivantes :

PHPLib : http://phplib.netuse.de/
BDSM : http://www.lazycat.org/BDSM/
dbSessions : http://www.phpheaven.net/resources/libraries/dbSessions/
PostgreSQL Session Handler : http://www.csh.rit.edu/~jon/projects/php/pgsql_session_handler/
sqlsession : http://ecom1.onestop.net/~joshm/sqlsession.html

16.2 Puis-je gérer les sessions avec PHP4

Oui. Ce concept est géré en natif par PHP4.

16.3 La fonction session_destroy semble ne pas fonctionner

Oui, c'est possible. Ce problème semble être propre à la version PHP 4.0.3 Win32.
Il est corrigé avec la version 4.0.4 pl 1. Il vous reste à mettre à jour votre version de PHP.

16.4 Comment savoir si une variable a été enregistrée dans la session

A l'aide de la fonction session_is_registered().

Documentation :
http://www.php.net/manual/fr/function.session-is-registered.php


17. PHP : Math

Contenu de cette section

17.1 Puis-je faire des calculs sur des nombres longs

Oui. Mais vous devez prendre soin de compiler PHP avec l'option --enable-bcmath.

17.2 Comment générer un nombre aléatoire

L'exemple suivant retourne un nombre entre 1 et 50. Il pourra peut-être vous aider.

<?php
srand((double)microtime()*1000000); 
echo rand(1,50); 
?>
Documentation :
http://www.php.net/manual/fr/function.rand.php
http://www.php.net/manual/fr/function.srand.php

17.3 Comment arrondir un nombre

A l'aide de la fonction round().

Documentation :
http://www.php.net/manual/fr/function.round.php

17.4 Comment obtenir la partie entière d'un nombre

Attention, on peut raisonner de deux façons différentes (je vous renvois à vos cours - chiants - d'Arithmétique). En effet, il n'existe pas un mais deux types de partie entière :

- par valeur max

4/5 = 0.8 donnera 1
1/3 ~ 0.33333 donnera également 1

En PHP, cette fonction s'appelle ceil().

- par valeur min

4/5 = 0.8 donnera 0
1/3 ~ 0.33333 donnera 0

En PHP, cette fonction s'appelle floor().

Documentation :
http://www.php.net/manual/fr/function.ceil.php
http://www.php.net/manual/fr/function.floor.php

17.5 Comment obtenir la racine n-ième d'un nombre

La fonction suivante vous y aidera peut-être,

<?php
function racine($base, $racine) {
    return pow($base, 1/$racine);
}

echo racine(27, 3);
// retournera 3
?>

17.6 Comment formater l'affichage de mes nombres

A l'aide de la fonction number_format().

Exemple :

<?php
$pi=3.14159265358979323846;
echo number_format($pi, 2);
?>
Documentation :
http://www.php.net/manual/fr/function.number-format.php

17.7 Comment calculer un logarithme népérien

A l'aide de la fonction log(). Le logarithme en base 10 étant obtenu avec la fonction log10().

Documentation :
http://www.php.net/manual/fr/function.log.php
http://www.php.net/manual/fr/function.log10.php

17.8 Comment manipuler PI

Par défaut, PHP connait un certain nombre de constantes Mathématiques. C'est le cas de PI.
Ainsi, PI est accessible au travers de la constante M_PI. Mais aussi par la fonction pi().

Documentation :
http://www.php.net/manual/fr/ref.math.php
http://www.php.net/manual/fr/function.pi.php


18. PHP : Mail

Contenu de cette section

18.1 Comment envoyer un mail

En utilisant la fonction mail().

Exemple :

<?php
mail("adresse.destinataire@host.com", "Ici c'est le sujet", "Et ici c'est le message"); 
?>
Documentation :
http://www.php.net/manual/fr/function.mail.php

18.2 Comment envoyer un mail à plusieurs destinataires

En utilisant la fonction mail() et en séparant les adresses des destinataires par un espace.

Exemple :

<?php
mail("adresse1.destinataire@host1.com adresse2.destinataire@host2.com adressex.destinataire@hostx.com", "Ici c'est le sujet", "Et ici c'est le message"); 
?>

18.3 Comment envoyer un mail en modifiant l'adresse de l'expéditeur

En utilisant la fonction mail() et en précisant l'adresse de l'expéditeur. Pour se faire, il est possible de passer à la fonction mail() un argument supplémentaire permettant de formater l'entête.

Exemple :

<?php
mail("adresse.destinataire@host.com", "Ici c'est le sujet", "Et ici c'est le message", "From: bill.gates@microsoft.com"); 
?>

18.4 Comment vérifier la syntaxe d'une adresse e-mail

La fonction suivante n'est pas parfaite, mais elle fonctionne :

<?php
function validation_email ($email)
{ 
return (eregi("^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3}$",$email)); 
} 

$adresse = array( 
"webmaster@php.net", 
"webmaster", 
"webmaster@phpindex", 
"webmaster@phpindex.com"); 

while(list($key,$val)=each($adresse))
{
if (validation_email($val)==1) 
echo "$val = Adresse valide\n"; 
else 
echo "$val = Adresse non valide\n";  
} 
?>

18.5 Comment envoyer un mail au format HTML

Il faut envoyer un message en plaçant dans le header les bons entêtes MIME.

En pratique, utiliser une classe ou un script tout fait.
On peut citer en particulier :

- http://px.sklar.com/code-pretty.html?code_id=233
- http://www.heyes-computing.net/download.php?script_id=4
- http://lwest.free.fr/doc/php/lib/Mail/

18.6 Comment récupérer l'email d'un visiteur

Le mieux est encore certainement de le la lui demander. Un simple formulaire suffira.

18.7 Comment envoyer un mail depuis l'hébergeur Free

Ce n'est pas possible par PHP.

Cet hébergeur a volontairement désactivé la fonction mail(). C'est également le cas de l'ouverture de sockets sur le port 25 si vous aviez des velléités de vouloir contourner cette limitation.

Notez que vous pouvez tout de même recevoir un message sur le compte e-mail associé à votre page Web. Pour de plus amples informations : http://support.free.fr/web/forms.html


19. PHP : Regex

Contenu de cette section

19.1 Quelle type d'expressions régulières utilise PHP

PHP utilise les expressions régulières étendues POSIX (norme POSIX 1003.2).

19.2 Ou trouver des ressources sur les Regex

En premier lieu, je vous recommande "Mastering regular expressions" aux édition O'Reilly (http://www.oreilly.com/catalog/regex/). La bible dans le domaine.

Sur le Web, quelques liens :
- Linux Focus (http://www.linuxfocus.org/Francais/July1998/article3.html)
- DevShed (http://www.devshed.com/Server_Side/Administration/RegExp/)

19.3 Que dois-je utiliser : str_replace ou ereg_replace

La fonction str_replace() se montre plus rapide que la fonction ereg_replace(). Sur un traitement un peu volumineux, il semble donc judicieux d'employer la première solution.

19.4 Comment nettoyer les occurrences multiples et consécutives dans une chaine

Le code suivant pourra peut-être vous y aider,

<?php
$chaine="je mangeee uneeeeeee souris";
echo ereg_replace("[e]{2,}", "e", $chaine);
?>
Dans cette exemple, nous supprimons les occurrences multiples et consécutives de "e" par un "e" simple.

19.5 Comment remplacer les caractères non alphanumérique d'une chaine par un caractère particulier

Le code suivant pourra peut-être vous y aider :

<?php
$chaine = "Ceci # est # un test";
$chaine = eregi_replace("[^A-Z0-9]", "_", $chaine);
print $chaine;
?>
Et si vous désirez ne pas remplacer les espaces par des underscores,

<?php
$chaine = "Ceci # est # un test"; 
$chaine = eregi_replace("[^A-Z0-9\ ]", "_", $chaine); 
print $chaine; 
?>

19.6 Comment vérifier qu'une chaine est alphabétique

L'expression suivante pourra peut-être vous y aider :

            ereg("^[A-Za-z]+$", $chaine)
			

Ou $chaine désigne la chaine à tester.

19.7 Comment vérifier qu'une chaine est numérique

L'expression suivante pourra peut-être vous y aider :

            ereg("^[0-9]+$", $chaine)
            

Ou $chaine désigne la chaine à tester.

19.8 Comment vérifier qu'une chaine est alphanumérique

L'expression suivante pourra peut-être vous y aider :

            ereg("^[A-Za-z0-9]+$", $chaine)
            

Ou $chaine désigne la chaine à tester.

19.9 Comment supprimer tous les caractères non alphabétiques d'une chaine

L'expression suivante pourra peut-être vous y aider :

            eregi_replace("[^a-z]", "", $chaine);
            

Ou $chaine désigne la chaine à nettoyer.

19.10 Comment supprimer tous les caractères non alphanumériques d'une chaine

L'expression suivante pourra peut-être vous y aider :

            eregi_replace("[^a-z0-9]", "", $chaine);
            

Ou $chaine désigne la chaine à nettoyer.

19.11 Comment nettoyer les tags <font ...> texte </font> en préservant le texte

L'expression suivante pourra peut-être vous y aider :

            $chaine = eregi_replace("<font[^>.]*>","",$chaine);
            $chaine = eregi_replace("</font[^>.]*>","",$chaine);
			

Ou $chaine désigne la chaine à nettoyer.

19.12 Comment nettoyer les tags <table ...>

L'expression suivante pourra peut-être vous y aider :

            $chaine = eregi_replace("<table[^>.]*>","",$chaine);
            

Ou $chaine désigne la chaine à nettoyer.

19.13 Que désigne PCRE

PCRE désigne Perl Compatible Regular Expression.

Documentation :
http://www.php.net/manual/fr/ref.pcre.php3


20. PHP : Database

Contenu de cette section

20.1 Quels sont les SGBDR supportés

Actuellement sont supportés : Adabas D, InterBase, Solid, dBase, mSQL, Sybase, Empress, MySQL, Velocis, FilePro, Oracle, Unix, dbm, Informix, SQL Server et PostgreSQL.

20.2 Est-il possible d'accéder à un SGBDR non supporté

Vous pouvez toujours tenter d'utiliser ODBC. Mais les performances seront médiocres.

Documentation :
http://www.php.net/manual/fr/ref.odbc.php

20.3 Dois-je utiliser MySQL

Difficile de répondre à cette question. Cela dépend d'une foultitude de paramètres : nature du site, alternatives offertes par votre hébergeur, etc.

On retiendra que MySQL est devenu très populaire ces derniers temps. Relativement simple à prendre en main, il est déployé chez la plupart des hébergeurs (free ou pro) et répond parfaitement à des problématiques simples. A ce titre, il est parfaitement adapté pour gérer le stockage et la mise en ligne de contenu (informations, etc.).

Ceci dit, MySQL présente aussi certaines limitations :
- il n'est pas transactionnel. Ainsi, la gestion d'accès concurrents n'est pas vraiment envisageable (level locking, trigger, etc.). Ceci fait de MySQL un SGBDR peut adapté aux sites d'enchères par exemple.
- il ne gère pas le concept de procédures stockées.
- il ne supporte pas les sous-select (ou select de select).
- etc.

Ces points font partis de la TODO List.

20.4 Où puis-je trouver des comparatifs entre MySQL et les autres SGBDR

Sur le site de MySQL :
http://mysql.com/crash-me-choose.htmy

Ressources complémentaires :

Why Not MySQL :
http://openacs.org/why-not-mysql.html
MySQL and PostgreSQL Compared :
http://www.phpbuilder.com/columns/tim20000705.php3
Open Source Databases: As The Tables Turn :
http://www.phpbuilder.com/columns/tim20001112.php3

20.5 Existe t-il un outil Web d'administration de MySQL

Oui. Il s'appelle phpMyAdmin et il est dispo sur :
http://www.phpwizard.com/phpMyAdmin/

20.6 Existe t-il un outil Web d'administration de PostgreSQL

Oui. Il s'appelle PostgresAdmin et il est dispo sur :
http://www.phpwizard.com/PostgresAdmin/

20.7 Existe t-il des ouvrages traitant de MySQL

Oui.
Des listes d'ouvrages sont maintenues sur :

- http://www.mysql.com/documentation/books.html
- http://archives.phpindex.com/annuaire/annuaire_partiel.php3?sous_categorie=700&categorie=700

Pour les anglophobes, on peut en particulier citer :

- "MySQL", Campus Press (255,55 F)
- "Vos premiers pas avec PHP 4", OEM (58 F).
- "Pratique de MySQL et PHP", O'Reilly (190 F).
- "PHP 4 Développement d'application Web", Campus Press (169 F).
- "L'intro PHP 4", Campuss Press (149 F).
- "Grand Livre PHP4 & MySQL", Micro Application (209 F).

20.8 Existe t-il des ouvrages traitant de PostgreSQL

Les ouvrages dédiés à PostgreSQL sont malheuresement rares. On peut tout de même citer "PostgreSQL Introduction and Concepts", Addison Wesley (347,70 F).

20.9 Puis-je accéder à une base SQL Server (sous NT) depuis un serveur Unix utilisant PHP

Oui. En utilisant la lib FreeTDS (http://www.freetds.org).

Ressources complémentaires :

Support PHP et Microsoft SQL Server
http://archives.phpindex.com/trucsetastuces/trucsetastuces_lire.php3?element=50
Support PHP et Microsoft SQL Server (Suite)
http://archives.phpindex.com/trucsetastuces/trucsetastuces_lire.php3?element=52
Accessing a Microsoft SQL Server database from PHP running under Linux
http://www.phpbuilder.com/columns/alberto20000919.php3

20.10 Puis-je accéder à une base Access depuis un serveur Unix utilisant PHP

Oui. En passant par ODBC.

20.11 Où trouver des tutoriaux traitant de MySQL

Un bon article paru dans Linux Focus aborde MySQL. Et il est en Francais :
http://www.linuxfocus.org/Francais/July1998/article59.html

20.12 Où trouver des tutoriaux traitant de PostgreSQL

Le tutorial de PostgreSQL a été traduit en francais. Il est disponible sur :
http://www.linux-france.org/article/serveur/psql/tutor/
A noter aussi l'existence d'un HOW-TO :
http://www.freenix.fr/unix/linux/HOWTO/PostgreSQL-HOWTO.html

20.13 Comment récupérer l'ID d'un champ auto-increment d'une table MySQL après un Insert

A l'aide de la fonction mysql_insert_id().

Documentation :
http://www.php.net/manual/fr/function.mysql-insert-id.php

20.14 Comment récupérer l'ID d'un champ auto-increment d'une table Access (via ODBC) après un Insert

Cet ID peut être récupéré en exécutant la requête :

SELECT @@IDENTITY

20.15 Que désigne CSV

CSV désigne "Comma Separated Values".


21. PHP : Divers

Contenu de cette section

21.1 Comment supprimer l'affichage de l'entête HTTP (Content-type : text/html) en ligne de commande

En utilisant l'argument -q de l'interpréteur PHP.

Exemple :

$ php -q monscript.php3

21.2 Pourquoi l'Authentification Web via PHP ne semble pas fonctionner

Sans doute parce que PHP n'est pas compilé comme module d'Apache.

21.3 Qu'est-ce qu'un script pré-tokenisé

Ce terme est lié à PHP3.
Il désigne un script PHP ayant subit une sorte de pré-compilation. Cette opération s'effectue via la commande suivante :

            $ php -p monscript.php3
            

Il en résulte un script portant l'extension .php3p (p pour pretokenized).
En pratique, un tel script n'est pas plus rapide qu'un script classique. Par contre, tout en étant toujours exécutable, son source n'est plus lisible. Afin de l'exécuter en ligne de commande, tapper :

$ php -e monscript.php3p

Afin de l'executer via Apache, ajouter dans le fichier /usr/local/apache/conf/httpd.conf :

AddType application/x-httpd-php3 .php3p

21.4 PHP est-il récursif

Oui.

21.5 Comment obtenir le nom du script en cours d'exécution

En utilisant la variable $SCRIPT_NAME. Une autre solution, utile si PHP est compilé en standalone ou cgi, consiste à utiliser la variable $PHP_SELF.

21.6 Puis-je faire fonctionner PHP et SSI

Oui, si le serveur HTTP employé est Apache. Dans ce cas, utilisez la fonction virtual().

Documentation :
http://www.php.net/manual/fr/function.virtual.php

21.7 Est-il possible d'éttofer PHP avec des fonctions en C développées par mes soins

Oui. Pour de plus amples informations, lisez les documents apidoc.txt et apidoc-zend.txt présents dans l'archive de PHP.

21.8 Quelle est la différence entre " et ' dans un echo

Pour mieux comprendre, le plus simple est sans doute de tester l'exemple suivant,

<?php
$foo=123; 

echo "La variable vaut : $foo"; 
echo "\n"; 
echo 'La variable vaut : $foo'; 
echo "\n"; 
?>
Dans le premier cas, c'est la valeur de la variable $foo qui sera affichée. Dans le second, le nom de la variable.

21.9 Quelle est la différence entre include et require

Ces deux fonctions permettent d'embarquer un script dans un autre. Par exemple, vous pouvez déclarer des variables ou des fonctions dans un premier script et les rendre accessibles depuis un second.
Ce qu'il faut retenir c'est que require() est toujours embarqué avant l'exécution du script. A l'inverse, include() est appelé, si nécessaire, au cours de l'exécution du programme. Il y a donc avec include() un concept conditionnel.

Toujours pas clair ? Exemple :

<?php
...
if($valeur)
{
include("scriptA.inc.php");
require("scriptB.inc.php");
}
...
?>
Ici, le fichier scriptB.inc.php sera toujours inclus. A l'inverse, le fichier scriptA.inc.php ne le sera que si la condition est vérifiée.

21.10 Quelle est la différence entre echo et print

En fait, print() est une fonction. A ce titre, elle retourne un résultat. Ceci est visible si vous faites,

$retour=print "bonjour";
echo $retour;

Vous constaterez que $return vaut 1.

De plus, print() fait partie de ce que l'on appelle, la table des précédences qui sert à définir les priorités des opérateurs (et qui explique par exemple que 2+4*3 retournera 14 et non 18).

Des informations sur la table des précédences est dispo sur :
http://www.php.net/manual/fr/language.operators.precedence.php

A l'inverse, echo n'est qu'une simple instruction. Et ne retourne rien. Ce qui explique qu'en pratique, echo est plus rapide que print. Mais c'est tout à fait négligeable.

21.11 Comment connaître depuis un script les librairies disponibles

Si vous disposez de PHP4, à l'aide de la fonction get_loaded_extensions().

Exemple :

<?php
$install=get_loaded_extensions();
while (list($key,$val)=each($install))
{
        echo $val."\n";
}
?>
Retournera par exemple,

xml
standard
session
posix
pcre
mysql

Documentation :
http://www.php.net/manual/fr/function.get-loaded-extensions.php

21.12 Suis-je limité à 255 caractères par la méthode GET

Non ! C'est totalement faux.

Cette mythique restriction (voir la RFC 2616 - HTTP 1.1) correspond à une limite basse en dessous de laquelle une application ne serait pas compatible avec le protocol HTTP 1.1.

En pratique, il en va heureusement tout autrement.

En fait, l'expérience montre que la limite du GET dépend fortement du client (navigateur IE, Netscape, Lynx, etc.). Mais aussi du serveur (Apache, Xitami, etc.). A ce titre, Apache limite la taille du GET à 8192 octets. Mais c'est paramétrable (directive LimitRequestLine).

Bref, IE et Netscape d'un coté, Apache de l'autre, sont parfaitement capables d'échanger plus de 255 caractères par la méthode GET.

21.13 Comment insérer plusieurs blancs consécutifs dans un echo ou un print

Si vous vous posez la question, c'est sans doute que vous visualisez le résultat de votre script à l'aide de votre navigateur (PHP peut être utilisé pour rédiger des scripts autres que Web).

Dans ce cas, un petit rappel s'impose : en HTML, 1 espace ou n espaces auront le même effet visuel. Si vous tenez vraiment à voir une différence, utilisez &.

21.14 Comment insérer un retour à la ligne dans un echo ou un print

Si vous vous posez la question, c'est sans doute que vous visualisez le résultat de votre script à l'aide de votre navigateur (PHP peut être utilisé pour rédiger des scripts autres que Web).

Dans ce cas, un petit rappel s'impose : en HTML, un retour à la ligne se code à l'aide de la balise <br>.

Si vous utiliser PHP en dehors d'un contexte Web, un retour à la ligne se code à l'aide d'un \n.

21.15 Comment obtenir la résolution écran du client

Attention ! PHP s'exécute coté serveur et non coté client. Il ne vous sera donc d'aucune utilité pour ce problème. Regarder plutôt du coté de JavaScript.

21.16 Comment coloriser la scrollbar du navigateur

Attention ! PHP s'exécute coté serveur et non coté client. Il ne vous sera donc d'aucune utilité pour ce problème. Regarder plutôt du coté des feuilles de style.

21.17 Où trouver la charte du fciwap

Archive-Name: fr/chartes/comp.infosystemes.www.auteurs.php

---------------
CHARTE DU FORUM
---------------

NOM : fr.comp.infosystemes.www.auteurs.php
STATUT : Non modéré
DESCRIPTION : le langage PHP Hypertext Processor.
LANGUE : français


OBJET :

Ce forum accueillera avec bienveillance toutes les discussions concernant
le langage PHP et son utilisation lors de développement d'applications. Les
problèmes de configuration et de sécurité de PHP sur les serveurs pourront
aussi y être abordés.

PHP est un langage interprété gratuit relativement simple à maîtriser pour
qui connaît un peu la programmation. Il permet aux concepteurs de sites web
de réaliser au sein de pages HTML, en toute sécurité pour les serveurs qui
les hébergent, des applications nécessitant normalement l'hébergement de
CGI spécifiques, comme la gestion de bases de données sur le serveur, la
réalisation dynamique de pages HTML, l'envoi automatique de courriers
électroniques, la gestion de formulaires complexes, l'élaboration de
moteurs de recherche, etc. Pour en savoir plus : http://fr.php.net.


MOTIVATION :

Aucun forum de discussion francophone n'est actuellement dédié à PHP, qui
connaît pourtant, en raison de ses qualités (sécurité, facilité
d'utilisation, puissance) et de sa gratuité, un succès croissant auprès des
concepteurs de sites web, professionnels comme amateurs. Ce langage étant
puissant mais plutôt mal documenté, un forum lui étant consacré aiderait
certainement ses utilisateurs à partager leurs expériences, et favoriserait
sa diffusion.

Ce forum n'est pas destiné à recevoir des annonces de création de sites.
Celles-ci seront postées sur fr.comp.infosystemes.www.pages-perso


QUELQUES RAPPELS DE BON USAGE :

Bien entendu les consignes habituelles de la hiérarchie fr.* (francophonie,
pas de chaînes de lettres) s'appliquent. En particulier ce groupe n'est pas
destiné à recevoir de la publicité.


----------------
FIN DE LA CHARTE
----------------

21.18 Existe t-il une instruction goto en PHP

Non !

21.19 Quelle est la différence entre \n, \r\n et \r

Il s'agit ici de code de retour à la ligne.
Mais ces codes dépendent de l'OS.

On peut résumer la chose ainsi :

- Unix : \n
- DOS/Windows : \r\n
- Mac OS : \r

21.20 Où trouver des informations sur l'API de Zend

Principalement sur le site de Zend.
Quelques liens sur ce sujet :

http://www.zend.com/zend/api.php
http://www.zend.com/apidoc

21.21 Qu'est-ce que PEAR

PEAR désigne PHP Extension and Application Repository.
Il peut être vu comme l'équivalent du CPAN (Comprehensive Perl Archive Network) du monde Perl.

Les buts sont multiples :

- faciliter la diffusion de class et de librairies
- encourager le partage du code entre développeurs
- définir des standards afin d'aider les développeurs à écrire du code portable et réutilisable

Pour en savoir plus :
http://pear.php.net
http://php.net/manual/en/pear.php

21.22 Existe t-il des standards ou des normes concernant le codage en PHP

Officiellement non. Officieusement oui.

On peut citer :

PHP Coding Standard : http://utvikler.start.no/code/php_coding_standard.html
PEAR Coding Standards : http://php.net/manual/fr/pear.standards.php

A terme, il est probable que les recommandations de PEAR deviendront un standard.

21.23 Comment exécuter du code contenu dans une chaine

A l'aide de la fonction eval().

Exemple :

<?php
$chaine="bonjour";
$code="echo strrev($chaine)";
eval ($code);
?>
Documentation :
http://php.net/manual/fr/function.eval.php

21.24 Comment exécuter une commande système

Les solutions sont multiples. On peut citer l'utilisation des fonctions exec(), system(), sans oublier l'utilisation d'un opérateur d'exécution particulier : backtick (guillemet oblique `).

L'exemple suivant fait appel à la commande "uname -a" disponible sous Unix :

<?php
// avec exec()
echo exec("uname -a"); 
echo "\n";
// avec system()
echo system("uname -a"); 
// avec l'opérateur d'exécution
`uname -a`; 
?>
Notez qu'exec() ne retourne que la dernière ligne du résultat. A l'inverse la fonction system() retourne l'ensemble du résultat dans un tableau. Quant à l'opérateur d'exécution, il retourne lui aussi l'ensemble du résultat qui peut-être stocké dans variable.

Documentation :
http://www.php.net/manual/fr/function.exec.php
http://www.php.net/manual/fr/function.system.php
http://www.php.net/manual/fr/language.operators.execution.php

21.25 Comment paramètrer la durée d'expiration d'une page

A l'aide de la fonction header().

Exemple :

<?php
header ("Expires: Mon, 9 Apr 2001 07:00:00 GMT");
...
?>
Documentation :
http://www.php.net/manual/fr/function.header.php

21.26 La présence de commentaires dans un script influence t-il les performances

Non, c'est tout à fait négligeable.
Vous pouvez donc vous lâcher :)

21.27 Puis-je passer des arguments à un script exécuté en ligne de commande

Oui.
Dans ce cas, vous récupérez le nombre d'argument dans $argc et l'ensemble des arguments dans le tableau $argv[].

Exemple :

<?php
echo "Nombre d'argument : ".$argc."\n";
while(list($key,$val)=each($argv)) {
echo $key."->".$val."\n";
}
?>
L'exécution du script avec les arguments suivant,

$php -q test.php3 a b c

Retournera,

Nombre d'argument : 4
0->test.php3
1->a
2->b
3->c

Notez que le nom du script est considéré comme un argument (le premier, indicé 0).

21.28 Est-il possible de mettre fin à un script

Oui. A l'aide des fonctions exit() ou die().

Documentation :
http://www.php.net/manual/fr/function.exit.php
http://www.php.net/manual/fr/function.die.php

21.29 Comment exécuter un script PHP en ligne de commande sans interpréteur PHP

Une méthode consiste à utiliser le navigateur texte lynx.

Si votre script n'est pas supposé vous retourner une page HTML formatée, mais sert juste à exécuter un script réalisant par exemple, une insertion de données dans une base, un calcul, un backup, etc., vous pouvez faire ceci :

$lynx -dump "http://localhost/votrescript.php" > /dev/null

Si par contre votre script est supposé vous retourner une page HTML formatée, par exemple dans le cas ou vous cherchez à figer régulièrement une page afin de décharger votre serveur, etc., vous pouvez faire ceci :

$lynx -source "http://localhost/votrescript.php" > mapage.html

21.30 Que désigne CSV

CSV désigne "Comma Separated Values".


22. PHP : Erreurs

Contenu de cette section

22.1 Parse error: parse error in xxxx.php on line y

Typique d'une erreur de syntaxe.
Vérifiez si vous n'avez pas oublié un ; (point virgule) en fin de ligne. Ou encore un $ (dollar) devant le nom d'une variable.
N'hésitez pas à contrôler les lignes avoisinantes. L'erreur se trouve souvent juste au-dessus.

22.2 Warning: Oops, php_SetCookie called after header has been sent in xxxx.php on line y

Vous avez tenté d'initialiser un cookie après que l'entête HTTP soit envoyé au client.
Vérifiez si une sortie (echo, print, message d'erreur) ne se fait quelques temps avant.

22.3 Warning: MySQL Connection Failed: Access denied for user: ....

Erreur de connexion à la base MySQL.
Vérifiez si host, user et password sont corrects.

22.4 Warning: 0 is not a MySQL result index in xxxx.php on line y

Erreur probable au niveau de la requête SQL.
Vérifiez votre requête SQL, en particulier les champs manipulés, le nom de ou des tables impliquées, etc.
Un petit truc : il est souvent pratique de stocker ses requêtes dans un chaine. Exemple :

$requete="SELECT truc FROM ma_table WHERE id=bidule";
$result = mysql_db_query($base, $requete);

En cas de problème, faire un print $requete juste après l'avoir initialisé. Une relecture de la requête en clair, permet souvent de voir l'erreur.

Et si l'erreur n'est toujours pas visible, balancez cette requête au formidable outil qu'est phpMyAdmin. Il vous aidera dans une certaine mesure à trouver votre erreur.

22.5 Warning: Variable $zzzz is not an array or string in xxxx.php on line y

Vous tentez de manipuler une valeur numérique avec une fonction dédiée aux chaines ou aux tableaux.

22.6 Warning: Variable $zzzz is not an array or object in xxxx.php on line y

Vous tentez de manipuler une valeur numérique avec une fonction dédiée aux tableaux ou aux objets.

22.7 Warning: Cannot add header information headers already sent in xxxx.php on line y

Vous avez tenté d'effectuer un Header après que l'entête HTTP ait envoyé au client.
Vérifiez si une sortie (echo, print, message d'erreur) ne se fait quelques temps avant.

22.8 Fatal error: Maximum execution time exceeded in xxxx.php on line y

PHP dispose d'un mécanisme permettant de se prémunir des scripts susceptibles d'engendrer un temps d'exécution trop important pouvant saturer un serveur. Par défaut, ce temps est de 30 secondes.

Dans la pratique, cette erreur est souvent révélatrice,

- d'un traitement mal implémenté : algorithme perfectible,
- d'une solution d'hébergement inadaptée à la problématique : à ce titre, les hébergeurs proposant des offres en co-hosting ou gratuits sont dans l'obligation de se protéger contre ce type de problème afin de ne pas pénaliser les autres sites hébergés sur le même serveur,
- d'une utilisation de PHP dans le cadre d'une approche souvent éloignée des réalités du Web : abandonnez toutes velléités de développer un moteur Quake en PHP avec la GD.
- d'une magnifique boucle infinie : vérifiez que l'indice d'un while est bien incrémenté par exemple.

Etudions quelques solutions pour palier à ce problème.

Méthode 1 :

Si vous disposez d'une maîtrise totale de votre plate-forme d'hébergement, vous pouvez opter pour la solution de facilité consistant à modifier le php.ini afin de repousser voir éliminer cette limitation. Pour cela, regardez le paramètre max_execution_time. Si la valeur est à 0, vous levez toutes limites.

Méthode 2 :

Dans la mesure ou PHP ne s'exécute pas en safe mode, vous pouvez aussi utiliser la fonction set_time_limit(). Cette fonction permet de fixer dynamiquement le temps d'exécution maximum.
Attention, il est bon de bien comprendre le fonctionnement de set_time_limit(). En fait, cette fonction permet en quelque sorte de reinitialiser le compteur de temps d'exécution. Vous devez donc imaginer qu'au top départ d'un script, ce compteur débute à 0 et que s'il atteint 30 secondes, le script sera coupé (paramétrage par défaut). Mais si en cours d'exécution on fait appel à set_time_limit() avec 0 en argument, on remet ce compteur à 0. Cette action accorde donc à nouveau 30 secondes d'exécution.
Ainsi, si vous êtes amené à boucler des milliers (dizaines de milliers) de fois dans une section de code effectuant un traitement qui, cumulé, nécessiterait plus de 30 secondes d'exécution, il semblerait opportun de placer un set_time_limit(0) lorsque l'on rentre dans la boucle.

Méthode 3 :

Revoir l'algorithme et le bien fondé du traitement que l'on tente d'effectuer. Optimisez l'ensemble, voir, découpez la problématique.

Documentation :
http://www.php.net/manual/fr/function.set-time-limit.php

22.9 Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate x bytes) in yyyy.php on line z

PHP dispose d'un mécanisme permettant de se prémunir des scripts susceptibles d'engendrer une consommation mémoire trop importante pouvant saturer un serveur. Par défaut, une limite est fixée à environ 8 Mo (8388608 octets).

Là encore, à l'image d'une erreur de type "Maximum execution time exceeded...", les causes sont souvent identiques (algorithme perfectible, solution d'hébergement inadaptée, etc.).

Plusieurs solutions existent afin de remédier à cette limitation, la plus simple étant d'éditer et modifier le php.ini.

22.10 Fatal Error: Call to undefined function: xxxx() in yyy.php on line z

La fonction que vous appelez n'existe pas. Ce peut-être une fonction liée à une librairie externe (GD, Zlib, PDF, etc.). Dans ce cas, un simple phpinfo() vous renseignera sur les paramètres de compilation de votre version de PHP.
Peut-être s'agit-il sinon d'une de vos propres fonctions. Vérifiez alors qu'elle existe.
Et dans tous les cas, contrôlez de plus prêt le nom de la fonction appelée (orthographe, etc.). Une erreur de frappe est vite arrivée.

22.11 Fatal Error: Cannot redeclare xxxx() in yyy.php on line z

Vous avez certainement déclaré plusieurs fois la même fonction. Contrôlez à nouveau l'ensemble des fonctions que vous avez créées. Et n'hésitez pas à vérifier également dans les éventuels fichiers inclus. C'est souvent dans un script secondaire que vous trouverez le doublon.
Veillez aussi à ne pas utiliser le nom d'une fonction propre à PHP ou à l'une de ses librairies.

22.12 Fatal error: Input in flex scanner failed in xxxx on line y

Vérifiez vos include et require.
Il y a fort à croire que vous avez indiqué un chemin incomplet (genre /usr/local/ sans préciser de fichier).

22.13 Puis-je éviter l'affichage des Warning

Oui ! Il suffit de placer un @ (arobase) devant la fonction qui provoque ce warning. Exemple :

<?php
... 
$nombre=0; 
print $nombre[0]; 
... 
?>
Va renvoyer,

Warning: Variable $nombre is not an array or string in xxxx.php on line y

Afin d'éviter l'affichage de ce Warning (parfaitement justifié !), vous pouvez faire ceci,

<?php
... 
$nombre=0; 
@print $nombre[0]; 
... 
?>

22.14 J'obtiens un Parse error étrange en fin de page

Vous avez certainement oublié de fermer un bloc par une accolade. Vérifiez les séquences if, while, etc. Et surtout, pensez à indenter votre code si votre éditeur ne le fait pas automatiquement :)

22.15 Je viens d'isoler un bug de PHP : que faire

En premier lieu, vérifier (deux fois plutôt qu'une) si ce bug provient bien de PHP et non de votre code.
Si ce bug semble bien imputable à PHP (fonction envoyant un résultat absurde, problème de compilation avec telles ou telles librairies, etc.) vous pouvez vous rendre sur http://bugs.php.net pour de plus amples informations. Véritable base de connaissance des bugs référencés de PHP, vous y trouverez peut-être quelques explications. Vous pourrez également y référencer votre problème en dernière limite.


23. PHP : Sécurité

Contenu de cette section

23.1 Où puis-je trouver des informations sur la sécurité liée à PHP

Allez sur http://www.php.net/manual/fr/security.php pour plus d'infos.

23.2 Les fichiers .inc présentent-ils un risque

Oui ! Et il est énorme.

Par défaut, les scripts portant l'extension .inc ne sont pas "parsés" (interprétés). Un utilisateur malveillant peut donc facilement télécharger de tels scripts depuis un simple navigateurs. Ces scripts comportant parfois des informations sensibles (user et password de connexion à une base), il est préférable de ne pas les utiliser.

Une première méthode, rapide et simple, consiste à les renommer systématiquement en .inc.php.

Il est également possible, en fonction des droits dont vous disposez sur le serveur qui héberge vos scripts, de placer ces scripts en dehors de l'arborescence Web.

Enfin, vous pouvez aussi interdire leur téléchargement à l'aide de la directive d'Apache. Les lignes suivantes, placées par exemple dans un .htaccess, règlent le problème des .inc à merveille :

            order deny,allow
            deny from all
			

23.3 Est-il possible de voir les sources de mes scripts

A priori non.

Ceci dit, si vous utilisez IIS3, IIS4 ou PWS 4.0, deux failles connues existent. Découvertes par les développeurs ASP, elles concernent également PHP.

Le "PHP Dot Bug" :
Si certains caractères sont présents en fin d'URL, il existe un risque de pouvoir visualiser le source d'un script PHP.

Le "Alternate Data Streams"
Suivant le même principe, si la séquence "::$DATA" figure en fin d'URL, il existe un risque de pouvoir visualiser le source d'un script PHP.

Afin de corriger ces problèmes,

Sous IIS 3 et 4
http://support.microsoft.com/support/kb/articles/Q233/3/35.ASP

Sous PWS 4.0
http://support.microsoft.com/support/downloads/DP4044.asp

23.4 Comment obtenir le login et le mot de passe saisies suite à la mise en place d'un .htaccess

Le login est stocké dans la variable $PHP_AUTH_USER et le mot de passe dans la variable $PHP_AUTH_PW.

23.5 Comment chiffrer et déchiffrer des données

En utilisant la librairie mcrypt (ftp://mcrypt.hellug.gr/pub/mcrypt/libmcrypt/).

Documentation :
http://www.php.net/manual/fr/ref.mcrypt.php

23.6 Existe t-il des virus en PHP

Parait-il :p

Le premier virus lié à PHP, PHP.Pirus, date de novembre 2000. Depuis, une demi-douzaine semble avoir été isolés.
On peut en particulier citer :

PHP.Pirus : http://www.symantec.com/avcenter/venc/data/php.pirus.html
PHP.io : http://www.symantec.com/avcenter/cgi-bin/virauto.cgi?vid=20562
PHP.io.inc : http://www.symantec.com/avcenter/cgi-bin/virauto.cgi?vid=20564
PHP.Neworld : http://www.symantec.com/avcenter/cgi-bin/virauto.cgi?vid=22085
PHP.Sysbat : http://www.symantec.com/avcenter/cgi-bin/virauto.cgi?vid=22086

Notez tout de même qu'un schéma de propagation en environnement Web (client / serveur) semble difficile voir impossible. Hormis, peut-être, en utilisant une grosse faille coté client. Mais dans ce cas, cette faille pourrait certainement être exploitée autrement qu'avec PHP. Bref, vous pouvez naviguez sans crainte sur des sites dynamiques en PHP. Inutile de fuir.

De plus, les communiqués autour de ces virus PHP sont souvent à prendre avec mesure. PHP est un langage qui devient de plus en plus populaire et qui représente par là même un marché émergeant pour les concepteurs d'anti-virus. Bref, attention aux annonces marketing :)

Mais restez tout de même vigilant. Surtout si vous êtes sous Windows et que vous disposez d'une version de PHP installé sur votre poste.

23.7 Comment générer un identifiant unique

Les solutions sont nombreuses. L'une d'elle utilise la fonction uniqid().

Exemple :

<?php
$id = md5 (uniqid (rand()));
echo $id;
?>
Documentation :
http://www.php.net/manual/fr/function.uniqid.php

24. Formulaires

Contenu de cette section

24.1 Dois-je traiter un formulaire en plusieurs scripts

Vaste sujet.

Le développeur débutant aura tendance à développer un premier script en charge d'implémenter le formulaire, et un second en charge de traiter les éléments saisis.

Si cette approche fonctionne, elle s'avère souvent lourde à maintenir et à faire évoluer, du fait de la multiplication des scripts.

24.2 Comment traiter un formulaire avec un seul script

En pratique, une problématique nécessitant la mise en oeuvre d'un formulaire comporte souvent les points suivants :

- Implémenter le formulaire lui même,
- Prendre en charge un minimum de contrôle sur la saisie,
- Effectuer une ou plusieurs actions suivant que la saisie est validée ou non,
- Afficher un message en cas de succès ou d’échec de la saisie.

Dans le but de limiter le nombre de script, nous allons donc chercher à effectuer l’ensemble de ces opérations par un seul et unique script.

Nous pouvons faire émerger une structure globale (squelette de script), pouvant ressembler à ceci,

<html>
<body> 
… 
<?php 
// Est-ce la première fois que l’on passe dans le script 
// NON 
if(NON) { 
// Contrôle sur la saisie 
… 
// Si la saisie est correcte : SAISIE VALIDE 
if(SAISIE VALIDE) { 
// Actions diverses 
… 
// Message 
… 
} 
// Sinon : SAISIE INVALIDE 
else { 
// Actions diverses 
… 
// Message 
… 
} 
} 
// OUI ou SAISIE INVALIDE 
if(OUI ou SAISIE INVALIDE) { 
?>

<form method="post" action="script.php3"> 
… 
<input type="hidden" name="formulaire" value="ok"> 
</form> 
<? 
} 
?>
… 
</body> 
</html>
A ce niveau de notre étude, une question peut venir à l’esprit : comment savoir si nous sommes ou non déjà passé dans le formulaire. De nombreuses méthodes existent. Celle que nous retiendrons consiste à passer un champ caché dans notre formulaire et de tester si la valeur associée est bien initialisée ou non au début de notre script : si oui, c’est que nous sommes déjà passé dans le formulaire. Sinon, c’est que le formulaire est chargé pour la première fois et qu’il n’y a donc aucun traitement particulier à faire. Ceci explique la présence de la ligne,

<input type="hidden" name="formulaire" value="ok"> juste avant la balise </form>.

Vous pouvez trouver un article plus détaillé sur cette problématique, sur PHPIndex : http://archives.phpindex.com/articles/articles_lire.php3?element=27

24.3 Suis-je limiter à 255 caractères par la méthode GET

Non ! C'est totalement faux.

Cette mythique restriction (voir la RFC 2616 - HTTP 1.1) correspond à une limite basse en dessous de laquelle une application ne serait pas compatible avec le protocole HTTP 1.1.

En pratique, il en va heureusement tout autrement.

En fait, l'expérience montre que la limite du GET dépend fortement du client (navigateur IE, Netscape, Lynx, etc.). Mais aussi du serveur (Apache, Xitami, etc.). A ce titre, Apache limite la taille du GET à 8192 octets. Mais c'est paramétrable (directive LimitRequestLine).

Bref, IE et Netscape d'un coté, Apache de l'autre, sont parfaitement capables d'échanger plus de 255 caractères par la méthode GET.

24.4 Comment lister les champs d'un formulaire

A l'aide des tableaux $HTTP_POST_VARS et $HTTP_GET_VARS. Ces tableaux, suivant la méthode employée (POST ou GET), contiennent l'ensemble des paires nom/valeur d'un formulaire (suite au submit).

Exemple :

<?php
...
while (list($key,$value) = each($HTTP_POST_VARS)) {
print $key."->".$value;
}
...
?>

24.5 La variable $HTTP_POST_VARS ne semble pas fonctionner

La version de PHP que vous utilisez n'a sans doute pas été compilée avec l'option --enable-track-vars. Un simple phpinfo() peut vous renseigner sur ce point.

Vous pouvez y remédier en plaçant <?php_track_vars?>en début de script.

24.6 Qu'est-que la directive magic_quotes_gpc

Derrière ce terme barbare se cache une directive de configuration directement liée à PHP. Cette directive provoque l'ajout ou non d'un caractère d'échappement, le \ (anti-slash), devant les quotes simples (') ou doubles (") des valeurs que vous choisirez de faire transiter par les méthodes GET, POST ou par les Cookies.

D'où la terminaison de cette directive : g désignant GET, p désignant POST, et c désignant Cookie.

Cette directive est initialisée dans le php.ini. Un simple phpinfo() vous permettra de connaître sa valeur.

En simplifiant :

Si magic_quotes_gpc est initialisée à 1 (On), les quotes simples ou doubles seront échappées par un antislash :

- pas d'opération particulière à faire si vous décidez de stocker vos données dans une base MySQL à l'issue d'une saisie par un formulaire
- vous devrez par contre faire un stripslashes() si vous affichez à nouveau vos données dans ce formulaire (en vue d'y faire des corrections, par exemple).

A l'inverse, si magic_quotes_gpc est initialisée à 0 (Off), les quotes simples ou doubles ne seront pas échappées par un anti-slash :

- vous devrez faire un addslashes() si vous décidez de stocker vos données dans une base MySQL à l'issue d'une saisie par un formulaire
- pas d'opération particulière à faire si vous affichez à nouveau vos données dans ce formulaire.

Ajoutons pour finir que la problématique du magic_quote_gpc est vaste et qu'il serait délicat d'en parler en détail dans ce document. Veillez seulement à ne pas perdre de vue l'influence de cette directive.

Documentation :
http://www.php.net/manual/fr/function.addslashes.php
http://www.php.net/manual/fr/function.stripslashes.php

24.7 Comment connaître la valeur de la directive magic_quote_gpc

Plusieurs solutions existent.
Un simple phpinfo() pourra vous renseigner.
Vous pouvez aussi utiliser la fonction get_magic_quotes_gpc().

Documentation :
http://www.php.net/manual/fr/function.get-magic-quotes-gpc.php

24.8 Puis-je modifier la valeur de la directive magic_quote_gpc

Oui.
Si vous avez le contrôle de votre plate-forme de développement, vous pouvez modifier cette directive dans le php.ini.
Si vous êtes sous Apache, vous pouvez aussi la modifier localement. C'est à dire, opter pour un paramétrage à On (1)sur l'ensemble de votre arborescence Web, et à Off (0) sauf sous tel ou tel répertoire. Ou inversement, évidement.

Une méthode consiste à placer la ligne suivante dans un simple .htaccess.

php_magic_quotes_gpc on

ou,

php_magic_quotes_gpc off

24.9 Comment traiter les champs texte

L'exemple suivant vous y aidera peut-être :

<html>
<body>
<?php
if($chaine)
    echo "chaine : $chaine";
?>
<form method=post action="texte.php">
<input type=text name=chaine size=16 maxlength=255 value="<?php echo htmlentities($chaine) ?>">

<br>
<input type=submit value=Valider>
</form>
</body>
</html>
Attention :
Ce code n'est qu'un exemple à titre indicatif et pédagogique. Le but n'est en aucun cas de proposer une solution optimisée, souvent fortement dépendante de la problématique réelle à traiter.

24.10 Comment traiter les champs textearea

L'exemple suivant vous y aidera peut-être :

<html>
<body>
<?php
if($texte) 
    echo "text : <br>".nl2br($texte); 
?>
<form method=post action="textarea.php"> 
<textarea name=texte cols=20 rows=10><?php echo $texte ?></textarea> 
<br>

<input type=submit value=Valider>
</form>
</body>
</html>
Attention :
Ce code n'est qu'un exemple à titre indicatif et pédagogique. Le but n'est en aucun cas de proposer une solution optimisée, souvent fortement dépendante de la problématique réelle à traiter.

24.11 Comment traiter les cases à cocher

L'exemple suivant vous y aidera peut-être :

<html>
<body>
<?php
if($choix1)
    echo "Choix 1 : Oui";
else
    echo "Choix 1 : Non";
echo " / ";
if($choix2)
    echo "Choix 2 : Oui";
else
    echo "Choix 2 : Non";
?>
<form method=post action="case.php"> 
<input type="checkbox" name="choix1" value="Oui" <?php if($choix1) echo "checked" ?>>Choix 1 
<br>
<input type="checkbox" name="choix2" value="Oui" <?php if($choix2) echo "checked" ?>>Choix 2 
<br>

<input type=submit name=submit value=Valider>
</form>
</body>
</html>
Attention :
Ce code n'est qu'un exemple à titre indicatif et pédagogique. Le but n'est en aucun cas de proposer une solution optimisée, souvent fortement dépendante de la problématique réelle à traiter.

24.12 Comment traiter les boutons radio

L'exemple suivant vous y aidera peut-être :


<html>
<body>
<?php
if($choix)
    echo "Choix : $choix";
?>
<form method=post action="bouton.php"> 
<input type="radio" name="choix" value="Oui" <?php if($choix=="Oui") echo "checked" ?>>Oui 
<br>
<input type="radio" name="choix" value="Non" <?php if($choix=="Non") echo "checked" ?>>Non
<br>

<input type="radio" name="choix" value="Peut-être" <?php if($choix=="Peut-être") echo "checked" ?>>Peut-être 
<br>
<input type=submit name=submit value=Valider>
</form>
</body>
</html>
Attention :
Ce code n'est qu'un exemple à titre indicatif et pédagogique. Le but n'est en aucun cas de proposer une solution optimisée, souvent fortement dépendante de la problématique réelle à traiter.

24.13 Comment traiter les listes

L'exemple suivant vous y aidera peut-être :

<html>
<body> 
<?php
if($liste)
    echo "Choix : $liste";
?>
<form method=post action="liste.php"> 
<select name=liste size=1> 
<option value="choix1" <?php if($liste=="choix1") echo "selected" ?>>Choix 1 

<option value="choix2" <?php if($liste=="choix2") echo "selected" ?>>Choix 2 
<option value="choix3" <?php if($liste=="choix3") echo "selected" ?>>Choix 3 
<br> 
<input type=submit name=submit value=Valider> 
</form> 
</body> 
</html>
Attention :
Ce code n'est qu'un exemple à titre indicatif et pédagogique. Le but n'est en aucun cas de proposer une solution optimisée, souvent fortement dépendante de la problématique réelle à traiter.

24.14 Comment traiter les listes multiples

L'exemple suivant vous y aidera peut-être :

<html>
<body> 
<?php
if($liste) {
    while(list($key,$val)=each($liste)) {
        echo "Choix : $val";
        echo "<br>";
    }
}
else
    $liste=array();
?>

<form method=post action="multiple.php"> 
<select name=liste[] size=3 multiple> 
<option value="choix1" <?php if(in_array("choix1",$liste)) echo "selected" ?>>Choix 1 
<option value="choix2" <?php if(in_array("choix2",$liste)) echo "selected" ?>>Choix 2 
<option value="choix3" <?php if(in_array("choix3",$liste)) echo "selected" ?>>Choix 3
<option value="choix4" <?php if(in_array("choix4",$liste)) echo "selected" ?>>Choix 4 
<option value="choix5" <?php if(in_array("choix5",$liste)) echo "selected" ?>>Choix 5 

<br> 
<input type=submit name=submit value=Valider> 
</form> 
</body> 
</html>
Attention :
Ce code n'est qu'un exemple à titre indicatif et pédagogique. Le but n'est en aucun cas de proposer une solution optimisée, souvent fortement dépendante de la problématique réelle à traiter.

24.15 Comment traiter le upload

La documentation est assez claire sur ce point et de nombreux articles abordent ce sujet.
On peut en particulier citer les ressources suivantes :

http://www.php.net/manual/fr/features.file-upload.php
http://www.zend.com/zend/spotlight/uploading.php
http://www.phpbuilder.com/columns/bealers20000904.php3


25. Outils et solutions

Contenu de cette section

25.1 Editeurs

On peut citer,

Sous Windows,

- UltraEdit : http://www.ultraedit.com/downloads/index.html
- PHPEd : http://www.soysal.com/PHPEd/
- HtmlTool : http://freedani.free.fr/htmltool.php3
- EditPlus : http://www.editplus.com/
- HTML Kit : http://www.chami.com/html-kit/
- TextPad : http://www.textpad.com/
- PHPCoder : http://www.phpide.de/
- HomeSite : http://www.allaire.com/Products/HomeSite/
- PHP Script Editor : http://www.pc-service-boerner.de/PHPScriptEditor.htm
- phpEdit : http://www.phpedit.com/
- 1st Page 2000 : http://www.evrsoft.com/1stpage/
- CuteHTML : http://www.globalscape.com/products/cutehtml/
- DreamWeaver : http://www.macromedia.com/software/dreamweaver/
- Editpad : http://www.editpadpro.net/editpadclassic.html
- GWD : http://www.gwdsoft.com/
- PrimalSCRIPT : http://www.sapien.com/PrimalSCRIPT.htm
- Jed : http://space.mit.edu/~davis/jed.html
- FTE (Folding Text Editor) : http://www.kiss.uni-lj.si/~k4fr0235/fte/
- VIM : http://www.vim.org/
- Emacs : http://www.gnu.org/software/emacs/
- NEdit : http://www.nedit.org/
- PHP mode for Emacs http://sourceforge.net/projects/php-mode/
- ConTEXT : http://www.fixedsys.com/context/

Sous Unix,

- VIM : http://www.vim.org/
- Code Crusader : http://www.coffeecup.com/select/editor.html
- Quanta+ : http://sourceforge.net/projects/quanta/
- asWedit : http://www.advasoft.com/
- BlueFish : http://bluefish.openoffice.nl/
- Jed : http://space.mit.edu/~davis/jed.html
- FTE (Folding Text Editor) : http://www.kiss.uni-lj.si/~k4fr0235/fte/
- NEdit : http://www.nedit.org/
- PHP mode for Emacs http://sourceforge.net/projects/php-mode/

Sous Mac OSX,

- BBEdit : http://www.barebones.com/products/bbedit.html
- VIM : http://www.vim.org/

25.2 Frontal SGBD

On peut citer,

phpMyAdmin : http://phpwizard.net/projects/phpMyAdmin/index.html
phpPgAdmin : http://www.greatbridge.org/project/phppgadmin/projdisplay.php
phpOracleAdmin : http://phporacleadmin.org/
phpSybaseAdmin : http://www.itlab.musc.edu/phpSybaseAdmin/Documentation.html

25.3 IDE

On peut citer,

Zend IDE : http://www.zend.com/store/products/zend-ide.php
KPHPDevelop : http://www.kphpdev.com/

25.4 Cache

Zend Cache : http://www.zend.com/store/products/zend-cache.php
AfterBURNER*Cache : http://bwcache.bware.it/cache.htm
APC Alternative PHP Cache : http://apc.communityconnect.com/
phpCache : http://0x00.org/phpCache/

25.5 Optimiseur

On peut citer,

Zend Optimzer : http://www.zend.com/store/products/zend-optimizer.php

25.6 Encodeur

On peut citer,

Zend Encoder : http://www.zend.com/store/products/zend-encoder.php
PHP Bytecode Compiler : http://pbc.sourceforge.net/
PHPCompiler : http://www.deskcode.com/phpcompiler/

25.7 Debogueur

On peut citer,

Zend IDE : http://www.zend.com/store/products/zend-ide.php
DBG PHP Debugger : http://dd.cron.ru/dbg/

25.8 Sessions

On peut citer,

PHPLib : http://phplib.netuse.de/
BDSM : http://www.lazycat.org/BDSM/
dbSessions : http://www.phpheaven.net/resources/libraries/dbSessions/
PostgreSQL Session Handler : http://www.csh.rit.edu/~jon/projects/php/pgsql_session_handler/
sqlsession : http://ecom1.onestop.net/~joshm/sqlsession.html

25.9 Abstraction SGBD

On peut citer,

PHPLib : http://phplib.netuse.de/
dbMysql : http://www.phpheaven.net/resources/libraries/dbMysql/
PDAC : http://www.dsnet.net/~cris/dac.html
PHP-MySQL-Lib : http://www.claws-and-paws.com/software/

25.10 Commerce

On peut citer,

- I-Store : http://www.w3-concept.net/
- FishCartSQL : http://www.fishcart.org/

25.11 Webmail

On peut citer,

Akasha 1.3 : http://sourceforge.net/projects/akasha/
BasiliX : http://www.basilix.org/
DragonFlyMail : http://www.dflytech.com/products/dragonflymail/
IMP : http://www.horde.org/imp/
JAWmail : http://jawmail.sourceforge.net/
kenstermail : http://sourceforge.net/projects/kenstermail/
LearnLoop : http://www.learnloop.org/
Netmania : http://www.netmania.com
MyPhPim : http://sourceforge.net/projects/myphpim/
NOCC : http://nocc.sourceforge.net/
oMail-admin : http://omail.omnis.ch
Phorecast : http://ciaweb.net/free/phorecast/
PHPwebmail : http://www.bmpsystems.com/downloads/linux/webmail-2.1.tgz
Postaci : http://www.trlinux.com/
TMail : http://www.groovin.net/tmail/
VAMP Webmail : http://undead.thegraveyard.org/?topic=vamp
vpopmail : http://www.inter7.com/vpopmail/
werkmail : http://werkmail.sourceforge.net/

25.12 Support Technique

Il existe quelques solutions afin d'obtenir du support autour de PHP. A ce titre :

Zend propose officiellement une telle offre : le Zend SOS Incident Support.
Les grandes lignes sont disponibles sur :
http://www.zend.com/store/products/zendsupport.php

Plus proche de nous, certaines sociétés de services intervenant (entre autre) sur des problématiques liées à PHP sont à même de proposer ce type de service. C'est souvent officieux, mais ca se fait. Et cela va se généraliser de plus en plus.

Ne pas négliger l'importante activité et réactivité de la "scène PHP" mondiale et française.
Le fciwap (fr.comp.infosystemes.www.auteur.php) ne développe t-il pas, entre autre, une forme de support technique ? Environ 35.000 posts par an pour 10.000 threads initiés. Pas mal non ?
Sans compter que les threads orphelins (sans réponse) sont rares (et parfois justifiés).

Ceci étant, il est clair que cette dernière solution n'est pas vraiment un élément de réponse fiable dans le cadre d'une proposition commerciale. C'est probable.

25.13 Hébergement

Vaste sujet. Voici néanmoins quelques éléments de réponses.

Il faut en premier lieu distinguer les hébergeurs gratuits et les hébergeurs professionnels. Et pour ces derniers, dissocier les offres d'hébergement en co-hosting de ceux dédiés.

Notons aussi que si certains hébergeurs proposent PHP, il n'en va pas toujours de même pour MySQL ou tout autres SGBD. C'est en particulier le cas des principaux hébergeurs gratuits. De plus, ces derniers imposent parfois la présence de bandeaux publicitaires.

Enfin, distinguer les hébergeurs proposant PHP3 et ceux proposant PHP4.

Voici une liste non exhaustive d'hébergeurs gratuits :

- Free : http://www.free.fr
- Forez : http://www.forez.com
- Chez : http://www.chez.com
- Multimania : http://www.multimania.com
- Hébergement Gratuit : http://www.hebergement-gratuit.com

Voici une liste non exhaustive d'hébergeurs professionnels/co-hosting :

- Online : http://www.online.fr
- Nexen : http://www.nexen.fr
- OVH : http://www.ovh.com
- Amen : http://www.amen.fr
- Claranet : http://www.claranet.fr

Voici une liste non exhaustive d'hébergeurs professionnels/dédiés :

- Agarik : http://www.agarik.com
- Claranet : http://www.claranet.fr

Pour une recherche et une sélection plus fine, vous pouvez aussi consulter le site abc-hébergement sur http://www.abchebergement.com/


26. Scripts et applications

Contenu de cette section

26.1 Où trouver des scripts et applications en PHP

On peut citer quelques sites,

- Zend : http://www.zend.com/apps.php
- HotScripts : http://www.hotscripts.com/PHP/
- PHPScripts : http://phpscripts.free.fr/
- Freshmeat : http://freshmeat.net/browse/183/
- PHPIndex : http://archives.phpindex.com/annuaire/annuaire_total.php3?categorie=500

26.2 Forum

On peut citer,

- W-Agora : http://w-agora.araxe.fr/
- Phorum : http://www.phorum.org/
- phpBB : http://www.phpbb.com/

Voir aussi,

HotScripts : http://www.hotscripts.com/PHP/Scripts_and_Programs/Discussion_Boards/
PHPScripts : http://phpscripts.free.fr/?page=scripts&cat=forums
PHPIndex : http://archives.phpindex.com/annuaire/annuaire_partiel.php3?sous_categorie=502&categorie=500

26.3 Chat

On peut citer,

phpMyChat : http://www.phpheaven.net/
ChatZoneSuivante : http://www.zonesuivante.com/
phpLittleChat : http://www.gamate.com/

Voir aussi,

HotScripts : http://www.hotscripts.com/PHP/Scripts_and_Programs/Chat_Scripts/
PHPScripts : http://phpscripts.free.fr/?page=scripts&cat=chats

26.4 Vote

On peut citer,

- SimplePoll : http://www.quake-au.net/php/
- phpAnyVote : http://www.punknews.org/code/
- phpVault : http://www.phpvault.com/

Voir aussi,

HotScripts : http://www.hotscripts.com/PHP/Scripts_and_Programs/Polls_and_Voting/
PHPScripts : http://phpscripts.free.fr/?page=scripts&cat=polls
PHPIndex : http://archives.phpindex.com/annuaire/annuaire_partiel.php3?sous_categorie=511&categorie=500

26.5 Bandeau

On peut citer,

phpAds : http://phpwizard.net/phpAds/
phpAdsNew : http://freshmeat.net/redir/phpadsnew/7941/url_homepage/
BannerAdmin : http://www.arch.f2s.com/downloads/index.php

Voir aussi,

HotScripts : http://www.hotscripts.com/PHP/Scripts_and_Programs/Ad_Management/
PHPScripts : http://phpscripts.free.fr/?page=scripts&cat=bannieres

26.6 Guestbook

On peut citer,

Probook : http://www.devpros.com/
phpMyGB : http://narcolepsy.dhs.org/mysoftware/

Voir aussi,

HotScripts : http://www.hotscripts.com/PHP/Scripts_and_Programs/Guestbooks/
PHPScripts : http://phpscripts.free.fr/?page=scripts&cat=livresdor

26.7 Portail

On peut citer,

phpNuke : http://www.phpnuke.org/
Drupal : http://www.drop.org/
ThatWare : http://www.thatware.org/

Voir aussi,

HotScripts : http://www.hotscripts.com/PHP/Scripts_and_Programs/Portal_Systems/
PHPScripts : http://phpscripts.free.fr/?page=scripts&cat=portails


27. Remerciements

Contenu de cette section

27.1 Globalis Media Systems Team

L'ensemble de la Globalis Media Systems Team :
Frédéric Hovart (fred@globalis-ms.com), Thomas Van Steen (tvs@pulsation.com), Nicolas Biot (nicolas@globalis-ms.com) et Olivier Portier (olivier@globalis-ms.com).

27.2 Sans oublier

Sans ordre de préférence, l'ensemble de personnes m'ayant aidé, conseillé ou soutenu :

- Denis Choteau (denis@choteau.net) qui m'a incité à découvrir PHP,
- John Gallet (john@wanadoo.fr) et Christophe Lauer (clauer@free.fr) pour les discussions toujours enrichissantes autour d'une (ou plusieurs) bière(s),
- Nicolas Hoizey, Thomas Broyer ainsi que l'ensemble des acteurs (actifs et passifs) du fciwap et des lecteurs de cette FAQ,
- Rasmus Lerdorf (The PHP Founding Father).

Sans oublier les éditions CampusPress (http://www.campuspress.fr/) pour le superbe bouquin collector de Leon Artkinson (75 pages dupliquées, 75 pages manquantes). Plus tous ceux que je n'ai pas cité ici.