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可能不会每次都以完全相同的方式生成,这一事实是不好的。