Лучший способ показать значения по умолчанию для пустых полей, возвращаемых из запроса к базе данных? - PullRequest
0 голосов
/ 07 ноября 2008

Есть ли лучший способ написать этот код?

Я хочу показать значение по умолчанию («Нет данных») для любых пустых полей, возвращаемых запросом:

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

Ответы [ 4 ]

3 голосов
/ 07 ноября 2008

Вы можете использовать небольшую вспомогательную функцию

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 голос
/ 07 ноября 2008

Один из подходов заключается в выборе права по умолчанию на сервере базы данных.

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

С архитектурной точки зрения этому может не хватать элегантности (в зависимости от того, как вы на это смотрите), но это эффективно.

1 голос
/ 07 ноября 2008

Если это не просто пример кода, то вы наверняка хотите очистить этот запрос, написав ...

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

или вы хотите преобразовать $ archivalie_id с помощью intval (), если оно всегда является целым числом.

Более того, я предлагаю заменить «Нет данных» на константу типа «_MYPROJECT_NODATA», чтобы вы могли легко изменить внешний вид вашей метки без данных или реализовать интернационализацию.

Вы бы тогда использовали

define('_MYPROJECT_NODATA', '<span class="no-data">No data</span>');
0 голосов
/ 07 ноября 2008

Вы можете использовать стандартную функцию 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  

Тогда вы можете заменить «NO_DATA» на соответствующий HTML в вашей программе, как предлагали другие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...