我已经在这几天捣乱了,所以有时间寻求帮助。我尝试使用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。结果没有变化。
答案 0 :(得分:1)
看起来它正在从mysqli_query()序列化结果对象。我不确定它在内部做了什么,但在枚举/获取结果之前它可能不会返回实际结果数据。
在一种方法中查看this example将其转换为JSON结果。