数据库表中出现异常


Exception in database table

我有一个网站,有相同CMS的不同实例;它们使用相同的代码(PHP)和相同的数据库模型。当然内容不同。我有适当的脚本来检查数据库模型中的偏差。

现在,对于一些网站,我需要添加一些额外的字段。例如,所有网站都有这样的用户表(用相应的表格填写数据):

Table user
  id
  username
  email

对于一些网站,我需要添加例如地址和年龄,而对于另一个网站,我则需要添加电话号码。

有没有一种方法可以做到这一点,而不需要像这样丑陋的结构

if ($site_name == 'siteA') {
   /* show field Z */
}

您应该使用版本控制和技术包装类来处理数据库访问。

在包装器中,您将检查数据库的版本,并根据它执行适当的查询。

你也可以有一个专用的代码,不是吗?很可能你有一个有特定需求的客户。为什么不给他安装一个特定的文件系统?

您可以创建一个额外的表,其中包含应为特定类型显示的站点名称和属性。例如:

 _______________________
| site_name | attribute |
|-----------------------|
| siteA     | address   |
| siteA     | age       |
| siteB     | address   |
| siteB     | phone_no  |
|___________|___________|

将所有(基本属性和额外属性)存储在同一个表中,并在php代码中使用存储在新表中的信息动态生成选择查询。因此,对于上面的例子,第一个站点的查询将是:

SELECT id, username, email, address, age FROM user;

第二个:

SELECT id, username, email, address, phone_no FROM user;

您可以使用PHP 轻松创建这些查询

以下算法可能会有所帮助:

根据配置文件和检测站点名称,我们可以执行以下操作:

// in conf.php
$siteA_fields = array('field1', 'field2', 'field1A');
// in the above array you have to include all fields you want to select with SiteA
$siteB_fields = array('field1', 'field2', 'field1B');
// in the above array you have to include all fields you want to select with SiteB
$sites = array('domain1.com' => 'siteA', 'domain2.com' => 'siteB');

// in your script file or master include
function detectDomain(){
 // return domain of the site
}
    function prepareSql(){
    $site = $sites[detectDomain()];
    $fields = $site.'_fields';
    $sql = 'SELECT '.implode(",",$$fields).' FROM table';
    return $sql
    }

您可以通过添加参数来改进prepareSql。这样的话,我认为你不必做这样的条件。

结论:您需要的解决方案应该取决于配置文件。