Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Problem mit Anzeige einer Datenbanktabelle über PHP

Empfohlene Antworten

Veröffentlicht

Hallo Community,

ich habe folgendes Problem: Ich habe mir einen Code zusammen geschrieben, der am Schluss eine Abfrage bilden soll - in der man Kunden abfragen kann. Mein bisheriger Code sieht bisher so aus:

<?php

// Logindaten für die Datenbank
$host = ...
$dbuser = ...
$dbpassword = ...

// Datenbank Login
$login = ibase_connect($host, $dbuser, $dbpassword);
// Fehlermeldung
if($login==false)
{
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>

<script language="javascript" type="text/javascript">
//<![CDATA[
alert("Die Datenbank konnte nicht geöffnet werden.");
//]]>
</script><?php
echo ibase_errmsg();
die;
}


// Einbindung der HTML Datei (zur Wiederholung der Eingabe)
include('abfrage.html');
$text = $_POST['eingabe'];


// Abfrage der query
switch($text)
{
// Keine Eingabe
case FALSE:
?>
<script language="javascript" type="text/javascript">
//<![CDATA[
alert('Bitte machen Sie eine Eingabe!');
//]]>
</script><?php
echo ibase_errmsg();
die;

// Eingabe: Komma -> Alles anzeigen
case ',':
$query = "SELECT
pa.pa_name,
pa.pa_vorname,
pa.pa_titel,
(substring(100+extract(DAY FROM pa.pa_geb_datum)from 2 for 2)||
'.'|| substring(100+extract(MONTH FROM pa.pa_geb_datum)from 2 for 2)||
'.'|| extract(YEAR FROM pa.pa_geb_datum)),
vs.vs_kas_bezeichnung,
vs.vs_versich_art,
vs.vs_mart mitsta,
pa.pa_behandler,
pa.pa_pat_nr,
vs_ab_datum
FROM
patient pa,
versichertenstatus vs
WHERE
pa.pa_pat_nr = vs.vs_pat_nr
ORDER BY
pa_name ASC,
pa_vorname ASC
;";

break;

// Eingabe = Zahl
case is_numeric($text):
$query = "SELECT
pa_name,
pa_vorname,
pa_titel,
substring(100+extract(DAY FROM pa_geb_datum)from 2 for 2)||
'.'|| substring(100+extract(MONTH FROM pa_geb_datum)from 2 for 2)||
'.'|| extract(YEAR FROM pa_geb_datum),
vs_kas_bezeichnung,
vs_versich_art,
vs_mart,
pa_behandler,
pa_pat_nr,
vs_ab_datum
FROM
patient,
versichertenstatus
WHERE
pa_pat_nr=vs_pat_nr
AND LOWER(PA_PAT_NR) LIKE '".$text."%'
AND vs_ab_datum IN (SELECT MAX(vs_ab_datum)
FROM versichertenstatus
GROUP BY vs_pat_nr)
ORDER BY
pa_name,
pa_vorname,
vs_ab_datum DESC;";
break;

case (strpos($text, ',')<1):
$splitted_name = explode(',', $text);

$vorname = trim($splitted_name[1]);

$query = "SELECT
pa_name,
pa_vorname,
pa_titel,
substring(100+extract(DAY FROM pa_geb_datum)from 2 for 2)||
'.'|| substring(100+extract(MONTH FROM pa_geb_datum)from 2 for 2)||
'.'|| extract(YEAR FROM pa_geb_datum),
vs_kas_bezeichnung,
vs_versich_art,
vs_mart,
pa_behandler,
pa_pat_nr,
vs_ab_datum
FROM
patient,
versichertenstatus
WHERE
pa_pat_nr=vs_pat_nr
AND LOWER(PA_VORNAME) LIKE '".strtolower($vorname)."%'
AND vs_ab_datum IN (SELECT MAX(vs_ab_datum)
FROM versichertenstatus
GROUP BY vs_pat_nr)
ORDER BY
pa_name,
pa_vorname,
vs_ab_datum DESC;";

// Suche nach Vor- und Nachnamen über Eingabe: Komma
case (strpos($text, ',')>0):
$splitted_name = explode(',', $text);

$name = trim($splitted_name[0]);
$vorname = trim($splitted_name[1]);

$query = "SELECT
pa_name,
pa_vorname,
pa_titel,
substring(100+extract(DAY FROM pa_geb_datum)from 2 for 2)||
'.'|| substring(100+extract(MONTH FROM pa_geb_datum)from 2 for 2)||
'.'|| extract(YEAR FROM pa_geb_datum),
vs_kas_bezeichnung,
vs_versich_art,
vs_mart,
pa_behandler,
pa_pat_nr,
vs_ab_datum
FROM
patient,
versichertenstatus
WHERE
pa_pat_nr=vs_pat_nr
AND LOWER(PA_NAME) LIKE '".strtolower($name)."%'
AND LOWER(PA_VORNAME) LIKE '".strtolower($vorname)."%'
AND vs_ab_datum IN (SELECT MAX(vs_ab_datum)
FROM versichertenstatus
GROUP BY vs_pat_nr)
ORDER BY
pa_name,
pa_vorname,
vs_ab_datum DESC;";
break;

// Suche nach Vor- und Nachnamen über Eingabe: Leerzeichen
case (strpos($text, ' ')>0):
$splitted_name = explode(' ', $text);

$name = trim($splitted_name[0]);
$vorname = trim($splitted_name[1]);

$query = "SELECT
pa_name,
pa_vorname,
pa_titel,
substring(100+extract(DAY FROM pa_geb_datum)from 2 for 2)||
'.'|| substring(100+extract(MONTH FROM pa_geb_datum)from 2 for 2)||
'.'|| extract(YEAR FROM pa_geb_datum),
vs_kas_bezeichnung,
vs_versich_art,
vs_mart,
pa_behandler,
pa_pat_nr,
vs_ab_datum
FROM
patient,
versichertenstatus
WHERE
pa_pat_nr=vs_pat_nr
AND LOWER(PA_NAME) LIKE '".strtolower($name)."%'
AND LOWER(PA_VORNAME) LIKE '".strtolower($vorname)."%'
AND vs_ab_datum IN (SELECT MAX(vs_ab_datum)
FROM versichertenstatus
GROUP BY vs_pat_nr)
ORDER BY
pa_name,
pa_vorname,
vs_ab_datum DESC;";
break;

// Suche nach Vor- und Nachnamen über Eingabe: Kommas anschließenden Leerzeichen
case (strpos($text, ', ')>0):
$splitted_name = explode(', ', $text);

$name = trim($splitted_name[0]);
$vorname = trim($splitted_name[1]);

$query = "SELECT
pa_name,
pa_vorname,
pa_titel,
substring(100+extract(DAY FROM pa_geb_datum)from 2 for 2)||
'.'|| substring(100+extract(MONTH FROM pa_geb_datum)from 2 for 2)||
'.'|| extract(YEAR FROM pa_geb_datum),
vs_kas_bezeichnung,
vs_versich_art,
vs_mart,
pa_behandler,
pa_pat_nr,
vs_ab_datum
FROM
patient,
versichertenstatus
WHERE
pa_pat_nr=vs_pat_nr
AND LOWER(PA_NAME) LIKE '".strtolower($name)."%'
AND LOWER(PA_VORNAME) LIKE '".strtolower($vorname)."%'
AND vs_ab_datum IN (SELECT MAX(vs_ab_datum)
FROM versichertenstatus
GROUP BY vs_pat_nr)
ORDER BY
pa_name,
pa_vorname,
vs_ab_datum DESC;";
break;

// Suche nach Vor- und Nachnamen über Eingabe: Leerzeichen anschließend Komma
case (strpos($text, ' ,')>0):
$splitted_name = explode(' ,', $text);

$name = trim($splitted_name[0]);
$vorname = trim($splitted_name[1]);

$query = "SELECT
pa_name,
pa_vorname,
pa_titel,
substring(100+extract(DAY FROM pa_geb_datum)from 2 for 2)||
'.'|| substring(100+extract(MONTH FROM pa_geb_datum)from 2 for 2)||
'.'|| extract(YEAR FROM pa_geb_datum),
vs_kas_bezeichnung,
vs_versich_art,
vs_mart,
pa_behandler,
pa_pat_nr,
vs_ab_datum
FROM
patient,
versichertenstatus
WHERE
pa_pat_nr=vs_pat_nr
AND LOWER(PA_NAME) LIKE '".strtolower($name)."%'
AND LOWER(PA_VORNAME) LIKE '".strtolower($vorname)."%'
AND vs_ab_datum IN (SELECT MAX(vs_ab_datum)
FROM versichertenstatus
GROUP BY vs_pat_nr)
ORDER BY
pa_name,
pa_vorname,
vs_ab_datum DESC;";
break;

// Suche nach Vor- und Nachnamen über Eingabe: Leerzeichen, Komma, Leerzeichen
case (strpos($text, ' , ')>0):
$splitted_name = explode(' , ', $text);

$name = trim($splitted_name[0]);
$vorname = trim($splitted_name[1]);

$query = "SELECT
pa_name,
pa_vorname,
pa_titel,
substring(100+extract(DAY FROM pa_geb_datum)from 2 for 2)||
'.'|| substring(100+extract(MONTH FROM pa_geb_datum)from 2 for 2)||
'.'|| extract(YEAR FROM pa_geb_datum),
vs_kas_bezeichnung,
vs_versich_art,
vs_mart,
pa_behandler,
pa_pat_nr,
vs_ab_datum
FROM
patient,
versichertenstatus
WHERE
pa_pat_nr=vs_pat_nr
AND LOWER(PA_NAME) LIKE '".strtolower($name)."%'
AND LOWER(PA_VORNAME) LIKE '".strtolower($vorname)."%'
AND vs_ab_datum IN (SELECT MAX(vs_ab_datum)
FROM versichertenstatus
GROUP BY vs_pat_nr)
ORDER BY
pa_name,
pa_vorname,
vs_ab_datum DESC;";
break;

// Normale Suche nach Nachnamen
default:
$query = "SELECT
pa_name,
pa_vorname,
pa_titel,
substring(100+extract(DAY FROM pa_geb_datum)from 2 for 2)||
'.'|| substring(100+extract(MONTH FROM pa_geb_datum)from 2 for 2)||
'.'|| extract(YEAR FROM pa_geb_datum),
vs_kas_bezeichnung,
vs_versich_art,
vs_mart,
pa_behandler,
pa_pat_nr,
vs_ab_datum
FROM
patient,
versichertenstatus
WHERE
pa_pat_nr=vs_pat_nr
AND LOWER(PA_PAT_NR) LIKE '".$text."%'
AND vs_ab_datum IN (SELECT MAX(vs_ab_datum)
FROM versichertenstatus
GROUP BY vs_pat_nr)
ORDER BY
vs_ab_datum DESC;";
}

// Login und Verbindung zur Query
$dbabfrage = ibase_query($login, $query);
//Fehlermeldung
if($dbabfrage==false)
{
echo(string)ibase_errmsg();
die;
}

// Datenbank anzeigen
echo '<br />';
echo '<table border="1" align="center" style="background-color: white; min-width: 800px; font-family: Arial;">';
echo '<tr>';
echo '<th>Name, ';
echo 'Vorname';
echo '<span style="white-space:pre"> </span>';
echo 'Titel</th>';
echo '<th>Geb.-Datum</th>';
echo '<th>Kr.-Kass.-Namen</th>';
echo '<th>Priv.</th>';
echo '<th>Mitgl.</th>';
echo '<th>Stam.</th>';
echo '<th>Pat-Nr.</th>';
echo '</tr>';
while($zeile = ibase_fetch_row($dbabfrage))
{
echo '<tr>';

for($j=0; $j<1; $j++)
{
echo '<td>' .(string)$zeile[0]. ', ' .(string)$zeile[1].
'<span style="white-space:pre"> </span>' .(string)$zeile[2]. '</td>';
}

for($j=3; $j<5; $j++)
{
echo '<td>' . (string)$zeile[$j] . '</td>';

if(strlen($zeile[4]) >= '15')
{
$zeile[4]=substr($zeile[4], 0,15);
}
}

if($zeile[5] == '1')
{
echo '<td> </td>';
}
elseif($zeile[5] == '2')
{
echo '<td>P</td>';
}

switch($zeile[6])
{
case '1':
echo '<td>M</td>';
break;

case '3':
echo '<td>F</td>';
break;

case '5':
echo '<td>R</td>';
break;

default:
echo '<td>-</td>';
break;
}

echo '<td>' . (string)$zeile[7] . '</td>';

for($j=8; $j<10; $j++)
{
echo '<td>' . (string)$zeile[$j] . '</td>';
}

echo '</tr>';
}
echo '</table>';


// Beenden und Schließen der Datenbank
ibase_free_result($dbabfrage);
ibase_close($login);


// Abschließender Satz
echo "<br /><br />database request completed";

?>

<title></title>
</head>

<body>
</body>
</html>[/PHP]

Mein Problem ist jetzt, das ich es nicht hin bekomme, das jeder Patient wirklich nur einmal angezeigt wird. Ein Teil meiner Tabelle würde im Moment noch so aussehen:

[code] Tut, Heike 08.02.1966 AOK Coburg M He 666 1998-04-01 00:00:00 Tut, Heike 08.02.1966 AOK Coburg M He 666 1999-10-09 00:00:00 Tut, Heike 08.02.1966 AOK Coburg M He 666 2002-12-25 00:00:00[/code]

Wobei das Datum am Schluss nur als Orientierung dient, das ist das Datum ab wann der jeweilige Eintrag gültig ist (Das [i]vs_ab_datum[/i] in der Datenbanktabelle).

Ich soll es so hinbringen das eben diese eine Person nach der ID-Nummer (der 666 in dem Fall) aussortiert wird und nur EINMAL, nach dem aktuellsten vs_ab_datum, angezeigt wird!

Allerdings weiß ich nicht wie ich das anstellen soll und ich bin echt schon mit meinem Latein am Ende. :confused:

Zur Information, ich benutze kein MySQL sondern eine FireBird Datenbank.

Danke also für eure Hilfe, schon einmal im Vorhinein.

Mit freundlichen Grüßen

PATix

                            AND vs_ab_datum IN (SELECT MAX(vs_ab_datum)
FROM versichertenstatus
GROUP BY vs_pat_nr) [/PHP]

Hast du mal das Select Statement getestet und geschaut was bei raus kommt?

  • Autor
Hast du mal das Select Statement getestet und geschaut was bei raus kommt?

Ja, habe ich ich. Er sortiert mir die Ausgaben nach dem vs_ab_datum, zwar das aktuellste Datum zu erst.

Wäre es nicht übersichtlicher, im CASE-Block nur die WHERE-Bedingung zu modifizieren?

Und müsste in dem SubSelect zum MAX(vs-ab-datum) nicht die WHERE-Bedienung ebenfalls berücksichtigt werden?

Und warum ist dort die Formulierung AND vs-ab-datum IN und nicht = (SELECT MAX(...)...?

  • Autor
Wäre es nicht übersichtlicher, im CASE-Block nur die WHERE-Bedingung zu modifizieren?

In wie fern meinst du das?

Und müsste in dem SubSelect zum MAX(vs-ab-datum) nicht die WHERE-Bedienung ebenfalls berücksichtigt werden?

Wieso das? Was sollte den dort in die WHERE-Bedienung rein? o.O

Und warum ist dort die Formulierung AND vs-ab-datum IN und nicht = (SELECT MAX(...)...?

Da er mir sonst gar keine Ausgabe macht.

  • Autor
Da er mir sonst gar keine Ausgabe macht.

Okay, das stimmt nicht ganz, ich habe gerade mal das GROUP BY weggelassen und habe ein = statt dem IN gemacht

und es hat einwandfrei funktioniert. Allerdings gibt er mir jetzt nur noch die Person aus, bei der zu letzt etwas am Eintrag geändert worden ist. (Also sprich, mir wird nur noch eine einzige Person angezeigt.) :-/

  • Autor

So, ich danke dir sehr, ich habe men Problem endlich gelöst und zwar folgendermassen:

$query = "SELECT
pa_name,
pa_vorname,
pa_titel,
substring(100+extract(DAY FROM pa_geb_datum)from 2 for 2)||
'.'|| substring(100+extract(MONTH FROM pa_geb_datum)from 2 for 2)||
'.'|| extract(YEAR FROM pa_geb_datum),
vs_kas_bezeichnung,
vs_versich_art,
vs_mart,
pa_behandler,
pa_pat_nr,
vs_ab_datum
FROM
patient
LEFT JOIN
versichertenstatus ON patient.pa_pat_nr = versichertenstatus.vs_pat_nr
WHERE
versichertenstatus.vs_ab_datum = (SELECT MAX(vs_ab_datum)
FROM versichertenstatus
WHERE pa_pat_nr = vs_pat_nr
GROUP BY vs_pat_nr)
AND pa_pat_nr = vs_pat_nr
AND LOWER(PA_NAME) LIKE '".$text."%'
ORDER BY
pa_name ASC,
pa_vorname ASC;";[/PHP]

Ich danke dir für deine Hilfe. :D

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.