【问题标题】:If Tables In Database如果数据库中的表
【发布时间】:2025-12-23 03:10:11
【问题描述】:

我正在创建一个 PHP 应用程序,他们在其中输入数据库信息,我的程序将连接到数据库并插入表。我想首先确保数据库中没有当前表,如果有我想给它们一个错误。

我已经尝试过“SELECT COUNT(*)”,但是当我尝试运行它时,它显示:

“mysqli_result 类的对象无法转换为 int”。

      $check = 'SELECT COUNT(*)';
      $val = $connection->query($check);

      if ($val > 0) {
        header("Location: ../../db-setup.php?notclean");
      }

      else {
        $sql = 'CREATE TABLE `test` (`name` VARCHAR(255) NOT NULL);';
        $connection->query($sql) or die();
        header('Location: ../../db-setup.php?success');
      }

我尝试了这种配置,即使数据库中没有表,它仍然会抛出我的 notclean created 错误。

所以我尝试了...

      $check = 'SELECT COUNT(*)';
      $val = $connection->query($check);

      if ($val > 1) {
        header("Location: ../../db-setup.php?notclean");
      }

      else {
        $sql = 'CREATE TABLE `test` (`name` VARCHAR(255) NOT NULL);';
        $connection->query($sql) or die();
        header('Location: ../../db-setup.php?success');
      }

尝试此操作后,如果数据库中没有任何内容,它将按照我的意愿创建表。但是,如果数据库中有东西,它会抛出一个奇怪的错误:

"注意:mysqli_result 类的对象无法转换为 整数”。

【问题讨论】:

  • 奇怪!为什么不为SELECT 语句指定一个表?您将获得1 作为计数(即使您没有选择数据库!)。

标签: php sql


【解决方案1】:

在没有指定表的情况下随机调用SELECT 'foo' 不是错误,并且会返回合理的值。

一般模式是使用CREATE TABLE IF NOT EXISTS ... 并无条件使用它。

CREATE TABLE IF NOT EXISTS `test` (
  `name`  varchar(255) not null,
);

大多数 SQL 方言都支持这一点。由于您没有列出您的 SQL 服务器,因此我无法确定。我猜是 mysql 因为你提到了 'mysqli_result' 和 mysql does in fact support IF NOT EXISTS

如果您真的想避免使用IF NOT EXISTS,则需要执行特定于 SQL 方言的查询 -- DESCRIBE DATABASESHOW TABLESSELECT table_names FROM all_tables 或其他任何东西。

【讨论】:

  • 非常感谢。如果还有其他表,我将如何检索错误,以便将其打印到屏幕上?
  • 取决于相关的数据库引擎。对于 mysql,请参阅this answer。查询名称后,您可以决定是否应该抛出错误。
【解决方案2】:

问题

首先,让我告诉你为什么会出现错误:

  • query 方法返回一个 mysqli_result 对象,该对象保存来自查询的结果(可能是行)。
  • 当您使用$val > 1 时,PHP 会尝试将$val 变量(这是一个mysqli_result 对象)转换为integer(这不可能发生),因此您会收到错误。李>

我看到您的代码中使用了一个奇怪的查询,SELECT COUNT(*)总是返回 1!您需要在此处指定FROM 子句。

...我想首先确保数据库中没有当前表... 为此,您可以使用类似 SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'DB_NAME' 的查询,其中 DB_NAME 是您的数据库'用于存储/创建表格。

解决方案

因此,要解决问题,您需要使用类似fetch_assoc 的方法(返回关联的array)和然后使用您存储结果的变量(这是一个关联的array)来获得您需要的计数。你会使用类似的东西:

$check = "SELECT COUNT(*) AS `c` FROM `information_schema`.`tables` WHERE `table_schema` = 'DB_NAME';"; /** COUNT(*) is aliased as c to simply get it using $result['c'] later **/
$val = $connection->query($check);
$result = $val->fetch_assoc();
if($result['c'] > 0) { /** or just if($val->fetch_assoc()['c'] > 0) after the ->query call as you don't need to hold the result from the query (you don't/won't it need/use it later) **/
  header("Location: ../../db-setup.php?notclean");
} else {
  $sql = 'CREATE TABLE `test` (`name` VARCHAR(255) NOT NULL);';
  $connection->query($sql) or die();
  header('Location: ../../db-setup.php?success');
}

【讨论】:

  • 非常感谢!我真的很感激。