0

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

4 回答 4

0

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

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

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

于 2013-01-26T20:34:15.443 回答
0

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

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

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

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

于 2013-01-26T20:35:04.673 回答
0

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

header('Content-type: application/json');
于 2013-01-26T20:41:25.343 回答
0

所以错误是这条线

    $stmt -> bind_result($result);

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

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

于 2013-01-26T21:28:25.117 回答