mysqli stmt准备不工作

时间:2014-06-05 18:13:47

标签: php mysqli

我完全不知道这里有什么问题。同样的确切陈述适用于其他部分。

只是尝试制作一个简单的select语句并将其加载到数组中。

mysqli一直表现得非常奇怪,几乎是因为随机原因而崩溃/工作。

$id = 1;
$s_user = 1000;

$hold = array();
$stmt = mysqli_stmt_init($con);
if (mysqli_stmt_prepare($stmt,"SELECT article_id, title, summary, body, category_id, tags FROM articles WHERE article_id = ? AND user_id = ?")){

    mysqli_stmt_bind_param($stmt, "ii", $id, $s_user);
    mysqli_stmt_execute($stmt); 
    mysqli_stmt_bind_result($stmt, $article_id, $title, $summary, $body, $category_id, $tags); 

   while(mysqli_stmt_fetch($stmt)){
    $hold[] = array(
        'article_id'    => $article_id,
        'title'         => $title,
        'summary'       => $summary,
        'body'          => $body,
        'category_id'   => $category_id,
        'tags'          => $tags
            );
     }       
}

更新:尝试了mysqli_errno,如果失败则将else语句放在最后。 mysqli_stmt_bind_result是问题(应该注意这是if语句失败的地方)。如果我把这个功能拿出来就可以了。

我也试过没有运气的mysqli_stmt_get_result。还有其他想法吗?

1 个答案:

答案 0 :(得分:2)

以下是我将如何编写它,因为它更容易编写和调试。您需要mysqlnd才能使用此代码样式,但默认情况下应在PHP 5.4及更高版本中启用。

$sql = "SELECT article_id, title, summary, body, category_id, tags FROM articles
    WHERE article_id = ? AND user_id = ?";
if (($stmt = $con->prepare($sql)) === false) {
    trigger_error($con->error, E_USER_ERROR);
}
if ($stmt->bind_param("ii", $id, $s_user) === false) {
    trigger_error($stmt->error, E_USER_ERROR);
}
if ($stmt->execute() === false) {
    trigger_error($stmt->error, E_USER_ERROR);
}
if (($result = $stmt->get_result()) === false) {
    trigger_error($stmt->error, E_USER_ERROR);
}
$hold = $result->fetch_all(MYSQLI_ASSOC);

请参阅?无需绑定,无需循环。最终结果是$hold包含一组关联数组,就像你想要的那样。

您应该始终至少检查prepare()execute() false 返回值。 每次。还有其他可能的mysqli方法,如果出现错误,几乎所有这些方法都会返回false。

问:如何使用$ hold?是不是这个$ hold ['username']?

来自@Phil的评论,是的,我们可以启用异常报告,但我通常不会将该选项放在那里,因为大多数正在努力使用mysqli的PHP开发人员可能还没准备好处理异常。但是使用异常很好,因为您不必编写所有重复的错误检查代码。

激活例外:

$driver = new mysqli_driver();
$driver->report_mode = MYSQLI_REPORT_ALL;