Bonjour, j'ai un problème lié à la vérification de l'existence d'un fichier en php avec la fonction file_exists. Prenons une fonction:

<?php
    define('WEBROOT', '/AE2I/');
    function bidule($lien){
        if(!file_exists($lien)){
            echo '<a href="'.$lien.'">test</a>'; //le lien fonctionne pourtant
        }
    }
    $lien = 'images/news/image.jpg';
    bidule(WEBROOT.$lien);
?>

Lors de l'appelle, la fonction se situe dans "/AE2I/admin", et le lien pointe vers l'image "/AE2I/images/news/image.jpg". La fonction entre toujours dans la condition, à moins que je remplace WEBROOT par '../'.

Je ne sais pas quoi faire pour résoudre le problème, je n'ai aucune idée d'où cela peut venir. Help?

2 réponses


Havok
Réponse acceptée

Salut,

As-tu essayé de mettre ton WEBROOT à $_SERVER'DOCUMENT_ROOT'] ? Parce que si t'es sur un serveur UNIX/Linux (et c'est <u>peut être</u> pareil sur WAMP sur Windows), lui mettre "/" lui dit d'aller chercher à la racine du disque sur lequel tu trouves, et non pas à la racine de ton espace web, contrairement au comportement de HTML qui lui, va chercher à la racine du site quand tu mets un chemin absolu. (Pour l'explication, j'suis pas trop sûr, donc je demande confirmation si quelqu'un sait, mais de mémoire, ça se comporte comme ça)
En plus, de cette manière, tu n'auras jamais à changer la valeur de WEBROOT si tu changes ton site de place. Il aura toujours pour valeur le dossier dans lequel se trouve la racine de ton site.

<?php  
    define('WEBROOT', $_SERVER'DOCUMENT_ROOT']);
?>

Éventuellement, si la racine de ton application, elle, se trouve à AE2I, tu peux en plus concaténer cette valeur là :

<?php  
    define('WEBROOT', $_SERVER'DOCUMENT_ROOT'].'AE2I/');
?>

Cela t'assure d'avoir vraiment le chemin absolu vers la racine de ton application.

Tiorte
Auteur
Réponse acceptée

Il y avait en effet un problème de ce type, le "/" devait ramener à la racine du disque. Je me suis appuyé sur tes suggestions pour résoudre le problème. J'avais déjà un WEBROOT définit de manière dynamique, mais à partir de $_SERVER'SCRIPT_NAME']:

<?php
    define('WEBROOT', str_replace($a, $b, $_SERVER'SCRIPT_NAME']));
?>

En partant du principe que le "/" amène à la racine du disque, j'ai regardé dans $_SERVER si une autre variable pourrait faire l'affaire, et en effet il y avait $_SERVER'SCRIPT_FILENAME']. Du coup j'ai définit une autre variable globale ROOT:

<?php
    define('ROOT', str_replace($a, $b, $_SERVER'SCRIPT_FILENAME']));
?>

Ainsi lorsque j'utilise ROOT dans file_exists(), ça marche! C'est pas très pratique de devoir jongler entre les deux, mais mieux que rien, merci!