数据库表中的异常

时间:2013-08-30 12:19:08

标签: php mysql

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

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

Table user
  id
  username
  email

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

有没有办法在没有像

这样丑陋的结构的情况下做到这一点
if ($site_name == 'siteA') {
   /* show field Z */
}

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

以下算法可能有所帮助:

根据配置文件并检测网站名称,我们可能会执行以下操作:

// 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。这样我认为你不必做出这样的条件。

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

答案 2 :(得分:0)

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

 _______________________
| 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轻松创建这些查询