Absteigend MySQL Daten ausgeben (mysql_fetch_array)
Bernd
- php
Hallo!
Ich habe folgenden Code:
<?php
$mysqlhost="localhost";
$mysqluser="root";
$mysqlpwd="PASSWORT";
$mysqldb="news";
[...]
$sql = "SELECT id,nachricht,verfasser,datum FROM beitraege";
$adressen_query = mysql_query($sql) or die("Anfrage nicht erfolgreich");
$anzahl = mysql_num_rows($adressen_query);
while ($adr = mysql_fetch_array($adressen_query))
{
if(($adr['id'] % 2) == 0)
{
echo $alignl1;
echo $adr['nachricht'] . "<br />";
echo $formatvorn . $adr['verfasser'] . ", ";
echo $adr['datum'] . $formatnach;
echo $alignl2;
}
else
{
echo $alignr1;
echo $adr['nachricht'] . "<br />";
echo $formatvorn . $adr['verfasser'] . ", ";
echo $adr['datum'] . $formatnach;
echo $alignr2;
}
}
?>
(Habe unwichtige Zeilen entfernt)
Nun die Ausgabe der Daten funktioniert. Nur ich würde gerne die Daten absteigend mit while ($adr = mysql_fetch_array($adressen_query)) ausgeben.
Wie kann ich das umsetzen?
P.S.: Noch eine zweite Frage: Was muss ich in der Datenbank einstellen, damit Umlaute etc. angezeigt werden?
Hallo,
$sql = "SELECT id,nachricht,verfasser,datum FROM beitraege";
keine Angabe einer Sortierung ...
Nun die Ausgabe der Daten funktioniert. Nur ich würde gerne die Daten absteigend mit while ($adr = mysql_fetch_array($adressen_query)) ausgeben.
Wie kann ich das umsetzen?
Indem du bei der Abfrage angibst, in welcher Reihenfolge du die Resultate gern hättest (ORDER BY ...).
P.S.: Noch eine zweite Frage: Was muss ich in der Datenbank einstellen, damit Umlaute etc. angezeigt werden?
Am besten überall die gleiche Zeichencodierung verwenden. Also in der Datenbank selbst und in der Kommunikation zwischen Datenbank und PHP. Im Script selbst ist es weitgehend unerheblich, wenn du die Daten nur zum Browser durchreichst. Aber dem Browser solltest du die verwendete Codierung im HTTP-Header noch mitteilen.
So long,
Martin
Hallo Bernd,
$sql = "SELECT id,nachricht,verfasser,datum FROM beitraege";
$adressen_query = mysql_query($sql) or die("Anfrage nicht erfolgreich");
$anzahl = mysql_num_rows($adressen_query);
Nun die Ausgabe der Daten funktioniert. Nur ich würde gerne die Daten absteigend mit while ($adr = mysql_fetch_array($adressen_query)) ausgeben.
verstehe ich Dich richtig: Du möchtest die Nachrichten nach Alter aufsteigend (neueste zuerst, älteste zuletzt) anzeigen?
Wie kann ich das umsetzen?
Ergänze das entsprechende Sortierkriterium in Deiner Abfrage:
SELECT
id,
nachricht,
verfasser,
datum
FROM
beitraege
ORDER BY -- sortiert
datum DESC -- nach der Spalte datum, und zwar absteigend.
Bitte beachte bei der Ausgabe den Kontextwechsel. Mehr zu Kontextwechsel und zur Zeichencodierung (Deinem Umlauteproblem) findest Du im SELFHTML-Wiki:
- Kontextwechsel
- Zeichencodierung: MySQL
Freundliche Grüße
Vinzenz
Hallo Bernd,
[...]
SELECT
id,
nachricht,
verfasser,
datum
FROM
beitraege
ORDER BY -- sortiert
datum DESC -- nach der Spalte datum, und zwar absteigend.
>
> Bitte beachte bei der Ausgabe den Kontextwechsel. Mehr zu Kontextwechsel und zur Zeichencodierung (Deinem Umlauteproblem) findest Du im SELFHTML-Wiki:
> [...]
>
> Freundliche Grüße
>
> Vinzenz
Lieber Vinzenz,
Nun ich war so dumm, und hab nicht erwähnt, dass die Spalte Datum den Typ TEXT hat, weil ich das Datum in der Spalte so eintragen lasse " 22.02.2012 22:41".
Kann ich dem Sagen er soll es von der Spalte ID die größte zahl absteigend ausgeben?
Liebe grüße,
Bernd
Hallo,
SELECT
id,
nachricht,
verfasser,
datum
FROM
beitraege
ORDER BY -- sortiert
datum DESC -- nach der Spalte datum, und zwar absteigend.
> Nun ich war so dumm, und hab nicht erwähnt, dass die Spalte Datum den Typ TEXT hat, weil ich das Datum in der Spalte so eintragen lasse " 22.02.2012 22:41".
Beste Idee: erstelle ein Backup, konvertiere die Spalte in den Datentyp DATETIME.
> Kann ich dem Sagen er soll es von der Spalte ID die größte zahl absteigend ausgeben?
eine ID ist dafür da, um einen Datensatz eindeutig zu identifizieren, sonst nichts. Bürde der Spalte keine Bedeutung auf, die sie nicht hat. Du hast doch eine Datumsspalte.
Zur Not kannst Du mit [STR_TO_DATE()](http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_str-to-date) aus Deiner Zeichenkette ein Datum machen. Ist nicht performant und MySQL kann dafür zur Zeit keinen Index verwenden :-(
Bernd, eine Bitte noch:
verzichte auf [TOFU](http://de.wikipedia.org/wiki/TOFU) (bei Dir in der Version FOTU), sondern zitiere sinnvoll.
Freundliche Grüße
Vinzenz
Lieber Vinzenz,
Beste Idee: erstelle ein Backup, konvertiere die Spalte in den Datentyp DATETIME.
Okay, habe ich gemacht. Nun wie kann ich dem Date Objekt nun ein Datum UND eine Uhrzeit zuweisen?
Bernd, eine Bitte noch:
verzichte auf TOFU (bei Dir in der Version FOTU), sondern zitiere sinnvoll.
Okay werde ich versuchen.
Liebe grüße,
Bernd
Hallo,
Beste Idee: erstelle ein Backup, konvertiere die Spalte in den Datentyp DATETIME.
Okay, habe ich gemacht. Nun wie kann ich dem Date Objekt nun ein Datum UND eine Uhrzeit zuweisen?
mit der bereits von mir verlinkten Funktion STR_TO_DATE(), die etwas ungenau benannt ist, da sie einen DATETIME-Wert zurückliefert, wenn sowohl ein DATE-Teil als auch ein TIME-Teil vorhanden ist.
Nehmen wir an, Du hast Datum/Uhrzeit in der von Dir angegebenen Form
22.02.2012 22:41
vorliegen (ggf. Leerzeichen wegtrimmen). Dann ist Dein Format also in der Form:
- zweistelliger Tag (vermutlich mit führenden Nullen)
- ein Punkt als Trennzeichen
- zweistelliger Monat (mit führenden Nullen)
- ein Punkt als Trennzeichen
- vierstelliges Jahr
- ein Leerzeichen als Trennzeichen
- zweistellige Stunden (von 0 bis 24, vermutlich mit führenden Nullen)
- ein Doppelpunkt als Trennzeichen
- zweistellige Minuten (vermutlich mit führenden Nullen)
Somit kommst Du zu dem Formatstring
'%d.%m.%Y %H:%i'
SELECT STR_TO_DATE('22.02.2012 22:41', '%d.%m.%Y %H:%i')
liefert Dir den dazu passenden DATETIME-Wert.
Für die Ausgabe kannst Du den DATETIME-Wert mittels DATE_FORMAT nach Gusto aufbereiten.
Freundliche Grüße
Vinzenz
Moin!
Nun ich war so dumm, und hab nicht erwähnt, dass die Spalte Datum den Typ TEXT hat, weil ich das Datum in der Spalte so eintragen lasse " 22.02.2012 22:41".
TEXT ist für Massentext bis 64 Kilobyte vorgesehen, er ist nicht unbedingt performant zu indizieren, und er ist nicht chronologisch, sondern nur alphabetisch zu sortieren.
Also ändere diese Spalte unbedingt auf DATETIME um - die Formatierung des Datums kannst du im Query bei der Ausgabe und beim Speichern jeweils umarbeiten zwischen deutschem und Datenbank-Format.
Kann ich dem Sagen er soll es von der Spalte ID die größte zahl absteigend ausgeben?
IDs sind nicht zwingend aufsteigend sortiert. Behebe zuerst das Problem mit dem Datum.
- Sven Rautenberg