[PHP/mySQL] Probleme bei Daten-Ausgabe

mh1001

Lt. Commander
Registriert
Nov. 2003
Beiträge
2.039
Hallo zusammen,

ich stehe gerade vor folgendem Problem:
Mit folgendem Script sollen Daten, welche im Format "Y-m-d" vorliegen, aus einer mySQL-Datenbank ausgelesen werden, in Monat und Jahr aufgesplittet werden und in einem Menü dargestellt werden:
PHP:
<html>
     <head>
     <title>Navigationsleiste</title>
     <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
     <link href="../daten/rahmen.css" rel="stylesheet" type="text/css">
     <link href="../daten/verlauf.css" rel="stylesheet" type="text/css">
     <link href="../daten/hintergrund.css" rel="stylesheet" type="text/css">
     </head>
     
     <body background="../daten/hintergrund.jpg" link="#000000" vlink="#000000" alink="#000000">
     <table width="200" border="0" cellpadding="0" cellspacing="0" class="rahmen">
       <tr> 
 	<td width="200" height="25" class="verlauf"><div align="center"><strong>Neuigkeiten-Archiv</strong></div></td>
       </tr>
       <tr> 
     	<td width="200" height="25" valign="bottom" class="hintergrund"> 
 	 <div align="center"><font size="-2"><strong>Zeige alle Neuigkeiten</strong></font></div></td>
       </tr>
       <tr> 
 	<td width="200" height="25" valign="top" class="hintergrund"><div align="center"><font size="-2"><strong>aus 
     	folgendem Zeitraum:</strong></font></div></td>
       </tr>
       <tr> 
     	<td width="200" height="25" class="hintergrund"><div align="center"> 
     		<select name="monat" id="monat">
     		  <option value="0" selected>------------</option>
     		  <?php
     		  include("konfiguration.php");
     		  $abfrage = "SELECT id, datum FROM rbg_neuigkeiten ORDER BY id DESC";
     		  $ergebnis = mysql_query($abfrage);
     		  while($row = mysql_fetch_object($ergebnis))
     		   {
     		  $monat = substr($row->datum, 5, -3);
 		 $monatsnamen = array("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"); 
     			$monatsname = $monatsnamen[$monat(n)-1];
     		   ?>
 		 <option value="<?php echo $row->id; ?>"><?php echo $monatsname; ?></option>
     		  <?php } ?>
     		</select>
     	  </div></td>
       </tr>
       <tr> 
     	<td width="200" height="25" valign="top" class="hintergrund"> 
 	 <div align="center"><font size="-2"><strong>Monat</strong></font></div></td>
       </tr>
       <tr> 
     	<td width="200" height="25" class="hintergrund"><div align="center"> 
     		<select name="jahr" id="jahr">
     		  <option value="0" selected>------------</option>
     		  <?php
     		  include("konfiguration.php");
     		  $abfrage = "SELECT id, datum FROM rbg_neuigkeiten ORDER BY id DESC";
     		  $ergebnis = mysql_query($abfrage);
     		  while($row = mysql_fetch_object($ergebnis))
     		   { 
     		  $jahr = substr($row->datum, 0, 4);
     		  ?>
 		 <option value="<?php echo $row->id; ?>"><?php echo $jahr; ?></option>
     		  <?php } ?>
     		</select>
     	  </div></td>
       </tr>
       <tr> 
     	<td width="200" height="25" valign="top" class="hintergrund"> 
 	 <div align="center"><font size="-2"><strong>Jahr</strong></font></div></td>
       </tr>
       <tr> 
     	<td width="200" height="25" class="hintergrund"><div align="center"> 
     		<input type="submit" name="Submit" value="Anzeigen">
     	  </div></td>
       </tr>
       <tr> 
     	<td width="200" height="25" class="hintergrund">&nbsp;</td>
       </tr>
     </table>
     </body>
     </html>
Hier noch die Datei konfiguration.php:
PHP:
<?PHP
     $dbhost="+++++++"; // Datenbankhost
     $dbuser="+++++++"; // Benutzername
     $dbpass=""; // Datenbankpasswort
     $dbname="+++++++"; // Datenbankname
     
     $conn=mysql_connect($dbhost,$dbuser,$dbpass);
     if(!$conn) { die("Verbinden zur Datenbank gescheitert."); }
     $conn2=mysql_select_db($dbname);
     if(!$conn2) { die("Datenbank nicht gefunden."); }
 ?>
Nun zu dem Problem: Es werden leider irgendwie weder die Daten richtig ausgegeben, noch erscheint die Tabelle vollständig, sondern bricht nach dem Menü, in welchem eigentlich die ausgelesenen Monate angezeigt werden sollten, einfach ab (siehe Anhang). Sobald die PHP-Funktionen entfernt werden, wird die Tabelle richtig dargestellt. Jedoch kann ich leider absolut darin keinen Fehler finden und bitte somit einmal euch um Hilfe . ;)

MfG mh1001

/Edit: Habe soeben noch einmal die Datei als Anhang beigefügt, da es bei der obigen Darstellung ja fast unmöglich ist den Überblick zu behalten. ;)
 

Anhänge

  • Fehler.jpg
    Fehler.jpg
    9 KB · Aufrufe: 262
  • neuigkeiten_links.zip
    997 Bytes · Aufrufe: 231
Zuletzt bearbeitet:
Drei Dinge fallen einem direkt auf.

SubStr mit dem Wert -3 als Länge des Strings suchen zu lassen ist nicht gut. Man sollte schon mindestens die Länge 1 wählen.
Dann gibt substr wie der Name eigentlich schon sagt einen String zurück, somit sollte der Aufruf $monat(n)-1 nicht funktionieren.



Also Substr gibt einen string zurück, am besten so einsetzen: substr($row->datum, 5, 2);
Dann diesen Zahlenwert benutzen, um den Array abzufragen.
$monatsname = $monatsnamen[$monat];
Zum glück macht PHP automatisches Typenfloating.
 
So, schon einmal vielen Dank für deine Hilfe! ;)

Ich habe jetzt deinen Rat befolgt und siehe da, die Tabelle ist wieder da. ;)
Doch stehe ich jetzt vor einem weiteren Problem, die Jahreszahlen werden zwar richtig ausgelesen, jedoch werden die Monatsnamen nur beim 10.-12. Monat ausgelesen, bei den anderen Monaten mit der Angabe "0*" funktioniert es aber leider nicht.
Aber trotzdem schon einmal vielen Dank für deine Hilfe! ;)

Nebenbei hätte ich auch noch eine zweite Frage. Und zwar sollten gleiche Monate nach möglichkeit nur einmal in der Liste auftauchen, jedoch hab ich nach einigen probieren keinen geeigneten Befehl gefunden, der nur eine einmalige Ausgabe des selben Monats ermöglicht.

MfG mh1001
 
Dann setz mal vor den $monats wert den befehl intval, damit der die Zahlen mit führender 0 auch richtig hinkriegt. So ungefähr: intval($monat)
 
custus schrieb:
Dann setz mal vor den $monats wert den befehl intval, damit der die Zahlen mit führender 0 auch richtig hinkriegt. So ungefähr: intval($monat)
Nochmals vielen Dank an dich, jetzt funktioniert dies auch. ;)
Jetzt bleibt nur noch eine Frage offen, wie ich doppelte Einträge, sprich Einträge des gleichen Monats vermeiden kann.

MfG mh1001
 
Zuletzt bearbeitet:
Da gibt es sicher Wege für. Entweder du findest eine Datenbankabfrage die das schon erledigt. Oder du gehst hin und löschst immer den Monat aus dem Text-Array heraus, der schon gewählt wurde und übernimmst nur die, die im Array gefunden werden.
 
custus schrieb:
Da gibt es sicher Wege für. Entweder du findest eine Datenbankabfrage die das schon erledigt. Oder du gehst hin und löschst immer den Monat aus dem Text-Array heraus, der schon gewählt wurde und übernimmst nur die, die im Array gefunden werden.
Irgendwie verstehe ich es jetzt leider noch nicht so ganz.

Hier noch einmal ein Beispiel:
Die Daten werden mit folgendem Code ausgelesen:
PHP:
<?php
  include("konfiguration.php");
  $abfrage = "SELECT datum FROM rbg_neuigkeiten ORDER BY id DESC";
  $ergebnis = mysql_query($abfrage);
  while($row = mysql_fetch_object($ergebnis))
  {
  $monat = substr($row->datum, 5, 2);
 $monatsnamen = array("Error","Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"); 
  $monatsname = $monatsnamen[intval($monat)];
  ?>
und anschließend mit folgendem Code ausgegeben:
PHP:
<?php echo $monatsname; ?>
Das Problem ist jetzt, dass, wenn jetzt in der Datenbank einmal beispielsweise ein Feld mit dem Inhalt "2004-11-12", "2003.11.05" und "2003-12-04" vorhanden ist, zwar die Monate Dezember und November richtig ausgelesen werden, der Monat November aber natürlich doppelt ausgegeben wird. Jetzt suche ich noch nach einer Möglichkeit dies zu unterbinden, da ich keinerlei geeignete Funktionen finden konnte.

MfG mh1001
 
Du kannst folgendermaßen vorgehen.

Erstmal sortierst du die Datenbankabfrage nach dem Datum, so das die neuesten oben stehen. Dann kannst du folgenden Code benutzen, um immer nur einmal eine Ausgabe zu starten:

PHP:
<?php
include("konfiguration.php");
$abfrage = "SELECT datum FROM rbg_neuigkeiten ORDER BY id DESC";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{
$monat = substr($row->datum, 5, 2);
$monatsnamen = array("Error","Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"); 

if(strlen($monatsnamen[intval($monat)]) > 0)
{
  $monatsname = $monatsnamen[intval($monat)];
  $monatsnamen[intval($monat)] = "";

  // Hier die Ausgabe starten
}

?>

Jetzt wird jedes mal wenn ein Monat gefunden wird, der Wert geschrieben und gleichzeit der Wert aus dem Array in einen geleert. Damit kann er beim nächsten mal nicht mehr durch strlen bestätigt werden. Somit wird jeder Monat nur einmal ausgegeben.
 
Falls das Datum in einer für mySQL verständlichen Form in der Datenbank gespeichert ist solltest du mit folgender Abfrage die verschiedenen Monate erhalten:
Code:
SELECT DISTINCT MONTH(datum) FROM `rbg_neuigkeiten`
 
Noch einmal einen herzlichen Dank euch beiden! ;)
Habe mich nun für Raechaers Möglichkeit entschieden welche auch wunderbar funktioniert und sich auch gleich auf das Jahr übertragen ließ.
Jetzt sollte mein Neuigkeiten-Archiv fertig sein und ich kann mich der Programmierung des Forums widmen. Ich hoffe, dass ich euch deswegen nicht noch öfters mit meinen Anfänger-Fragen stören muss. ;)

MfG mh1001
 
Zurück
Oben