[GELÖST] MYSQL-Ausgabe nach Datum sortieren

Hey, ich hab ne Frage:
ich hab ein Script geschrieben, das mir die Verwaltung von Veranstaltungen ermöglicht. Funktioniert auch gut, aber ein paar kleine Probleme hab ich noch:

  1. Die Tabelle, in der die Veranstaltungen ausgegeben werden, soll nach Datum sortiert werden.

  2. Erscheint, wenn ich etwas eintrage ganz oben auf der Seite eine “1”. nicht weiter schlimm, aber woher kommt die?

  3. Wird unter dem lösch-button manhcmal die Statusmeldung “gelöscht”, manchmal “nicth gelöscht” ausgegeben, obwohl es immer erfolgreich gelöscht wurde.

und zu guter letzt, weiß jemand, wie ich das Datumsformat in der MySQL-Datenbank von: 2008-10-15 auf 15.10.2008 umstell?

Hier jetzt der Code:

[code]<?php
require “mysql_connect.php”;
if (isset( $_POST[‘go’] ))
{
if ($conID)
{
echo $database;
}
$_POST = get_magic_quotes_gpc() ? array_map( ‘stripslashes’, $_POST ) : $_POST;
$datum = $_POST[‘datum’];
$location = $_POST[‘location’];
$name = $_POST[‘name’];
$url = $_POST[‘url’];
mysql_query(“INSERT INTO gigs (id, datum, location, name, url) VALUES(’’, '”.$datum."’, ‘".$location."’, ‘".$name."’, ‘".$url."’)");

}

if (isset( $_POST[‘goloesch’] ))
{
if ($conID)
{
echo $database;
}
$id = $_POST[‘loeschid’];
mysql_query(“DELETE FROM gigs WHERE id = ‘$id’”);

}

?>

insight-band.de GIG-VERWALTUNG

EINTRAGEN:



    Datum:

    Location:

    Name:

    Info-URL:

            <p align="center"><input type="submit" name="go" value="Eintragen"><br><?php

if (isset( $_POST[‘go’] ))
{
if (mysql_affected_rows() == 1)
{
echo “Der Datensatz wurde hinzugefügt!”;
}
else
{
echo “Der Datensatz konnte nicht hinzugefügt werden!”;
}
}
?>


LÖSCHEN:

<?php if ($conID) { echo $database; } $abfrage='SELECT * FROM gigs'; $ergebnis=mysql_query($abfrage); ?>
<?php while($row=mysql_fetch_object($ergebnis)){ echo ''."\r\n"; echo ''."\r\n"; echo ''."\r\n"; echo ''."\r\n"; echo ''."\r\n"; echo ''."\r\n"; echo ''."\r\n"; } ?>

Id

Datum

Location

Name

URL

'.$row->id.''.$row->datum.''.$row->location.''.$row->name.''.$row->url.'

Id:      
<?php if (isset( $_POST['goloesch'] )) { if (mysql_affected_rows() == 1) { echo "Der Datensatz wurde gelöscht!"; } else { echo "Der Datensatz konnte nicht gelöscht werden!"; } } ?>

[/code]

Danke im Voraus für die Hilfe!

Edit: $conID und $database werden aus der mysql_connect.php includiert
Edit 2: hier gibts das ganz live: leexx.bplaced.net/system/verwaltung.php

zu 1:

zu 2:
liegt wohl an dem echo $database; ?

zu 3:
edit: kanns sein, dass du mehr als eine Datensatz löschst?
Dann müsste es so aussehen:

if(mysql_affected_rows() >= 1) { // Daten gelöscht } else { // Daten nicht gelöscht }

zu 4:
hab das so gelöst:

$datum = date("d.m.Y", strtotime($row->datum)); ... echo $datum;

Das sortieren kann man relativ einfach lösen mit:

$ergebnis=mysql_query("SELECT * FROM `gigs` ORDER BY `datum`");oder falls es andersrum sortiert werden soll:

$ergebnis=mysql_query("SELECT * FROM `gigs` ORDER BY `datum` DESC");

Nur ne Vermutung. Und auch sehr wahrscheinlich das es nicht stimmt, aber könnte es an:

echo $database;liegen? Ist die einzige Idee die ich dazu habe…

Also wird wahrscheinlich eine andere mysql-Operation sich eingemischt haben. Vielleicht solltest du die Abfrage nach der Anzahl der Reihen gleich nach dem löschen machen und dann in eine Variable speichern. Das könnte das Problem beheben.

Tja, bei dem letzten kann ich dir nicht helfen. Wobei. Muss es unbedingt in der DB umgestellt werden? Falls nicht kannst du dir das selber zusammen setzen mit $i = exlode(TRENNZEICHEN, STRING). Die Funktion liefert ein Array zurück das man dann wieder zusammensetzen kann.

Gruß
Wizard_85

danke erstmal!!!
zu 1.: funktioniert perfekt, danke!
zu 2.: meine mysql_connet sieht so aus:

$conID = mysql_connect( localhost, root, ****** ) or die( "Die Datenbank konnte nicht erreicht werden!" ); $database = mysql_select_db( test, $conID );
zu 3.: wie mach ich das am besten? so funktioniert es nicht:

$loeschbestaetigung = "mysql_affected_rows()"; ........... if ($loeschbestaetigung == 1) { echo "<font color=green>Der Datensatz wurde hinzugefügt!</font>"; } else { echo "<font color=red>Der Datensatz konnte <strong>nicht</strong> hinzugefügt werden!</font>"; }
zu 4.: wenn ichs so mach wie hummer gesagt hat, zeigt er bei allen einträgen 01.01.1970 als datum an.

$loeschbestaetigung = "mysql_affected_rows()";

$loeschbestaetigung enthält jetzt den String mysql_affected_rows(), also nicht,
wie von dir beabsichtigt den Rückgabewert der Funktion. So wärs richtig:

$loeschbestaetigung = mysql_affected_rows();

Deine if-abfrage würde ich wie folgt um schreiben:

if ($loeschbestaetigung == 1) {
        echo "<font color=green>Der Datensatz wurde hinzugefügt!</font>";
} else if ($loeschbestaetigung > 1) {
        echo "<font color=red>Es wurde mehr Datensatz als <strong>ein</strong> Datensatz hinzugefügt!</font>"
} else {
        echo "<font color=red>Der Datensatz konnte <strong>nicht</strong> hinzugefügt werden!</font>";
}
$database = mysql_select_db( test, $conID );

Die 1 wird ausgegeben, da es sich bei $databsae um einen bool-wert handelt, nicht um den Namen der Db ( siehe dazu: de3.php.net/manual/en/function.m … ect-db.php ).

greetz electron1x

der Rückgabewert von mysql_select_db() ist nunmal true, also wird die 1 ausgegeben. Daher lösch enfach das echo $database;

Das mit dem Datum: gibts du auch das englische Datumsformat ein?
Ansonsten, wenn du es so eintragen willst “dd.mm.yyyy”, musst du es vorher ins englische umwandeln:

$datum = $_POST['datum'];
list($d, $m, $y) = split("\.", $datum);
$datenew = "$y-$m-$d";
mysql_query("INSERT INTO `gigs` (`id`, `datum`, `location`, `name`, `url`) VALUES('', '".$datenew."', '".$location."', '".$name."', '".$url."')");

danke für die antworten!

  1. klappt
  2. klappt
  3. klappt
    nur mit 4. hab ich immernoch das “01.01.1970”-Problem.
    kann ich nicht bei der abfrage das ganz wieder über split usw. rückgängig machen?
    also quasi so:

[code]<?php
$datum = $row->datum;
list($y, $m, $d) = split("-", $datum);
$datenew = “$d.$m.$y”;
while($row=mysql_fetch_object($ergebnis)){
echo ‘

’."\r\n";
echo '<td width="30">'.$row->id.'</td>'."\r\n";
echo '<td width="100">'.$datenew.'</td>'."\r\n";
echo '<td width="300">'.$row->location.'</td>'."\r\n";
echo '<td width="300">'.$row->name.'</td>'."\r\n";
echo '<td width="270">'.$row->url.'</td>'."\r\n";

echo '<tr>'."\r\n";

}

?>[/code]

Edit: da gibt er mir als datum leider nur noch [quote]–[/quote] aus.

Du musst das innerhalb der while-Schleife stehen haben, da ja $row->datum vorher leer ist.

[code] while($row=mysql_fetch_object($ergebnis)){
$datum = date(“d.m.Y”, strtotime($row->datum));
echo ‘

’."\r\n";
echo '<td width="30">'.$row->id.'</td>'."\r\n";
echo '<td width="100">'.$datum.'</td>'."\r\n";
echo '<td width="300">'.$row->location.'</td>'."\r\n";
echo '<td width="300">'.$row->name.'</td>'."\r\n";

echo ‘

’.$row->url.’’."\r\n";
echo '<tr>'."\r\n";

}[/code]

Ich würde sagen bei split hast du deinen Fehler. Der Bindestrich darf meines achtens an der Stelle NICHT escaped werden.

perfekt!!! dankeschön!!!

eins wäre noch schön, ist es ohne all zu großen aufwand möglich nur den eintrag mit dem datum, das dem heutige am nächsten ist anzuzeigen? wie ich das „späteste“ datum anzeig is mir halbwegs klar, aber der eintrag mit dem nächsten datum???

danke, danke, danke :hail: :hail: :hail: :p

p.s.: danke Wizard, aber es funktioniert schon mit hummers Methode!

doch, hab das selbst bei so einer Gigverwaltung im Einsatz. Aber man kann ihn ja auch mal löschen.

edit: zu spät ^^

was das nächste datum angeht:

Danke! Da muss mal halt alle vergangenen Termine löschen. Weißt du ob man das irgendwie über den Timestamp von php machen kann, dass es tatsächlich der nächste ist?

wenn das Datumfeld auch vom Typ “date” ist, dann müsste das ohne Probleme gehen.

Ich wollte das jetzt mit folgendem Code probieren, aber da gibt er mir immer den Eintrag mit dem ältesten Datum aus…

<?php
include_once "mysql_connect.php";
$heute = mktime(0,0,0,date("m"),date("d"),date("Y"));
$abfrage='SELECT * FROM gigs WHERE UNIX_TIMESTAMP(datum) AS ts > $heute LIMIT 1';
$ergebnis=mysql_query($abfrage);
?>
<html>
<body>
<table width="1000" cellspacing="0" border="1" bordercolordark="white" bordercolorlight="black">
<tr>
        <th>
            <p align="left">Datum</p>
        </th>
        <th>
            <p align="left">Location</p>
        </th>
        <th>
            <p align="left">Name</p>
        </th>
        <th>
            <p align="left">URL</p>
        </th>
</tr>

<?php
  while($row=mysql_fetch_object($ergebnis))
  {
  	$datum = date("d.m.Y", strtotime($row->datum));
    echo '<tr>'."\r\n";

    echo '<td width="100">'.$datum.'</td>'."\r\n";
    echo '<td width="300">'.$row->location.'</td>'."\r\n";
    echo '<td width="300">'.$row->name.'</td>'."\r\n";
   echo '<td width="300">'.$row->url.'</td>'."\r\n";

    echo '<tr>'."\r\n";
  }

?>
</table>
</body>
</html>

weiß jemand woran das liegt?
danke im voraus

“ORDER BY datum DESC” der Abfrage hinzufügen, so sollte das neueste Datum an erster Stelle stehen:

probier das mal aus.

mfg Balmung

Funktioniert leider immernoch nicht.
Vielleicht kannst du mir aber sagen, wie ich korrekt ein datum im Format tt.mm.jjjj in ein timestamp umwandeln kann. dann kann ich einfach ne weitere spalte in mysql machen mit dem timestamp und das nachher vergleichen, damit spar ich mir UNIX_TIMESTAMP, ich habs so versucht:

$datumsplit=split(".",$datum);
$datumtimestamp = mktime(0,0,0,$datumsplit[1],$datumsplit[0],$datumsplit[2]);

das passt ihm aber irgendwie nich:

danke

intval() wurde in dem Zusammenhang mit der Stringumwandlung ja bereits genannt.

Zum SQL-Problem:
Variablen unter ’ werden nicht geparst, heißt so viel wie $heute wird als $heute in die DB geschossen. Folglich steht in der Abfrage Bullshit.
Entweder unter " setzen oder anständig mit ‘.$heute.’ verketten.

Man gut ich hab diese Probleme nicht…
Ich speicher immer schön meine unix_timestamps als INT in der Datenbank.

Der Fehler sagt aus: du hast versucht der Funktion mktime() an vierter stelle ein string zu geben (string = text), aber die Funktion mktime darf nur long Werte bekommen (long = ganzzahl).

Demnach hat also etwas mit dem splitten nicht ganz geklappt.
manchmal reicht es einfach intval() um die dinger rum zu machen.

aber je nachdem wo das Datum herkommt ist diese Lösung vielleicht nicht so Optimal.

wo wolltest du diese mktime Zeile denn einfügen?

edit:
das von freggle natürlich auch.

Warum speicherst du das Datum nicht in einem Feld vom Typ “date” ab? Dann brauchst du nur noch in der Abfrage ORDER BY datum DESC LIMIT 1 angeben und man brauch den ganzen Gedöns mit maketime() nicht mehr.

Um dann das Datum ins Format tt.mm.jjjj zu bekommen:

  1. Möglichkeit mit SQL: $ergebnis = mysql_query("SELECT DATE_FORMAT(datum, %d.%m.%Y) AS newdate FROM gigs ORDER BY datum DESC LIMIT 1"); $row = mysql_fetch_object($ergebnis); echo $row->newdate;
  2. Möglichkeit mit PHP: $newdate = date("d.m.Y", strtotime($row->date)); echo $newdate;

so, es funktioniert jetzt endlich mit:

hab das “AS ts” hinter “UNIX_TIMESTAMP(datum)” entfernt und $heute in “” gesetzt, dann gings. damit wär eigentlich alles geklärt. danke!
nur noch rein aus interesse, weil ich nix dazu finden kann, was bewirkt bei PHP “\r\n” ???

danke, LeeXX