我使用 json_decode在我的 PHP 中解析来自 POST 的数据(POST 本身是通过 ajax 执行的)。我的代码如下所示:
$data = json_decode($_POST['logdata'], true);
if(!$data) {
$ecodes = array(
JSON_ERROR_NONE => "No error has occurred",
JSON_ERROR_DEPTH => "The maximum stack depth has been exceeded",
JSON_ERROR_STATE_MISMATCH => "Invalid or malformed JSON",
JSON_ERROR_CTRL_CHAR => "Control character error, possibly incorrectly encoded",
JSON_ERROR_SYNTAX => "Syntax error",
JSON_ERROR_UTF8 => "Malformed UTF-8 characters, possibly incorrectly encoded"
);
$err = json_last_error();
$result = array("error" => 1, "error_msg" => "Invalid log data: " . $ecodes[json_last_error()]);
echo json_encode($result);
exit;
}
... //use $data array
这段代码工作正常。当在我的本地 linux 机器或我的 mac 上执行时,传递的数据被正确解码并且一切正常。然而,当在 godaddy 共享主机上执行相同的代码时,解码失败并出现语法错误。花了很多时间试图缩小问题范围后,我发现当我有 < 时会出现问题。或 > JSON 对象属性值中的字符。
javascript 中的上传部分(ajax)如下所示:
$.ajax({
url: '/emaillog.php',
type: 'POST',
dataType: 'json',
data: { logdata: JSON.stringify(this.logData[this.scenarioLogId]) },
cache: false,
error: function(jqXHR, textStatus, errorThrown) {
alert("Error occurred during upload: " + textStatus);
},
success: function(data, textStatus, jqXHR) {
var msg = data.error
? "An error occurred processing action log: " + data.error_msg
: "Action log processed successfully.";
alert(msg);
}
})
如您所见,POST 参数的值是使用 JSON.stringify 创建的并且在检查时是正确的(客户端和服务器端)。如果重要,这里是提交的 POST 参数的示例值:
{
"scenarioId":"1",
"scenarioName":"MOH",
"startTime":1355496349,
"log":[
{
"role":"Leader",
"task":"MOH",
"response":"start",
"time":1355496349
},
{
"role":"Head",
"task":"<span class=\"bold\">Assign Role</span>",
"response":"done",
"time":1355496351
}
]
}
如果数组中的最后一个元素(任务分配角色)被移除,那么一切都会成功处理。如果我更换 <和 > > 带空格的字符,一切正常。
由此产生两个问题:
如果此类 JSON 字符串的语法错误是正确的行为,那么为什么我在其他两种环境中看不到错误?另外,为什么是 JSON.stringify然后生成不正确的字符串?
如果此类 JSON 字符串的语法错误是不正确的行为,那么 godaddy 的 PHP 实现或配置一定有问题。
请注意,虽然我明确询问了有关 godaddy 的问题,但它仅在代码产生错误的唯一提供者范围内才有意义。任何人都可以阐明这种情况吗?
最佳答案
无论出于何种原因,仅在 godaddy 托管上(可能也在其他一些地方,但在我测试过的其他地方没有),当我提交表单时,服务器正在转义引号 - 这就是导致问题的原因。问题的解决方案非常简单:而不是做
$data = json_decode($_POST['logdata'], true);
我做到了
$data = json_decode(stripslashes($_POST['logdata']), true);
一切都很完美。
关于php - json_decode 在 Godaddy 主机上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13881919/
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我有一个非常简单的RubyRack服务器,例如:app=Proc.newdo|env|req=Rack::Request.new(env).paramspreq.inspect[200,{'Content-Type'=>'text/plain'},['Somebody']]endRack::Handler::Thin.run(app,:Port=>4001,:threaded=>true)每当我使用JSON对象向服务器发送POSTHTTP请求时:{"session":{"accountId":String,"callId":String,"from":Object,"headers":
我正在尝试在Rails上安装ruby,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf
我需要一个非常简单的字符串验证器来显示第一个符号与所需格式不对应的位置。我想使用正则表达式,但在这种情况下,我必须找到与表达式相对应的字符串停止的位置,但我找不到可以做到这一点的方法。(这一定是一种相当简单的方法……也许没有?)例如,如果我有正则表达式:/^Q+E+R+$/带字符串:"QQQQEEE2ER"期望的结果应该是7 最佳答案 一个想法:你可以做的是标记你的模式并用可选的嵌套捕获组编写它:^(Q+(E+(R+($)?)?)?)?然后你只需要计算你获得的捕获组的数量就可以知道正则表达式引擎在模式中停止的位置,你可以确定匹配结束
我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("
我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm
一段时间以来,我一直在使用open_uri下拉ftp路径作为数据源,但突然发现我几乎连续不断地收到“530抱歉,允许的最大客户端数(95)已经连接。”我不确定我的代码是否有问题,或者是否是其他人在访问服务器,不幸的是,我无法真正确定谁有问题。本质上,我正在读取FTPURI:defself.read_uri(uri)beginuri=open(uri).readuri=="Error"?nil:urirescueOpenURI::HTTPErrornilendend我猜我需要在这里添加一些额外的错误处理代码...我想确保我采取一切预防措施来关闭所有连接,这样我的连接就不是问题所在,但是我
我在思考流量控制的最佳实践。我应该走哪条路?1)不要检查任何东西并让程序失败(更清晰的代码,自然的错误消息):defself.fetch(feed_id)feed=Feed.find(feed_id)feed.fetchend2)通过返回nil静默失败(但是,“CleanCode”说,你永远不应该返回null):defself.fetch(feed_id)returnunlessfeed_idfeed=Feed.find(feed_id)returnunlessfeedfeed.fetchend3)抛出异常(因为不按id查找feed是异常的):defself.fetch(feed_id
我正在为毕业设计开发GEM,TravisCI构建不断失败。这是我在Travis上的链接:https://travis-ci.org/ricardobond/perpetuus/builds/8709218构建错误是:$bundleexecrakerakeaborted!Don'tknowhowtobuildtask'default'/home/travis/.rvm/gems/ruby-1.9.3-p448/bin/ruby_noexec_wrapper:14:in`eval'/home/travis/.rvm/gems/ruby-1.9.3-p448/bin/ruby_noexec_