我有一个网站,其中包含相同CMS的不同实例;他们使用相同的代码(PHP)和相同的数据库模型。当然不同的内容。我有脚本来检查数据库模型中的偏差。
现在,对于某些网站,我需要添加一些额外的字段。例如。所有网站都有这样的用户表(用相应的表格来填充数据):
Table user
id
username
email
对于我需要添加的几个网站,例如地址和年龄,另一个我需要添加电话号码。
有没有办法在没有像
这样丑陋的结构的情况下做到这一点if ($site_name == 'siteA') {
/* show field Z */
}
答案 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轻松创建这些查询