【问题标题】:Best way to show default values for empty fields returned from a database query?显示从数据库查询返回的空字段的默认值的最佳方法?
【发布时间】:2010-09-21 06:31:04
【问题描述】:

有没有更好的方法来编写这段代码?

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

$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; 
}

【问题讨论】:

    标签: php database


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      如果这不仅仅是示例代码,那么您肯定希望通过编写来清理此查询...

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

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

      此外,我建议将“无数据”替换为“_MYPROJECT_NODATA”等常量,以便您轻松更改无数据标签的外观或实现国际化。

      然后你会使用

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

      【讨论】:

      • 他使用的是PostgreSQL扩展,所以转义DB字符串的函数应该是pg_escape_string()。
      • 先转成整数还需要转义吗?
      • @wdm: 不,如果 intval() 确实是整数就足够了,我调整了帖子
      【解决方案3】:

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

      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()

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

      【讨论】:

        【解决方案4】:

        您可以使用标准 SQL COALESCE 函数返回一个特殊的字符串而不是 null,如下所示:

        $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  
        

        然后您可以按照其他人的建议将“NO_DATA”替换为程序中的适当 HTML。

        【讨论】:

        • 如果字符串 'NO_DATA' 是合法的原始值怎么办?
        猜你喜欢
        • 1970-01-01
        • 2014-02-24
        • 2019-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-07
        • 2020-08-05
        • 2023-03-16
        相关资源
        最近更新 更多