php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 20-01-2014, 20:38
tomahawkv2
 Registrierter Benutzer
Links : Onlinestatus : tomahawkv2 ist offline
Registriert seit: Jan 2014
Beiträge: 8
tomahawkv2 befindet sich auf einem aufstrebenden Ast
Standard Prüfen ob Termin in einem Zeitraum noch frei ist ... Hilfe!

Hallo zusammen,

ich bin Anfänger und arbeite derzeit an einem Projekt.
Dabei soll es sich um eine Art "Terminverwaltung handeln. (mit PHP, MySQL, usw.)

Ein neuer Termin wird dabei über ein Formular erstellt. Nach Klick auf einen Submit-Button wird der Termin in die Datenbank geschrieben.

Damit man sich etwas vorstellen kann - Hier ein Teil des Eingabeformulars:



Hier ein Teil der Datenbank:



Bitte die Datenbank ist derzeit noch fernab von Daten-Normalisierung, da ich viel rumprobiere...

Zum Problem:

Ich möchte jetzt bevor der neue Datensatz in die Datenbank geschrieben wird abfragen, ob der Termin noch frei ist.
Es soll also geprüft werden, ob sich der Zeitraum des neuen Termines mit einem vorhandenem Termin in der Datenbank überschneidet.

Kann mir dabei bitte jemand behilflich sein und mir einen einfachen Lösungsweg vorschlagen.

Vielen Dank im Voraus!

Geändert von wahsaga (21-01-2014 um 09:49 Uhr) Grund: Bitte unsinnge Verlinkungen bzw. Spam unterlassen!
Mit Zitat antworten
  #2 (permalink)  
Alt 20-01-2014, 21:51
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.722
Kropff befindet sich auf einem aufstrebenden Ast
Standard

Wo ist das Problem? Du sendest einen Query ab, der abfragt, ob das Datum innerhalb eines bestimmten Wertes liegst. Dazu benötigst du doch nur die PHP-Funktion date und BETWEEN von MySQL.

Peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
Mit Zitat antworten
  #3 (permalink)  
Alt 20-01-2014, 23:28
tomahawkv2
 Registrierter Benutzer
Links : Onlinestatus : tomahawkv2 ist offline
Registriert seit: Jan 2014
Beiträge: 8
tomahawkv2 befindet sich auf einem aufstrebenden Ast
Standard

Hallo,

mag sein, dass ich zu kompliziert denke....

Der neue Termin hat doch eine Start- und eine Endzeit. z.B.:
Start: 21.01.2014 - 12:00 Uhr
Ende: 21.01.2014 - 13:00 Uhr

Ich müsste jetzt ja abfragen, ob irgendwann in dieser Stunde zw. 12:00 und 13:00 Uhr bereits ein Termin existiert und somit eine Überschneidung vorliegt.

Vielleicht gibt es ja einen Termin, der um 12:45 anfängt und bis 13:00 dauert. Wie prüfe ich das ab?


Zitat:
Wo ist das Problem? Du sendest einen Query ab, der abfragt, ob das Datum innerhalb eines bestimmten Wertes liegst. Dazu benötigst du doch nur die PHP-Funktion date und BETWEEN von MySQL.
Ich könnte ja so nur die Startzeit mit der Datenbank vergleichen und nicht die gesamte Dauer meines Termines oder?
Einen Termin der wie im obigen Beispiel um 12:45 anfängt erfasse ich so ja nicht.


Vielleicht hast du ein kurzes Code-Snippet, damit ich mir etwas darunter vorstellen kannst, wie du genau vorgehen würdest.

Vielen Dank
Mit Zitat antworten
  #4 (permalink)  
Alt 21-01-2014, 09:46
pg_user
 Registrierter Benutzer
Links : Onlinestatus : pg_user ist offline
Registriert seit: Jan 2014
Beiträge: 19
pg_user befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von tomahawkv2 Beitrag anzeigen

Ich möchte jetzt bevor der neue Datensatz in die Datenbank geschrieben wird abfragen, ob der Termin noch frei ist.
Es soll also geprüft werden, ob sich der Zeitraum des neuen Termines mit einem vorhandenem Termin in der Datenbank überschneidet.
Muß es zwingend MySQL sein?

In PostgreSQL kannst das als exclusion constraint direkt in der Datenbank abbilden.

Geändert von wahsaga (21-01-2014 um 09:50 Uhr)
Mit Zitat antworten
  #5 (permalink)  
Alt 21-01-2014, 12:08
tomahawkv2
 Registrierter Benutzer
Links : Onlinestatus : tomahawkv2 ist offline
Registriert seit: Jan 2014
Beiträge: 8
tomahawkv2 befindet sich auf einem aufstrebenden Ast
Standard

Hallo,

Zitat:
Muß es zwingend MySQL sein?
Sorry - Ja. Muss unter MySQL laufen.
Muss das irgendwie lösen, komme aber ohne Hilfe nicht weiter.

Danke
Mit Zitat antworten
  #6 (permalink)  
Alt 21-01-2014, 12:31
pg_user
 Registrierter Benutzer
Links : Onlinestatus : pg_user ist offline
Registriert seit: Jan 2014
Beiträge: 19
pg_user befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von tomahawkv2 Beitrag anzeigen
Hallo,

Sorry - Ja. Muss unter MySQL laufen.
Schlecht. Bekommt man mit viel Hirn sicher hin, aber in PG mit Range-Typen und Exclusion Constraint wäre es nicht nur absolut trivial, sondern auch noch sehr robust (weil als Table-Constraint) und schnell (weil Index-basiert)

Es gibt da direkt Range-Typen (also es geht von-bis) und ein Overlapp-Operator, der Ranges auf Überlappung prüft, und Exclusion Constraint prüft, daß keine 2 sich überlappenden Ranges in der Tabelle stehen.
Mit Zitat antworten
  #7 (permalink)  
Alt 21-01-2014, 13:29
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Mach dir erst mal klar, welche Arten von Überlappungen es geben kann – „aufmalen” hilft!

Daraus kann man dann recht einfach die notwendigen Bedingungen ableiten.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #8 (permalink)  
Alt 21-01-2014, 16:47
tomahawkv2
 Registrierter Benutzer
Links : Onlinestatus : tomahawkv2 ist offline
Registriert seit: Jan 2014
Beiträge: 8
tomahawkv2 befindet sich auf einem aufstrebenden Ast
Standard

Ich glaube meine Kenntnisse übersteigt das um Längen.
Werde das nicht ohne Hilfe auf die Reihe bekommen.

Dachte nicht, dass das so komplex sei.

Falls noch jemand eine Idee hat und mir helfen möchte ... - Untenstehend eine Visualisierung des Problems. Die Überlappung sollte mittels PHP, MySQL vermieden werden:




Vielen Dank und schöne Grüße!
Mit Zitat antworten
  #9 (permalink)  
Alt 21-01-2014, 17:13
pg_user
 Registrierter Benutzer
Links : Onlinestatus : pg_user ist offline
Registriert seit: Jan 2014
Beiträge: 19
pg_user befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von tomahawkv2 Beitrag anzeigen
Ich glaube meine Kenntnisse übersteigt das um Längen.
Werde das nicht ohne Hilfe auf die Reihe bekommen.

Dachte nicht, dass das so komplex sei.
Vergleich einfach Anfangs- und Endzeiten, und vergleiche. Damit kannst das prüfen. Wenn die neue Anfangszeit nach einer schon eingetragenen ist und die dortige Endzeit danach überlappt es sich vorne. Das auch noch hinten prüfen.


So schwer ist es nun auch nicht. Was halt nicht geht: das direkt als Constraint abzubilden. Um mal zu zeigen, was ich meine:

Code:
test=*# create table buchung (dauer tsrange, exclude using gist (dauer with &&));
CREATE TABLE
test=*# insert into buchung values ('[2014-01-30 15:00:00,2014-01-30 15:45:00)');
INSERT 0 1
test=*# insert into buchung values ( '(2014-01-30 16:00:00,2014-01-30 17:00:00)');
INSERT 0 1

-- nun ein Select, ob sich die Zeit überlappt:

test=*# select * from buchung where  dauer && '(2014-01-30 16:30:00,2014-01-30 17:30:00)';
                     dauer
-----------------------------------------------
 ("2014-01-30 16:00:00","2014-01-30 17:00:00")
(1 row)


-- ein Insert, der aber scheitert aufgrund des Constraints
test=*# insert into buchung values ( '(2014-01-30 16:30:00,2014-01-30 17:30:00)');
ERROR:  conflicting key value violates exclusion constraint "buchung_dauer_excl"
DETAIL:  Key (dauer)=(("2014-01-30 16:30:00","2014-01-30 17:30:00")) conflicts with existing key (dauer)=(("2014-01-30 16:00:00","2014-01-30 17:00:00")).
STATEMENT:  insert into buchung values ( '(2014-01-30 16:30:00,2014-01-30 17:30:00)');
ERROR:  conflicting key value violates exclusion constraint "buchung_dauer_excl"
DETAIL:  Key (dauer)=(("2014-01-30 16:30:00","2014-01-30 17:30:00")) conflicts with existing key (dauer)=(("2014-01-30 16:00:00","2014-01-30 17:00:00")).
Mit Zitat antworten
  #10 (permalink)  
Alt 21-01-2014, 17:32
pg_user
 Registrierter Benutzer
Links : Onlinestatus : pg_user ist offline
Registriert seit: Jan 2014
Beiträge: 19
pg_user befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von pg_user Beitrag anzeigen
Vergleich einfach Anfangs- und Endzeiten, und vergleiche. Damit kannst das prüfen. Wenn die neue Anfangszeit nach einer schon eingetragenen ist und die dortige Endzeit danach überlappt es sich vorne. Das auch noch hinten prüfen.
Weil ich es grad sehe: speicher Zeitpunkte nicht mehrfach, das ist sehr redundant, was Du da mit je 3 Feldern machst. In MySQL heißt der passende Datentyp wohl DATETIME.
Mit Zitat antworten
  #11 (permalink)  
Alt 22-01-2014, 12:29
tomahawkv2
 Registrierter Benutzer
Links : Onlinestatus : tomahawkv2 ist offline
Registriert seit: Jan 2014
Beiträge: 8
tomahawkv2 befindet sich auf einem aufstrebenden Ast
Standard

Hallo,

ich unternehme noch einen letzten Versuch:


Zitat:
Weil ich es grad sehe: speicher Zeitpunkte nicht mehrfach, das ist sehr redundant
Bitte lies kurz den Satz den ich genau unter dem Screenshot platziert habe.
Wenn die Sache gelöst ist, dann bin ich bereit alles umzuschreiben...

----------------------------------------------------------------------------


Ich habe so begonnen:

Ich meine zu glaube, dass mir das folgende SQL-Statement alle möglichen Terminüberschneidungen liefert:

Code:
 // $start_time_timestamp = Startzeit des neuen Termins
 // $end_time_timestamp = Endzeit des neuen Termins
  
SELECT * FROM `terminverwaltung_termine` 
WHERE start_time_timestamp BETWEEN '" . $start_time_timestamp . "' AND '" . $end_time_timestamp . "' 
OR end_time_timestamp BETWEEN '" . $start_time_timestamp . "' AND '" . $end_time_timestamp . "'
Hoffnungsvoll habe ich habe dann folgendes gecodet:

PHP-Code:
$ueberschneidung_query mysqli_query($verbindung"SELECT * FROM `terminverwaltung_termine` 
WHERE start_time_timestamp BETWEEN '" 
$start_time_timestamp "' AND '" $end_time_timestamp "' 
OR end_time_timestamp BETWEEN '" 
$start_time_timestamp "' AND '" $end_time_timestamp "'");

 
$ueberschneidung_num_rows mysqli_num_rows($ueberschneidung_query);

 if (
$ueberschneidung_num_rows 0) {

  
// GIB EINEN FEHLER AUS!
  
 
} else {   
  
 
// SCHREIB DEN NEUEN DATENSATZ IN DIE DB!
  
 

Grundsätzlich funktioniert es, aber es gibt folgendes Problem:

Nehmen wir an es existiert bereits der folgende Termin:
Start: 10:00 Uhr
Ende: 11:00 Uhr

Der neue Termin sieht so aus:
Start: 09:00 Uhr
Ende: 10:00 Uhr

Der Termin wird nicht in die Datenbank geschrieben, da:
Ende "Neuer Termin" == Start "Bestehender Termin"


So jetzt müsste es dann so weitergehen:

PHP-Code:
$ueberschneidung_query mysqli_query($verbindung"SELECT * FROM `terminverwaltung_termine` 
WHERE start_time_timestamp BETWEEN '" 
$start_time_timestamp "' AND '" $end_time_timestamp "' 
OR end_time_timestamp BETWEEN '" 
$start_time_timestamp "' AND '" $end_time_timestamp "'");

 
$ueberschneidung_num_rows mysqli_num_rows($ueberschneidung_query);

  
// Wenn es eine Überschneidung gibt
  
if ($ueberschneidung_num_rows 0) {
 
 
// Datensatz der möglichen Überschneidungen holen und Variablen setzen
 
while ($row mysqli_fetch_array($ueberschneidung_query)) {
   
$ueberschneidung_start $row["start_time_timestamp"]
   
$ueberschneidung_ende $row["end_time_timestamp"]
 } 
  
 if(
$start_time_timestamp == $ueberschneidung_ende || $end_time_timestamp == $ueberschneidung_start) {
  
 
// ALLES OK
  // SCHREIB DEN NEUEN DATENSATZ IN DIE DB!
  
} else {
  
  
// GIB EINEN FEHLER AUS!
  
}
} ELSE {
  
  
// ALLES OK
 // SCHREIB DEN NEUEN DATENSATZ IN DIE DB!
  


Ich glaube zwar nicht, dass sich das jetzt jemand von euch durchschaut, aber einen Versuch ist es Wert. So hab' ich's wenigstens mal dokumentiert.

Ich kenn' mich nicht mehr aus. Als Anfänger ist mir das zu viel.
Kann dies so funktionieren?
Was ist wenn wenn das SQL-Statement mehr als einen Datensatz zurückliefert?

Hat jemand noch eine Idee?
Mit Zitat antworten
  #12 (permalink)  
Alt 22-01-2014, 13:24
pg_user
 Registrierter Benutzer
Links : Onlinestatus : pg_user ist offline
Registriert seit: Jan 2014
Beiträge: 19
pg_user befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von tomahawkv2 Beitrag anzeigen
Grundsätzlich funktioniert es, aber es gibt folgendes Problem:

Nehmen wir an es existiert bereits der folgende Termin:
Start: 10:00 Uhr
Ende: 11:00 Uhr

Der neue Termin sieht so aus:
Start: 09:00 Uhr
Ende: 10:00 Uhr

Der Termin wird nicht in die Datenbank geschrieben, da:
Ende "Neuer Termin" == Start "Bestehender Termin"
BETWEEN betrachtet IIRC die Grenzen inklusive. Um das zu verhindern kannst auch mit Größer/Kleiner - Zeichen arbeiten - ist natürlich auch wieder Aufwand. Oder ziehst am Ende 'ne Sekunde ab. (also vom Ende des neuen Termins)

Bei den Ranges-Typen in PG kann man das übrigens definieren: eckige Klammern inklusive, geschweite exclusive.
Mit Zitat antworten
  #13 (permalink)  
Alt 22-01-2014, 13:25
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von tomahawkv2 Beitrag anzeigen
Ich meine zu glaube, dass mir das folgende SQL-Statement alle möglichen Terminüberschneidungen liefert:

Code:
[…]
WHERE start_time_timestamp BETWEEN '" . $start_time_timestamp . "' AND '" . $end_time_timestamp . "' 
OR end_time_timestamp BETWEEN '" . $start_time_timestamp . "' AND '" . $end_time_timestamp . "'
Nein, da fehlt noch der Fall, dass ein bestehender Termin den neuen Termin vollständig enthält.

Zitat:
Nehmen wir an es existiert bereits der folgende Termin:
Start: 10:00 Uhr
Ende: 11:00 Uhr

Der neue Termin sieht so aus:
Start: 09:00 Uhr
Ende: 10:00 Uhr

Der Termin wird nicht in die Datenbank geschrieben, da:
Ende "Neuer Termin" == Start "Bestehender Termin"
BETWEEN prüft auf kleiner-gleich/größer-gleich.

Endzeitpunkt = 10:00 und Startzeitpunkt = 10:00 wird damit natürlich als „Überschneidung” gewertet. Den gleich-Fall musst du also jeweils ausschließen, wenn du diese Gleichheit nicht als „Überschneidung” betrachten willst.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #14 (permalink)  
Alt 22-01-2014, 14:32
tomahawkv2
 Registrierter Benutzer
Links : Onlinestatus : tomahawkv2 ist offline
Registriert seit: Jan 2014
Beiträge: 8
tomahawkv2 befindet sich auf einem aufstrebenden Ast
Standard

Hallo,

also ich glaube fast, dass mir eure beiden Beiträge geholfen haben.

Zitat:
Um das zu verhindern kannst auch mit Größer/Kleiner - Zeichen arbeiten - ist natürlich auch wieder Aufwand. Oder ziehst am Ende 'ne Sekunde ab ...
Mein Code sieht jetzt so aus:

PHP-Code:
 
// $start_time_timestamp = Startzeit des neuen Termins
 // $end_time_timestamp = Endzeit des neuen Termins
  
 
 // Auf Termin-Überschneidung prüfen
$ueberschneidung_query mysqli_query($verbindung"SELECT * FROM terminverwaltung_termine 
WHERE start_time_timestamp > '" 
$start_time_timestamp "' AND start_time_timestamp < '" $end_time_timestamp "'
OR end_time_timestamp > '" 
$start_time_timestamp "' AND start_time_timestamp < '" $end_time_timestamp "'");

 
 
// Nachschauen, ob das SQL-Statement ein Ergebnis geliefert hat
 
$ueberschneidung_num_rows mysqli_num_rows($ueberschneidung_query);

 
  
// Wenn es mindestens eine Überschneidung gibt, dann ...
  
if ($ueberschneidung_num_rows 0) {

    
// GIB EINEN FEHLER AUS!
 
 
} else {   // Wenn es keine Überschneidung gibt, dann ...

    // SCHREIB DEN NEUEN DATENSATZ IN DIE DB!

 

Also ein erster Test sieht sehr erfolgsversprechend aus.
Ehrlich gesagt fühle ich mich noch immer sehr sehr unsicher und es fällt mir schwer zu glauben, dass jetzt alles passt mit so einfachen Code.

Kann das jetzt so funktionieren?

Vielen Dank nochmal für die Unterstützung!
Mit Zitat antworten
  #15 (permalink)  
Alt 22-01-2014, 14:40
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von wahsaga Beitrag anzeigen
Nein, da fehlt noch der Fall, dass ein bestehender Termin den neuen Termin vollständig enthält.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Kalender mit Termin über einen Zeitraum Edlly BRAINSTORMING PHP/SQL/HTML/JS/CSS 5 17-03-2008 22:01
Entwickler hat noch Kapazitäten frei highrise Jobgesuche 0 21-06-2006 02:28
[Jobgesuch] Habe noch Resourcen frei xJonx Jobgesuche 0 27-05-2006 03:00
datum in zeitraum prüfen phaeton BRAINSTORMING PHP/SQL/HTML/JS/CSS 4 23-06-2004 07:30
Onesoft AG hat noch Kapazitäten frei cfraunholz Archiv / Trash 26 08-04-2003 12:14

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:39 Uhr.