Php 避免mysql查询中的硬编码
我有一份禁令理由表:Php 避免mysql查询中的硬编码,php,mysql,oop,database-schema,Php,Mysql,Oop,Database Schema,我有一份禁令理由表: id | short_name | description 1 virus Virus detected in file 2 spam Spammy file 3 illegal Illegal content 当我禁止某个文件成为病毒时,我会在代码中执行以下操作: $file -> banVirus(); 将文件id和禁止原因插入到表中: "INSERT INTO 'banned_files' VALUE
id | short_name | description
1 virus Virus detected in file
2 spam Spammy file
3 illegal Illegal content
当我禁止某个文件成为病毒时,我会在代码中执行以下操作:
$file -> banVirus();
将文件id和禁止原因插入到表中:
"INSERT INTO 'banned_files' VALUES (61234, 1)"
我的问题是,我硬编码值1是否有问题?,以指示垃圾邮件文件
我应该在配置中使用像define('SPAM',1)这样的define,以便用define替换1吗?或者这一点都不重要?因为您有一个固定的(而且数量很少)参数,所以我很想在您的代码中将ID作为枚举,甚至不将它们作为单独的数据库表包含
想想性别之类的东西——它有两个(或更多)选项,都是固定的。(我们不会很快添加多个新的性别。)我保证大多数注册系统没有包含两个条目的性别表
因此,表禁止的\u文件
如下所示:
id | reason
--------+------------
12345 | 1
67890 | 2
reason ENUM('virus', 'spam', 'illegal') NOT NULL
您的代码将根据需要包含枚举:
enum BanReason {
Virus = 1,
Spam = 2,
Illegal = 3
}
(请转换为PHP;我是一名C#开发人员!)
在PHP中:
$aBanReason = array(
'Virus' => 1,
'Spam' => 2,
'Illegal' => 3
);
如果
id
是一个自动递增字段,那么这是一个非常大的问题!由于ID是自动生成的,很难保证其稳定性;i、 他们可能会改变
如果id
是您手动分配的,这不是什么大问题,但这是一种不好的做法。因为神奇的数字容易导致混乱和错误。谁知道阅读代码时“1
”是什么意思
因此,无论哪种方式,您最好为每个案例分配一个稳定、可读的id
我同意@Tenner的观点,即一开始就为这种静态的、不变的数据建立一个表也是毫无意义的。您的banked_files
表应该有如下列:
id | reason
--------+------------
12345 | 1
67890 | 2
reason ENUM('virus', 'spam', 'illegal') NOT NULL
数据库中不需要更多内容。当为用户输出此信息时,您可以通过PHP代码使用简单数组添加可读的原因。为什么不将其作为可选参数?如果您维护了代码,您希望在源代码中看到什么,
SPAM
或1
?在我看来很好,因为您只有3种ban类型,它们很容易记住。如果您有50多个,我可能会有不同的想法。这不是一个真正的问题,但您可能希望在注释中指出此1
对应于“禁止原因”表中的一个条目,以便以后的维护人员知道在哪里查找。。。由于您将insert包装在一个具有相当描述性名称的函数中,因此这比使用自动递增的主键作为ban-reason-id有很大帮助。。。您可以只使用short_name
,它保持数据库的关系化和规范化,并在其他地方(例如在应用程序中)使用时为您提供描述性禁止理由。由于id在数据库级别用作列的值,因此在一些随机代码中使用枚举来描述它不是一种好的做法。它将两者结合在一起,当然不清楚将来是否需要查找它。拥有一个字典表是一种常见的好做法,除非值是二进制的,就像你提到的那样,MySQL中的TINYINT就足够了,并且列名描述了它自己。感谢PHP的帮助,@CD001!我不同意你的第一句话。虽然它可以是一个自动递增字段,但它位于“查找”表中。还有另一个表,Banked_files,它有一个指向被禁止原因文件的外键。那么?但是1
是用PHP硬编码的,而数据库中的id可能会更改。这是一种不稳定的关系,因此是一个问题。这似乎是一个更好的插入解决方案。如果可能,您能否提供一个简单的示例,说明如何使用数组添加可读的原因?@paul$reasons=array('virus'=>'文件是病毒',…);echo$reasons[$row['reasons']
@AgRizzo无论出于何种原因,在自动增量值未设置为1
时设置数据库表。这些记录将收到一些随机id。仅仅是因为你依赖于自动生成的id,而这些id可能不会每次都以完全相同的方式生成,这一事实是不好的。