Page suivante Page précédente Table des matières

3. Utilisation de PHP3

3.1 J'aimerais voir un exemple simple de code php3...

       <html>
       <head>
       <title>Bonjour le monde </title>
        </head>
       <body>
       <h1>Bonjour le monde...
        <?php
        $Hello = "Bonjour le monde";
        printf("<b>$Hello</b><br>");
        ?>
        </body>
        </html>
       

3.2 Comment puis-je concaténer des chaînes de caractères ?

La facon la plus classique de réaliser cette opération est d'utiliser le concaténateur de chaine ".":

<?php
$Sujet = "Je ";
$Verbe = "dis ";
$Cplmt = "bonjour...";
$Phrase = $Sujet . $Verbe . $Cplmt;
echo "$Phrase";
$Phrase = $Phrase . " à tout le monde ";
echo "$Phrase";
?>

Ce code produira cette sortie sur le browser:

Je dis bonjour... Je dis bonjour... à tout le monde 

3.3 PHP change les apostrophes en "\'" comment puis-je l'en empêcher.

Une des méthodes radicale consiste à modifier dans le fichier de configuration php3.ini la ligne magic_quotes_gpc=on en remplacant "on" par off.

Cependant Etienne de Tocqueville répond:
... Du coup, le programme que tu fais n'est plus portable [...] je ne trouve pas cette méthode très propre.

La bonne méthode consiste à laisser magic_quotes_gpc=on et d'utiliser les fonctions stripslashes(string str) qui enlèvera les anti-slash gênants. (Voir aussi la fonction addslashes(string str).
(voir le détail des fonctions dans le PHP3 MANUAL).

3.4 Le quatuor php, apache, imap semble planter.

Mathieu Poumeyrol répond:

L'installateur a tendance à oublier de rajouter une ligne du type:
extension=imap.so
Il oublie systématiquement de mettre LoadModule ... php dans la config d'apache.

Cependant, il faut vérifier d'abord que php fonctionne déjà convenablement.

3.5 J'utilise la PHP librairie et je n'arrive pas à générer de graphe avec la fonction graphique. Pourtant j'ai bien sur mon browser l'apparition du fichier gif et non de l'image.

Jean-Marc Libs répond:

Bon, manifestement tu génères bien le gif, mais tu l'envoies en Conten-type: text/html au lieu de Content-type: image/gif. Pour te le confirmer a toi-même (ou contredire si je me trompe), tu peux tester a la main, avec un telnet sur le port 80, etc. A ma connaissance, cela peut être du a : 1/ Il n'y a pas de Header("Content-type: image/gif") dans le script. Mais tu dis que ce n'est pas le cas. 2/ Ton script envoie quelque chose (du texte, une ligne blanche, n'importe quoi) avant que la commande Header("Content-type: image/gif") soit appelée. Dans ce cas, apache prend sur lui d'envoyer les entêtes HTTP avant d'envoyer le quelque chose en question. Ton Content-type: arrive alors trop tard pour modifier les entêtes. Vérifie donc bien que ta page commence directement par le début de ton script (pas de ligne blanche, pas d'echo de debuggage, rien).
A moins que, comme le fait remarquer Etienne Bernard, le niveau de débuggage dans le php.ini soit suffisant élevé.

3.6 Comment réaliser un moteur de recherche avec PHP3 ?

Regis Scotto répond:

en PHP, ce systeme est realisable, tout depend cependant de la permission des serveurs interroges... A confirmer... Par exemple ceci:

<?
echo "<p>texte contenu dans la page presenta.htm du site
monsieur-biere.com :
<//p>";
$fp = fsockopen ("monsieur-biere.com", 80);
../.. [ Coupe-Coupe] ../..
(extrait de la documentation de Rapidsite.com)
Par contre, cet exemple ne fonctionne pas sur toutes les pages de tous les serveurs, je pense que son fonctionnement dépend de la permission offerte, est ce quelqu'un a été confronté a une impossibilité d'importation a l'aide de cet algo ?

A quoi Jean-Paul Wattiaux répond:

Cela fonctionne, et je crois que ce n'est pas un problème de permission. Simplement l'URL et le nom de fichier doivent être rigoureusement exacts, donc attention aux redirections d'URL et il vaut mieux émuler correctement le protocole HTTP en remplaçant:

    fputs ($fp, "GET /presenta.htm\n");
par:
       fputs($fp,"GET /presenta.htm HTTP/1.0\n\n");
Cela étant les IIS de Microsoft ne répondent pas toujours comme il faut, peut être faut-il aussi envoyer l'en-tête HTTP adhoc pour se faire passer pour Mozilla (je n'ai jamais essayé) Avec des serveurs Apache j'ai par contre 100% de réussite

3.7 Comment vérifiez qu'une variable PHP contient plusieurs fois la même valeur et comment dés lors éliminer les valeurs identiques ?

Jean Marc Libs répond:

Puisque personne n'a d'idée élégante, je vais me permettre de proposer quelque chose de très laid, qui fait ce qui est demande mais sans doute pas pour des valeurs trop nombreuses : (attention: code non teste)

$toto["allo"]=1;
$toto["allo"]=1;
$toto["allo"]=1;
$toto["test"]=1;
$toto["bye"]=1;
while(list($key,)=each($toto)) {
    echo $key;
}

Ca peut depanner, mais si quelqu'un a mieux.

Et sur quoi Régis Scotto et Etienne de Tocqueville répondent:

Régis Scotto:
Sur la même base, le test d'existence de la clef dans le tableau associatif en question, ce n'est pas compliqué a faire, il y a des fonctions pour cela, il suffit de lire un petit peu le manuel ;-)

Etienne de Tocqueville:
Tu m'étonne et tu m'interpelle, là ;-)

J'ai souvent besoin de savoir si l'indice "toto" existe dans un tableau $tab, et je fais :


        if ($tab["toto"])
Malheureusement, bien sûr, ça ne permet pas de voir si la valeur affecté à cet indice est Zéro ou Blanc.

Du coup, quand je veux être plus efficace, je fais une boucle :


        for(reset($tab); $k=next($tab); next($k)) if($k="toto)
Malheureusement là encore, ce n'est pas top : si le tableau est gros, on passe beaucoup de temps là dedans et on s'approche dangereusement du timeout...

Donc suite à ta remarque, j'ai encore regardé les fonctions Array, et je n'ai toujours rien trouvé de la sorte. Me suis-je encore induit d'erreur, ou voulais-tu dire autre-chose ?

Sur quoi Stéphane Pineau répond:

Je prend en cours...mais je me permet de mettre mon grain de sel...:-)

Y aurait d'autres solutions mais je ne sais pas si elles seraient plus adaptées...C'est juste des idées de pistes.

1) Utiliser l'instruction USORT, qui te permet de définir une fonction appelée à chaque pas du tri... cela te permettrait par exemple d'enregistrer dans un tableau annexé les éléments vides.

2) Balancer ton tableau dans un DBM temporaire et utiliser les fonctions de recherche DBM.

3)Trier ton tableau, puis lui affecter un algo dichotomique pour la recherche. La c'est quasi instantané, et cela ne demande qu'une itération de plus chaque fois que tu double la taille de ton tableau.

Mais bon tout ceci n'est valable que si ton tableau se prête à un tri. Sinon en dehors de ta méthode je n'en vois pas d'autre.

Et sur quoi, Christophe Massiot répond et propose la solution simple:

if (isset($tab[toto]))
(et en plus ca marche).

3.8 PHP3; MySQL et internationalisation.

Faut-il générer les pages en plusieurs langues ? Comment gérer les jeux de caratères.

Mathieu Poumeyrol répond:

il suffit de remplacer chaque texte par une variable et de ramener tout cela dans ton include. Sinon, il faut écrire une page php par langue, donc a priori avec une adresse différente, ou alors les appeler a partir d'une page générique ne contenant qu'un include.

Et Benoit de Mulder propose:

J'ai ete confronté a un probleme similaire pour la realisation du site d'un client (en 5 langues) la solution a été la suivante :

une table ou figure :

le texte a inclure le nom de la page la rubrique aucquel appartient la page (cette derniere etant indexée sur une autre table pour plus de modularité)

je recupere via les variables d'environnements le nom de la page en cours et je fais un bete select dessus dans ma table. Pour eviter trop de requetes serveurs, je genere des fichiers statiques (650 pages au total) tous les jours .(je porte actuellement le site en question sous php+mysql, le site d'origine etant sous cold fusion)

3.9 Comment passer des variables entre différentes pages PHP ?

Mathieu Poumeyrol répond:

La solution la plus simple est de mettre dans tes href http://machin/bidule.phtml?var1=7&var2=...

La page bidule.phtml sera ouverte avec $var1 initialisée à 7, etc

urlencode sert a proteger les caracteres d'un texte normal (ex : les espaces) si une de tes variables contient du texte. urldecode (?) fait le contraire.

Et Etienne de Tocqueville répond à Mathieu Poumeyrol:

> La solution la plus simple est de mettre dans tes href > http://machin/bidule.phtml?var1=7&var2=...

Et on peut préciser que pour que machine.phtml "lance" l'exécution de bidule.phtml, c'est à dire que PHP l'intérprète, il faut accéder au fichier par l'intermédiaire d'une connexion http. Par exemple, on peut faire :

$resultat = file(http://machin/bidule.phtml?var1=7&var2=X%20Y&var3=8);

>La page bidule.phtml sera ouverte avec $var1 initialisée à 7, etc [...]

>urlencode sert a protéger les caractères d'un texte normal (ex : les >espaces) si une de tes variables contient du texte.

En fait, tous les caractères qui ne peuvent pas être passé dans URL (soit parce qu'ils ne sont pas autorisés, soit parce qu'ils changeraient la signigication de l'URL) sont codés.

Cela concerne donc par exemple l'espace, les caractères de contrôles et accentués, mais aussi les caractères de codage d'un URL tels que "?", "&", "/", "%" et peut-être d'autres.

Chacun de ces carcaractères est remplacé par %XX, où XX est la valeur hexadécimale de son code ASCII.

>urldecode (?) fait le contraire.

Oui, mais cette fonction ne sert dans les fait quasiment jamais. Si un script un script appel l'URL comme indiqué dans mon exemple un peu plus haut, la $var2 contiendra la chaîne de caractère "X Y" (avec un espace, parce que le code ASCII de l'espace est 20 en hexa ). Le décodage des valeurs passées par URL est réalisé automatiquement par PHP lorsqu'il initialise les différentes variables.

3.10 Quelle différence entre l'utilisation de la fonction require() et include() ?

Samuel Hocevar répond:

Pour information, la différence entre include() et require() est que include("file"); est remplacé par file à chaque fois qu'il est exécuté, alors que require("file"); n'est remplacé qu'à la première occurence, dès qu'il est parsé (et pas forcément exécuté).

Pierre Baudracco répond:

un include ou un require est pratique surtout pour l'inclusion de constantes mais pas de variables. Exemple simple: j'ai une variable lang qui contient "en" ou "fr". Si on clique sur un drapeau francais, c'est url_ex?lang=fr qui est appele sinon url_ex?lang=en. Un include dans url_ex ne peut resoudre cette situation. De plus, l'action d'un formulaire peut etre changee (par ex: avec javascript) et ainsi la valeur de la variable sera fixee d'apres l'action de l'utilisateur.

Un autre moyen de transferer des donnees entre 2 ou plusieurs pages est d'utiliser phplib qui permet de gerer des sessions et donc de garder des variables persistentes pour une session ou un utilisateur. Cela necessite l'emploi d'une base de donnee, et la mise en oeuvre de phplib.


Page suivante Page précédente Table des matières