Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php json_encode不使用html字符串作为值_Php_Jquery_Ajax_Json - Fatal编程技术网

Php json_encode不使用html字符串作为值

Php json_encode不使用html字符串作为值,php,jquery,ajax,json,Php,Jquery,Ajax,Json,我调试这个ajax已经有相当一段时间了。我的jQUery文件中有以下内容: $("#typeForm").ajaxForm({ success : function(html){ alert(html); }).submit(); 这将调用service.php,其中包含以下内容: $data = array('upload_data' => $this->upload->data()); $str = "<div style='position

我调试这个ajax已经有相当一段时间了。我的jQUery文件中有以下内容:

$("#typeForm").ajaxForm({
    success : function(html){
        alert(html);
}).submit();
这将调用service.php,其中包含以下内容:

$data = array('upload_data' => $this->upload->data());
$str = "<div style='position:relative'><img src='/assets/ui/success.png' /><span style='position:relative;top:-15px;'>Nachricht empfangen!</span></div>";
echo json_encode(array('file_name' => $data['upload_data']['file_name'], 'prompt' => $str));
然后它什么也不做,甚至发出警报

我在
json\u encode
上做了一个var\u转储,下面是转储,它看起来像一个格式错误的json:

string(214) "{"file_name":"cde595988d386529909ce5a8fe3a6d6f.png","prompt":"<div style="position:relative;"><img src="\/assets\/ui\/success.png" \=""><span style="position:relative;top:-15px;">Nachricht empfangen!&lt;\/span&gt;&lt;\/div&gt;"}"
</span></div>
string(214)“{”文件名“:“cde5959988d38652909ce5a8fe3a6d6f.png”,“提示符“:“Nachricht empfangen!\/span\/div”}”
以下是service.php的完整内容

class Service extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
    }
    public function index()
    {
        $filename = 'uploadfile';

        $config['upload_path'] = './uploads/temp';
        $config['allowed_types'] = 'jpg|png|gif|doc|docx|pdf|ppt|pptx|xls|xlsx|bmp';
        $config['max_size'] = '3072';
        $config['encrypt_name'] = TRUE;
        $config['remove_spaces'] = TRUE;

        $this->load->library('upload', $config);

        if (!$this->upload->do_upload($filename))
        {
            $error = array('error' => $this->upload->display_errors());
                    echo json_encode(array('error' => $error['error']));
        }
        else
        {
            $data = array('upload_data' => $this->upload->data());
            $file_name = $data['upload_data']['file_name'];
            //print_r($data);
            //echo json_encode(array('test' => "Hello World"));
            $str = "<div style='position:relative;'><img src='/assets/ui/success.png' /><span style='position:relative;top:-15px;'>Nachricht empfangen!</span></div>";
            $str2 = json_encode(array("file_name" => $file_name, "prompt" => $str));
            //var_dump($str2);
            exit(json_encode(array('file_name' => $data['upload_data']['file_name'], 'prompt' => $str)));
        }
    }
}
类服务扩展CI_控制器
{
公共函数构造()
{
父项::_构造();
}
公共职能指数()
{
$filename='uploadfile';
$config['upload_path']='。/uploads/temp';
$config['allowed_types']=“jpg | png | gif | doc | docx | pdf | ppt | pptx | xls | xlsx | bmp”;
$config['max_size']='3072';
$config['encrypt_name']=TRUE;
$config['remove_spaces']=TRUE;
$this->load->library('upload',$config);
如果(!$this->upload->do_upload($filename))
{
$error=array('error'=>$this->upload->display_errors());
echo json_编码(数组('error'=>$error['error']);
}
其他的
{
$data=array('upload_data'=>$this->upload->data());
$file_name=$data['upload_data']['file_name'];
//打印(数据);
//echo json_编码(数组('test'=>“Hello World”);
$str=“Nachricht empfangen!”;
$str2=json_编码(数组(“文件名”=>$file_名,“提示”=>$str));
//var_dump($str2);
退出(json_编码(数组('file_name'=>$data['upload_data']['file_name'],'prompt'=>$str));
}
}
}

看起来您需要从服务器端转义引号。因为它们在那里,所以似乎创建了一个无效的JSON字符串。

一些东西可以尝试:

ajaxForm支持数据类型参数,如果您希望一个JSON来自服务器,请使用
dataType:JSON
像这样

$("#typeForm").ajaxForm({
    success : function(html){
       // html here is already automatically a json object
       alert(html.prompt);
    },
    dataType: 'json'
}).submit();
你能发布完整的service.php吗?或者尝试以下操作:

退出(json_编码(数组('file_name'=> $data['upload_data']['file_name'],'prompt'=>$str))

--编辑--

不确定为什么json_encode返回如此奇怪的字符串:s,
json_encode
是标准php库还是外部库?我这样问是因为有些服务器在php安装中没有json_编码。。。我在我的本地服务器上进行了测试,并使用php内部json_encode进行编码,效果良好:

<?php
$str = "<div style='position:relative'><img src='/assets/ui/success.png' /><span style='position:relative;top:-15px;'>Nachricht empfangen!</span></div>";
echo json_encode(array('prompt' => $str));

// output
//{"prompt":"<div style='position:relative'><img src='\/assets\/ui\/success.png' \/><span style='position:relative;top:-15px;'>Nachricht empfangen!<\/span><\/div>"}
string(214)“{”文件名“:“cde595958d38652909ce5a8fe3a6d6f.png”,“提示符“:“Nachricht emphangen!\/span\/div”}”
这似乎被打破了,因为没有引用。当发现“unescaped”时,它会破坏您期望的JSON结构。
转义的“应该是”,单引号带\”,等等。

如果找不到更好的解决方案,可以将值编码为base64编码:

$data = array('upload_data' => $this->upload->data());
$str = base64_encode("<div style='position:relative'><img src='/assets/ui/success.png' /><span style='position:relative;top:-15px;'>Nachricht empfangen!</span></div>");
echo json_encode(array('file_name' => $data['upload_data']['file_name'], 'prompt' => $str));
$data=array('upload_data'=>this->upload->data());
$str=base64_编码(“Nachricht empfangen!”);
echo json_encode(数组('file_name'=>$data['upload_data']['file_name'],'prompt'=>$str));
在客户端解码中,这更安全,如果处理来自不同语言的字符,这也更适用

此外:


确保打印后不会在json字符串调用exit;writer上添加其他字符。

我今天遇到了与
json\u encode
相同的问题。但经过大量测试,我找到了正确的解决方案:

在PHP中对数组或字符串进行编码:

json_encode($array, JSON_HEX_QUOT | JSON_HEX_TAG);
在JS中解码相同内容:

var d = $.parseJSON(content);

在这种情况下,如何转换所有潜在的问题字符,而不仅仅是解决问题的方法:

die(json_encode($data, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE));


您应该只调用数组的
prompt
对象,而不是全部!如下所示:

$("#typeForm").ajaxForm({
    success : function(html){
        var obj = $.parseJSON(html);
        alert(obj.prompt);
}).submit(); 

JSON不能很好地处理magic method
\uuuuToString()
产生的
字符串
输出-几乎不可能
JSON\uEncode()
任何远程接触到这样的东西的东西

<?php
/**
 * DEBUGGING NIGHTMARE
 * SO MUCH FUN, 10/10,
 */
class Nightmare {
  protected $str;
  public function __construct($str) {
    $this->str = $str;
  }
  public function __toString() {
    return $this->str;
  }
}

$test = new Nightmare('Hello Friends.');
echo $test;
> Hello Friends.

// cooool, so let's JSON the hell out of it, EASY

echo json_encode(['our_hello' => $test]);
// This what you expect to get, right?
> {"our_hello":"Hello Friends."}

// HAHA NO!!!
// THIS IS WHAT YOU GET:
> {"our_hello":{}}


// and this is why is that:

var_dump($test);
object(Nightmare)#1 (1) {
  ["str":protected]=>
  string(14) "Hello Friends."
}

print_r($test);
Nightmare Object
(
    [str:protected] => Hello Friends.
)


您的JSON看起来像…?by“不起作用“你的意思是这是投掷错误吗?或者它没有注入HTML或..?它如何“不工作”?JSON不在乎你在字符串中嵌入了什么——它可以是数字,可以是文本,也可以是html。没关系,只要遵守JSON语法规则就行。伙计们,看我编辑的帖子。很抱歉没有发布输出。所以它会提醒?请确切说明问题所在和/或预期行为。。。到目前为止,您的问题非常模糊。这正是我所怀疑的,但我似乎找不到在
$str
中我应该做的正确转义。如果您想手动转义,您可以更改为$str=“Nachricht empfangen!”;谢谢你,但是不行。如果我这样做了,它就不会发出警报。你有测试页面吗?如果我可以直接进行测试,它将不会发出警报,因为数据类型json需要一个有效的json字符串,在这种情况下,“HELLO WORLD”不是一个有效的JSonTanks,但我没有测试页面。这是以我的本地电影为背景的。我想这与格式错误的JSON有关,因为如果我转储JSON编码,它看起来像格式错误的JSON。如果您使用chrome浏览器,请按F12并查看右下角,如果您看到类似于
(x)1
,它可能会告诉您。json_encode应该正确地转义您的HTML,所以不要太担心对于chrome或mozilla,您可以对其他浏览器使用atob()或btoa(),您可以使用这个js库,或者这是一个好主意,在php端使用base64编码,在js端使用base64解码。我真的更喜欢这种方法,因为您不必弄乱任何json_encode标志!惊人的答案!这就是解决问题的方法。我也有同样的问题,但我几乎找到了解决办法。我使用的是
json编码($json,json'u HEX'u QUOT)json_
$("#typeForm").ajaxForm({
    success : function(html){
        var obj = $.parseJSON(html);
        alert(obj.prompt);
}).submit(); 
<?php
/**
 * DEBUGGING NIGHTMARE
 * SO MUCH FUN, 10/10,
 */
class Nightmare {
  protected $str;
  public function __construct($str) {
    $this->str = $str;
  }
  public function __toString() {
    return $this->str;
  }
}

$test = new Nightmare('Hello Friends.');
echo $test;
> Hello Friends.

// cooool, so let's JSON the hell out of it, EASY

echo json_encode(['our_hello' => $test]);
// This what you expect to get, right?
> {"our_hello":"Hello Friends."}

// HAHA NO!!!
// THIS IS WHAT YOU GET:
> {"our_hello":{}}


// and this is why is that:

var_dump($test);
object(Nightmare)#1 (1) {
  ["str":protected]=>
  string(14) "Hello Friends."
}

print_r($test);
Nightmare Object
(
    [str:protected] => Hello Friends.
)