8768 sujets

Développement web côté serveur, CMS

Pages :
Bonjour,

Je suis en train de construire un site web en php (jusqu'à ce jour mon site est un wordpress hybride, moitié page wp et moitié page php made in moi-même) J'en suis à construire le squelette de ma page index.php. Je souhaite insérer menus, footer, etc. en faisant appel à la fonction php 'include', mais un premier problème se pose puisque cette fonction ne fonctionne que si les fichiers appelé se trouve dans le même répertoire que le fichier index.php. C'est très gênant. Première question, est-il possible d'appeler des fichiers situé dans d'autre répertoire plutôt qu'à la racine ?

En attendant, j'utilise la fonction $curl qui fonctionne bien. Mais après tout peut-être est-ce aussi bien, qu'en pensez-vous ? $curl ou include ?

Merci par avance.
Bonjour,

La fonction include fonctionne même si l'include n'est pas dans le même dossier qu'index.php.
Si, dans votre cas, vous avez cette restriction, c'es peut-être lié a votre hébergeur.
En ce qui me concerne, avec mon hébergeur, je peux accéder à des include situés soit dans un sous-dossier de mes pages php, soit dans un dossier au même niveau ou même à un niveau inférieur (en utilisant les jokers ..) , soit à la racine du site.

Je ne connaissais pas $curl, je suis allé voir sur internet.
Si j'ai bien compris, cette fonction n'a pas le même effet qu'include.
Avec include, on peut éxécuter du php.
avec $curl on récupère le source html produit par une page php.
Dans votre cas (avec mon hébergeur), j'utilise include, car je peux appeler des fonctions php situés dans l'include, alors que si j'ai tout compris, je ne peux pas le faire avec $curl.
Je place mes include dans un dossier protégé, non accessible directement par l'internaute.
Modifié par jlon (28 Jun 2014 - 16:00)
Merci pour votre réponse.
$curl exécute php. En revanche, il semblerait que c'est une fonction qui offre moins de sécurité.

Vous avez sans doute raison en ce qui concerne le non fonctionnement de include. Cela provient très certainement de restrictions de mon hébergeur.
ON ne peut pas comparer, l'utilisation n'est pas la même.

- Include/require sert à exécuter un autre script php qui se trouve dans un répertoire local et accessible
- CURL sert à récupérer un contenu distant de la même manière que si on utilisait un navigateur web

Utiliser CURL pour récupérer un contenu local est une hérésie pour les performances !

Si le but est de récupérer un contenu local sans interpréter le code php, c'est readfile qu'il faut utiliser.
Je me sert de $curl pour récupérer un menu de navigation écrit en html + javascript (jquery) mais cela fonctionne également pour du php. Mais si c'est une hérésie, je veux bien utiliser readfile en attendant de pouvoir, je l'espère, utiliser include. Toutefois, afin d'apprendre, pourquoi est-ce une hérésie pour du local ?

Une petite aide pour la syntaxe de readfile ?

Voici le code que j'utilise pour le moment :

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL,"l(url du fichier .php"); // j'appelle un fichier contenant un menu écrit en html + js (jquery)
$contenu = curl_exec($curl);

Et cela fonctionne.
Ca fonctionne, mais c'est une hérésie parce que tu demandes à mettre en marche tout un dispositif réseau pour récupérer quelque chose que tu aurais très bien pu charger 10 fois plus vite.

Au moment où tu demandes l'URL, php n'est pas censé savoir que ça se trouve sur ton propre serveur. En plus de lancer les machineries DNS et TCP, ça doit repasser par toutes les vérifications du serveur web (autorisations, virtual host & co).

Pour bien te rendre compte de la différence entre ce que fait CURL et ce que fait readfile, mets un mot de passe HTTP (.htaccess/.htpass) sur ta page. Avec ça ça deviendra plus clair.

Vu tes réponses précédentes, de toute façon, c'est clairement include que tu dois utiliser. Cherche à désactiver SAFE_MODE si tu es embêté avec les accès aux fichiers. ET si ton hébergeur ne veut pas désactiver SAFE_MODE, change d'hébergeur, il a au moins 5 ans de retard.
include fonctionne uniquement avec les fichiers contenu dans un même répertoire. Dès que j'en sors, j'ai une erreur. La fonction include est donc active mais il semblerait qu'elle soit limitée. Sais-tu ce que je dois modifier exactement ?
franckh a écrit :
Dès que j'en sors, j'ai une erreur.


Quand tu as un message d'erreur postes le pour qu'on puisse voir de quoi il s'agit. Parce qu'avec "j'ai une erreur" il est impossible de t'aider.

Et postes aussi le code que tu as essayé et qui produit l'erreur. Nous n'avons pas tous des dons de voyance.
Voici :

Warning: include(/...): failed to open stream: No such file or directory in /vdir/www.... on line 97

Warning: include(): Failed opening '/...p' for inclusion (include_path='.:/usr/share/php/') in /vdir/www.... on line 97
Ça veut simplement que tu t'es trompé dans le chemin et donc le fichier est introuvable. Corrige le chemin du fichier et ton problème sera résolu.
Administrateur
EDIT : je crois que je me suis fait griller par une fraise tagada. Pas grave je ferai l'inverse au prochain barbeuk, non mais Smiley murf

Euh 2 secondes : comment WordPress peut-il fonctionner si include() et require() sont aussi limités ?
Y aurait pas incompréhension sur le chemin dans ce CMS ? Genre ne pas partir de la racine du site pour aller chercher un sous-répertoire du répertoire du thème, alors qu'il faut simplement descendre d'un répertoire ? C'est un truc contre-intuitif au possible avec les CMS, tu serais pas le premier (et autant SPIP que WordPress j'ai souvent joué à "Loup y es-tu" Smiley rolleyes )
Modifié par Felipe (29 Jun 2014 - 20:11)
Je ne suis plus dans WP, là. J'essai de construire mon site avec DW.
Le chemin...mmmm...ne riez pas mais j'ai un doute sur comment l'écrire.
J'ai essayé comme ça : /repertoire1/sous_rep1/fichier.php
je viens d'essayer d'entrer l'url complète http://www... et j'ai eu ce message d'erreur :

Warning: include(): http:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /vdir/www... on line...

Je crois comprende qu'il me faut modifier allow_url_fopen=0

Est-ce sans risque ?
a écrit :

/repertoire1/sous_rep1/fichier.php


Si tu commences par un / (slash) tu pars de la racine de ton serveur. Dans ton cas tu veux probablement partir du chemin du fichier depuis lequel tu fais l'inclusion.

Maintenant sans connaitre ton arborescence ce n'est pas possible de te donner une réponses complète. A un moment il va falloir arrêter de jouer aux devinettes et nous donner un peu plus d'infos dans tes sujets parce qu'on perd un temps fou.
Ok, j'ai trouvé, ou plutôt j'ai retrouvé dans mes lointains souvenir d'utilisateur basic de DW.
Il faut ouvrir avec ../ tout simplement. Include fonctionne très bien.

Merci à vous.
Pfff... tout n'est pas résolu. Je ne parviens pas à passer de variable dans une url avec include.


Voici ce que j'écris : include 'rep/sous_rep/fichier.php?i=$id';

J'ai un message d'erreur m'indiquant que le fichier n'existe pas ou est introuvable.
Si je supprime ?i=$id cela fonctionne.

Y a t-il une solution ?

Merci
Un chemin sur le système de fichier n'est pas une URL.

Les variables de ton script PHP appelant sont directement accessibles depuis ton script PHP appelé, tu n'as pas besoin de les transmettre explicitement.

* Suppression doublon Smiley cligne
Modifié par 6l20 (29 Jun 2014 - 22:55)
a écrit :
Y aurait pas incompréhension sur le chemin dans ce CMS ? Genre ne pas partir de la racine du site pour aller chercher un sous-répertoire du répertoire du thème, alors qu'il faut simplement descendre d'un répertoire ? C'est un truc contre-intuitif au possible avec les CMS, tu serais pas le premier (et autant SPIP que WordPress j'ai souvent joué à "Loup y es-tu"


Ah oui, c'est vrai que c'est un piège courant ça.... tu es dans ./a/b.php, tu veux inclure ./c/d.php, alors tu écris tout naturellement ../c/d.php et ça marche pas, parce que le répertoire courant est ./, conséquence du fait que le point d'entrée unique du CMS est ./index.php. Dans le toute, afficher le retour de getcwd ou construire des chemins relatifs qui marchent en tout temps grâce à $_SERVER['PHP_SELF'], dirname et basename.
QuentinC a écrit :

Ah oui, c'est vrai que c'est un piège courant ça.... tu es dans ./a/b.php, tu veux inclure ./c/d.php, alors tu écris tout naturellement ../c/d.php et ça marche pas, parce que le répertoire courant est ./, conséquence du fait que le point d'entrée unique du CMS est ./index.php. Dans le toute, afficher le retour de getcwd ou construire des chemins relatifs qui marchent en tout temps grâce à $_SERVER['PHP_SELF'], dirname et basename.


Ou préférer les chemins absolus (et moins se prendre la tête).
Pages :