【问题标题】:Can't return array from php function to ajax request无法将数组从 php 函数返回到 ajax 请求
【发布时间】:2017-08-26 11:50:01
【问题描述】:

我有一个 javascript 文件,我在其中向 foo.php 发出 ajax 请求 为了得到一个mysql结果数组。 这是我的 javascript 文件。

//foo.js
$(document).ready(function(){
    $.ajax({
        url:"foo.php",
        type:"POST",
        data:{
            action:"test",
            remail:"foo"
        },
        success:function(data){
            var messages = data;
            console.log("Ext req");
            try{
                console.log(JSON.parse(data));
            }catch(e){
                console.log(data);
            }
        },
        failure:function(){

        }
    })
});

为了从 php 接收我的结果数组,我执行以下操作:

//foo.php
<?php 
    if(isset($_POST)){
        $action = $_POST['action'];
        if(empty($action)){
            return;
        }
        switch($action){
            case "test":
                $query = "select * from message where seen";
                $ar = [];
                $res = mysqli_query($con,$query);
                while($row = mysqli_fetch_array($res)){
                    $ar[] = $row;

                }
               echo json_encode($ar);
            break;
        }
    }            
?>

这会向我的 ajax 请求返回一个对象数组,然后我可以根据需要进行处理。 但是,如果我尝试将 switch 语句中的 php 代码移动到函数中并返回函数的编码结果,我只会得到一个空数组作为响应。 以下是我的尝试:

<?php 
    function test(){
        $query = "select * from message where seen";
        $ar = [];
        $res = mysqli_query($con,$query);
        while($row = mysqli_fetch_array($res)){
            $ar[] = $row;
        }
        return $ar;
    }
    if(isset($_POST)){
        $action = $_POST['action'];
        if(empty($action)){
            return;
        }
        switch($action){
            case "test":
                $result = test();
               echo json_encode($result);
            break;
        }
    }            
?>

任何想法为什么会发生这种情况?

更新

$con 是来自另一个文件的变量,我 include

【问题讨论】:

  • 你在哪里调用测试函数?
  • 该函数也没有返回语句...至少对于 JSON 编码
  • 函数确实有return语句

标签: javascript php jquery arrays ajax


【解决方案1】:

当您将查询逻辑移至函数$con 时,MySQL 的连接对象不可用。在你的函数中使用GLOBAL $con;

阅读本文了解Variable Scope

方法一 使用GLOBAL关键字

function test(){
    GLOBAL $con;

    $query = "select * from message where seen";
    $ar = [];
    $res = mysqli_query($con,$query);
    while($row = mysqli_fetch_array($res)){
        $ar[] = $row;
    }
    return $ar;
}

方法二 将参数传递给函数

function test($con){
    $query = "select * from message where seen";
    $ar = [];
    $res = mysqli_query($con,$query);
    while($row = mysqli_fetch_array($res)){
        $ar[] = $row;
    }
    return $ar;
}

Call it like this:

test($con);

【讨论】:

  • $con 来自另一个 php 文件,我将更新我的帖子
  • 没关系。您可以使用我提供的解决方案来修复它。由于未找到连接,您的查询失败。
  • 我可以在 5 分钟内接受这个答案。但是我不明白为什么我的函数中没有 $con 可用
  • 函数有自己的变量范围php.net/manual/en/language.variables.scope.php
【解决方案2】:

如果不小心使用全局变量,可能会使问题更难找到,正如其他解决方案所建议的那样。将 $con 作为参数传递给您的函数:

function test($con){
        $query = "select * from message where seen";
        $ar = [];
        $res = mysqli_query($con,$query);
        while($row = mysqli_fetch_array($res)){
            $ar[] = $row;
        }
        return $ar;
    }

【讨论】:

    【解决方案3】:

    让我们谈谈你遇到的问题:

    1. 您将failure 函数传递给$.ajax。您肯定想使用error 而不是failure。见here

    2. 您有一个 messages 变量已初始化,但在 success 中未使用。摆脱它。

    3. 您检查isset($_POST),但始终是true。你想检查isset($_POST["action"]),或者你想检查whether it is a POST request

    4. $confunction 中不可用。您需要在 function 中对其进行初始化或将其传递给它并将其用作参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 2020-12-28
      • 2013-10-29
      • 2021-06-28
      • 2017-08-22
      相关资源
      最近更新 更多