【问题标题】:PHP Warning mysqli_fetch_assoc()PHP 警告 mysqli_fetch_assoc()
【发布时间】:2020-01-09 06:20:23
【问题描述】:

PHP 版本:7.1 我一直在关注关于如何为用户构建上传选项的 mmtuts PHP 视频。当我观看视频时,他编写的代码在 localhost(通过 xampp 的数据库(mysql))上运行良好,但是当我去 HostGator 将其连接到实际数据库时。我收到错误提示

致命错误 : 未捕获的错误:在第 45 行的 gallery.php 中调用未定义函数 mysqli_stmt_get_result()

我在这个网站上查找了错误,大多数答案都是为了检查我的 PHP 扩展,但我无法在 PHP.INI 下的 Hostgator 控制面板中找到扩展 mysqlnd 和 nd_mysqli。如果你能指导我完成那将不胜感激。然而,其他答案也表明我可以使用 bind 和 fetch 方法,即使在查看了如何将此代码转换为 bind 和 fetch 方法之后,我真的不理解它。我对 PHP 完全陌生(尝试学习的第 7 天),所以我正在寻求有关如何解决此问题的建议。提前谢谢你。

   <?php
        include_once 'includes/dbh.inc.php';

        $sql = "SELECT * FROM gallery ORDER BY orderGallery DESC;";

        $stmt = mysqli_stmt_init($conn);
        if (!mysqli_stmt_prepare($stmt, $sql)) {
          echo "SQL statement failed!";
        } else {

          mysqli_stmt_execute($stmt);
          $result = mysqli_stmt_get_result($stmt);

          while ($row = mysqli_fetch_assoc($result)) {
            echo '<a href="#">
              <div style="background-image: url(img/gallery/'.$row["imgFullNameGallery"].');"></div>
              <h3>'.$row["titleGallery"].'</h3>
              <p>'.$row["descGallery"].'</p>
            </a>';
          }
        }
        ?>

【问题讨论】:

  • 我不确定,但从看起来你有两个关闭的 php 标签“?>” - 你可以删除一个吗?不管是哪一个。
  • 对此感到抱歉。谢谢阿米特的编辑!

标签: php mysql database


【解决方案1】:

我认为你的mysqlnd驱动安装正确了吗?根据Manual 中的评论:

如果您缺少已安装/加载的 mysqlnd 或者您没有安装它,您将在尝试调用“mysqli_stmt_get_result()”时获得未定义的引用。

最后,here 是一个论坛,讨论有关将驱动程序与 cpanel 一起使用的信息,您可能会觉得这些信息很有用。

【讨论】:

  • 我对如何安装 mysqlnd 驱动程序来托管 gator cpanel 非常迷茫。我看了你锚定的帖子,Hostgator 没有类似的东西。
  • 您需要联系您的托管服务提供商。他们会为你做的
  • 我认为在这里你可以使用 phpinfo() 函数prnt.sc/ql5sj2 找到该信息
  • 我明天会尝试联系我的托管服务提供商,以防底层解决方案不起作用。感谢您的帮助和外部链接。
【解决方案2】:

函数mysqli_stmt_get_result 依赖于一个函数,该函数仅在使用特定适配器时可用(mysql 本机驱动程序[实际上更好,但一些托管服务提供商不喜欢它的某些特性或只是提供非常旧的 php... ] 而不是 libmysqlclient)。

最好的选择是从学习PDO 开始,但如果你想坚持使用mysqli,那么我也鼓励使用面向对象的风格——你可以在这里找到一个很好的例子: https://www.php.net/manual/en/mysqli-stmt.execute.php

但只是为了修复您的文件:

0) 主要问题(使用旧的 libmysqlclient)是您需要确切知道您将拥有多少列 - 我看到您想要三个: - imgFullNameGallery - 题库 - descGallery

然后修改您的查询:

$sql = "SELECT * FROM gallery ORDER BY orderGallery DESC;";

到:

$sql = "SELECT imgFullNameGallery, titleGallery, descGallery FROM gallery ORDER BY orderGallery DESC;";

1) 换行

$result = mysqli_stmt_get_result($stmt);

与:

mysqli_stmt_bind_result($stmt, $imgFullNameGallery, $titleGallery, $descGallery);

现在替换:

while ($row = mysqli_fetch_assoc($result)) {
            echo '<a href="#">
              <div style="background-image: url(img/gallery/'.$row["imgFullNameGallery"].');"></div>
              <h3>'.$row["titleGallery"].'</h3>
              <p>'.$row["descGallery"].'</p>
            </a>';
          }

与:

while (mysqli_stmt_fetch($stmt)) {
    echo '<a href="#">
      <div style="background-image: url(img/gallery/'.$imgFullNameGallery.');"></div>
      <h3>'.$titleGallery.'</h3>
      <p>'.$descGallery.'</p>
    </a>';
}

如您所见,fetch 的每次调用都将使用数据库行中它们各自的值填充绑定变量$imgFullNameGallery$titleGallery$descGallery。 (变量实际上可以以不同的方式命名,这无关紧要,重要的是它们的计数)

同样在下面,如果您不重复使用它,请务必关闭语句:

mysqli_stmt_close($stmt);

和连接:

mysqli_close($link);

如果这对你有帮助,请告诉我。另外:您需要这样做只是因为您的托管服务提供商限制了您的功能。

【讨论】:

  • 第一个错误已经消失。现在它给了我一个“致命错误:允许的内存大小为 268435456 字节已用尽(试图分配 4294967296 字节)”这是一个新问题,所以我会对此进行一些阅读,如果我仍然无法弄清楚我会问一个新问题。感谢您的帮助
  • 对于允许的内存大小问题,您可以查看stackoverflow.com/questions/59654795/…
猜你喜欢
  • 2012-04-21
  • 2022-12-31
  • 2023-04-10
  • 2015-04-01
  • 1970-01-01
  • 2013-06-11
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多