Sven Rautenberg: Probleme mit ORDER BY Spalte mit DATETIME

Beitrag lesen

Moin!

ich hab nachwievor Probleme mit meinem MySQL bzw PHP Script. Ich hab jetzt eine Spalte vom Typ Datetime. Und ich schreibe die Zeit bzw das Datum nach yyyy-mm-dd hh:mm:ss hinein. Und hab ORDER BY zeit (so heißt die Spalte) gemacht allerdings ordnet er nicht richtig, nur nach dem datum und nicht der Zeit.

Hast du mal geprüft, was als Zeit in der Datenbank drinsteht? PHPMyAdmin ist für sowas geradezu ideal.

Außerdem ist es sehr empfehlenswert, wenn du dich mal mit den Zeitfunktionen von MySQL beschäftigen würdest. Damit kannst du wahnsinnig viele Sachen gleich bei der Abfrage oder beim Einfügen des Datensatzes regeln, ohne mit PHP drumherumhampeln zu müssen.

Und wie forme ich die das Datum in dd.mm.yyyy um? Ich habs allein nicht geschafft. :-(

Das ist Aufgabe von MySQL. Siehe die Datumsfunktionen: http://www.mysql.com/doc/en/Date_and_time_functions.html, DATE_FORMAT().

Außerdem hast du mehrere Grausamkeiten in deinen Quelltext eingebaut:

$time = gmstrftime ("%Y-%m-%d %H:%M:%S", time());
$insert = "INSERT INTO posts (name, mail, icq, herkunft, text, zeit) VALUES ('$name', '$mail', '$icq', '$herkunft', '$text', '$time')";

Hier produzierst du sinnlos eine aktuelle Zeit, um sie an MySQL zu übergeben. Besser wäre die Funktion NOW() in MySQL:

$insert = "INSERT INTO posts (name, mail, icq, herkunft, text, zeit) VALUES ('$name', '$mail', '$icq', '$herkunft', '$text', NOW() )";

Es haben sich bereits
<?
$result = mysql_query("SELECT * FROM posts");
$menge = mysql_num_rows($result);
echo $menge;
?>
 Besucher eingetragen!

Wah!!!! Wenn du wissen willst, wieviele Datensätze in der Datenbank enthalten sind, mach sowas wie da oben bitte NIEMALS! Damit fragst du die komplette Datenbank ab und überträgst sämtliche Inhalte in den Puffer von PHP. Das ist unperformant hoch drei, frißt wahnsinnig Speicher und ist deshalb einfach nur schlecht.

Wenn du nur wissen willst, wieviele Datensätze in der Datenbank sind, frag die Datenbank!

$result = mysql_query("SELECT count(*) AS anzahl FROM posts");
$menge = mysql_fetch_array($result);
echo $menge['anzahl'];

Aber: Du willst weiter unten die gesamte Datenbank ausgeben. Deshalb wäre es an dieser Stelle hier besser, wenn du einfach hier schon den SELECT von unten reinsetzt und mit mysql_num_rows($result) abfragst, wieviele Datensätze geliefert werden und weiter unten ohne neuen SELECT einfach mit mysql_fetch_array($result) die einzelnen Datensätze abfragst.

Die Sortierung darf dann oben bei der Abfrage natürlich schon drinstehen - das ändert an der Anzahl ja nichts.

<?
//SELECT
  $abfrage = "SELECT * FROM posts ORDER BY zeit('%H%i%S')";
  $ergebnis = mysql_query($abfrage);
  while($row = mysql_fetch_object($ergebnis))

Hier einfach nur
while ($row = mysql_fetch_object($result))
ohne weitere SELECTs etc.

Warum du hier unbedingt mysql_fetch_object nehmen willst, weiß ich allerdings nicht. Ich benutze mysql_fetch_array lieber.

//FREE
$free = mysql_free_result($ergebnis);
$free_ex = @mysql_query($free);

Schön, dass du hinter dir aufräumen willst. Aber das @ deutet es schon an: So ganz richtig läuft es hier nicht. Außerdem räumt PHP von allein auf, wenn du es nicht tust.

//CONN CLOSE
$db_close = @MYSQL_CLOSE($connect);

Das Gleiche gilt für das Schließen der Datenbankverbindung. Man _kann_ es machen, man _muß_ es aber nicht.

Und wieder: Benutze in deinem Skript keine @ zur Fehlerunterdrückung! Wenn Fehler auftreten, haben sie einen Grund. Korrigiere die Fehler, oder fange sie ordentlich ab, aber unterdrücke sie nicht! @ ist ein eindeutiger Beweis von schlechtem Programmierstil.

- Sven Rautenberg

--
Signatur oder nicht Signatur - das ist hier die Frage!