我完全不知道这里有什么问题。同样的确切陈述适用于其他部分。
只是尝试制作一个简单的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。还有其他想法吗?
答案 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。
来自@Phil的评论,是的,我们可以启用异常报告,但我通常不会将该选项放在那里,因为大多数正在努力使用mysqli的PHP开发人员可能还没准备好处理异常。但是使用异常很好,因为您不必编写所有重复的错误检查代码。
激活例外:
$driver = new mysqli_driver();
$driver->report_mode = MYSQLI_REPORT_ALL;