返回mysqli准备的数组和num行

时间:2016-02-12 18:53:39

标签: php mysqli prepared-statement

我对mysqli预处理语句有点新意,我想使用fetch_array返回结果并将num_rows作为数组值返回。

我有类似的东西

function getCategories($dbh, $catId) 
{
    $data = array();
    $s = "SELECT id, title FROM categories WHERE parent_id = ?";
    if ($stmt = mysqli_prepare($dbh, $s)) {
        mysqli_stmt_bind_param($stmt, "i", $catId);
        mysqli_stmt_execute($stmt);
        if (mysqli_stmt_errno($stmt)) {
            exit(mysqli_stmt_error($stmt));
        }
        mysqli_stmt_store_result($stmt);
        $count = mysqli_stmt_num_rows($stmt)) {
        if ($count) {
            $data['count'] = $count;
            $result = mysqli_stmt_get_result($stmt);
            while ($r = mysqli_fetch_assoc($result)) {
                $data[] = $r;
            }
        }

        return $data;
    } else {
        exit(mysqli_error($dbh));
    }
}

似乎我不能使用mysqli_stmt_store_result和mysqli_stmt_get_result()。

store_result函数似乎给出了一个布尔值然后我得到了这个错误:" mysqli_fetch_assoc()期望参数1是mysqli_result,布尔给定"

希望这是有道理的。任何帮助都会非常感激。

更新:

function getCategories($dbh, $catId) 
{
    $data = array();
    $s = "SELECT id, title FROM categories WHERE parent_id = ?";
    if ($stmt = mysqli_prepare($dbh, $s)) {
        mysqli_stmt_bind_param($stmt, "i", $catId);
        mysqli_stmt_execute($stmt);
        if (mysqli_stmt_errno($stmt)) {
            exit(mysqli_stmt_error($stmt));
        }

        $result = mysqli_stmt_get_result($stmt);
        $data['count'] = $result->num_rows;
        while ($r = mysqli_fetch_assoc($result)) {
            $data[] = $r;
        }

        return $data;
    } else {
        exit(mysqli_error($dbh));
    }
}

1 个答案:

答案 0 :(得分:1)

根据PHP文档,mysqli_stmt_get_result在出错时返回FALSE

  

返回成功SELECT查询的结果集,或 FALSE 表示其他DML查询或失败。 mysqli_errno()函数可用于区分两种类型的失败。

然后你将其传递给mysqli_fetch_assoc抱怨,因为你给它一个bool而不是它期望的结果集。

在那一点上做一些错误检查,你会没事的。您的SQL查询可能有问题。请致电mysqli_errorno以确定是否存在错误,如上文所述。

修改

使用mysqli_error函数获取mysql错误的描述。最好在任何地方使用它来检查是否有故障,因为有一条错误消息会使调试变得比简单地无声地失败更容易。