Boş alanlar için varsayılan değerleri göstermek için en iyi yol bir veritabanı sorgu döndü?

4 Cevap php

Bu kod yazmak için daha iyi bir yolu var mı?

Ben sorgu tarafından döndürülen herhangi bir boş alanlar için varsayılan bir değer ('veri yok') göstermek istiyorum:

$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 Cevap

Küçük bir yardımcı işlevini kullanabilirsiniz

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

Bu sadece bir örnek kod değilse o zaman mutlaka yazarak bu sorguyu sterilize etmek istiyorum ...

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

ya da bunu her zaman açıkça bir tamsayı ise intval () ile $ archivalie_id dönüştürmek istiyorum.

ayrıca ben böylece kolayca herhangi bir veri etiketi görünüyor şeklini değiştirmek ya da uluslararasılaşma uygulayabilirsiniz '_MYPROJECT_NODATA' gibi bir sabit ile 'Veri yok' yerine öneririz.

Daha sonra kullanmak istiyorsunuz

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

Bir yaklaşım veritabanı sunucusunda varsayılan hakkını seçmek olacaktır.

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

Hemen çıkış değerleri can, ve varolan kod dokunmak zorunda değilsiniz Bu şekilde. IFNULL(NULLIF()) NULL boş dizeleri döner, ve NULL 'No data' için. Yalnız boş dizeleri bırakmak istiyorsanız, IFNULL() sadece kullanın.

Mimari açıdan bakıldığında, bu (bunu nasıl baktığınıza bağlı olarak) bazı zerafet olmayabilir, ama etkilidir.

Bu gibi yerine null özel bir dize döndürmek için standart SQL COALESCE işlevini kullanabilirsiniz:

$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

Diğerleri önerilen gibi Sonra programda uygun HTML tarafından 'NO_DATA' yerini alabilir.