Ankündigung

Einklappen
Keine Ankündigung bisher.

Einzelne Zeilen automatisch aktualisieren

Einklappen

Neue Werbung 2019

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

  • Einzelne Zeilen automatisch aktualisieren

    Hallo,

    in meiner Tabelle gibt es eine Spalte im Date Format welche den Abgabetermin eines Angebotes enthält. Hierbei handelt es sich um das Datum wann das Angebot beim Kunden sein MUSS. Also muss vorher eine automatisch Erinnerung an den Kalkulator raus.

    Vorab rufe ich den Wert ( abgabetermin ) aus der DB ab, dann verändere ich in PHp das Datum zu einem Erinnerungsdatum.

    Dieses Datum soll dann in der Tabelle unter erinnerung eingetragen werden.
    Von diesem Datum soll dann PHP später vergleichen und eventuell eine Mail verschicken.

    Mit meinem Code wird das Datum zwar aktualisiert aber nicht jede Zeile individuell sondern alle Zeilen enthalten das selbige Datum obwohl ein anderer Abgabetermin hinterlegt ist.

    Ich bin noch nicht so ganz sicher mit php und sql und könnte hier etwas Hilfe gebrauchen.

    PHP-Code:
    <?php  
                
    //Datum von Heute wird ermittelt 
                
    $heute date("Y-m-d"); 

                
    //Holt den eingetragenen Abgabetermin aus der Datenbank 
                
    $pdo = new PDO('mysql:host=localhost;dbname=nubis''root''');  

                                            
    $sql "SELECT abgabetermin FROM angebote WHERE status = 0";  
                                            foreach (
    $pdo->query($sql) as $row) {  
                                            
    var_dump($row);     
                                            } 
                
    // Rechnet den Abgabetermin minus der angegebenen Tage. Ermittelt das Erinnerungsdatum. 
                
    $dbabgabetermin $row['abgabetermin'];  
                    
    $erinnerungsdatum = new DateTime($dbabgabetermin);  
                    
    $erinnerungsdatum->modify("-5 day");  
                    
    $tagerinnerung $erinnerungsdatum->format("Y-m-d");   
                    
    //echo $tagerinnerung; 

                //Hier wird geprüft ob eine Erinnerung verschickt werden muss 
                //echo $heute; 
                
    $pdo = new PDO("mysql:host=localhost;dbname=nubis"'root''');  
                
    $pdo->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION); 

                
    $sql $pdo->prepare("UPDATE `angebote` SET `erinnerung` = '$tagerinnerung'"); 
                
    $sql->execute(); 

                 
    /*if ($heute == $tagerinnerung){ 

                     echo "Heute müsste eine Mail verschickt werden"; 
                 } 
                 else { 

                     echo"Heute muss nichts verschickt werden"; 
                 } 
                */ 
                 
    ?>

  • #2
    UPDATE kann auch selbst rechnen. UPDATE feld SET feld = feld+5 WHERE ... (Filter wenn nötig). Und DATE_ADD() kann auch Tage zu Datum addieren.

    Welche Funktion hat das "Erinnerungsdatum"? Du kannst auch tgl. einen Job laufen lassen, der alle Abgabetermine prüft und wenn < 5 Tage dann zB eine Erinnerung verschicken. Dann brauchst du das Erinnerungsdatum gar nicht.
    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


    • #3
      Ah okay . Wusste ich so auch noch nicht !
      Das Erinnerungsdatum sollte mir eigentlich dazu dienen an dem Tag eine Mail zu verschicken. Quasi ab diesem Tag sind noch 5 Tage bis zur Abgabe.
      Wie würde das wie du vorgeschlagen hast denn aussehen ?

      Also was ich eigentlich will ist eine automatische Erinnerung.
      Sprich: Es gibt einen Abgabetermin und ab 5 Tagen davor soll der Kalkulator benachrichtigt werden das er an den Abgabetermin erinnert wird.
      Wie du geschrieben hast, wäre es natürlich ein Traum wenn das Script täglich also z.B. um 01:00 Uhr ausgeführt wird.

      Der Abgabetermin steht in jedem Datensatz ( also jeder Zeile ) und ist halt logischer Weise immer ein anderes.


      Kommentar


      • #4
        Dann reicht der Abgabetermin in der DB und ein Script das per Cronjob tgl. (zB wie du schreibst um 01:00 Uhr) läuft. Das Script prüft immer ob es noch 5 Tage sind bis zum Termin und wenn ja was auch immer machen .. z.B. Mail verschicken. Eigentlich ganz einfach.
        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


        • #5
          Okay.... du schreibst eigentlich ganz einfach. Für mich aber ein großer Berg

          Ich habe jetzt mal die Abfrage so gemacht:

          PHP-Code:
          <?php
          //Datum von Heute wird ermittelt
          $heute date("Y-m-d");

          //Holt den eingetragenen Abgabetermin aus der Datenbank
          $pdo = new PDO('mysql:host=localhost;dbname=nubis''root''');

                                      
          $sql "SELECT bearbeiter,DATE_SUB(abgabetermin, INTERVAL 5 DAY) AS SubstractDate FROM angebote WHERE status = 0";
                                      foreach (
          $pdo->query($sql) as $row) {
                                      
          var_dump($row);    
                                      }
          ?>
          Das Arry gibt dann folgendes aus, wobei das Datum richtig berechnet wird.

          Code:
          array(4) { ["bearbeiter"]=> string(8) "Matthias" [0]=> string(8) "Matthias" ["SubstractDate"]=> string(10) "2017-01-15" [1]=> string(10) "2017-01-15" } array(4) { ["bearbeiter"]=> string(14) "Matthias Brand"

          Das Array enthält nun den Kalkulator und das neu errechnete Erinnerungs"Start"Datum.

          Per if könnte ich jetzt ja prüfen und sachen veranstalten.
          Was mir nicht in die Birne will ist wie ich das jetzt für jeden Datensatz automatisiere !

          Kannst du mich mal auf die richtige Spur bringen ?

          Wenn ich es so mache hätte ich dann eine Erinnerung an dem Erinnerungsdatum richtig ? Ginge das auch täglich bis zur Deadline ?

          Kommentar


          • #6
            Naja.. ist es auch. Du brauchst nur per SELECT abfragen welche Termine "reif" für die Info sind, d.h. wo es noch 5 Tage bis zum Termin sind. Da das Script ja täglich läuft bekommst du dann jeden Tag genau die wo es noch 5 Tage sind.

            Ginge das auch täglich bis zur Deadline ?
            Ja, wenn du statt = 5 ein <= 5 machst. Dann läuft kommen immer alle von 5 Tage weg (4 Tage, 3 Tage, ...) bis zum Termin.
            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


            • #7
              Leider geht das sqlfiddle nicht, aber so in der Art. Was du da rausbekkommst sind dann die Termine, zu denen du Erinnerung schickst.

              Code:
              SELECT termin_name, ... , DATEDIFF(CURDATE(), abgabetermin) AS resttage FROM termine WHERE resttage > 5
              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


              • #8
                ich habe das mal so angepasst um zu sehen was passiert.

                PHP-Code:
                $sql "SELECT bearbeiter,bauvorhaben,DATEDIFF(CURDATE(), abgabetermin) AS resttage FROM angebote WHERE resttage > 5"
                da ich eine Fehlermeldung bekommen habe, habe ich einfach mal in phpmyadmin ausgeführt.

                Hier die Meldung das es die Spalte resttage in der WHERE Abfrage nicht gibt:

                #1054 - Unknown column 'resttage' in 'where clause'

                Kommentar


                • #9
                  Du kannst nicht im Where so auf diese Spalte zugreifen, das Where filtert bevor die Funktion ausgeführt wird. Henne - Ei.
                  PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                  Kommentar


                  • #10
                    Du musst den datediff() Ausdruck mit ins WHERE nehmen. Das mit dem Alias im WHERE klappt nur bei sqlite, die anderen Datenbanken haben das Problem, was akretschmer angesprochen hat.
                    PHP-Code:
                    WHERE DATEDIFF(CURDATE(), abgabetermin) > 

                    Kommentar


                    • #11
                      Code:
                      $sql = "SELECT `bearbeiter`, `bauvorhaben`, DATEDIFF(`abgabetermin`, CURDATE() ) AS `Resttage`
                      FROM `angebote`
                      WHERE ABS(DATEDIFF(`abgabetermin`, CURDATE() ) <= '5' ";

                      EDIT: Habe gerade gemerkt das es ja ein Abgabetermin ist, der in der Zukunft liegt, daher mal eben korrigiert.

                      Kommentar


                      • #12
                        Wenn ich es so in Phpmyadmin ausführe bekomme ich folgenden Fehler:

                        Befehl:
                        PHP-Code:
                        SELECT `bearbeiter`, `bauvorhaben`, DATEDIFF(`abgabetermin`, CURDATE() ) AS `Resttage`FROM `angebote`WHERE ABS(DATEDIFF(`abgabetermin`, CURDATE() ) <= '5' LIMIT 025 
                        Fehler:
                        #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'LIMIT 0, 25' at line 1

                        Kommentar


                        • #13
                          Zähl mal die Klammern... Und du darfst deine Query auch gerne lesbar formatieren.

                          Und eigentlich hat das ABS() keinen Sinn, weil -3 wäre ja auch <= 5. Das kannst du dir meines Erachtens sparen.

                          Code:
                          SELECT
                              `bearbeiter`,
                              `bauvorhaben`,
                              DATEDIFF(`abgabetermin`, CURDATE() ) AS `Resttage`
                          
                          FROM `angebote`
                          
                          WHERE ABS(DATEDIFF(`abgabetermin`, CURDATE())) <= 5
                          
                          LIMIT 25
                          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


                          • #14
                            ja prima, zehn mal gelesen und nicht gesehen ! ABER es gibt ja super nette Hilfe hier.
                            Geklappt hat das ganze auch noch

                            PHP-Code:
                            $sql "SELECT bearbeiter,bauvorhaben FROM angebote WHERE ABS(DATEDIFF(`abgabetermin`, CURDATE() )) <= '5' AND status = 0 "
                                                        foreach (
                            $pdo->query($sql) as $row) { 
                                                        
                            var_dump($row);    
                                                        } 
                            Die Abfrage gibt mir nun einen Fall in dem array row aus. ( 1 Fall trifft im Moment auch nur zu )

                            Jetzt hänge ich mit der Weiterverarbeitung etwas fest.
                            Das Array kann ja auch durchaus mehrere Fälle enthalten.

                            Wie würdet ihr den das array jetzt durchgehen um jedem Bearbeiter eine Erinnerungsmail über sein Bauvorhaben zukommen zu lassen.

                            Die Fälle sind mit der Abfrage ja jetzt erkannt. Nun muss doch je Fall ( Zeile ) das Bauvorhaben in die Mail und der Bearbeiter ist dann logischerweise der Empfänger der Mail.

                            Ich bin noch sehr unsicher darin, wie ich jetzt einzelne Zeilen mit individuellen Daten bearbeiten kann.

                            Kommentar


                            • #15
                              Du hast deine Schleife. Jeder Durchlauf betrifft immer genau eine Zeile (einen Datensatz) des Ergebnisses. D.h. in der Schleife machst du dann den Versand des Mailes. Sei dir halt dann bewußt das jeder Scriptaufruf Mails erzeugt.. nur als Info. Wenn du das nicht willst, brauchst zB noch eine Spalte in der DB mit zB "letzte_erinnerung" und dann darf das Mail bei Scripaufruf nur verschickt werden wenn das letzte zB gesten war. Oder wie auch immer du das willst.

                              Leg dir Testdatensätze an und spiel damit rum und teste alle möglichen Szenarien.
                              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

                              Lädt...
                              X