我正在尝试使用mysqli语句从MySQL表中检索单行。我已经尝试了几次不同的代码迭代,根据此论坛以及其他方面的各种先前问题巧妙地更改结构,但似乎除了'null'之外似乎没有得到任何结果。
这是一个更大的脚本的一部分,它通过带有jQuery的Ajax请求调用。我已经在下面包含了PHP和Javascript,虽然我对JS的确定相当自信(现在准备告诉别人......)。
关于我出错的地方的任何建议都会非常感激,因为我再也看不到树上的木头了,我只是绕圈子走了。
PHP:
//initiate new mysqli object
$retrieve_link = new AuctionMySQLi($db_host, $db_user, $db_password, $db_name); //custom subclass, this definitely works as is used in other scripts on the server
//prepares DB query. Query has been tested on phpmyadmin and returns the expected data set
$stmt = $retrieve_link->prepare("SELECT `item_number`,`item_name`,`item_category`,`end_date`,`auction_type`,`high_bid_number` FROM `item` WHERE `item_number`=2");
$stmt->execute(); //no params to bind, so execute straight away
$stmt->bind_result($item);
$stmt->fetch();
$dataset = $item->fetch_row();
$response[0] = $dataset; //returned data forms part of larger dataset
echo json_encode($response); //return the entire dataset to a jquery Ajax request
die;
JS:
//this definitely works as objects have been returned via the 'success' function as the code was being developed
$.ajax({
url : "items/populate-home-page-script.php",
type : "GET",
data : {data:toSend},
dataType : "json",
success : function(data){
alert(data[0]);
},
error : function(jqXHR, textStatus, errorThrown){
alert(textStatus+','+errorThrown);
}
});
return false;
我还尝试使用fetch_assoc()
和fetch_row()
作为PHP查询的一部分,从PHP参考资料here和here开始。我还阅读了Stackoverflow this,this和this中的这些问题,但我似乎仍然为我尝试的每个不同代码组合返回null
。
正如我在代码注释中所说的那样,我知道数据库的链接可以正常工作,因为我已经在其他脚本中使用过它,而且在这个脚本的其他区域 - 所以没有理由说这个对象不会工作要么。我也知道,当输入到phpmyadmin时,查询会返回预期的数据。
返回的数据只是一些字符串,我想要做的就是将大约16个返回的数据集存储到一个数组中,作为循环的一部分,然后将此数组返回给Ajax请求。
答案 0 :(得分:1)
您正在使用“AuctionMySQLi”,它似乎扩展了常规的Mysqli驱动程序。我会假设它正确地做到了这一点。
你正在使用准备好的陈述,在这种情况下可能是一种过度杀伤力。你可以用这样的东西完成同样的事情(php 5.3,mysqli + mysqlnd):
$retrieve_link = new AuctionMySQLi($db_host, $db_user, $db_password, $db_name);
$result = $retrieve_link->query("SELECT `item_number`,`item_name`,`item_category`,`end_date`,`auction_type`,`high_bid_number` FROM `item` WHERE `item_number`=2");
if($result !== false) {
echo json_encode($result->fetch_all());
} else {
echo json_encode(array());
}
$retrieve_link->close();
如果您使用的是较旧的php版本,或者mysqlnd不可用,您也可以
$retrieve_link = new AuctionMySQLi($db_host, $db_user, $db_password, $db_name);
$result = $retrieve_link->query("SELECT `item_number`,`item_name`,`item_category`,`end_date`,`auction_type`,`high_bid_number` FROM `item` WHERE `item_number`=2");
if($result !== false) {
$output = array();
while($row = $result->fetch_assoc()) {
$output[] = $row;
}
echo json_encode($output);
} else {
echo json_encode(array());
}
$retrieve_link->close();
我也明白你想限制结果的数量。在这两种情况下,完成它的一个好方法是在SQL中使用LIMIT语句。这总体上降低了源头的开销。否则,您可以使用array_slice对解决方案1中的result-> fetch_all()或解决方案2中的$ output的输出进行切片。
最后,如果你坚持使用准备好的声明,请阅读说明 http://ca2.php.net/manual/en/mysqli-stmt.bind-result.php 并分析提供的例子:
$retrieve_link = new AuctionMySQLi($db_host, $db_user, $db_password, $db_name);
$stmt = $retrieve_link->prepare("SELECT `item_number`,`item_name`,`item_category`,`end_date`,`auction_type`,`high_bid_number` FROM `item` WHERE `item_number`=2");
$stmt->execute();
$stmt->bind_result($itemName, $itemCat, $endDate, $auctionType, $highBidder);
$output = array();
while($stmt->fetch()) {
$output[] = array($itemName, $itemCat, $endDate, $auctionType, $highBidder);
}
echo json_encode($output);
$retrieve_link->close()
答案 1 :(得分:0)
在我看来,您可能会对->fetch()
和->fetch_row()
感到困惑。你应该使用其中一个,但不能两个都使用。
尝试此操作来检索结果集:
$stmt->execute();
while ($dataset = $stmt->fetch_row()) {
$response[] = $dataset; //returned data forms part of larger dataset
}
这会将结果集的每一行追加到$ response数组。