2008-11-07 8 views
0

Existe-t-il un meilleur moyen d'écrire ce code?Meilleure façon d'afficher les valeurs par défaut pour les champs vides renvoyés à partir d'une requête de base de données?

Je veux montrer une valeur par défaut («Non de données) pour tous les champs vides renvoyés par la requête:

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

Répondre

3

Vous pouvez utiliser une petite fonction d'aide

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

Si cela est pas seulement le code d'exemple alors vous voulez sûrement désinfecter cette requête en écrivant ...

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

ou vous voulez convertir $ archivalie_id avec intval() si c'est toujours un entier. En outre, je suggère de remplacer «Aucune donnée» par une constante comme «_MYPROJECT_NODATA» afin que vous puissiez facilement modifier l'apparence de votre étiquette de non-données ou mettre en œuvre l'internationalisation.

Vous pouvez ensuite utiliser

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

Il utilise l'extension PostgreSQL, donc la fonction permettant d'échapper les chaînes DB doit être pg_escape_string(). –

+0

A-t-il besoin de s'échapper s'il est converti en entier en premier? – meleyal

+0

@sgehrig: merci, édité – markus

1

Une approche serait de choisir le droit par défaut sur le serveur de base de données. De cette manière, vous pouvez sortir des valeurs immédiatement et vous n'avez pas besoin de toucher au code existant.

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 

Le IFNULL(NULLIF()) transforme les chaînes vides en NULL et NULL en 'No data'. Si vous souhaitez laisser les chaînes vides seules, utilisez uniquement le IFNULL(). D'un point de vue architectural, cela peut manquer d'élégance (selon la façon dont vous le regardez), mais il est efficace.

0

Vous pouvez utiliser la fonction SQL standard COALESCE pour retourner une chaîne spéciale au lieu de null, comme ceci:

$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 

Ensuite, vous pouvez remplacer « NO_DATA » par le code HTML approprié dans votre programme comme d'autres l'ont suggéré.

+0

Et si la chaîne 'NO_DATA' est une valeur d'origine légitime, bien que? – micahwittman

Questions connexes