Datenbankeinträge nicht chronologisch

VanNostren

VanNostren

Mitglied
Thread Starter
Dabei seit
03.07.2005
Beiträge
70
Reaktionspunkte
1
Hallo!
ich hoffe es kann mir jemand helfen, sonst platz ich...
nun denn, ich habe ein script im internet gefunden, dass genau passend für mich ist. es ist ein news-system. in einer php benutzeroberfläche kann man neue news erstellen, diese werden dann in meiner mysql-datenbank gespeichert. außerdem erstellt das system eine php datei die vortäuscht eine xml datei zu sein, aus dieser liest meine flash-anwendung die informationen aus. leider passiert es dauernd, dass neue news einträge eben nicht "ganz unten" gespeichert werden, sondern mitten in der datenbank. das heißt, wenn man die seite aufruft, sieht man nicht die aktuellsten news. ich versteh nicht warum. hier das php script das die einträge in die datenbank speichert:

//ADD NEWS ENTRY
if($mode != '' && $action === 'add_news'){

//Did they fill in everything?
if($author != '' && $title != '' && $body != ''){

//YES

$query = "INSERT INTO spielberichteerste (author, title, body, timestamp)
VALUES('" . $author . "', '" . $title . "', '" . $body . "', '" . time() . "')";

if(mysql_query($query)){

echo '<p style="text-align:middle;">Neuer Bericht gespeichert!</p>';

}else{

echo 'Problem Executing Query' . mysql_error();

}

}else{

//NO
echo 'Bitte alle Felder ausfüllen!';

}

falls nicht klar geworden ist was mein problem ist, bitte melden, dann versuche ich es besser auszudrücken....
 
Wie die Newseinträge gespeichert werden und wie sie im phpmyadmin in der Datenbank angezeigt werden ist humpe, solange sie ein Attribut haben, mit dem man die beim Auslesen sortieren kann (was auch phpmyadmin nach verschiedene Kriterien darstellen kann, wenn Du das benutzt).

Das Script speichert per timestamp Attribut, so sollte auch der Select-Query in der Lage sein durch ein "...ORDER BY timestamp ASC (oder DESC)" die News chronologisch aus der DB auszulesen.

Kannst Du mal den Select-Query posten?

2nd
 
Naja, wenn Du nen Datensatz in der mitte irgendwo löscht, mit dem Keyattribut(swert) XY, wird dieser auch irgendwann wieder für einen neuen Datensatz benutzt und die chronologische Sortierung ist dahin...
 
Macht nichts weil er den Timestamp hat. Ich habe statt des Timestamp DateTime benutzt.
 
SilverShadow schrieb:
Naja, wenn Du nen Datensatz in der mitte irgendwo löscht, mit dem Keyattribut(swert) XY, wird dieser auch irgendwann wieder für einen neuen Datensatz benutzt und die chronologische Sortierung ist dahin...

Ich kann Dir nicht ganz folgen? Ob ein schon "benutzter" und gelöschter Primary Key wieder genommen wird, funktioniert doch, solange er nur einmal vorkommt.

Und "in der Mitte" bei einer Datenbank ist relativ, abhängig davon wie ich sortiere (z. B. nach Namen oder Timestamp). Wie die Tupel in der Datenbank liegen ist doch egal, solange sie Attribute haben, mit denen ich sie sortiert da raus bekommen kann ;)

Oder was meinst Du mit der "Mitte" der DB?

2nd
 
Ja ok, "in der Mitte" ist etwas dumm ausgedrückt.
Ich bin davon ausgegangen, dass er Post-Author gemeint hat, wenn er Datensätze von 1-10 einspielt, dass die auch in der Reihenfolge 1-10 rauskommen. Tun sie auch. Aber wenn er z.b. den 4. löscht, steht nun plötzlich 11 an dieser "stelle".
Ein Order by ist daher immer Pflicht..
 
danke für eure antworten.

dies hier ist die php datei, die die datenbank ausliest und dann als xml ausspuckt:

<?php
#***********************************
# XML OUTPUT
#***********************************


include('admin/functions.php');
connect('hier stehen meine verbindungsdaten');
$query = 'SELECT id, author, title, body, FROM_UNIXTIME(timestamp, \'%d.%m.%Y\') date
FROM spielberichteerste
LIMIT 20';

$result = mysql_query($query);


$nl = "\r\n";

echo '<?xml version="1.0" encoding="ISO-8859-1"?>' . $nl;
echo '<ROOT>' . $nl;

while($r = mysql_fetch_array($result)){

echo '<news id="' . $r['id'] . '" title="' . stripslashes2($r['title']) . '" date="' . $r['date'] . '" author="' . stripslashes2($r['author']) . '">' . $nl;
echo '<body><![CDATA[' . stripslashes2($r['body']) . ']]></body>' . $nl;
echo '</news>' . $nl;


}

echo '</ROOT>' . $nl;

?>

am liebsten wär mir aber wenn immer wenn man einen neuen eintrag schreibt, der auch ans ende der tabelle gespeichert wird, damit alles auch in dem admin bereich sortiert ist und nicht nur auf der webseite auf der die einträge dann auftauchen...
 
phpMyAdmin zeigt die Daten so an, wie sie im Dateisystem stehen. Wie SilverShadow schon gesagt hat, überschreibt die Datenbank "Lücken", damit nicht zuviel Speicherplatz verschwendet wird.

@VanNostren:
Du solltest mal posten, wie das ganze angezeigt wird. Es ist nämlich nicht ein Problem der Speicherung, sondern ein Problem der Ausgabe.
 
JEDER neuer eintrag in der datenbank wird an's ende gestellt, sofern du die ID auf "auto increment" gestellt hast (oder so)

die ID des eintrages geht weiter nach oben, also nach eintrag 186 kommt eintrag 187.

kann zwar irgendwo drinnen stehen (lücken), aber wenn du nach der ID sortierst, ist alles chronologisch.

ich sortier meine inhalte meist nach der ID, wenn es um chronologie geht.

du musst nur diese zeile ausbessern:

Code:
$query = 'SELECT id, author, title, body, FROM_UNIXTIME(timestamp, \'%d.%m.%Y\') date [b]ORDER BY id DESC[/b]

dann gehst du in der DB rückwärts, also das neueste ist als erstes dran, danach das zweit-neueste, dann das drittneueste usw. usf.
 
Nachtrag:

auch im admin bereich wird ja die datenbank ausgelesen um sie anzeigen zu können undzwar so:


//LIST ALL NEWS ENTRIES FOR US TO VIEW
$query = 'SELECT id, title , FROM_UNIXTIME(timestamp, \'%d.%m.%Y \') date FROM spielberichteerste';
$result = mysql_query($query);


echo '<table style="margin: 0 auto;width:500px;border: 1px dotted #E5E5E5;" cellpadding="5" cellspacing="1">
<tr>
<th>Überschrift</th><th>Datum</th><th>Bearbeiten</th><th>Löschen</th>';

while($r = mysql_fetch_array($result)){

//Swap our CSS classes
$bg = 'light' ? 'light' : 'dark';

echo '

<tr class="' . $bg . '"><td><strong>' . stripslashes2($r['title']) . '</strong></td>
<td>' . $r['date'] . '</td>
<td><a href="admin.php?mode=edit&id=' . $r['id'] . '">Edit</a></td>
<td><a href="admin.php?mode=delete&id=' . $r['id'] .'">Delete</a></td></tr>';


wie muss ich jetzt dieses ORDER benutzen um zu sortieren?
 
mores schrieb:
JEDER neuer eintrag in der datenbank wird an's ende gestellt, sofern du die ID auf "auto increment" gestellt hast (oder so)...
Jein. Klar wird er ID-mäßig ans Ende gestellt (also wenn der letzte Satz die ID 99 hatte, dann wird der neue die ID 100 haben).

ABER Dateisystem-mäßig wird der Datensatz dort gespeichert, wo "Platz" ist. Wenn man die Datenbank also ohne Sortierung ausgibt, liest er sie normal aus dem Dateisystem. Lücken, als "Platz", entsteht natürlich nur, wenn Datensätze gelöscht wurden. Wenn man nie einen Datensatz löscht, dann entstehen natürlich auch keine Lücken und man muss auch keine Sortierung mitgeben. Natürlich sollte man IMMER eine Sortierung mitgeben, damit man eben solchen Problemen aus dem Weg geht.
 
master_p schrieb:
phpMyAdmin zeigt die Daten so an, wie sie im Dateisystem stehen. Wie SilverShadow schon gesagt hat, überschreibt die Datenbank "Lücken", damit nicht zuviel Speicherplatz verschwendet wird.

Jo, defaultmäßig schon, sobald ich auf den Kopfzeilen der Tabelle rumklicke, erfolgt die Abfrage/Darstellung im phpMyAdmin nach anderen Kriterien (ORDER BY). Ich betone das nur, dass man sich nicht darauf verläßt, dass die Datenbank die Daten so ausspuckt, wie ich die haben will, ohne das ich etwas machen muss nur weil phpMyAdmin sie primär erstmal "richtig" darstellt.

Du schreibst es ja selbst:

master_p schrieb:
Natürlich sollte man IMMER eine Sortierung mitgeben, damit man eben solchen Problemen aus dem Weg geht.

Und damit muss man überhaupt nicht drüber nachdenken, wo die Daten in der DB gespeichert werden. Ob am Ende, zwischendrin oder irgendwo sonst ist mir als User egal, hauptsache die Daten werden nach meinem logischen Schema gespeichert und abgerufen.

Eine Festplatte funktioniert ja ebenso: Wo die Daten liegen ist mir humpe und ich erwarte selbstverständlich das der Platz optimal mit Lückenfüllern genutzt wird - die Infos rufe ich trotzdem anders ab.

EDIT: Hier noch 2 Bilder aus dem phpMyAdmin, einmal nach dem Attribut "category" und einmal nach dem Attribut "id" geordnet:


CATEGORY Ordnung:

category.png




ID Ordnung:

id.png



VanNostren muss den Query mit einem ORDER BY bestücken:

$query = "SELECT id, author, title, body, FROM_UNIXTIME(timestamp, \'%d.%m.%Y\') date FROM spielberichteerste ORDER BY timestamp DESC LIMIT 20";


Ich habe noch nie nach einem Timestamp sortiert, sollte aber genauso wie eine Sortierung nach Datum erfolgen. Mores Methode funktioniert selbstverständlich auch - unter der Voraussetzung, dass die ID als AUTO_INCREMENT läuft und Primary Key ist.

2nd
 
Zuletzt bearbeitet:
Zurück
Oben Unten