PHP类返回JSON但不适用于AJAX调用

时间:2013-01-26 20:24:54

标签: php ajax json oop class

我有一个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

4 个答案:

答案 0 :(得分:0)

您似乎违反了浏览器中内置的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或服务器端桥接脚本。

答案 1 :(得分:0)

如果你的AJAX调用没有请求来自同一域的数据,那么它将无法正常工作,这就是浏览器不会滥用AJAX的安全性。因此,为了使其跨域工作,您可以做的事情之一是从PHP脚本发出CORS头。

您可以将其添加到PHP文件

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

这将指示浏览器他们可以接受此ajax调用和数据传输,然后您的脚本将正常工作。

答案 2 :(得分:0)

你也可能想要添加它来为输出提供一个合适的mime类型,把它放在&#39; echo&#39;上面一行:

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

答案 3 :(得分:0)

所以错误是线

的事实
    $stmt -> bind_result($result);

搞乱了查询结果中预期的绑定变量。因为我没有使用查询检索任何内容,所以没有任何内容可以将变量$ result赋值给。

这反过来给PHP错误弄乱了json返回。