[RESOLU] Slash et antislash avec dirname - erreur 500

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Slash et antislash avec dirname - erreur 500

Re: [RESOLU] Slash et antislash avec dirname - erreur 500

par josse34 » 11 oct. 2013, 18:19

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

Re: [RESOLU] Slash et antislash avec dirname - erreur 500

par xTG » 11 oct. 2013, 18:06

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

Re: Slash et antislash avec dirname - erreur 500

par josse34 » 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

Re: Slash et antislash avec dirname - erreur 500

par yann18 » 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 )

Re: Slash et antislash avec dirname - erreur 500

par josse34 » 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.

Re: Slash et antislash avec dirname - erreur 500

par yann18 » 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?

Re: Slash et antislash avec dirname - erreur 500

par josse34 » 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!!!

Re: Slash et antislash avec dirname - erreur 500

par yann18 » 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.

Re: Slash et antislash avec dirname - erreur 500

par josse34 » 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!!

Re: Slash et antislash avec dirname - erreur 500

par yann18 » 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

Slash et antislash avec dirname - erreur 500

par josse34 » 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!!!