2008-11-07 88 views
0

有没有更好的方法来编写这段代码?显示从数据库查询返回的空字段的默认值的最佳方法是什么?

我想显示为查询所返回的空字段的默认值(“无数据”):

$archivalie_id = $_GET['archivalie_id']; 

$query = "SELECT 
       a.*, 
       ip.description AS internal_project, 
       o.description AS origin, 
       to_char(ad.origin_date,'YYYY') AS origin_date 

      FROM archivalie AS a 
      LEFT JOIN archivalie_dating AS ad ON a.id = ad.archivalie_id     
      LEFT JOIN internal_project AS ip ON a.internal_project_id = ip.id 
      LEFT JOIN origin AS o ON a.origin_id = o.id    

      WHERE a.id = $archivalie_id"; 

$result = pg_query($db, $query); 

while ($row = pg_fetch_object($result)) 
{ 
    $no_data = '<span class="no-data">No data</span>'; 

    $internal_project = ($row->internal_project != '') ? $row->internal_project : $no_data; 
    $incoming_date = ($row->incoming_date != '') ? $row->incoming_date : $no_data; 
    $origin = ($row->origin != '') ? $row->origin : $no_data; 
} 

回答

3

你可以使用一个小的辅助函数

function dbValue($value, $default=null) 
{ 
    if ($default===null) { 
     $default='<span class="no-data">No data</span>'; 
    } 
    if (!empty($value)) { 
     return $value; 
    } else { 
     return $default; 
    } 
} 
1

如果这是不只是示例代码,那么你肯定希望通过编写消毒这个查询...

$archivalie_id = pg_escape_string($_GET['archivalie_id']); 

或者你想转换$ archivalie_id与intval()如果它显然总是一个整数。

此外,我建议用'_MYPROJECT_NODATA'等常数替换'无数据',以便您轻松更改无数据标签的外观或实现国际化的方式。

你会再使用

define('_MYPROJECT_NODATA', '<span class="no-data">No data</span>'); 
+0

他使用PostgreSQL扩展名,所以用于转义数据库字符串的函数应该是pg_escape_string()。 – 2008-11-07 11:53:16

+0

如果首先转换为整数,它仍然需要转义吗? – meleyal 2008-11-07 11:57:26

1

一种方法是选择数据库服务器上的默认权限。

SELECT 
    IFNULL(NULLIF(a.field1, ''), 'No data')  AS field1, 
    IFNULL(NULLIF(a.field2, ''), 'No data')  AS field2, 
    IFNULL(NULLIF(ip.description, ''), 'No data') AS internal_project, 
    IFNULL(NULLIF(o.description, ''), 'No data') AS origin, 
    to_char(ad.origin_date,'YYYY') AS origin_date 
FROM 
    archivalie AS a 
    LEFT JOIN archivalie_dating AS ad ON a.id = ad.archivalie_id     
    LEFT JOIN internal_project AS ip ON a.internal_project_id = ip.id 
    LEFT JOIN origin   AS o ON a.origin_id = o.id    
WHERE 
    a.id = $archivalie_id 

这样您就可以立即输出值,而且您不必触摸现有代码。 IFNULL(NULLIF())将空字符串变为NULL,NULL变为'No data'。如果您想单独留空字符串,请仅使用IFNULL()

从架构的角度来看,这可能缺乏一些优雅(取决于你如何看待它),但它是有效的。

0

您可以使用标准的SQL COALESCE函数返回一个特殊的字符串,而不是空的,就像这样:

$query = "SELECT 
      a.*, 
      COALESCE(ip.description,'NO_DATA') AS internal_project, 
      COALESCE(o.description,'NO_DATA') AS origin, 
      COALESCE(to_char(ad.origin_date,'YYYY'),'NO_DATA') AS origin_date 

然后,你可以为其他人所建议的在程序中相应的HTML代替“无音”。

相关问题