【问题标题】:Mysqli query is returning a null value for a simple row of strings from a DBMysqli 查询正在为来自数据库的简单字符串行返回空值
【发布时间】:2014-03-31 20:14:38
【问题描述】:

我正在尝试使用 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 参考资料herehere 获得指导。我还阅读了来自 Stackoverflow thisthisthis 的这些问题,但对于我尝试的每种不同的代码组合,我似乎仍然得到了 null 的返回。

正如我在代码注释中所说的,我知道到数据库的链接可以像我在其他脚本和该脚本的其他区域中使用的那样工作 - 所以没有理由为什么这个对象不会工作。我也知道查询在输入到 phpmyadmin 时会返回预期的数据。

返回的数据只是一些字符串,我想做的只是将大约 16 个返回的数据集存储到一个数组中,作为循环的一部分,然后将该数组返回给 Ajax 请求。

【问题讨论】:

  • 去掉所有的反引号
  • 查询后有没有检查MySQL没有报错?
  • @Dagon - 不幸的是,尝试删除这些无济于事
  • @TeroKilkanen - 不,我完全忽略了一个很好的观点,我将在 execute() 阶段添加一个错误报告

标签: javascript php jquery mysql mysqli


【解决方案1】:

在我看来,您可能对->fetch()->fetch_row() 有一些混淆。您应该使用其中一种,但不能同时使用。

试试这个来检索你的结果集:

$stmt->execute();
while ($dataset = $stmt->fetch_row()) {
    $response[] = $dataset; //returned data forms part of larger dataset
}

这会将结果集的每一行附加到 $response 数组中。

【讨论】:

    【解决方案2】:

    您正在使用“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()
    

    【讨论】:

    • 被接受,因为第三个代码剪切产生了结果,而无需对我的方法进行太多更改。也就是说,我接受了为这个简单的查询使用准备好的语句的过度杀伤力。不幸的是,结果数组仍然显示空值,我不确定为什么问题中提出的问题已成功解决。
    猜你喜欢
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    相关资源
    最近更新 更多