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 :

php cli Parser une ligne de commande avec arguments


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut php cli Parser une ligne de commande avec arguments
    Bonjour,

    J'utilise en ligne de commande des programmes php de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    php script.php ma_fonction mes_argument_serializes
    Lorsque les arguments sont du texte simple alors je n'ai aucun problème. Mais cette fois j'ai un tableau en argument contenant du code html inséré dans un tableau php (notamment des balises div etc..), lorsque je serialize cela pour construire la ligne de commande du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    php mon_script.php "arg1"  ... "array(a:2:{s:14:\"ajoute_prefixe\";s:34:\"<div style=\"display:inline-block;\">\";s:14:\"ajoute_suffixe\";s:6:\"</div>\";})"
    l'exécution pose problème j'ai un message d'erreur qui s'affiche avant même que php exécute script.php :

    Je pense donc à un problème de lecture des arguments contenant certains symboles, mais je ne trouve pas l'origine exacte, ni comment contourner un tel problème ?
    Avez vous une idée ?

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 888
    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 888
    Points : 6 632
    Points
    6 632
    Par défaut
    Il faut que tes arguments soient entre simple quotes car les chaînes entre double quotes sont interpolées par le shell. Du coup, tu devras aussi enlever les antislashes devant les doubles quotes.

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut
    Bonjour,

    Effectivement, je pense que l'utilisation des guillemets simples ou doubles pose problème dans l'interprétation. Comment écrire correctement un argument dans lequel j'ai des espaces et des guillemets simples ou doubles ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "array(a:2:{s:14:\"ajoute_prefixe\";s:34:\"<div style=\"display:inline-block;\">\";s:14:\"ajoute_suffixe\";s:6:\"</div>\";})"
    si j'enlève "
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array(a:2:{s:14:\"ajoute_prefixe\";s:34:\"<div style=\"display:inline-block;\">\";s:14:\"ajoute_suffixe\";s:6:\"</div>\";})
    Mes arguments sont interprétés comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      string(43) "array(a:2:{s:14:"ajoute_prefixe";s:34:"<div"
      [2]=>
      string(69) "style="display:inline-block;">";s:14:"ajoute_suffixe";s:6:"</div>";})"

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut
    cet argument semble bien interprété
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "array(a:2:{s:14:""ajoute_prefixe"";s:34:""<div style='display:inline-block;'>"";s:14:""ajoute_suffixe"";s:6:""</div>"";})"
    voici ce qui est lu de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    array(2) {
      [0]=>
      string(48) "array(a:1:{s:21:"convert.base64-encode";a:0:{}})"
      [1]=>
      string(113) "array(a:2:{s:14:"ajoute_prefixe";s:34:"<div style='display:inline-block;'>";s:14:"ajoute_suffixe";s:6:"</div>";})"
    }
    Par contre mon tableau serialize pose problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PHP Notice:  unserialize(): Error at offset 67 of 106 bytes in C:\serveur\programmes\programmes.inc.php on line 852
     
    Notice: unserialize(): Error at offset 67 of 106 bytes in C:\serveur\programmes\programmes.inc.php on line 852

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut
    Ok je viens de trouver c'était "s:35" au lieu de 34 erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "array(a:2:{s:14:""ajoute_prefixe"";s:35:""<div style='display:inline-block;'>"";s:14:""ajoute_suffixe"";s:6:""</div>"";})"
    Ceci fonctionne donc lorsqu'écrit tel quel en ligne de commande, comme cette ligne de commande doit être écrite depuis un script php, il faut à nouveau que je traduise " par \" n'est ce pas ?

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut
    pour l'argument original :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    voici un "exemple d'argument"
    Ecrit Sous dos la syntaxe générale à utiliser est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "voici un ""exemple d'argument"""
    (on l'englobe avec " et on double les double guillemets internes avec "").

    Ecrit dans un script php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    \"voici un \"\"exemple d'argument\"\"\"
    Pour mon exemple ça fonctionne parfaitement, à priori on peut utiliser autant de guillemets doubles que l'on souhaite à partir du moment où celles-ci sont doublées, à vérifier...

    Merci pour votre soutien qui m'a orienté sur la bonne voie.

  7. #7
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 888
    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 888
    Points : 6 632
    Points
    6 632
    Par défaut
    Ah, c'était sous DOS, je pensais que c'était sous un shell linux, effectivement pour échapper un double-quote chez Microsoft il faut le doubler.
    Si tu veux passer des arguments sans te compliquer la vie tu peux aussi les encoder en base64 puis les décoder dans ton script:
    Code monscript.php : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php print_r(unserialize(base64_decode($argv[1])));

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    php monscript.php "YToyOntzOjE0OiJham91dGVfcHJlZml4ZSI7czozNToiPGRpdiBzdHlsZT0iZGlzcGxheTppbmxpbmUtYmxvY2s7Ij4iO3M6MTQ6ImFqb3V0ZV9zdWZmaXhlIjtzOjY6IjwvZGl2PiI7fQ=="
    // Array
    // (
    //     [ajoute_prefixe] => <div style="display:inline-block;">
    //     [ajoute_suffixe] => </div>
    // )

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Parser une ligne de commande.
    Par shirohige dans le forum Générateurs de compilateur
    Réponses: 7
    Dernier message: 30/06/2013, 11h46
  2. Réponses: 1
    Dernier message: 30/01/2013, 14h01
  3. Réponses: 6
    Dernier message: 12/05/2008, 11h22
  4. Réponses: 8
    Dernier message: 27/08/2007, 08h07
  5. [OCaml] Parser une ligne de commande
    Par Thanatos dans le forum Caml
    Réponses: 4
    Dernier message: 10/12/2004, 10h11

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