PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : letzte hoffnung


exweised
22.11.2004, 20:12:03
hallo, ihr seit jetzt meine letzte hoffnung, nachdem ich den ganzen tag rumprobiert habe, aber kein erfolg verbuchen konnte.

ich habe in einer datenbanktabelle 2 spalten mit datums im format jjjj-mm-tt. eine spalte ist 'datum von' und die andere 'datum bis'. zB. steht folgendes drin:

2004-11-21 | 2004-11-22
2004-11-23 | 2004-11-23
2004-11-25 | 2004-11-27
2004-11-31 | 2004-12-02

jetzt habe ich ein formular, wo man halt dieser tabelle neue daten hinzufügen kann. vor dem eintragen soll aber erst überprüft werden, ob der zeitraum der datums auch noch frei ist - genau da liegt nämlich mein problem.

nach absenden des formulars werden alle vorhandenen datums aus dieser tabelle ausgelesen. dann speicher ich diese in 2 arrays:

while( $result = @mysql_fetch_array($select) )
{
$db_date_from[] = $result['date_from'];
$db_date_to[] = $result['date_to'];
}

dann muss ich irgendwie kontrollieren, ob dass eingetragene datum von aus dem formular nicht schon in der db-tabelle steht. nur ich weis nicht, wie ich das anstellen soll. zumal gibts ja auch länge, über mehrere tage hinweggestreckte datums.

ich hatte schon zig varianten gehabt, aber irgendwie kann ich in den lücken, wo ja auch wirklich was frei ist, nix eintragen. zB. wäre der 24.11.2004 ja noch platz und da dürfte ich ja eigentlich eintragen, aber es ging nicht. ich hatte auch schon erst mal die datums umgewandelt mit mktime(), weil ich dachte das es damit besser klappt, aber nix. mein kopf raucht.

könnt ihr mir tipps geben?

feuervogel
22.11.2004, 22:36:10
also. zuallererst speichert man daten nicht so, sondern als unix-timestamp.

$timestamp = <zeitpunktdenduwissenwillst>;

und dann im sql:

SELECT
COUNT( id ) AS amount
FROM
tabelle
WHERE
$timestamp >= datum_von AND
$timestamp <= datum_bis

wenn nun $mysqlresult[ 'amount' ] == 1 ist, steht schon was in der db für den zeitraum, wenn nicht, dann nicht.

okay, das ganze jetzt noch für die beiden eingeben anfangs- und end-daten, dann hast dus...

exweised
23.11.2004, 11:41:11
also so ganz verstehe ich deine variante nicht. :(

ich hab doch auch die möglichkeit bei phpmyadmin den type DATE zu wählen, wo dann die datums im jjjj-mm-dd format gespeichert werden.

ich muss ja vorm eintragen bei allen vorhandenen einträgen überprüfen, ob der zeitraum noch frei ist. deshalb verstehe ich auch nicht, warum du in deiner sql-abfrage mit WHERE gearbeitet hast. ?!

c4
23.11.2004, 11:49:34
Original geschrieben von exweised
ich hab doch auch die möglichkeit bei phpmyadmin den type DATE zu wählen, wo dann die datums im jjjj-mm-dd format gespeichert werden. Da Du nicht gesagt hast, dass das Feld vom Typ DATE ist, ist das Vögelchen zu Recht davon ausgegangen, dass Du die Zeit als String speicherst.

ich muss ja vorm eintragen bei allen vorhandenen einträgen überprüfen, ob der zeitraum noch frei ist. deshalb verstehe ich auch nicht, warum du in deiner sql-abfrage mit WHERE gearbeitet hast. ?! Die Idee vom Piepmatz ist, dass er prüft, ob in dem gewählten Zeitraum Einträge vorhanden sind. Wenn nicht, dann ist amount=0, sonst >0 Damit kannst Du dann auch einfach sagen 'Ja, frei' oder 'Nein, nix frei'.

exweised
23.11.2004, 12:04:05
Original geschrieben von _c_4_
Da Du nicht gesagt hast, dass das Feld vom Typ DATE ist, ist das Vögelchen zu Recht davon ausgegangen, dass Du die Zeit als String speicherst.
achso, ok. dachte das wäre selbstverständlich. ;-)
geht es also auch damit oder muss ich trotzdem in timestamp ändern?

Original geschrieben von _c_4_
Die Idee vom Piepmatz ist, dass er prüft, ob in dem gewählten Zeitraum Einträge vorhanden sind. Wenn nicht, dann ist amount=0, sonst >0 Damit kannst Du dann auch einfach sagen 'Ja, frei' oder 'Nein, nix frei'.
alles klar, jetzt habe ich seine idee verstanden.

c4
23.11.2004, 12:04:53
Kannst Du getrost bei DATE belassen.

exweised
23.11.2004, 13:00:35
bei mir ist amount immer 0, obwohl das datum eigentlich vergeben ist!?

c4
23.11.2004, 13:02:55
Zeig mal den Code.

exweised
23.11.2004, 13:08:53
$sql = "SELECT COUNT(id) AS amount FROM tabelle WHERE date_from >= '" . $date_from . "' AND date_to <= '" . $date_to . "'";

$select = mysql_db_query($db, $sql, $verbindung);

$result = mysql_fetch_array($select);

echo $result['amount'];
setz ich das $result = my... in eine while-schleife kommt auch nur null raus. bei mysql_num_rows kommt nix raus.

exweised
23.11.2004, 13:33:38
lasse ich die WHERE-bedingung weg, zählt er mir mehr als 0 treffer, logisch. ich schlussfolgere einfach mal daraus, dass das mit >= & <= nicht funktioniert. wie auch? wenn eingegebenes datum_von größer als datenbank datum_von & eingegebenes datum_bis kleiner als datenbank datum_bis ... ??

c4
23.11.2004, 13:41:55
Du kannst nicht einfach so einen String mit einem Datum vergleichen. Auch wenn es in der Ausgabe gleich aussieht, ist es nicht das gleiche.

Solltest Du MySQL > 4.1.1 haben, dann nimm einfach STR_TO_DATE()
--> http://mysql.com/STR_TO_DATE
Damit sollten dann auch Vergleiche einfach mit > und < funktionierern

Ansonsten habe ich keine schöne(!) Idee.

exweised
23.11.2004, 13:49:41
ach man, shit. :( die mysql-version is älter. warum is blos imma alles so kompliziert?

feuervogel
23.11.2004, 19:23:58
um noch mal auf die idee mit dem timestamp zurück zu kommen:

$sql = "
SELECT
COUNT(id) AS amount
FROM
tabelle
WHERE
( date_from >= '$timestamp_from' AND date_to <= '$timestamp_from' )
OR
( date_from >= '$timestamp_to' AND
date_to <= '$timestamp_to'" );

müsste hinhauen. wenn nun amount > 0 ist, darf dieser zeitraum nicht mehr ausgewählt werden.

exweised
26.11.2004, 17:57:34
ich habe das jetzt nochmal mit timestamps probiert und so gemacht wie du meinst das es klappt. leider funktioniert es nur teilweise.

ist das eingegebene datum in timestamp gewandelt und lasse es kontrollieren mit der sql-abfrage, gibt er mir immer ein 0, solange die timestamps nicht total identisch sind.

zb: steht in der db das datum, in timestamp natürlich:
from: 26.11.2004
to: 29.11.2004

jetzt geb ich in meinem formular den 27.11.2004 an. sende ab, script wandelt in timestamp, sql prüft, amount = 0 obwohl ja vergeben. gebe ich im formular den 26.11.2004 ein ist amount = 1

c4
27.11.2004, 09:55:03
Alles gut und schön, nur ohne Code lässt sich's immer so schwer helfen...

exweised
27.11.2004, 12:15:15
ok. formular zur eingabe:

Datum von:
<input type="text" name="date_from_day" size="2" maxlength="2"> . <input type="text" name="date_from_month" size="2" maxlength="2"> . <input type="text" name="date_from_year" size="4" maxlength="4"> (TT.MM.JJJJ)
das gleiche für datum bis, sowie submit-button, etc.

nachdem absenden:

$timestamp_date_from = mktime(0, 0, 0, $_POST['date_from_month'], $_POST['date_from_day'], $_POST['date_from_year']);

das gleiche auch für datum bis. wir gehen jetzt davon aus, dass das datum korrekt eingegeben wurde, fehlerkontrollen lasse ich jetz weg.
die datums in der datenbank sind auch alle auf 00:00:00 gespeichert, deshalb auch bei mktime() die 3 nullen.

$sql = "SELECT COUNT(id) AS amount FROM tabelle WHERE ( date_from >= '" . $timestamp_date_from . "' AND date_to <= '" . $timestamp_date_to . "' ) OR ( date_from >= '" . $timestamp_date_to . "' AND date_to <= '" . $timestamp_date_to . "' )";

$select = mysql_db_query($db, $sql, $verbindung);

$result = mysql_fetch_array($select);

echo $result['amount'];

ich bin schon so durcheinander im kopf. wie soll das mit dieser sql funktionieren?

xabbuh
27.11.2004, 12:38:12
In welchem Format ist denn jetzt das Datum in der Datenbank gespeichert (DATE, DATETIME, MySQL-Timestamp, UNIX-Timestamp)?

exweised
27.11.2004, 12:51:57
UNIX-Timestamp

xabbuh
27.11.2004, 13:00:00
<?php
$select = mysql_db_query($db, $sql, $verbindung) or die('Fehlernummer: ' . mysql_errno() . ' Fehlermeldung: ' . mysql_error());
?>

Erhälst du da eine Ausgabe?

exweised
27.11.2004, 13:16:54
nein, zeigt nichts an.

xabbuh
27.11.2004, 13:37:34
Kann es sein, dass die Abfrage eigentlich so aussehen muss:

<?php
$sql = "SELECT COUNT(id) AS amount FROM tabelle WHERE ( date_from >= '" . $timestamp_date_from . "' AND date_to <= '" . $timestamp_date_to . "' ) OR ( date_from >= '" . $timestamp_date_to . "' AND date_to <= '" . $timestamp_date_from . "' )";
?>

exweised
27.11.2004, 14:11:28
bringt auch nix.

es is total komisch. bei bestimmten kombinationen funktioniert es richtig, dann wieder nicht. etc.

xabbuh
27.11.2004, 16:11:10
Original geschrieben von exweised
bringt auch nix.

es is total komisch. bei bestimmten kombinationen funktioniert es richtig, dann wieder nicht. etc.
Dann zeig doch mal einen Dump deiner Datenbank und mit welchen Daten du es versucht hast.

exweised
27.11.2004, 16:47:47
was meinst du mit dumb? ich hab mal nen scrrenshot gemacht.

in der datenbank steht das:

http://www.picupload.net/files/20042711/1101569952.png

probiert das:

01.12.2004 - 02.12.2004: wäre belegt: amount = 0: fazit falsch

30.11.2004 - 04.12.2004: wäre belegt: amount = 2: fazit korrekt

02.12.2004 - 02.12.2004: wäre frei: amount = 0: fazit korrekt

05.12.2004 - 06.12.2004: wäre frei: amount = 0: fazit korrekt

05.12.2004 - 07.12.2004: wäre belegt: amount = 0: fazit falsch

xabbuh
27.11.2004, 17:39:45
Verändere dein Query mal so, dass auch Daten gefunden werden, bei denen zwar das Startdatum in die Zeitspanne fällt, das Enddatum aber nicht, und umgekehrt:

<?php
$sql = "SELECT
COUNT(id) AS amount
FROM
tabelle
WHERE
date_from >= '$timestamp_date_from' OR
date_from >= '$timestamp_date_to' OR
date_to <= '$timestamp_date_from' OR
date_to <= '$timestamp_date_to'";
?>

exweised
27.11.2004, 18:36:53
ok, ich nehm zum vergleich mal die selben datums:

01.12.2004 - 02.12.2004: wäre belegt: amount = 5: fazit korrekt

30.11.2004 - 04.12.2004: wäre belegt: amount = 5: fazit korrekt

02.12.2004 - 02.12.2004: wäre frei: amount = 5: fazit falsch

05.12.2004 - 06.12.2004: wäre frei: amount = 5: fazit falsch

05.12.2004 - 07.12.2004: wäre belegt: amount = 5: fazit korrekt

neu:
24.12.2004 - 24.12.2004: wäre frei: amount = 5: fazit falsch


kommt irgendwie immer 5 raus.

xabbuh
27.11.2004, 19:35:45
Ich glaube, jetzt habe ich es. Im Prinzip geht es ja nur darum, ob das Start- oder das Enddatum in einer Zeitspanne enthalten ist. Da war der Ansatz oben weiter doch nicht so falsch. Ich habe ihn nur falsch korrigiert.
Probier es mal hiermit:

<?php
$sql = "SELECT
COUNT(id) AS amount
FROM
tabelle
WHERE
(date_from <= '{$timestamp_date_from}' AND
date_to >= '{$timestamp_date_from}') OR
(date_from <= '{$timestamp_date_to}' AND
date_to >= '{$timestamp_date_to}')";
?>

exweised
27.11.2004, 20:44:52
01.12.2004 - 02.12.2004: wäre belegt: amount = 0: fazit falsch

30.11.2004 - 04.12.2004: wäre belegt: amount = 0: fazit falsch

02.12.2004 - 02.12.2004: wäre frei: amount = 0: fazit korrekt

05.12.2004 - 06.12.2004: wäre frei: amount = 0: fazit korrekt

05.12.2004 - 07.12.2004: wäre belegt: amount = 0: fazit falsch

24.12.2004 - 24.12.2004: wäre frei: amount = 0: fazit korrekt

jetzt kommt immer 0 raus. irgendwie kann man es wenden wie man will. *heul*

xabbuh
27.11.2004, 21:25:45
Probiere es mal, indem du die Vergleichsoperatoren in der Abfrage umkehrst (s. meinen editierten Beitrag).

exweised
28.11.2004, 11:49:49
01.12.2004 - 02.12.2004: wäre belegt: amount = 1: fazit korrekt

30.11.2004 - 04.12.2004: wäre belegt: amount = 2: fazit korrekt

02.12.2004 - 02.12.2004: wäre frei: amount = 0: fazit korrekt

05.12.2004 - 06.12.2004: wäre frei: amount = 0: fazit korrekt

05.12.2004 - 07.12.2004: wäre belegt: amount = 1: fazit korrekt

24.12.2004 - 24.12.2004: wäre frei: amount = 0: fazit korrekt

wow, bis jetzt die beste lösung. *freu*
sobald der tag belegt ist, ist amount nicht null. aber:

02.12.2004 - 05.12.2004: wäre belegt: amount = 0: fazit falsch

der 2.12. & 5.12. sind zwar frei, aber der 3.12. & 4.12. sind ja schon weg. da darf amount nicht null sein.
man ist das kompliziert. :roll:

xabbuh
28.11.2004, 13:29:42
Erweitern wir die Abfrage noch:

<?php
$sql = "SELECT
COUNT(id) AS amount
FROM
tabelle
WHERE
(date_from <= '{$timestamp_date_from}' AND
date_to >= '{$timestamp_date_from}') OR
(date_from <= '{$timestamp_date_to}' AND
date_to >= '{$timestamp_date_to}') OR
(date_from > '{$timestamp_date_from}' AND
date_to < '{$timestamp_date_to}')";
?>

exweised
28.11.2004, 14:06:39
01.12.2004 - 02.12.2004: wäre belegt: amount = 1: fazit korrekt

30.11.2004 - 04.12.2004: wäre belegt: amount = 2: fazit korrekt

02.12.2004 - 02.12.2004: wäre frei: amount = 0: fazit korrekt

05.12.2004 - 06.12.2004: wäre frei: amount = 0: fazit korrekt

05.12.2004 - 07.12.2004: wäre belegt: amount = 1: fazit korrekt

24.12.2004 - 24.12.2004: wäre frei: amount = 0: fazit korrekt

02.12.2004 - 05.12.2004: wäre belegt: amount = 1: fazit korrekt


VIELEN VIELEN VIELEN DANK FÜR EURE HILFEN!!! BESONDERS AN xabbuh!!!!
hätte nie gedacht, dass das irgendwann läuft. aber es klappt endlich. jippy. ;-)

xabbuh
28.11.2004, 14:14:53
Hoffen wir mal, dass das jetzt die endgültige Fassung war ;-) Bin mir da selbst noch nicht wirklich sicher.