PATIX Geschrieben 28. März 2011 Geschrieben 28. März 2011 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 Zitieren
jjn Geschrieben 28. März 2011 Geschrieben 28. März 2011 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? Zitieren
PATIX Geschrieben 28. März 2011 Autor Geschrieben 28. März 2011 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. Zitieren
ennor Geschrieben 28. März 2011 Geschrieben 28. März 2011 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(...)...? Zitieren
PATIX Geschrieben 29. März 2011 Autor Geschrieben 29. März 2011 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. Zitieren
PATIX Geschrieben 29. März 2011 Autor Geschrieben 29. März 2011 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.) :-/ Zitieren
PATIX Geschrieben 29. März 2011 Autor Geschrieben 29. März 2011 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. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.