【问题标题】:Call to MySQL SP from Ajax/PHP returns null-ish values从 Ajax/PHP 调用 MySQL SP 返回空值
【发布时间】:2017-01-21 21:59:10
【问题描述】:

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

{"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 脚本返回预期值。其次,一旦我得到结果,我实际上并没有编写正确的代码来处理结果。仍在尝试将正确的结果返回到页面。

页面retrievedata.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;
}

?>

我在retrievedata 中有另一个PHP 函数,它调用相同的MySQL SP,但不是从Ajax 调用的,它返回了预期的结果,所以我非常有信心SP 能达到我的预期。

我认为关于如何从 Ajax 完成这一切,我认为一定有一些我不明白的地方。

编辑:只是想补充一点,我在 ajax 调用中尝试了成功而不是完成,以及 _GET 而不是 _POST。结果没有变化。

【问题讨论】:

  • 其他功能是否也使用connect2db(想知道用户是否对sp没有执行权限?)
  • 是的,另一个函数只是getactions的一个变种。调用代码相同。

标签: php jquery mysql ajax


【解决方案1】:

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

请参阅this example,了解将其转换为 JSON 结果的一种方法。

【讨论】:

  • 对于成功的 SELECT、SHOW、DESCRIBE 或 EXPLAIN 查询,mysqli_query() 将返回一个 mysqli_result 对象。 他需要获取结果。 $allresult = json_encode(mysqli_fetch_assoc($query));
  • 在调用 json_encode 之前将参数包装在 mysqli_fetch_assoc 中就可以了。 (对第一个错误的响应表示歉意;搞砸了参数。)
猜你喜欢
  • 1970-01-01
  • 2017-08-20
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
  • 2021-04-21
  • 2019-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多