从Ajax / PHP调用MySQL SP会返回null-ish值

时间:2017-01-21 21:59:10

标签: php jquery mysql ajax

我已经在这几天捣乱了,所以有时间寻求帮助。我尝试使用Ajax / PHP / MySQL根据用户在下拉列表中的选择仅显示表的子集。 PHP代码调用MySQL存储过程。我正在构建的调用是正确的,如果我将其回显然后将其复制并按原样从phpMyAdmin MySQL控制台运行,我会得到我期望的结果。但是从Ajax调用的PHP代码中,我反而看到了这个结果(在JSON_encode之后在Firebug中回显):

{"current_field":null,"field_count":null,"lengths":null,"num_rows":null,"type":null}

页面本身的相关部分是:

    <script>
    function updateActions() {
    var results = '';
    var success = false;
    var selectedIssues = getIssues();
    var fnargs = "GetActions|'" + selectedIssues + "'";

    $.ajax({
        url: 'retrievedata.php',
        type: "POST",
        async:false,
        data: {"functionname":"getactions", "arguments":fnargs},
        dataType: "JSON",
        complete: function (obj, textStatus) {
                      if( (obj.error != '') ) { 
                        alert(JSON.parse(obj));
                        $("#testresult").text(textStatus);
                      }
                      else {
                        $("#testresult").text("Error");
//                      console.log(obj.error);
                      }
                      success = true;
                },
         error: function(textStatus, errorThrown) {
             success = false;
             $("#testresult").text('Error occurred: '.textStatus);
         }            
        })

    };
    </script>

两个音符。首先,它调用的getIssues脚本返回预期值。其次,我没有真正编写正确的代码来处理结果。仍在尝试将正确的结果返回页面。

页面retrieveata.php看起来像这样:

<?php

    include "dbfns.php";

    $aResult = array();
    $returnval = 'before tests';

    if( !isset($_POST['functionname']) ) { 
        $aResult['error'] = 'No function name!'; 
        }

    if( !isset($_POST['arguments']) ) { 
        $aResult['error'] = 'No function arguments!'; 
        }

    if( !isset($aResult['error']) ) {

        $functionName = $_POST['functionname'];
        $argsarray = explode('|', $_POST['arguments']); 
        $argcount = count($argsarray);
        $returnval = 'before switch';

        switch($_POST['functionname']) {
            case 'getactions':
               if( $argcount < 2 ) {
                   $returnval = 'too few arguments';
               }
               else {
                   $returnval = 'in else';
                   $returnval = getactions($argsarray[0], $argsarray[1]);
               }
               break;

            default:
               $returnval = 'function not found';
               break;
        }

    }

    return $returnval;
    ?>

dbfns.php的相关部分(当然,删除了标识数据和凭据)是:

<?php

function connect2db() {
    $hostname = "XXX";
    $username = "XXX";
    $password = "XXX";
    $database = "XXX";
    $conn = mysqli_connect($hostname, $username, $password, $database);

    if( $conn == false ) {
         echo "Connection could not be established.<br />";
         die( print_r( myslqi_connect_error(), true));
    }

    return $conn;
}

function getactions($spname, $params, $errorstring = 'Unable to retrieve requested data') {
    $conn = connect2db();
    $query = "CALL ".$spname."(".$params.")";
    echo $query."\r\n";
    $result = mysqli_query($conn, $query);

    if ($result == false) {
        $errmessage = mysqli_error($conn);
        $allresult = $errmessage;
        echo $errmessage;
        die( print_r( mysql_error(), true));
    }
    else {
        echo "In else case\r\n";    
        $allresult = json_encode($result);              
    }           

    echo $allresult;
    return $allresult;
}

?>

我在retrieveata中有另一个PHP函数,它调用相同的MySQL SP,但不是来自Ajax,它返回预期的结果,所以我非常有信心SP做了我所期望的。

我认为必须有一些我不知道如何从Ajax中完成所有这些工作。

编辑:只想添加我尝试成功而不是在ajax调用中完成,而_GET而不是_POST。结果没有变化。

1 个答案:

答案 0 :(得分:1)

看起来它正在从mysqli_query()序列化结果对象。我不确定它在内部做了什么,但在枚举/获取结果之前它可能不会返回实际结果数据。

在一种方法中查看this example将其转换为JSON结果。