【问题标题】:PHP class returning JSON but doesn't work with AJAX callPHP 类返回 JSON 但不适用于 AJAX 调用
【发布时间】:2013-01-29 21:14:05
【问题描述】:

我有一个 ajax 调用...

        $(function(){
        $('#registerUser').submit(function() {

           $.ajax({
                  url: 'http://www.mysite.co.uk/path/register/add_user.php',
                  type: 'post',
                  data: form.serialize(),
                  dataType: 'json',
                  crossDomain : true,
                  timeout: 5000,

                  success: function(msg){
                    alert(msg.name);
                  },

                  error: function(){
                    alert('There was an error loading the data.');
                  }
                  });
          });
      });

当我在 PHP 文件中回显一个 json 对象时,这一切都很好。但是,当使用我的类回显它时,它会在页面上回显,但在与 ajax 函数一起使用时不起作用 - 没有返回任何内容。

值得一提的是,我是 OOP 的菜鸟。我试图返回的对象只是一个与函数无关的简单对象,仅用于测试目的。

<?php

include('../config/.db.php');
include('../config/headers.php');

$firstName = $_POST['name'];
$surname = $_POST['surname'];
$email = $_POST['email'];
$password = $_POST['password'];
$password2 = $_POST['password2'];

class user{
    public $returnArray;
    public function addUser($firstName, $surname, $email, $password, $mysqli){

    $stmt = $mysqli -> prepare("INSERT INTO users(name, surname, email, password) VALUES (?,?,?,?)");   
    $stmt -> bind_param("ssss", $firstName, $surname, $email, $password);   
    $stmt -> execute();
    $stmt -> bind_result($result);
    $stmt -> fetch();
    $stmt -> close();

    $array = array('name'=>'andre');
    $this->returnArray = json_encode($array);  
    }
}

$user = new user;
$user->addUser($firstName, $surname, $email, $password, $mysqli);
echo $user->returnArray;
?>      

请求/响应

POST /intheloop/register/add_user.php HTTP/1.1
Host: www.mysite.co.uk
Connection: keep-alive
Content-Length: 47
Accept: application/json, text/javascript, */*; q=0.01
Origin: null
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Form Dataview sourceview URL encoded
name:a
surname:a
email:a
password:a
password2:a
Response Headersview parsed
HTTP/1.1 200 OK
Date: Sat, 26 Jan 2013 20:51:36 GMT
Server: Apache
X-Powered-By: PHP/5.3.15
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,PUT,POST,OPTIONS,DELETE
Keep-Alive: timeout=5, max=75
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json

【问题讨论】:

  • AJAX 和 PHP 是否在同一个域中?
  • 没有。您是否开始使用服务器 ip 而不是本地主机?

标签: php ajax json oop class


【解决方案1】:

您似乎违反了浏览器内置的 same origin policy 限制,该限制阻止您发送跨域 AJAX 请求。

您只能将 AJAX 请求发送到托管在与托管 AJAX 脚本的域相同的域中的脚本。在这种情况下,您似乎正在尝试向 http://www.mysite.co.uk/path/register/add_user.php 发送 AJAX 请求,但要使其正常工作,您的 javascript 文件必须托管在 http://www.mysite.co.uk/ 上。

您可以考虑some workarounds。它们涉及在您的域上使用JSONPCORS 或服务器端桥接脚本。

【讨论】:

  • 嘿伙计。我已经为跨域请求准备了 cors 的东西。不过感谢您的建议。
  • 但是您的浏览器是否支持 CORS?不要忘记旧的浏览器不支持它。如果您打算支持旧版浏览器,则不能依赖 CORS。
  • 太好了,这应该可以工作。看不出你的代码有什么问题。尝试检查您的 JavaScript 控制台是否存在潜在错误。还要检查 Network 选项卡以查看请求是否实际发出以及服务器对它的响应。
  • 请求发送的所有数据都很好,响应似乎根本没有发回任何变量:s
  • 您能在“网络”选项卡中看到请求吗?你怎么知道它没有返回任何东西。使用 FireBug 或 Chrome 开发人员工具栏,您将能够查看您的 AJAX 请求是否正在发送到服务器以及服务器对它的准确响应。如果没有这些信息,将很难为您提供帮助。
【解决方案2】:

如果您的 AJAX 调用没有从同一个域请求数据,那么它将无法工作,这是浏览器防止滥用 AJAX 的安全措施。因此,为了使其跨域工作,您可以做的一件事是从您的 PHP 脚本中发出 CORS 标头。

您可以将其添加到您的 PHP 文件中

header('Access-Control-Allow-Origin: *');

这将表明浏览器可以接受这个 ajax 调用和数据传输,然后你的脚本就可以工作了。

【讨论】:

  • 嘿伙计。我已经为跨域请求准备了 cors 的东西。不过感谢您的建议。
【解决方案3】:

您可能还想添加它以使输出具有正确的 mime 类型,将其放在“echo”上方 1 行:

header('Content-type: application/json');

【讨论】:

    【解决方案4】:

    所以错误在于该行

        $stmt -> bind_result($result);
    

    弄乱了查询结果中预期的绑定变量。因为我没有通过查询检索任何内容,所以没有将变量 $result 分配给任何内容。

    这反过来又给了一个 PHP 错误,弄​​乱了返回的 json。

    【讨论】:

      猜你喜欢
      • 2015-01-16
      • 1970-01-01
      • 1970-01-01
      • 2020-06-30
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多