Ankündigung

Einklappen
Keine Ankündigung bisher.

Datetime und Überschneidungen in PHP

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #16
    SQL Dump kannst du mit PHPMyAdmin erstellen unter dem Reiter Export und dann hier rein kopieren den Text, nicht die Datei.
    sqlfiddle.com ist manchmal überlastet, dann muss nur nach einigen Sekunden es erneut probieren, geht aber.

    .

    Kommentar


    • #17
      So Fiddle wieder erreichbar..
      Hier die Fiddle

      hier scheint alles zu funktionieren...
      Leider nicht bei der direkten SQL abfrage am server


      Hier der Dump

      Code:
      -- phpMyAdmin SQL Dump
      -- version 4.6.6
      -- https://www.phpmyadmin.net/
      --
      -- Host: localhost:3306
      -- Erstellungszeit: 13. Sep 2018 um 08:23
      -- Server-Version: 5.5.60-MariaDB
      -- PHP-Version: 5.6.30
      
      SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
      SET time_zone = "+00:00";
      
      
      /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
      /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
      /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
      /*!40101 SET NAMES utf8mb4 */;
      
      --
      -- Datenbank: `rese_`
      --
      
      -- --------------------------------------------------------
      
      --
      -- Tabellenstruktur für Tabelle `T2`
      --
      
      CREATE TABLE `T2` (
        `id` int(10) NOT NULL,
        `name` text NOT NULL,
        `beginn` datetime NOT NULL,
        `ende` datetime NOT NULL
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
      
      --
      -- Daten für Tabelle `T2`
      --
      
      INSERT INTO `T2` (`id`, `name`, `beginn`, `ende`) VALUES
      (1, 'Erol Semiz', '2018-09-12 15:00:00', '2018-09-12 22:00:00'),
      (2, 'test 2 ', '2018-10-12 15:00:00', '2018-10-12 18:00:00'),
      (3, 'tetstst stst', '2018-09-15 15:00:00', '2018-09-15 16:00:00');
      
      --
      -- Indizes der exportierten Tabellen
      --
      
      --
      -- Indizes für die Tabelle `T2`
      --
      ALTER TABLE `T2`
        ADD PRIMARY KEY (`id`);
      
      --
      -- AUTO_INCREMENT für exportierte Tabellen
      --
      
      --
      -- AUTO_INCREMENT für Tabelle `T2`
      --
      ALTER TABLE `T2`
        MODIFY `id` int(10) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;
      /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
      /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
      /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
      lg

      Kommentar


      • #18
        Zitat von hausl Beitrag anzeigen

        Hast du wirklich doppelte und einfache Quotes? Korrigier das mal.

        EDIT:

        Und bei so vielen Bedingungen würde ich Klammern setzten und mal sauber formatieren.
        a la:
        Code:
        SELECT id, name, beginn, ende
        
        FROM T2
        
        WHERE
        (beginn > '2018-09-12 14:15:00' AND beginn < '2018-09-12 17:15:00')
        OR
        (ende > '2018-09-12 14:15:00' AND beginn < '2018-09-12 17:15:00')
        OR
        ('2018-09-12 14:15:00' > beginn AND '2018-09-12 14:15:00' < ende)
        OR
        ('2018-09-12 17:15:00' > beginn AND '2018-09-12 14:15:00' < ende)
        Danke dir!, so funktioniert die Anfrage auch auf dem SQL server!
        Jetzt mal unter php probieren

        Kommentar


        • #19
          Wie Setze ich am besten die Variablen unter PHP in den SQL befehl ein? einfach das Datum mit der Variable ändern? also so:
          Code:
           SELECT id, name, beginn, ende  FROM T2  WHERE
          (beginn > '$nbeginn' AND beginn < '$nende')
          OR (ende > '$nbeginn' AND beginn < '$nende')
          OR ('$nbeginn' > beginn AND '$nbeginn' < ende)
          OR ('$nende' > beginn AND '$nbeginn' < ende)
          Denkt ihr ich habe mit diesem Code alle optionen betrachtet so das keine doppelte terminbuchung entsehen kann?

          Fest steht das mein Fehler beim PHP code passiert..

          Liebe grüße und Vielen DANK an Alle!

          Kommentar


          • #20
            Am besten mit Prepared Statements.

            z.B. mit PDO:
            PHP-Code:
            $stmt $pdo->prepare('
                SELECT
                    id, name, beginn, ende
                FROM
                    T2
                WHERE
                    beginn BETWEEN :beginn AND :ende
                OR
                    ende BETWEEN :beginn AND :ende
            '
            );

            $stmt->execute([
                
            ':beginn' => $nbeginn,
                
            ':ende' => $nende
            ]); 
            Warum heißen eigentlich deine Variablen so komisch? Davon abgesehen solltest du dir angewöhnen Variablen in Englisch zu benennen. Englisch ist nun mal die Hauptsprache unter Programmierer, außerdem lernt man auch gleich besser Englisch, wenn man "gezwungen" ist es zu verwenden.

            Eine Tabelle sollte auch nicht "T2" heißen, sondern einen aussagekräftigen Namen haben.

            Kommentar


            • #21
              Wenn du PDO nutzt, kannst du direkt named-Parameter nutzen: https://php-de.github.io/jumpto/pdo/#bind-array
              The string "()()" is not palindrom but the String "())(" is.

              Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
              PHP.de Wissenssammlung | Kein Support per PN

              Kommentar


              • #22
                Zitat von deluxe13 Beitrag anzeigen

                Möchte gerne MySql verwenden.
                Deine Sache. Nur um mal zu zeigen, was andere DB-Systeme können:

                Code:
                --
                -- die Tabellendefinition
                --
                test=*# \d termine
                                             Table "public.termine"
                 Column  |  Type   | Collation | Nullable |               Default               
                ---------+---------+-----------+----------+-------------------------------------
                 id      | integer |           | not null | nextval('termine_id_seq'::regclass)
                 name    | text    |           |          |
                 von_bis | tsrange |           |          |
                Indexes:
                    "termine_pkey" PRIMARY KEY, btree (id)
                    "termine_von_bis_excl" EXCLUDE USING gist (von_bis WITH &&)
                
                --
                -- Inhalt
                --
                test=*# select * from termine;
                 id |     name     |                    von_bis                    
                ----+--------------+-----------------------------------------------
                  4 | -----        | ["2018-09-12 15:00:00","2018-09-12 22:00:00")
                  5 | test2        | ["2018-10-12 15:00:00","2018-10-12 18:00:00")
                  6 | tetstst stst | ["2018-09-15 15:00:00","2018-09-15 16:00:00")
                (3 rows)
                
                --
                -- Abfrage, ob Dein Termin frei ist
                --
                test=*# select count(*) from termine where von_bis && '[2018-09-12 14:15:00,2018-09-12 17:15:00)';
                 count
                -------
                     1
                (1 row)
                
                --
                -- da kommt 1,also da ist schon was geplant
                --
                
                --
                -- wir versuchen, dennoch das einzutragen, es wird nicht gehen:
                --
                test=*# insert into termine (name, von_bis) values ('geht nicht','[2018-09-12 14:15:00,2018-09-12 17:15:00)');
                FEHLER:  kollidierender Schlüsselwert verletzt Exclusion-Constraint »termine_von_bis_excl«
                DETAIL:  Schlüssel (von_bis)=(["2018-09-12 14:15:00","2018-09-12 17:15:00")) kollidiert mit vorhandenem Schlüssel (von_bis)=(["2018-09-12 15:00:00","2018-09-12 22:00:00")).
                aber mach mal schön weiter mit MySQL




                PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                Kommentar


                • #23
                  Wie könnte ich das unter Mysqli realisieren?


                  Ich danke euch !!

                  Kommentar


                  • #24
                    Zitat von akretschmer Beitrag anzeigen

                    Deine Sache. Nur um mal zu zeigen, was andere DB-Systeme können:

                    Code:
                    --
                    -- die Tabellendefinition
                    --
                    test=*# \d termine
                    Table "public.termine"
                    Column | Type | Collation | Nullable | Default
                    ---------+---------+-----------+----------+-------------------------------------
                    id | integer | | not null | nextval('termine_id_seq'::regclass)
                    name | text | | |
                    von_bis | tsrange | | |
                    Indexes:
                    "termine_pkey" PRIMARY KEY, btree (id)
                    "termine_von_bis_excl" EXCLUDE USING gist (von_bis WITH &&)
                    
                    --
                    -- Inhalt
                    --
                    test=*# select * from termine;
                    id | name | von_bis
                    ----+--------------+-----------------------------------------------
                    4 | ----- | ["2018-09-12 15:00:00","2018-09-12 22:00:00")
                    5 | test2 | ["2018-10-12 15:00:00","2018-10-12 18:00:00")
                    6 | tetstst stst | ["2018-09-15 15:00:00","2018-09-15 16:00:00")
                    (3 rows)
                    
                    --
                    -- Abfrage, ob Dein Termin frei ist
                    --
                    test=*# select count(*) from termine where von_bis && '[2018-09-12 14:15:00,2018-09-12 17:15:00)';
                    count
                    -------
                    1
                    (1 row)
                    
                    --
                    -- da kommt 1,also da ist schon was geplant
                    --
                    
                    --
                    -- wir versuchen, dennoch das einzutragen, es wird nicht gehen:
                    --
                    test=*# insert into termine (name, von_bis) values ('geht nicht','[2018-09-12 14:15:00,2018-09-12 17:15:00)');
                    FEHLER: kollidierender Schlüsselwert verletzt Exclusion-Constraint »termine_von_bis_excl«
                    DETAIL: Schlüssel (von_bis)=(["2018-09-12 14:15:00","2018-09-12 17:15:00")) kollidiert mit vorhandenem Schlüssel (von_bis)=(["2018-09-12 15:00:00","2018-09-12 22:00:00")).
                    aber mach mal schön weiter mit MySQL



                    Das sieht sehr gut aus, ich sollte dann wirklich mit einer anderen Datenbank arbeiten um auch spätere fehler umzugehen.
                    Welche Datenbank verwendest du in deinem Beispiel ?

                    Kommentar


                    • #25
                      Zitat von deluxe13 Beitrag anzeigen
                      Wie könnte ich das unter Mysqli realisieren?
                      Umständlicher, weil du die "bescheuerte" ? ? Syntax nutzen musst. Daher auch die Empfehlung zu PDO. Weiteres zu Prep.Statements (mysqli_) findest du im Handbuch: http://php.net/manual/de/mysqli.quic...statements.php


                      Zitat von deluxe13
                      Welche Datenbank verwendest du in deinem Beispiel ?
                      Zitat von akretschmer Beitrag anzeigen
                      Das kannst Du ... verhindern. Falls Du PostgreSQL hast.
                      The string "()()" is not palindrom but the String "())(" is.

                      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                      PHP.de Wissenssammlung | Kein Support per PN

                      Kommentar


                      • #26
                        Vielen lieben dank !
                        ich werde mich mal in PostgreSQL reinarbeiten.

                        Danke

                        Kommentar


                        • #27
                          Zitat von deluxe13 Beitrag anzeigen
                          Wie könnte ich das unter Mysqli realisieren?
                          Musst du selber im PHP-Handbuch nachschauen. Ich weiß nur, dass es umständlich ist.

                          Kommentar


                          • #28
                            Zitat von deluxe13 Beitrag anzeigen
                            Vielen lieben dank !
                            ich werde mich mal in PostgreSQL reinarbeiten.
                            Und dann gleich von Beginn an mit Prep.Statments unter PDO darauf zugreifen
                            The string "()()" is not palindrom but the String "())(" is.

                            Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                            PHP.de Wissenssammlung | Kein Support per PN

                            Kommentar


                            • #29
                              Zitat von hellbringer Beitrag anzeigen
                              z.B. mit PDO:
                              PHP-Code:
                              $stmt $pdo->prepare('
                              SELECT
                              id, name, beginn, ende
                              FROM
                              T2
                              WHERE
                              beginn BETWEEN :beginn AND :ende
                              OR
                              ende BETWEEN :beginn AND :ende
                              '
                              );

                              $stmt->execute([
                              ':beginn' => $nbeginn,
                              ':ende' => $nende
                              ]); 
                              Warum hei
                              Das funktioniert so aber nur, wenn die Prepared Statements emuliert werden.

                              Kommentar


                              • #30
                                Nur um mal zu zeigen, dass MySQL das auch kann:

                                Code:
                                DELIMITER //
                                
                                CREATE TRIGGER check_dates
                                BEFORE INSERT ON `t2`
                                FOR EACH ROW
                                BEGIN
                                
                                IF EXISTS (
                                    SELECT beginn
                                    FROM t2
                                    WHERE NEW.beginn < ende
                                    AND NEW.ende > beginn
                                ) THEN
                                    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Fehler! Termin-Überschneidung!';
                                  END IF;
                                END; //
                                
                                DELIMITER ;
                                termine.PNG

                                Also überleg dir das nochmal mit dem Wechsel zu Postgre
                                sorry, shift-taste kaputt

                                Kommentar

                                Lädt...
                                X