无法将数组从php函数返回到ajax请求

时间:2017-04-01 06:41:39

标签: javascript php jquery arrays ajax

我有一个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是来自另一个文件I include

的变量

3 个答案:

答案 0 :(得分:1)

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

阅读本文以了解Variable Scope

方法1 使用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;
}

方法2 将参数传递给函数

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);

答案 1 :(得分:1)

如果不仔细使用全局变量,可能会像其他解决方案建议的那样难以找到问题。将$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;
    }

答案 2 :(得分:1)

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

  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内对其进行初始化或将其传递给它并将其用作参数。