2016-08-19 2 views
0

schränkt Ich muss den doppelten Wert von der Datenbank überprüfen, die PHP und MySQL verwendet. Ich erkläre meine Tabelle unten.Wie man doppelten Rekord unter Verwendung PHP und Mysql

time_id  member_id  day_id  time 

    1    2   1  12.30am-3.00am 

Hier muss ich für time Spalte Duplikat überprüfen. Nehmen wir an, die vom Benutzer eingegebene Zeit wie 2.00am-4.00am für member_id=2 und day_id=1 sollte überprüft werden, da 12.00am-3.00am Slot bereits für diesen member_id and day_id reserviert ist.

Hier brauche ich Abfrage für Benutzer kann nicht die Zeit zwischen 12.00am-3.00am wieder für die gleiche member_id and day_id einfügen.

+1

Warum Sie nicht zwei Spalten verwendet haben, wie 'beginnen Time' und' Time', die zu zählen Enddatum? Es wäre mit Abfragen leicht gewesen, doppelte und kreuzende Schlitze zu überprüfen. –

+0

True, aber so oder so, das ist nicht so schwer – Strawberry

+0

Sie können einzigartige Einschränkung auf diese 3 Spalte hinzufügen – Saurabh

Antwort

4

Es wird viel einfacher (und besser für die Datenkonsistenz), wenn Sie time Spalte 2 Spalten datetime ändern (ex. date_start und date_end), und dann können Sie integrierte Mechanismen in SQL versuchen, dass Benutzer versuchen, zu überprüfen Fügen Sie zwischen diesen beiden Daten eine Zeile hinzu.

+0

Können Sie teilen Sie Idee von Code bitte. – subhra

0

Hier sind die logischen Schritte, die Sie ergreifen müssen, um diese Aufgabe zu erfüllen:

Schritt 1 Trennen Sie die Startzeit und die Endzeit in zwei Spalten. So sollten Sie Ihren Tisch wie folgt aussehen:

time_id member_id entry_day time_in     time_out 
1  2   2016-01-19 2016-08-19 12:30:00  2016-08-18 03:00:00 

Ihre Spalten Typen sein sollte:

`time_id`: `int` 
`member_id`: `int` 
`time_in`: `DATETIME` 
`entry_day`: `DATE` 
`time_out`: `DATETIME` 

Schritt 2 einige PHP schreiben, die eine Abfrage auf der Datenbank ausführt, die etwa wie folgt aussieht:

SELECT * FROM TimeEntryTable t 
WHERE t.member_id = :memberId 
AND :new_entry_time_in BETWEEN t.time_in AND t.time_out 
OR :new_entry_time_out BETWEEN t.time_in AND t.time_out 

Sie müssen den neuen Rekord time_in, passieren time_out, member_id an die Abfrage. Ich nehme an, Sie benutzen PDO ... wenn nicht, dann sollten Sie wahrscheinlich anfangen.

Schritt 3

Überprüfen Sie das Ergebnis von dieser Abfrage zurückgegeben werden.

if (count($resultsArray) === 0) { 
    //Create the new record, 
} else { 
    //If you're here than there was a record within that time range and you should not create it. 
} 
+0

Aber ich habe zwei Felder, deren Datentyp string.Are funktionieren sie in meinem Fall? – subhra

+0

Sie müssen sie konvertieren, aber sie werden funktionieren. PHP wird sie für Sie konvertieren. '$ inTime = new \ DateTime ($ inTimeString);' Wenn Sie 'PDO' verwenden, können Sie dieses Objekt als Parameter übergeben. –

+0

@ Layton Everson: Ich benutze 'jquery' Timepicker für die Auswahl der Zeit im Frontend, wird es gut sein, datetime Typ Spalte zu speichern. – subhra

Verwandte Themen