Bedingungen und Anzahl von Ergebnissen

Skribi

Grünschnabel
Hallo zusammen,

ich bin PHP Anfänger und setze mich zur Zeit mit einzelnen Scripten auseinander, um etwas dazuzulernen. Leider reicht mein Grundwissen häufig nicht, um diese Scripte meinen Bedürfnissen anzupassen.

Bei folgendem Script wird für jede Reihe in der Datenbank deren Datum NICHT in der Zukunft liegt, ein leeres Ergebnis zurückgegeben. Gibt es nun keine Events in der Zukunft, möchte ich dies auf einer Website per echo "No upcoming events" kenntlich machen.

Der Code sieht zur Zeit wie folgt aus:

PHP:
$query  = "SELECT * FROM events ORDER BY date, time";
				$result = mysql_query($query);

				while($row = mysql_fetch_assoc($result))
				{
				if ($row['date'] >= date('Y-m-d'))
				{
				displayEvents($row);
				echo "</tr><tr><td colspan='7' height='0px'></td></tr>";
				}
								
				elseif ($row['date'] >= date('Y-m-d') == '')
				{
					echo "Currently, there are no upcoming events.";
					echo "</tr><tr><td colspan='7' height='0px'></td></tr>";
				}
				}

Natürlich wird nun für jede Reihe der auszugebene Text wiedergegeben, d.h. ich habe "Currently, there are no upcoming events." ungefähr x-mal hinereinander stehen. Damit schieße ich völlig übers Ziel hinaus, da es ja einmal absolut ausreichen würde. ;-)

Ich habe bereits mit mysql_row_count herumgespielt, leider ohne Erfolg. Daher wäre es super, wenn mir jemand einen Tip in Richtung richtige Lösung geben würde.

Vielen Dank für Eure Hilfe.

Skribi
 
Hallo,
sowas machst du am besten direkt in die Datenbankabfrage.
PHP:
$date = date('Y-m-d'); 
$sql = 'SELECT COUNT(*) FROM events WHERE date >= '.$date;
$result = mysql_query($sql);
$count = mysql_result($result,0);
if($count == 0) :
       echo 'No upcoming events.';
endif;
 
Danke, das funktioniert - zumindest fast.

Leider geht es nur wenn ich den zweiten Paramter aus folgender Line weglasse:

PHP:
$count = mysql_result($result,0);

Da mysql_result aber 2 Paramter verlangt, wird vor der Ausgabe der entsprechende Fehler angezeigt. Dabei bin ich mir auch ziemlich sicher, dass die Null schon stimmt...

Ich fürchte, dass ich da gerade irgendetwas Fundamentales nicht beachte...
 
Dann schreib mal testweise in die ersten zwei Zeilen in deinem Script

PHP:
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);

Außerdem verwende mysql_error() wo es geht:

PHP:
$count = mysql_result($result, 0) || die(mysql_error());
 
Ok, habe ich gemacht.

Dies hatte für jede Reihe der Abfrage folgenden Error zur Folge:

Strict Standards: date() [function.date]: It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/Berlin' for 'CEST/2.0/DST' instead in [...]

Ich habe dies korrigiert, indem ich in meinem Script

date_default_timezone_set('Europe/Berlin');

gesetzt habe.

Nun sind alle Fehler weg und ich bin wieder bei meiner leeren Seite... :-/


Falls es hilft, kann ich Euch gerne einen Link zu der Seite, auf der ich das Script nutze, schicken.
 
Gibst du dieses $count mit echo irgendwo aus?

Du willst ja anzeigen, das keine Einträge da sind, wenn dir der Query 0 als Wert zurück gibt. Hast du eine Prüfung dafür eingebaut?

Ansonsten mach es mal so:

PHP:
if( ($num_events = mysql_result($result, 0)) == 0 )
{
  echo "Currently, there are no upcoming events.";
}
else
{
  echo "We $num_events upcoming events so far.";
}
 
Jetzt hab' ich es...

Der Fehler war eine der Marke "Grausam", betraf die Logik hinter der DB Abfrage bzw. der gestellten Bedingungen. Beim oben gemachten Lösungsansatz hatte ich auf einmal den Output "14", was der Anzahl aller DB Einträge (die zur Zeit in der Vergangenheit liegen) entspricht.

Somit habe ich die Abfrage völlig neu geschrieben. Ist evtl. etwas umständlich geworden, aber funktioniert: Eine Abfrage gibt mir nun die Gesamtanzahl an Einträgen aus, eine weitere die Anzahl der Einträge/Events in der Vergangenheit. Zu guter letzt wird dann letzteres von erstem subtrahiert. Ist dieses Ergebnis = 0, so wird der gewünschte Text "No upcoming events [...]" angezeigt.

PHP:
date_default_timezone_set('Europe/Berlin');

				$query  = "SELECT * FROM events ORDER BY date, time";
				$result = mysql_query($query);

				while($row = mysql_fetch_assoc($result))
				{
				if ($row['date'] >= date('Y-m-d')) 
				{
				displayEvents($row);
				echo "</tr><tr><td colspan='7' height='0'></td></tr>";
				}
				}
				$date = date('Y-m-d'); 
				$sql = 'SELECT COUNT(*) FROM events WHERE date >= '.$date;
				$query1 = mysql_query($sql);
				$totalentries = 'SELECT COUNT(*) FROM events';
				$query2 = mysql_query($totalentries);

				if((mysql_result($query2, 0) - mysql_result($query1, 0)) == 0) 
				{
  				echo "<b>Currently, there are no upcoming events.</b><br />The list will be updated as soon as possible.<br /><br />If you know about events in the near future that should be listed, don't hesitate to contact us. ";
				echo "</tr><tr><td colspan='7' height='0'></td></tr>";
				}
				else
				{
  				echo "There are $sql upcoming events in this list.";
				echo "</tr><tr><td colspan='7' height='0'></td></tr>";
				}

Ich bedanke mich bei allen für die Hilfe und vor allem Geduld und hoffe, mit meiner Lösung in Zukunft auch anderen Newbies etwas helfen zu können. Das Thema kann geschlossen werden...
 
Du kannst das Thema selbst schließen (Erledigt-Haken).

Außerdem kann man sich einen Query sparen. Du liest ja ohnehin schon alle aus. Du müsstest in deiner ersten while-Loop nur alle Termine mit zählen, die in der Zukunft (also größer als heute-Bedingung) liegen.

Falls du Interesse hast, zu erfahren, wie das geht, kann man ja daran optimieren. Wenn nicht, ists auch ok ;-)
 
Zurück