2017-06-21 47 views
2

我在我的php脚本和我的javascript文件之间的通信有一些麻烦。看来javascript正在从我写的php脚本接收html,json和“无效的json”。为什么我的带有JSONP脚本的PHP/AJAX返回HTML,JSON和无效的JSON?

在JavaScript代码,所述数据变量计算:

{"readyState":4,"status":200,"statusText":"success"}

这不是余回声下方(在任一代码点,其中我这样做)的JSON格式。根据我的研究,这是因为PHP代码中的JSON回声返回了无效的JSON(导致PHP返回此结果)。然而,当我检查控制台,我发现以下几点:

<br /> 
<b>Warning</b>: mysqli::mysqli() [<a href='mysqli.mysqli'>mysqli.mysqli</a>]: (28000/1045): Access denied for ... in <b>..../.php</b> on line <b>xx</b><br /> 
{"status":"failure","message":"Access denied for ...."} 

这并不是因为任何的console.log语句我在我的代码的印刷,这是打印从Firefox的自动控制台项的结果致电http://...../.php

代码的第一行是PHP返回的HTML,如果这不是JSON返回,并且上面的代码的底线是我创建的实际JSON对象,并且我想要使用。

我在这里发布的原因是因为我想不出为什么PHP会返回HTML,我的JSON和JSON指示无效的JSON。

我还要提到的是,我在控制台上收到另一个错误:

SyntaxError: expected expression, got '<' --> file.php:1

这表明,我认为浏览器试图解释在出于某种原因,客户端PHP的,但我不知道这是否准确。

我认为我有一个错误是所有这些症状的根源,但经过一段时间和研究后,我一直无法自己找到这个错误。

我使用的代码如下所示:

的Javascript AJAX:

$.ajax({ 

    url: "...url.../file.php", 
    crossDomain: true, 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    dataType: "jsonp", 
    data: { 
     name: email, 
     email: email 
    }, 
    complete: function(data) { 
     console.log(JSON.stringify(data)); 
     //this is where the {"readyState":4,"status":200,"statusText":"success"} appears 
    } 

}); 

PHP(含量降低到范围这个问题):

<?php 

header("Content-type: application/json"); 
header("Content-Disposition: attachment;Filename=\"gamesUser.json\""); 

header('Access-Control-Allow-Origin: *'); 
header('Access-Control-Allow-Methods: POST'); 
header('Access-Control-Max-Age: 1000'); 

......... 

$data = array(); 

$conn = @new mysqli($servername, $username, $password, $dbname, $port); 

//check the connection 
if ($conn->connect_error) { 
    $data['status'] = 'failure'; 
    $data['message'] = $conn->connect_error; 

    echo json_encode($data); 
} else { 
    ......... 

    $data['status'] = 'success'; 
    $data['message'] = 'operations complete'; 
    $data['fileURL'] = $fileURL; 

    echo json_encode($data); 

    ......... 
} 

......... 
?> 

解决了!

代码:

echo $_GET['callback'].'('.json_encode($data).')'; 

不断变化的AJAX参数一起:

type: "GET", 
    dataType: 'jsonp', 
    jsonpCallback: 'handleResponse', 
    data: data 

有固定的问题。感谢所有协助讨论的人。

+0

那期待“<”听起来像,所以它无法正确执行你没有逃脱的东西。你能发布产生该错误的文件的代码吗? – NickSlash

+0

该文件将是php文件,其中包含上面的代码。 –

回答

-1

在PHP中发生错误时,它会使用HTML显示错误信息,以便在浏览器中正确地看到它。这就是为什么你得到意想不到的HTML,所以你应该确保PHP脚本不显示错误

你可以通过预先在(@)前面抑制mysqli构造函数(我认为是造成问题的那个)的警告,签名:

... @mysqli(...) ...

有避免显示错误的其他方式,检查http://php.net/manual/es/errorfunc.configuration.php#ini.display-errors http://php.net/manual/es/errorfunc.configuration.php#ini.error-reporting

+0

谢谢。当我这样做时,它抑制了html,但有趣的是,它也抑制了我的JSON对象(我想要的那个,如上所述,不是“readyState”对象)。作为参考,我在上面的代码中包含了连接调用(使用@)。 –

+0

@BrandonDixon我的不好,我没有检查你的所有代码,你应该用'complete'替换'success',因为第一个并不真正给你提供数据,但是我需要保留这个状态 – Piyin

+0

现在,因为我还没有设置我的PHP脚本来正确地返回成功或失败的状态(我的虚拟主机使用的是PHP的旧版本,所以我遇到了一些困难,并决定处理成功或失败的完整功能)。我从PHP返回的JSON对象,以及我试图从AJAX中获得的JSON对象,将给我的状态以及数据。 –

0

我想,你需要的是从jsonpcallback功能,请进行下面的例子中,你会得到的想法

function myfunc(json) { 
    alert(json); 
} 

$.ajax({ 
    type: "GET", 
    url: "http://example.com?keyword=r&callback=jsonp", 
    dataType: 'jsonp', 
    jsonpCallback: 'myfunc', // the function to call 
    jsonp: 'callback', // name of the var specifying the callback in the request 
}) 

;

+0

尝试你的建议后,我收到:{“readyState”:0,“responseText”:“”,“status”:0,“statusText”:“error”}。在这种情况下需要JSONP,因为目前,我正在使这个请求跨域。 –

+0

“jsonp”:false,flag会去哪里?我试图把它放在数据字段中,并作为它自己的参数,但都没有什么不同。 –

+0

我改变了我的代码以符合上面的建议,并且函数'myfunc'没有实际执行。你能告诉我在这种情况下回调变量的作用吗?编辑:我会说,这与我原来的方法相同,这可能意味着,也许,问题是与PHP文件相反。 –

相关问题