【问题标题】:mysqli_stmt object is not fully initialized [duplicate]mysqli_stmt 对象未完全初始化[重复]
【发布时间】:2021-08-25 21:51:46
【问题描述】:

我在PHP中有一条SQL语句如下:

$sql = "SELECT t_da_edu_questions.ID, t_da_edu_questions.question_part1, t_da_edu_questions.question_part2, t_da_edu_questions.question_part3, t_da_edu_questions.answer, t_da_edu_questions.option2, t_da_edu_questions.option3, t_da_edu_questions.option4, t_da_edu_questions.option5, t_da_edu_questions.Supplerende, t_da_edu_questions.pic_id, t_da_edu_questions.Category_ID, t_da_edu_questions.approved, t_da_edu_questions.NeedAdmin
        FROM t_da_edu_questions
        WHERE (((t_da_edu_questions.Category_ID=?)) AND ((t_da_edu_questions.approved)=1) AND ((t_da_edu_questions.NeedAdmin)=0) AND
        ((t_da_edu_questions.ID) Not In (SELECT t_da_edu_UserAnswers.ID_qst FROM t_da_edu_UserAnswers WHERE ((t_da_edu_UserAnswers.ID_team = ?) AND T_da_edu_UserAnswers.AnsOrBack = 1 ))))
        ORDER BY RAND()
        LIMIT 1";

$stmt = mysqli_stmt_init($conn);
mysqli_stmt_prepare($stmt, $sql);
mysqli_stmt_bind_param($stmt, "ii", $cat, $TeamID); //(Line 36 in error)
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);

我得到错误:

致命错误:未捕获错误:mysqli_stmt 对象未在 C:\xampp\htdocs\app\content\db.php:36 中完全初始化 堆栈跟踪:#0 C:\xampp\htdocs\app\content\db。 php(36): mysqli_stmt_bind_param(对象(mysqli_stmt), 'ii', '6', 304) #1

如果我删除“Not In”中的子查询,它可以正常工作。 我一直没能找到类似的问题。

那么,基本上,我如何正确地将准备好的语句添加到带有子查询的查询中?

【问题讨论】:

  • 考虑规范化你的架构,
  • 我没有解决方案,只是建议检查每次调用 mysqli 函数的返回值。在几乎所有情况下,如果有任何问题,它们都会返回 FALSE,因此您应该检查一下。如果它确实返回 FALSE,则使用 mysqli_stmt_error() 检查特定错误以获取有关错误类型和消息的更多信息。在出现错误之前,您无法继续进行调试。养成检查这些函数的每个返回值的习惯。

标签: php mysql sql mysqli prepared-statement


【解决方案1】:

像往常一样,您忘记启用 mysqli 错误报告。打开它,您将看到来自 MySQL 的错误。要启用它,只需在建立连接之前添加此行。

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

在您启用错误报告之前,我们无法确定真正的错误是什么。不过,我可以解释一下这个神秘错误的含义。

当你用mysqli_stmt_init() 实例化mysqli_stmt 对象时,它只是一个普通的PHP 对象,没有任何与之链接的准备好的语句。您必须调用 mysqli_stmt_prepare() 来准备 MySQL 服务器上的语句。当您的 SQL 出现问题时,准备将失败,mysqli_stmt 对象将保持未初始化状态。你不能将这样的对象用于任何事情。

【讨论】:

  • 尽管真正的答案在链接的帖子中,但我还是将其发布为真正解决方案的答案和路标。
  • 谢谢。我不知道这个功能。这有很大帮助。错误当然是在深夜拼写错误......
猜你喜欢
  • 2020-06-27
  • 2018-08-05
  • 2012-01-17
  • 2018-09-19
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-03
相关资源
最近更新 更多