我使用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
还有我的两个引号。所以什么也没做。
答案 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"
}