[RESOLU] Slash et antislash avec dirname - erreur 500

Eléphant du PHP | 103 Messages

10 oct. 2013, 12:13

Bonjour!
J'ai un code PHP fonctionnant parfaitement sous EasyPHP (avec Windows) qui contient :
    $dir = new DirectoryIterator(dirname(__FILE__) . '\AVANT'); 
Une fois mis sur mon serveur dédié sous Linux, j'obtiens l'erreur suivante :
DirectoryIterator::__construct(/home/monsite/public_html\AVANT): failed to open dir: No such file or directory
J'ai un souci d'antislash et slash (gueguerre entre Linux et Windows) car cela devrait être public_html/AVANT et non pas public_html\AVANT

Si je mets :
    $dir = new DirectoryIterator(dirname(__FILE__) . '/AVANT'); 
ou que je supprime le point et indique le chemin complet
    $dir = new DirectoryIterator(dirname(__FILE__)  'home/monsite/public_html/AVANT'); 
J'obtiens une erreur 500.

Comment faire comprendre cette différence entre slash et antislash??

A noter qu'un fichier dans le dossier AVANT est accessible via le web (pas de blocage htaccess ou autres) et que la permission des fichiers est sur 755.

Merci!!!

Mammouth du PHP | 571 Messages

10 oct. 2013, 13:12

bonjour,

ce code devrait normalement fonctionner quel que soit soit le système:
    $dir = new DirectoryIterator(dirname(__FILE__) . '/AVANT'); 
  
linux étant sensible à la casse, Est-ce que le répertoire AVANT est en majuscule?


une forme simplifiée de dirname(__FILE__) est __DIR__ en php 5.3

Eléphant du PHP | 103 Messages

10 oct. 2013, 13:34

Salut!
Le dossier est bien en majuscule et en ce qui me concernne le /AVANT, que j'utilise EasyPHP ou mon serveur, j'ai toujours une erreur blocante type 500!!

Mammouth du PHP | 571 Messages

10 oct. 2013, 16:27

essaies de regarder les logs apache, que donnent-t-ils?

vérifies si t'as pas des espaces sur les noms des fichiers et des répertoires, au pire essaies de les renommer sur le serveur linux.

dans tous les cas adoptes les slash(/) dans tes scripts car window sait interpréter le slash(/) que l'antislash(\) dans un chemin.

Eléphant du PHP | 103 Messages

10 oct. 2013, 16:51

essaies de regarder les logs apache, que donnent-t-ils?
.
[Thu Oct 10 16:42:13 2013] [warn] [client XX.XXX.XX.XX] mod_fcgid: stderr: PHP Fatal error: Call to undefined method DirectoryIterator::getExtension() in /home/monsite/public_html/moncode.php on line 12
Ligne 12, c'est if (!$fileinfo->isDot() && $fileinfo->isFile() && $fileinfo->getExtension() == 'data') {
Voici mon code issue de ce topic : php-debutant/parser-repertoire-fichiers ... 12-15.html
et voici le dossier AVANT avec les fichiers .data :
AVANT.zip
<?php
try {
    // connexion
    $pdo = new PDO('mysql:host=localhost;dbname=MABASE', 'MATABLE', 'MONPASSWORD');
    $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_OBJ);
    $pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
    $pdo->setAttribute(\PDO::ATTR_CASE, \PDO::CASE_LOWER);

    $dir = new DirectoryIterator(dirname(__FILE__) . '/AVANT');  
    foreach ($dir as $fileinfo) { 
        if (!$fileinfo->isDot() && $fileinfo->isFile() && $fileinfo->getExtension() == 'data') {
            echo 'parse du fichier : '.$fileinfo->getFilename().'<br />';
            $tabFile = file($fileinfo->getPathname());
            preg_match('/^fic(\d+)-(\d+)-(\d+)-(\d+).data$/',$fileinfo->getFilename(),$match);
            $table = $match[1];
            $pdo->query("CREATE TABLE IF NOT EXISTS `$table` (dtlog  INT PRIMARY KEY, glot INT);");
            $stmt = $pdo->prepare('INSERT INTO `'.$table.'` (dtlog, glot) VALUES (str_to_date(:dt,\'%Y%m%d\'),:glot) ON DUPLICATE KEY UPDATE glot = VALUES(glot)');
            if (count($tabFile) > 0) {
                unset($tabFile[0]);
                $i = 0;
                foreach ($tabFile as $line) {
                    $csv = str_getcsv($line, ';');
                    $stmt->bindValue(':dt', $csv[1]);
                    $stmt->bindValue(':glot', $csv[2], PDO::PARAM_INT);
                    $stmt->execute();
                    echo 'insertion de la ligne '.$i.'<br />';
                    $i++;
                }
            }
        }
    }
} catch (Exception $e) {
    echo $e->getMessage() . '<br />' . $e->getTraceAsString();
    $to = 'MONMAIL';
    $subject = 'ALERTE';
    $msg = 'Attention :     '.$e->getMessage().'     '.$e->getTraceAsString().'';
    mail($to, $subject, $msg);
}
Merci!!!
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Mammouth du PHP | 571 Messages

10 oct. 2013, 17:29

[Thu Oct 10 16:42:13 2013] [warn] [client XX.XXX.XX.XX] mod_fcgid: stderr: PHP Fatal error: Call to undefined method DirectoryIterator::getExtension() in /home/monsite/public_html/moncode.php on line 12
php ne reconnaît pas la méthode getExtension() , c'est clair que t'as pas la bonne version de php. La méthode getExtension() de DirectoryIterator est disponible à partir de php 5.3.6.

Quelle version de php as-tu sur ton serveur?

Eléphant du PHP | 103 Messages

10 oct. 2013, 21:01

Salut!
5.5.0 sur EasyPHP et 5.3.3 sur mon dédié !!
Je cherche encore la façon de forcer la mise à jour PHP avec Virtualmin.

Mammouth du PHP | 571 Messages

11 oct. 2013, 12:03

rien ne t'empêche d'utiliser une autre fonction php, compatible à ton serveur, vérifiant l'extension d'un fichier par exemple pathinfo().
//exemple
$file = 'photo.png';
pathinfo($file, PATHINFO_EXTENSION); //png
en application à ton code, en voici une des implémentations:

<?php
function extension($file){
return pathinfo($file, PATHINFO_EXTENSION);
}
    

    $dir = new DirectoryIterator(dirname(__FILE__) . '/AVANT');  
    foreach ($dir as $fileinfo) {
        if (!$fileinfo->isDot() && $fileinfo->isFile() && extension($fileinfo->getFilename()) == 'data') {
            echo 'parse du fichier : '.$fileinfo->getFilename().'<br />';
      }         

}
 

Quant à la mise à jour de php sur ton serveur il suffit d'ajouter les adresses de dépôts php5.4+ dans le fichier /etc/sources/sources.list puis lancer la mise à jour(cas de debian )

Eléphant du PHP | 103 Messages

11 oct. 2013, 15:26

Salut Yann!

Bon, j'ai donc remplacé
$fileinfo->getExtension() == 'data'
par :
pathinfo($fileinfo->getFilename(), PATHINFO_EXTENSION) == 'data'
Ca fonctionne parfaitement sur mon serveur MAIS un nouveau souci est apparu !!!!!
Le code suivant :
$pdo->query("CREATE TABLE IF NOT EXISTS `$table` (dtlog  INT PRIMARY KEY, glot INT);");
            $stmt = $pdo->prepare('INSERT INTO `' . $table . '` (dtlog, glot) VALUES (str_to_date(:dt,\'%Y%m%d\'),:glot) ON DUPLICATE KEY UPDATE glot = VALUES(glot)');
N’insère pas correctement la date (indique seuleument 2013) alors que cela fonctionne bien sur EasyPHP (indique 20131002), la version PHP 5.3.3 ne supporte pas (str_to_date(:dt,\'%Y%m%d\'),:glot) ????
Tout fonctionne parfaitement en indiquant seuleument VALUES (:dt,:glot)

Merci

ViPHP
xTG
ViPHP | 7331 Messages

11 oct. 2013, 18:06

Je regarderai en premier lieu vers le type de champs de la table. ;)

Eléphant du PHP | 103 Messages

11 oct. 2013, 18:19

Effectivement, avec un DATE au lieu de INT, c'est bien mieux!!!! :D :D :D