使用json_encode和shell_exec的JSON无效

时间:2015-11-02 14:10:07

标签: json symfony symfony-process wp-cli symfony-console

我使用Symfony's console component编写了一些命令行工具,其中一个使用WP-CLI来设置WordPress站点。特别是使用wp option update我遇到了JSON和引号的问题。

例如,运行类似:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.TimeZone;

public class Testing {
    public static void main(String[] args) throws ParseException {
        String time = "4:40pm";
        String country = "Australia";
        convertDate(time, country);
    }

    public static String convertDate(String time, String country)
            throws ParseException {
        SimpleDateFormat in = new SimpleDateFormat("hh:mm");

        if (country.equals("Australia")) {
            in.setTimeZone(TimeZone.getTimeZone("Australia/Sydney"));
            in.parse(time).toString();

        }
        return "";
    }
}

数据库中文字shell_exec("wp option update blogdescription ''"); 的结果。事实上,每当我使用该命令时,如果它成功,我试图在数据库中设置的内容都包含在单引号中。

然后是这样的事情:

''

转储结果为:

$github_updater_args = [
            'github_access_token'=>'',
            'bitbucket_username'=>'username',
            'bitbucket_password'=>'password',
            'all-in-one-seo-populate-keywords'=>'1'
];
$github_updater_args = json_encode($github_updater_args);
var_dump($github_updater_args);
shell_exec("wp option update github_updater '$github_updater_args' --format=json");

哪个是有效的JSON,但string(200) "{"github_access_token":"","bitbucket_username":"devs@webspecdesign.com","bitbucket_password":"xxxxxxxxx","webspec-design-wordpress-core":"1","all-in-one-seo-populate-keywords":"1","webspec-smtp":"1"}" 命令导致以下结果:

wp

您会注意到报价已被删除,我认为这是它所抱怨的内容?或者这就是它如何排除错误?

无论哪种方式,我都决定硬编码JSON,所以只需:

Error: Invalid JSON: '{github_access_token:,bitbucket_username:username,bitbucket_password:password,all-in-one-seo-populate-keywords:1}'

这给了我以下错误:

错误:位置参数太多:,bitbucket_username:username,bitbucket_password:password}'

我打赌这两个问题是相关的。我想也许这是一个WP-CLI问题,所以我在那里开了一个问题,但它是closed without reaching an answer。然而,我越是盯着它,我认为Symfony的东西越多。也许我绝对需要使用Process Component而不是shell_exec('wp option update github_updater \'{"github_access_token": "", "bitbucket_username": "username", "bitbucket_password": "password"}\' --format=json'); ?这是它的设计目的吗?

更新:尝试了Symfony Process Component:

shell_exec

还有我的两个引号。所以什么也没做。

1 个答案:

答案 0 :(得分:0)

您正在寻找escapeshellarg()来逃避您的json数据。 escapeshellcmd()用于清理整个命令,而不是单个参数。尝试这样的事情:

$github_updater_args = [
    'github_access_token'=>'',
    'bitbucket_username'=>'username',
    'bitbucket_password'=>'password',
    'all-in-one-seo-populate-keywords'=>'1'
];
$github_updater_args = json_encode($github_updater_args);
$cmd = sprintf("wp option update github_updater %s --format=json", escapeshellarg($github_updater_args));
shell_exec($cmd);

修改

您的问题中缺少某些内容,或者您​​正在执行的CLI脚本中存在错误。我写了两个快速测试PHP脚本来说明json转义是否正常工作。

<强> test.php的

<?php

$github_updater_args = [
    'github_access_token'=>'',
    'bitbucket_username'=>'username',
    'bitbucket_password'=>'password',
    'all-in-one-seo-populate-keywords'=>'1'
];
$github_updater_args = json_encode($github_updater_args);
$cmd = sprintf("php j.php %s", escapeshellarg($github_updater_args));
echo shell_exec($cmd);
echo PHP_EOL;

<强> j.php

<?php

var_dump(json_decode($argv[1]));

<强>输出

~$ php test.php
object(stdClass)#1 (4) {
  ["github_access_token"]=>
  string(0) ""
  ["bitbucket_username"]=>
  string(8) "username"
  ["bitbucket_password"]=>
  string(8) "password"
  ["all-in-one-seo-populate-keywords"]=>
  string(1) "1"
}