避免在mysql查询中进行硬编码

时间:2013-10-11 15:04:16

标签: 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' VALUES (61234, 1)"

我的问题是; 是否存在问题,我将值1?硬编码,以表示垃圾邮件文件。

我应该在我的配置中使用定义,例如define('SPAM',1),所以我可以用define替换1吗?或者根本不重要?

2 个答案:

答案 0 :(得分:2)

如果id自动递增字段,那么这是非常大的问题!由于ID是自动生成的,因此很难保证它们的稳定性;即他们可能会改变。

如果id是你手动分配的东西,那不是一个大问题,但这是不好的做法。因为魔法数字很容易导致混乱和错误。谁知道“1”在阅读代码时的含义?

无论哪种方式,最好为每种情况分配稳定,可读 ID。

我同意@Tenner的说法,开始使用这个静态,不变的数据表也几乎没有意义。您的banned_files表应该有一个这样的列:

reason ENUM('virus', 'spam', 'illegal') NOT NULL

您的数据库中不需要任何其他内容。为用户输出时,可以通过PHP代码添加一个简单数组的可读原因。

答案 1 :(得分:1)

由于你有一个固定(和小)的参数,我很想让你的代码中的ID成为一个枚举,甚至根本不包括它们作为一个单独的数据库表。

想想像性别这样的东西 - 它有两个(或更多)选项,都是固定的。 (我们不会很快添加多个新性别。)我保证大多数注册系统都没有包含两个条目的GENDER表。

因此,表banned_files将是这样的:

id      | reason
--------+------------
12345   | 1
67890   | 2

并且您的代码将根据需要包含枚举:

enum BanReason {
    Virus = 1,
    Spam = 2,
    Illegal = 3
}

(请转换为PHP;我是C#开发人员!)

在PHP中:

$aBanReason = array(
    'Virus' => 1,
    'Spam' => 2,
    'Illegal' => 3
);