Meowsalot: Hinweis ausgeben

Hallo,

ich stehe gerade irgendwie auf dem Schlauch und komme nicht weiter. Es soll ein Hinweis ausgegeben werden wenn folgendes eintrift:

Zuerst lese ich Einträge aus meiner MySQL Tabelle aus

$anzahlTage = 2;
$id         = "701346d7ce495295e43eacc007063c8c";

$sql = "SELECT mid, rechnugnsadresse, das, pb, kost, ktjr 
        FROM abrechnungsdetails 
        WHERE ma_mid =?";

if ($stmt = $mysqli->prepare($sql)) {
		
		$stmt->bind_param('s', $id);
		$stmt->execute();
		$stmt->store_result();
		$anzahl = $stmt->num_rows;
       
        $stmt->bind_result($mid, $rechnugnsadresse, $das, $pb, $kost, $ktjr);

}

Jetzt prüfe ich ob die Anzahl ungleich der Tage ist

<?php if ($anzahl != $anzahlTage): ?>
  <div>Achtung: Es sind noch nicht alle Daten ausgefüllt!</div>
<?php endif ?>

Dieser Teil klappt. Für das Anzeige der Datensätze nutze ich dann

<?php while ($stmt->fetch()) { ?>
	<?php echo htmlspecialchars($mid) ?>
<?php  } ?>

Soweit klappt alles. Jetzt komme ich nicht mehr weiter. Die Meldung oben, soll auch dann erscheinen, wenn die oben genannten Felder nicht alle ausgefüllt sind (in diesem Fall findet er zwei Datensätze und alle Felder aus beiden Datensätzen müssen einen Wert enthalten).

Wie könnte ich dieses umsetzten?

Bis bald!
Meowsalot (Bernd)

akzeptierte Antworten

  1. Wie sieht denn Dein Datenmodell aus? Wenn es auf eine ID mehrere Rechnungen geben kann, kann das ja nicht die Rechnungs-ID sein sondern irgendeine andere ID , also welche?

    Und was bedeuten Anzahl der Tage? Eine Rechnung je Tag oder was?

    Wennmer das klären könnten, wüssten wir evntl auch, was der Browser dazu ausgeben soll.

    MfG

    1. Hallo,

      stopp, ich habe nie von Rechnungen geschrieben! Die ID ist eine Nummer, welche von einem externen System kommt. Hat mit der internen mySQL Datenbank ID nichts zu tun. Ich könnte den Wert in Zeile zwei auch als $pl bezeichnen, spielt keine Rolle.

      Anzahl der Tage bedeutet so viele Einträge müssen mindestens zurück kommen. Dieser Wert steht in $anzahl

      Bis bald!
      Meowsalot (Bernd)

  2. Tach!

    Die Meldung oben, soll auch dann erscheinen, wenn die oben genannten Felder nicht alle ausgefüllt sind (in diesem Fall findet er zwei Datensätze und alle Felder aus beiden Datensätzen müssen einen Wert enthalten).

    Wäre das nicht eine Prüfung, die vor dem Eintragen der Daten stattzufinden hat, so dass diese fehlerhaften Datensätze gar nicht erst ins System kommen?

    Aber wobei hast du nun ein Problem? Beim Durchlaufen von Datensätzen, beim Prüfen auf Bedingungen, beim Zählen der Prüfungsergebnisse, bei der Reihenfolge der Dinge, die zu erledigen sind?

    dedlfix.

    1. Hallo dedlfix,

      Wäre das nicht eine Prüfung, die vor dem Eintragen der Daten stattzufinden hat, so dass diese fehlerhaften Datensätze gar nicht erst ins System kommen?

      leider nein, die Daten müssen zu Beginn noch nicht vorliegen. Diese müssen erst 2 Tage vor Projektbeginn hinterlegt sein. Wenn dieses nicht der Fall ist, soll eine Ausgabe erscheinen.

      Aber wobei hast du nun ein Problem? Beim Durchlaufen von Datensätzen, beim Prüfen auf Bedingungen, beim Zählen der Prüfungsergebnisse, bei der Reihenfolge der Dinge, die zu erledigen sind?

      Das Problem ist, wie prüfe ich alle Einträge? Ich kann ja prüfen ob ein Wert leer ist

      if ($rechnugnsadresse != "") {
      		# code...
      	}
      

      Dieses kann ich mit jedem Feld machen, aber bringt mir dieses etwas? Was muss ich bei #code ... hinterlegen? Einen Wert mit einer z.B. 1. Oder lege ich irgendwo ein Array an fülle dieses und schau ob darin irgendwo eine andere Zahl steht als eine 1. Wenn z.B. etwas leer ist dann hinterlege ich dort eine 2.

      Ich weiß es eben nicht.

      Bis bald!
      Meowsalot (Bernd)

      1. Tach!

        Das Problem ist, wie prüfe ich alle Einträge? Ich kann ja prüfen ob ein Wert leer ist

        Du erstellst dir eine Variable für das Endergebnis, die zum Beispiel mit true initialisiert ist. Nun läufst du durch deine Datenmenge. Wenn eine Prüfung ein Problem ergibt, setzt du diese Variable auf false. Aber du setzt sie nicht auf true, wenn mit dem geprüften Datensatz alles richtig ist. Am Ende ist sie auf true geblieben oder wurde auf false gesetzt. Damit weißt du, ob es Problemfälle gibt.

        dedlfix.

        1. Hallo dedlfix,

          danke für deine Erklärung. Ich habe es jetzt so umgesetzt:

          $anzahlTage = 2;
          $fehler 	  = true;
          $id 		    = "701346d7ce495295e43eacc007063c8c";
          
          $sql = "SELECT mid, rechnugnsadresse, das, pb, kost, ktjr 
                  FROM abrechnungsdetails 
                  WHERE ma_mid =?";
          
          if ($stmt = $mysqli->prepare($sql)) {
          		
          		$stmt->bind_param('s', $id);
          		$stmt->execute();
          		$stmt->store_result();
          		$anzahl = $stmt->num_rows;
                 
              $stmt->bind_result($mid, $rechnugnsadresse, $das, $pb, $kost, $ktjr);
          
          }
          
          while ($stmt->fetch()) { 
          	
          	if ($rechnugnsadresse == "") {
          		$fehler = false;
          	}
          
          	if ($das == "") {
          		$fehler = false;
          	}
          
          	if ($pb == "") {
          		$fehler = false;
          	}
          
          	if ($kost == "") {
          		$fehler = false;
          	}
          
          	if ($ktjr == "") {
          		$fehler = false;
          	}
          
          } 
          
          if ($fehler == false OR $anzahl != $anzahlTage) {
          
          	echo "Es sind noch nicht alle Felder ausgefüllt!";
          }
          

          Gibt es Verbesserungsvorschläge?

          Bis bald!
          Meowsalot (Bernd)

          1. Hallo,

            wenn ich dieses ausgeben lasse

            $von = new DateTime("-10 days");
            echo $von->format("Y-m-d");  
            

            erhalte ich folgendes

            2018-07-21

            in $von steht 2018-07-25

            Was mache ich falsch?

            Bis bald!
            Meowsalot (Bernd)

            1. Tach!

              wenn ich dieses ausgeben lasse

              $von = new DateTime("-10 days");
              echo $von->format("Y-m-d");  
              

              erhalte ich folgendes

              2018-07-21

              Was ja richtig wäre.

              in $von steht 2018-07-25

              Bei mir nicht (mit var_dump() geprüft).

              Was mache ich falsch?

              Was wäre denn deiner Meinung nach das richtige?

              dedlfix.

              1. Hallo dedlfix,

                Was wäre denn deiner Meinung nach das richtige?

                meiner Meinung nach wäre der 2018-07-15 richtig? Denn 2018-07-25 - sollte doch hinten 15 ergeben?

                Bis bald!
                Meowsalot (Bernd)

                1. Tach!

                  Was wäre denn deiner Meinung nach das richtige?

                  meiner Meinung nach wäre der 2018-07-15 richtig? Denn 2018-07-25 - sollte doch hinten 15 ergeben?

                  Wenn du meinst, dass vor deiner Aktion etwas in $von stand, dann ist das weg, weil du etwas neues zugewiesen hast, das sich am heutigen Datum orientiert. "-10 days" bezieht sich jedenfalls nicht auf das $von, das ist in der Formel ja nicht enthalten.

                  dedlfix.

                  1. Hallo dedlfix,

                    ok verstanden. Ich habe es jetzt so gelöst, scheint zu funktionieren

                    $NeuesDatum = date_create($von);
                    
                    date_add($NeuesDatum, date_interval_create_from_date_string('-10 days'));
                    echo date_format($NeuesDatum, 'Y-m-d');
                    

                    Bis bald!
                    Meowsalot (Bernd)

                    1. Hallo,

                      mir ist gerade noch eingefallen ich könnte die ganze Prüfung doch bereits in der Datenbank erledigen?

                      SELECT `titel` FROM abrechnungsdetails WHERE `von` = DATE_SUB(NOW(), INTERVAL 10 DAY)
                      

                      Wenn ich dieses ausführe halte ich keine Einträge obwohl keiner vorhanden sein muss. Eine Fehlermeldung erhalte ich allerdings auch nicht.

                      Führe ich folgendes aus, erhalte ich Einträge, die mich aber gerade nicht interesieren

                      SELECT `titel` FROM abrechnungsdetails WHERE `von` > DATE_SUB(NOW(), INTERVAL 10 DAY)
                      

                      Was ist bessere, die Berechnung direkt in bei der Abfrage durchführen lassen, sollte dieses überhaupt möglich sein oder später mit PHP prüfen?

                      Bis bald!
                      Meowsalot (Bernd)

                      1. Hallo

                        SELECT `titel` FROM abrechnungsdetails WHERE `von` = DATE_SUB(NOW(), INTERVAL 10 DAY)
                        

                        Wenn ich dieses ausführe halte ich keine Einträge obwohl keiner vorhanden sein muss.

                        Soso.

                        Eine Fehlermeldung erhalte ich allerdings auch nicht.

                        Warum auch? Du erhältst einfach nur eine leere Ergebnismenge, da du Datensätze mit dem exakten Zeitstempel von jetzt - 10 Tage inklusive der Uhrzeit (!) suchst. Gibt es keinen Datensatz mit diesem Datum (inklusive der Uhrzeit), wird auch keiner gefunden.

                        Führe ich folgendes aus, erhalte ich Einträge, die mich aber gerade nicht interesieren

                        SELECT `titel` FROM abrechnungsdetails WHERE `von` > DATE_SUB(NOW(), INTERVAL 10 DAY)
                        

                        Was ist bessere, die Berechnung direkt in bei der Abfrage durchführen lassen, sollte dieses überhaupt möglich sein

                        Je nachdem, wonach du fragen willst, ist das möglich. Vermutlich musst du nur die Formulierung der Bedingung verfeinern.

                        [Nachtrag]: Wenn du eine Spalte mit dem Typ date abfragst, musst du den Vergleichswert auch als Datum und nicht als Zeitstempel (datetime) formulieren.

                        SELECT `titel` FROM abrechnungsdetails WHERE `von` = DATE(DATE_SUB(NOW(), INTERVAL 10 DAY))
                        

                        Mit der Extraktion des Datumswerts aus dem DATE_SUB-Aufruf hast du auch auf der rechten Seite einen Wert vom Typ date.

                        Tschö, Auge

                        --
                        Eine Kerze stand [auf dem Abort] bereit, und der Almanach des vergangenen Jahres hing an einer Schnur. Die Herausgeber kannten ihre Leser und druckten den Almanach auf weiches, dünnes Papier.
                        Kleine freie Männer von Terry Pratchett
                        1. Hallo Auge,

                          danke für deine Erklärung

                          SELECT titel FROM abrechnungsdetails WHERE von = DATE(DATE_SUB(NOW(), INTERVAL 10 DAY))

                          jetzt verstehe ich gar nichts mehr. Ich bekomme zwar ein Ergebnis aber für mich ein falsches. Als Ausgabe erhalte ich dieses 2018-07-21

                          Ahh, ich darf nicht DATE_SUB nehmen sondern DATE_ADD, dann wird mein Wert vom 2018-08-10.

                          Bis bald!
                          Meowsalot (Bernd)

                          1. Tach!

                            Ahh, ich darf nicht DATE_SUB nehmen sondern DATE_ADD, dann wird mein Wert vom 2018-08-10.

                            Du kannst das generell abkürzen und auch etwas lesbarer schreiben, denn auch folgende Syntax ist erlaubt:

                            datumswert + INTERVAL 10 DAY
                            

                            oder

                            datumswert - INTERVAL 10 DAY
                            

                            dedlfix.

                          2. Hallo

                            SELECT `titel` FROM abrechnungsdetails WHERE `von` = DATE(DATE_SUB(NOW(), INTERVAL 10 DAY))
                            

                            jetzt verstehe ich gar nichts mehr. Ich bekomme zwar ein Ergebnis aber für mich ein falsches. Als Ausgabe erhalte ich dieses 2018-07-21

                            Die ganze Zeit sprichst du von heute minus 10 Tagen und nun ist es falsch?

                            Ahh, ich darf nicht DATE_SUB nehmen sondern DATE_ADD, dann wird mein Wert vom 2018-08-10.

                            Du kannst mit DATE_ADD auch in die Vergangenheit rechnen. Mit DATE(DATE_ADD(NOW(), INTERVAL -10 DAY)) gelangst du ebenso 10 Tage zurück wie mit DATE(DATE_SUB(NOW(), INTERVAL 10 DAY)) (beachte das Minus vor dem Zahlenwert). Ich frage mich nur, was du beim Funktionsnamen DATE_SUB anderes erwartet (und in der Doku ermittelt) hast, als Datumswerte in der Vergangenheit und nicht in der Zukunft zu ermitteln.

                            Tschö, Auge

                            --
                            Eine Kerze stand [auf dem Abort] bereit, und der Almanach des vergangenen Jahres hing an einer Schnur. Die Herausgeber kannten ihre Leser und druckten den Almanach auf weiches, dünnes Papier.
                            Kleine freie Männer von Terry Pratchett
                            1. Tach!

                              Die ganze Zeit sprichst du von heute minus 10 Tagen und nun ist es falsch?

                              Wenn du https://forum.selfhtml.org/self/2018/jul/19/hinweis-ausgeben/1727711#m1727711 meinst, das ist nur eine unglückliche Ausdrucksweise gewesen. Der gezeigte Code geht von "heute" aus, aber eigentlich sollte der Wert, der vorher in $von stand als Ausgangspunkt dienen.

                              dedlfix.

                      2. Tach!

                        mir ist gerade noch eingefallen ich könnte die ganze Prüfung doch bereits in der Datenbank erledigen?

                        SELECT `titel` FROM abrechnungsdetails WHERE `von` = DATE_SUB(NOW(), INTERVAL 10 DAY)
                        

                        Wenn ich dieses ausführe halte ich keine Einträge obwohl keiner vorhanden sein muss. Eine Fehlermeldung erhalte ich allerdings auch nicht.

                        NOW() liefert ein DateTime mit Time-Anteil. Vielleicht passt das nicht zum Wert in von. Bei solchen Problemen kann man den Teil DATE_SUB(NOW(), INTERVAL 10 DAY) auch mal getrennt ausführen, zum Beispiel in phpMyAdmin. Dann sieht man das Ergebnis dieser Operation. Dazu noch den Wert von von ausgeben und zu Fuß vergleichen.

                        Führe ich folgendes aus, erhalte ich Einträge, die mich aber gerade nicht interesieren

                        SELECT `titel` FROM abrechnungsdetails WHERE `von` > DATE_SUB(NOW(), INTERVAL 10 DAY)
                        

                        Dabei spielt der Time-Wert keine so große Rolle wie beim Vergleich, da können dann auch mehr Ergebnisse entstehen.

                        Was ist bessere, die Berechnung direkt in bei der Abfrage durchführen lassen, sollte dieses überhaupt möglich sein oder später mit PHP prüfen?

                        Ist es besser alle Angestellten herzubeordern um sie zu zählen oder bei der Personalabteilung den einen gewünschten Wert nachzufragen?

                        dedlfix.

                        1. Hallo,

                          Ist es besser alle Angestellten herzubeordern um sie zu zählen oder bei der Personalabteilung den einen gewünschten Wert nachzufragen?

                          Wenn der Mensch in der Personalabteilung besonders pedantisch oder sonstwie schwierig ist, so dass man sehr genau drauf achten muss, wie man nachfragt, kann das Herbeordern tatsächlich schneller sein 😉

                          scnr

                          Gruß
                          Kalk

                          1. Hallo Tabellenkalk,

                            Wenn der Mensch in der Personalabteilung besonders pedantisch oder sonstwie schwierig ist, so dass man sehr genau drauf achten muss, wie man nachfragt, kann das Herbeordern tatsächlich schneller sein 😉

                            oder wenn man einfach mal wieder alle Kollegen sehen möchte, lässt man sie einfach alle antanzen 😉

                            Bis bald!
                            Meowsalot (Bernd)

                            1. Tach!

                              oder wenn man einfach mal wieder alle Kollegen sehen möchte, lässt man sie einfach alle antanzen 😉

                              Dann ist die Aufgabenstellung eine andere und nicht das Zählen sondern das Wiedersehen das primäre Ziel.

                              dedlfix.

            2. Moin,

              wenn ich dieses ausgeben lasse

              $von = new DateTime("-10 days");
              echo $von->format("Y-m-d");  
              

              erhalte ich folgendes

              2018-07-21

              Heute ist der 31.7., -10 Tage davon sind der 21.7.

              in $von steht 2018-07-25

              Wie kommt das dort hin?

              Viele Grüße
              Robert

              1. Hallo Robert,

                Heute ist der 31.7., -10 Tage davon sind der 21.7.

                mir war nicht klar, dass ich damit ab heute rechne. Deshalb war ich verunsichert. Hab es jetzt so gelöst:

                https://forum.selfhtml.org/self/2018/jul/19/hinweis-ausgeben/1727719#m1727719

                in $von steht 2018-07-25 Wie kommt das dort hin?

                $von kommt aus der Datenbank.

                Bis bald!
                Meowsalot (Bernd)

          2. Moin Meowsalot,

            Gibt es Verbesserungsvorschläge?

            Ja: rechnungsadresse richtig schreiben 😉

            Viele Grüße
            Robert

            1. Hallo Robert,

              Ja: rechnungsadresse richtig schreiben 😉

              danke für den Hinweis ;) Die Hitze steigt mir einfach zu Kopf :/

              Bis bald!
              Meowsalot (Bernd)