【问题标题】:jquery ajax request result undefinedjquery ajax请求结果未定义
【发布时间】:2016-10-05 03:51:35
【问题描述】:

我的 PHP 返回了一个字符串。我从 $.ajax 调用 PHP 脚本并尝试 将字符串放入全局变量 以进行进一步操作。它说变量未定义。你能帮帮我吗?

(我用dataType : "jsonp"来避免这里回答的错误Ajax Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource

我的 javascript (Jquery, Ajax, ...) 脚本

var my_data;

function get_my_data(){

$.ajax({

    type: 'GET',
    url: 'http://localhost:8012/My_PHP_scripts/test_1.php',
    dataType : "jsonp",
    crossDomain:true,
    success: function (my_data){
        console.log(my_data);
    }

    });

}

$( document ).ready(get_my_data);

PHP 脚本

<?php
$user = 'JOHN';
echo json_encode($user);
?>

HTML 代码

<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script>
<script type="text/javascript" src="MyJS.js"></script>
</head>
<body>
</body>
</html> 

更新

PHP 脚本

<?php
$name     = 'JOHN';
$encoded2 = json_encode(array('name'=>$name));    
echo $encoded2;
die( $encoded2 );
?>

JS 脚本

var my_data;

function get_my_data(){

$.ajax({

    type: 'GET',
    url: 'http://localhost:8012/My_PHP_scripts/test_1.php',
    dataType : "jsonp",
    crossDomain:true,
    success: function (result){
        my_data = result;
        console.log(my_data.name);
        console.log(result.name);
    }

    });
alert(my_data.name);
}

$( document ).ready(get_my_data);

【问题讨论】:

  • 试试dataType : "json"
  • 从 url 中删除 localhost 部分。浏览器对此做出了奇怪的反应
  • @AkhileshBChandran 如果我尝试得到以下错误stackoverflow.com/questions/23959912/… 我按照那里的建议使用了 jsonp
  • @Toumash 嗯,我认为这不是一个好主意。这个地址是我的脚本在我的 xammp Apache 服务器中的 URL。请看这个stackoverflow.com/questions/37632325/…
  • @JasonKrs 第一个问题是您尝试回显字符串而不是 JSON。您通过 json_encoding 键值数组 json_encode(array('name'=&gt;$name)); 解决了这个问题。然后下一个问题是与沙盒相关的。由于您的 URL 的性质,当您向 PHP 脚本发送 AJAX 请求时,访问被拒绝。 header('Access-Control-Allow-Origin: *'); 解决了那部分。你可以在这里阅读更多:jqfundamentals.com/chapter/ajax-deferreds

标签: javascript php jquery ajax


【解决方案1】:

你没有得到一个有效的 JSON,因为你的 PHP 代码只编码了一个纯字符串......你为什么不在你的 PHP 脚本中尝试这样的事情呢?

你的 JS 可以像这样更好:

function get_my_data(evt) {
    $.ajax({
        type: 'POST',
        url: 'https://some-domain.ch/test.php',
        dataType: "json",
        crossDomain: true,
        success: function(my_data) {
        alert(my_data.name);
        }
    });
}

确认HERE.

<?php   
    header('Access-Control-Allow-Origin: *');   //<== ALLOW ACCESS TO ALL...
    header('Content-Type: application/json');   //<== TELL HEADER TO DELIVER JSON-TYPE DATA 

    $user = array('name'=>'JOHN');
    die( json_encode($user) );     

现在你有一个有效的 JSON 数据,你可以像这样访问它:

    my_data.name;    // WILL OUTPUT:  JOHN

注意事项:

    <?php 
        $name     = 'JOHN';
        $encoded1 = json_encode($name);    
        die( $encoded1 );         //<== RESULT: 'JOHN'           |==>[INVALID JSON - STRING]

        $name     = 'JOHN';
        $encoded2 = json_encode( array('name'=>$name) );    
        die( $encoded2 );         //<== RESULT: {"name":"JOHN"}  |==>[VALID JSON]

测试一下HERE

【讨论】:

  • 哇,现在我得到一个 php 错误:丢失;声明之前。在控制台中它指的是 ` {"name":"JOHN"}` 很奇怪,因为在该行之前没有任何内容。另外 my_data 仍然未定义。我不明白为什么会出现这个 php 错误。无意义....我使用了 $encoded2 部分(仅这 3 行)
  • @JasonKrs 请用您的更改更新您的帖子,以便我们能够为您提供帮助。
  • @Poiz php 困扰着我,伙计大声笑(我认为我的浏览器很疯狂)。我只复制粘贴了你给我的东西(我什至还没有使用我自己的数组)......我仍然得到同样的错误; missing ; before statementmy_data 是未定义的。请在我的 OP 中查看更新的 scipts
  • @JasonKrs 现在我们也遇到了编码问题,如果您返回的是 json 字符串基结果,那么您需要返回内容类型标头。为此,只需附加 header("Content-type:application/json");在 $name ... assingment 之前并在 ajax 的 dataType 中使用“json”
  • @Nico 我不能使用“json”作为数据类型,因为它会引发错误:stackoverflow.com/questions/23959912/… 另外我不仅返回一个字符串,而且返回一个 PHP 数组对象......有点困难跨度>
【解决方案2】:

问题是你的全局变量 my_data 和你的成功函数的参数变量不是同一个变量。您可以更改参数名称,然后将其值分配给您的全局变量。

success: function (result){ my_data = result; }

检查this fiddle 以澄清这一点。

更新: @Poiz 也回答了您的问题

【讨论】:

  • 不。就是这么做的。还是一样。 my_data 仍未定义。 success: function (result){ my_data = result; console.log(my_data); } }); alert(my_data);
  • 是的,确实有两个问题。这个和@Poiz回答的编码问题
猜你喜欢
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
  • 2017-06-26
相关资源
最近更新 更多