Probleme mit ORDER BY Spalte mit DATETIME
der bär
- datenbank
Hi
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.
Und wie forme ich die das Datum in dd.mm.yyyy um? Ich habs allein nicht geschafft. :-(
Ich wäre sehr dankbar für Hilfe.
gruß der bär
Quelltext:
<?
include("var.inc.php"); <- nur server und passwort
//Connection
$connect = @mysql_connect("$db_server","$db_user","$db_pass");
mysql_select_db("$db_select");
if(!$name=="" and !$mail=="" and !$herkunft=="" and !$icq=="" and !$text=="" and $hidden=="hidden")
{
$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')";
$mysql_ok = mysql_query($insert);
header("Location:show.php");
}
else
{
if($hidden=="hidden")
{
if($name=="")
{
echo "Bitte geben Sie ihren Namen ein!<br>";
}
if($mail=="")
{
echo "Bitte geben Sie ihre Email Adresse ein!<br>";
}
if($herkunft=="")
{
echo "Bitte geben Sie ihre Herkunft ein!<br>";
}
if($text=="")
{
echo "Bitte geben Sie einen Text ein!<br>";
}
}
}
?>
<html>
<body>
<p align="center"><strong><font face="Arial, Helvetica, sans-serif">Gästebuch
von</font></strong> <br>
Es haben sich bereits
<?
$result = mysql_query("SELECT * FROM posts");
$menge = mysql_num_rows($result);
echo $menge;
?>
Besucher eingetragen!
</p>
<form name="form1" method="post" action="">
<input name="hidden" type="hidden" id="hidden" value="hidden">
<table width="394" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td width="150"><div align="right">Name:</div></td>
<td width="150"> <input name="name" type="text" id="name"> </td>
<td width="150"><div align="right">Email:</div></td>
<td width="150"><input name="mail" type="text" id="mail"></td>
</tr>
<tr>
<td><div align="right">Herkunft:</div></td>
<td><input name="herkunft" type="text" id="herkunft"></td>
<td><div align="right">Icq:</div></td>
<td><input name="icq" type="text" id="icq"></td>
</tr>
<tr>
<td colspan="2"> </td>
<td colspan="2"> </td>
</tr>
<tr>
<td colspan="4"><div align="center">
<textarea name="text" cols="50" rows="7" id="text"></textarea>
</div></td>
</tr>
<tr>
<td colspan="4"> </td>
</tr>
<tr>
<td colspan="4"><div align="center">
<input type="submit" name="Submit" value="Submit">
</div></td>
</tr>
</table>
</form>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<?
//SELECT
$abfrage = "SELECT * FROM posts ORDER BY zeit('%H%i%S')";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{ ?>
<tr>
<td><? echo $row->id ?>.) <b><? echo $row->name ?></b> aus <? echo $row->herkunft ?> schrieb am <? echo $row->datum ?> um <? echo $row->zeit ?> Uhr</td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td><? echo $row->text ?></td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td><a href="mailto:<? echo $row->mail ?>"><? echo $row->mail ?></a> - ICQ:<? echo $row->icq ?></td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<tr>
<td><b>Kommentar:<b><br><? echo $row->kommentar ?></td>
</tr>
<tr>
<tr>
<td>
<hr>
</td>
</tr>
<?
};
//FREE
$free = mysql_free_result($ergebnis);
$free_ex = @mysql_query($free);
//CONN CLOSE
$db_close = @MYSQL_CLOSE($connect);
?>
</table>
</body>
</html>
Halihallo der bär
Und wie forme ich die das Datum in dd.mm.yyyy um? Ich habs allein nicht geschafft. :-(
über SQL oder PHP?
Möglich wäre auch ein
SELECT UNIX_TIMESTAMP(zeit)
dann kriegst du die unix Timestamp, diese kannst du dann wie bereits getan über
gmstrftime formatieren.
$abfrage = "SELECT * FROM posts ORDER BY zeit('%H%i%S')";
Hm. Warum nicht ORDER BY zeit DESC? - Neuste Postings zuerst, ältere später?
Viele Grüsse
Philipp
Hallo!
Und wie forme ich die das Datum in dd.mm.yyyy um? Ich habs allein nicht geschafft. :-(
14.2. Wie kann ich ein deutsches Datum in MySQL-Format umwandeln (und umgekehrt)?
http://www.dclp-faq.de/q/q-datum-mysql.html
$result = mysql_query("SELECT * FROM posts");
// SELECT * FROM posts ORDER BY zeit ASC;
MfG, André Laugks
Hallo der bär,
Und wie forme ich die das Datum in dd.mm.yyyy um? Ich habs allein nicht geschafft. :-(
mit DATE_FORMAT() ->http://www.mysql.com/doc/de/Date_and_time_functions.html#IDX1264
<?
'short_open_tag' ist bei dir auf on?
$connect = @mysql_connect("$db_server","$db_user","$db_pass");
mysql_select_db("$db_select");
die Anführungszeichen um die Variablen sind zwar nicht falsch, können aber weggelassen werden
if(!$name=="" and !$mail=="" and !$herkunft=="" and !$icq=="" and !$text=="" and $hidden=="hidden")
if(!empty($name)&&!empty($mail)&&!empty($herkunft)&&!empty($icq)&&!empty($text)&&$hidden=='hidden') geht auch (wobei ich annehme, dass du eher $_POST['name']... meinst)
header("Location:show.php");
das ist kein gültiger header - der muss eine url enthalten (also mit http:// anfangen)
->http://www.php.net/manual/de/function.header.php
}
}
}
du weißt, welcher dieser Klammer zu welcher Schleife o.ä. gehört? -> einrücken
$result = mysql_query("SELECT * FROM posts");
warum fragst du alle Spalten aus der kompletten Tabelle ab nur um die Anzahl der Datensätze zu bekommen?
ein "SELECT count(id) FROM posts" funktioniert auch (wenn es keine Spalte 'id' gibt eben eine andere)
<form name="form1" method="post" action="">
action="" darf nicht leer sein.
<input name="hidden" type="hidden" id="hidden" value="hidden">
das gefällt mir - 4x hidden :-)
$abfrage = "SELECT * FROM posts ORDER BY zeit('%H%i%S')";
ORDER BY zeit funktioniert bei mir (evtl noch ASC bzw. DESC dahinter)
$free = mysql_free_result($ergebnis);
$free_ex = @mysql_query($free);
das ist afaik nicht richtig ->http://www.php.net/mysql_free_result
(und außerdem unnötig, da dein Script hier dann sowieso zu ende ist und der Speicher wieder freigegeben wird)
Grüße aus Nürnberg
Tobias
Hi nochmal
Wenn ich Inhalt in die Spalte text mit dem Typ TEXT einfüge und in dem Inhalt sind Absätze bzw Zeilensprünge gibt er die als Leerstellen aus. Was muss ich ändern damit er das nicht macht?
gruß der bär
Hallo der bär,
Wenn ich Inhalt in die Spalte text mit dem Typ TEXT einfüge und in dem Inhalt sind Absätze bzw Zeilensprünge gibt er die als Leerstellen aus. Was muss ich ändern damit er das nicht macht?
vorher die Funktion nl2br() drüberlaufen lassen (oder das was CK in den User Contributed Notes geschrieben hat) ->http://www.php.net/nl2br
Grüße aus Nürnberg
Tobias
Halihallo der bär
Wenn ich Inhalt in die Spalte text mit dem Typ TEXT einfüge und in dem Inhalt sind Absätze bzw Zeilensprünge gibt er die als Leerstellen aus. Was muss ich ändern damit er das nicht macht?
Jep, in HTML werden Zeilenumbrüche nicht interpretiert (und als solche kommen sie an).
Antwort s. Tobias'es Antwort.
Die Frage steht in keinem Zusammenhang zu deiner Ursprünglichen, können wir deine erste
Frage als beantwortet erachten?
Viele Grüsse
Philipp
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