【问题标题】:PHP MySQL CREATE TABLEPHP MySQL 创建表
【发布时间】:2023-03-31 19:03:01
【问题描述】:

我正在尝试使用 PHP、PDO 和 MySQL 创建一个表。 对于我的应用程序的需要,表的名称必须是一个变量。

这是我的代码:

$request = $pdo->prepare("CREATE TABLE IF NOT EXISTS :table (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
      `parent_id` bigint(20) unsigned NOT NULL,
      `position` bigint(20) unsigned NOT NULL,
      `left` bigint(20) unsigned NOT NULL,
      `right` bigint(20) unsigned NOT NULL,
      `level` bigint(20) unsigned NOT NULL,
      `title` text CHARACTER SET utf8 COLLATE utf8_unicode_ci,
      `type` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
      `content` text CHARACTER SET utf8 COLLATE utf8_unicode_ci,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;");
$request->execute(array(
    'table'=>$uuid));

我不能在 MySQL 语句中使用 ":table" 吗? 目前我写道:

[...]
CREATE TABLE IF NOT EXISTS `$uuid`
[...]

这可行,但对我来说听起来很奇怪^^'这是解决我问题的唯一方法吗?

【问题讨论】:

  • var_dump($uuid); 的输出是什么?
  • 当您尝试使用 :table 执行版本时会发生什么?
  • @rekire $uuid 包含我用来生成随机 ID 的 uniqid("", true) 的结果
  • @DWright 带有 :table 的版本不起作用。它什么都不做(没有错误)

标签: php mysql pdo create-table


【解决方案1】:

您不能将表名作为参数传递。如果要创建具有变量名称的表,则必须使用动态查询。

【讨论】:

  • 我不明白... ^^' 每次有人在我的网站上注册时,我只需要创建一个表(一个新用户 = 一个新表)。动态查询真的是我需要的吗?你会怎么做?
  • “一个新用户 = 一个新表”最糟糕的设计。包括引用用户表 PK 的 UserId 字段。
  • Hokobyan 我知道这是一个非常糟糕的设计。但是我的时间不多了,这似乎是最简单的版本。我有一个包含我所有用户的表,每个用户都可以在线存储文件并通过“树视图”访问它们。所以每个用户都有一个存储文件的表(就像我试图使用变量名创建的那个)。表名对应用户id。
  • @Eschard1991:我必须同意 Hakobyan 的观点......你正走向一个充满失败的土地......
  • “但是我的时间不多了,这似乎是最简单的版本。”你知道technical debt是什么吗?阅读此内容,您就会明白这不是最简单的方法。
【解决方案2】:
$pdo->query("CREATE TABLE IF NOT EXISTS userfiles (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int unsigned NOT NULL,
  `parent_id` bigint(20) unsigned NOT NULL,
  `position` bigint(20) unsigned NOT NULL,
  `left` bigint(20) unsigned NOT NULL,
  `right` bigint(20) unsigned NOT NULL,
  `level` bigint(20) unsigned NOT NULL,
  `title` text CHARACTER SET utf8 COLLATE utf8_unicode_ci,
  `type` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
  `content` text CHARACTER SET utf8 COLLATE utf8_unicode_ci,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8");

这是处理此类情况的唯一正确方法。
这些都是很基本的事情。
而您当前的设置就像一辆带有方形轮子的汽车。
尽管您的时间不足,但您必须使其成为单桌。
否则你会浪费更多的时间,最终还是会转向正确的设计,但经过无数次的痛苦

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 2015-06-20
    • 2019-06-01
    • 1970-01-01
    • 2013-03-01
    • 2011-12-09
    • 2012-01-27
    相关资源
    最近更新 更多