IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Générer du code PHP


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 620
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 620
    Points : 824
    Points
    824
    Par défaut Générer du code PHP
    Bonjour,
    Je souhaite générer cette ligne define('DIR_ROOT', __DIR__.DIRECTORY_SEPARATOR); à partir de celle-ci $root = "'".$path['root']."'";.
    Le problème est que $path['root'] se termine par un DIRECTORY_SEPARATOR qui sous Windows échappe le caractère suivant. J'ai essayé toute sorte de solution sans y arriver.

    J'obtiens ceci: define('DIR_ROOT', 'C:\wamp64\www\test\'); avec la parenthèse, le point-virgule et toute la suite inclus dans la chaîne à définir.

    Pour plus d'infos, voici mon code complet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	$content	= fileGetContent('patterns/define.php');	// fileGetContent inclut file_get_contents et des contrôles
    	$comments	= sprintf($_SESSION['s1']['comments'], $_SESSION['s3']['definetitle']);
    	$root		= "'".$path['root']."'";
    	$viewpage	= '"'.$path['root'].'view'.DIRECTORY_SEPARATOR.'page'.DIRECTORY_SEPARATOR.'"';
    	$varExport	= var_export($_SESSION['s3']['lang'], return: true);
    	$languages	= isset($_SESSION['s1']['multiling']) && isset($_SESSION['s3']['lang']) ?
    					"define(AVAILABLE_LANGUAGES, {$varExport});":
    					'';
    	$urlContact	= !empty($_SESSION['s1']['urlContact']) ? "define('URL_CONTACT',\t\"{$_SESSION['s1']['urlContact']}\");": '';
    	$content	= sprintf($content, $comments, $root, $viewpage, $languages, $urlContact);
    	$result		= file_put_contents($_SESSION['path']['root'].'define.php', $content, FILE_USE_INCLUDE_PATH);

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 908
    Points : 6 700
    Points
    6 700
    Par défaut
    La fonction addslashes est précisément faite pour ce cas de figure.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 620
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 620
    Points : 824
    Points
    824
    Par défaut
    Ok, merci.

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 620
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 620
    Points : 824
    Points
    824
    Par défaut
    Bonjour,
    Je reviens avec encore un souci.
    Je veux générer la ligne suivante:require_once "C:\wamp64\www\mysite\lang/$language.php;" ou require_once "C:\wamp64\www\mysite\lang/".$language.".php;"; à partir des infos suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // Répertoire racine
    var_dump($path['root']);
    // Sous-répertoire qui contient les fichiers de langues sans les '/' ou les '\ saisi par l'utilisateur
    var_dump( rtrim($_SESSION['s3']['dirlang'], "/\\") );
    // Variable qui n'existe pas dans le code générateur mais existante dans le code généré: contient 'fr' par exemple
    var_dump(\$language);
    J'ai à peu près tout essayé avec addslashes(), échappement de caractères, remplacement des guillemets par chr(34), etc.
    Code complet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	// Répertoire racine
    	var_dump($path['root']);
    	// Sous-répertoire qui contient les fichiers de langues sans les '/' ou les '\ saisi par l'utilisateur
    	var_dump( rtrim($_SESSION['s3']['dirlang'], "/\\") );
    	// Variable $language qui n'existe pas dans le code générateur mais existante dans le code généré: contient 'fr' par exemple
    	var_dump('\$language');		
    	$string		= $path['root'].rtrim($_SESSION['s3']['dirlang'], "/\\").'/$language.php';
    	$lang		= isset($_SESSION['s1']['multiling']) ?
    		//chr(34).require_once $string.chr(34):		// essai
    		"require_once '$string';":
    		'';
    Le résultat dans le fichier généré est: require_once 'C:\wamp64\www\tito\view/lang/$language.php'; qui fonctionnerait bien si j'avais des guillemets doubles au lieu d'apostrophes.

  5. #5
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 793
    Points : 3 064
    Points
    3 064
    Par défaut
    Bonjour

    Un site php ne devrait jamais utiliser des chemins absolus tels que tu les donnes mais strictement relatif tel que ./ressources/fr.php.

    Dans l'absolu, ton code php devrait pouvoir tourner sur n'importe quel ordinateur ou serveur et là zéro dossier absolu tel que tu essaies.

    Et le fait d'utiliser des / et non \ va résoudre ton problème.
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 908
    Points : 6 700
    Points
    6 700
    Par défaut
    Il faut bien être au clair avec comment marche l'antislash dans les chaînes PHP.

    L'antislash est le caractère d'échappement que ce soit dans une chaîne entre guillemets simples, dans une chaîne entre guillemets doubles ou dans une chaîne Heredoc. Son rôle est d'annoncer que le prochain caractère ne doit pas être interprété comme il l'est d'habitude. Par exemple un guillemet simple dans une chaîne entre guillemets simples doit être précédé d'un antislash sans quoi il serait vu comme le délimiteur de la chaîne. De même si je place un antislash devant la lettre t dans une chaîne entre guillemets doubles, j'obtiens non plus la lettre t mais une tabulation horizontale.

    Du fait de ce rôle spécifique, l'antislash doit, pour pouvoir se représenter lui-même, s'échapper lui-même. Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    echo '    \\    ', "    \\    ", <<<TEST
        \\    
    TEST;
    #    \        \        \
    C'est la manière rigoureuse et logique d'écrire un antislash dans une chaîne entre guillemets simples ou doubles ou Heredoc.

    Alors pourquoi voit-on des fois des antislashes qui ne sont pas échappés et qui apparaissent pourtant à l'affichage?

    C'est un comportement par défaut: lorsque l'antislash est placé avant un caractère (ou une suite de caractères) et que l'ensemble ne correspond à aucune séquence d'échappement interprétable dans le type de chaîne utilisé, on obtient un antislash et le caractère.

    Du fait de ce comportement par défaut, il est courant de voir des antislashes qui ne soient pas échappés dans les 3 types de chaînes (simple, double, Heredoc). Pour ce qui est des chaînes Nowdoc, la question ne se pose pas puisqu'il n'y a rien à échapper, dans ce contexte l'antislash n'a aucun rôle particulier, c'est un caractère comme un autre.



    Conclusion, inutile de t'acharner à obtenir: require_once "C:\wamp64\www\mysite/lang/$language.php";.
    Contente toi d'obtenir: require_once "C:\\wamp64\\www\\mysite/lang/$language.php"; car c'est strictement la même chose pour l'interpréteur PHP.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $string = 'C:\wamp64\www\tito\view/lang/$language.php';
    echo 'require_once "' . addslashes($string) . '";'
    // require_once "C:\\wamp64\\www\\mysite/lang/$language.php";
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. Transcrire code PHP dans une DLL
    Par LEK dans le forum C++
    Réponses: 16
    Dernier message: 26/09/2005, 14h17
  2. Mettre un code php dans une variable...
    Par kedare dans le forum Langage
    Réponses: 6
    Dernier message: 19/09/2005, 12h55
  3. [Conception] Code php dans une base de donnée
    Par krfa1 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 13/09/2005, 10h58
  4. pb eval pour le code php dans une feuille xslt
    Par nipepsi dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 10/09/2004, 11h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo