【问题标题】:define tables and columns names with constant用常量定义表和列名
【发布时间】:2014-10-16 12:29:35
【问题描述】:

用常量定义所有表和列名然后在查询字符串中使用它们是一种好的编码风格吗? 我这样做是因为每当我更改数据库中的某些内容时,我都可以简单地更改常量值而不是更改所有内容。 例如,这是我在单独文件中的数据库定义:

    define("DB_TBL_USER", "user");

    define("DB_USER__PK_USER_ID", "pk_user_id");
    define("DB_USER__PASSWORD", "password");
    define("DB_USER__EMAIL", "email");
    define("DB_USER__FIRST_NAME", "first_name");
    define("DB_USER__LAST_NAME", "last_name");
    define("DB_USER__GENDER", "gender");

在我的数据库类中,我构建了这样的查询(在 register_user() 方法中!):

$queries[]="INSERT INTO ".
                            constant('DB_TBL_USER'). " ( ".
                            constant('DB_USER__PASSWORD').",".
                            constant('DB_USER__EMAIL').",".
                            constant('DB_USER__FIRST_NAME').",".
                            constant('DB_USER__LAST_NAME').",".
                            constant('DB_USER__GENDER').") ".
                        "VALUES ("."
                            $password, 
                            $email, 
                            $first_name, 
                            $last_name, 
                            $gender
                            ";

然后将其他查询放入 queries[] 数组并循环执行。

有没有更简单有效的方法?

【问题讨论】:

  • 也许您应该多担心 SQL 注入攻击而不是轻松更改。
  • 感谢@IgnacioVazquez-Abrams,但如果您的意思是密码加密和清理字符串,我已经知道它们并且我实现了它们。我刚开始学习 php 和 mysql,我知道以后我的数据库中会有很多东西要更改。
  • 也许你可以尝试流行MVC框架中的ORM部分(php:Codeigniter,Yii等...),你可能不需要在sql查询的上下文中重新发明轮子,结果生成 - ellislab.com/codeigniter/user-guide/database/active_record.html
  • @buddhi。我正在阅读文档。它会帮助我。谢谢

标签: php mysql


【解决方案1】:

实际上,重命名列并不经常发生。添加或删除它们更为常见,因此您的常量将无济于事。

列发生变化的主要原因是其含义发生变化,例如,当您想要存储首字母而不是名字时,您可以将列重命名为 first_nameinitials

但是,如果您有一个常量,您仍然需要重命名该常量,否则您的常量名称将毫无意义且令人困惑。

这可能仍然更容易,因为DB_USER__FIRST_NAMEfirst_name 更容易在您的代码中找到(这可能会导致变量名等误报)。

无论如何:如果你这样做,我会使用名称为DB_TBL_USER 的常量而不是constant('DB_TBL_USER')。如果这样做,您的代码会更精简,并且您可能会受益于 IDE 中的代码完成功能。

如果您不这样做,并且在极少数情况下需要重命名 first_name,您仍然可以搜索整个代码并检查每个匹配项是否需要更改。即使在非常大的项目中,这也很容易管理。

或者,您也可以考虑将表名添加为列名的前缀,因此将列命名为user_first_name 而不仅仅是first_name。不是我会选择的路径,但有时会这样做(例如,MediaWiki 使用这种模式)。

如果您使用 ORM 和/或命令模式,您可能会将对表的访问封装在几个小类中,从而使更改列名变得微不足道。如果您有合适的 IDE,则可以通过重构工具重命名映射到列的属性,否则应用与上述相同的搜索/替换备注。

【讨论】:

  • 我想,我太担心了!关于使用 DB_TABLE_USER 而不是常量('DB_TBL_USER'),我认为根据this 没有办法做到这一点,谢谢,
  • 那个问题是关于在不连接的情况下扩展字符串中的常量。由于您 正在 连接,这很有可能:INSERT INTO '.DB_TABLE_USER.' ....' 可以正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
  • 1970-01-01
  • 2013-06-03
相关资源
最近更新 更多