Ankündigung

Einklappen
Keine Ankündigung bisher.

Ausgabe in Tabelle

Einklappen

Neue Werbung 2019

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

  • Ausgabe in Tabelle

    Mahlzeit zusammen,

    bin gerade an meiner Darstellung zur Abfrage am arbeiten. Leider habe ich aber 3 kleine Probleme.
    Erstmal mein Code

    PHP-Code:
    <?php

    // Server-Konfiguration überschreiben
    error_reporting(E_ALL & ~E_NOTICE);
    set_time_limit(3600);
    ini_set("memory_limit","512M");

    // Datenbankverbindung
    require ("conf/dbc.php");
    ?>
    <html>
    <head>
        <title>VSG Wesel</title>
        <link rel="stylesheet" type="text/css" href="style.css" />
    </head>
    <body>
        <div id="site">
            <div id="nav">    <a href="index.php"><img src="img/home.svg" alt="Startseite" height="25px" width="25px">Startseite</a>
                            <a href="agenda.php"><img src="img/agenda.svg" alt="Übersicht" height="25px" width="25px">Aktuell</a>
                            <a href="archive.php"><img src="img/archive.svg" alt="Archive" height="25px" width="25px">Archive</a>
                            <a href="search.php"><img src="img/search.svg" alt="Suche" height="25px" width="25px">Suche</a>
            </div>
            <div id="content">
                <?php
                    
    // SQL-Query
                    
    $result "select * from general WHERE zeitstempel >= CURDATE()-1";
                        if (
    is_null($result))     
                            {
                            echo 
    "Von gestern gibt es keine Datensätze.";
                            }
                                else
                                    {
                                    foreach (
    $mysqli->query($result) as $row)
                                        {
                                        echo 
    "<table border=1>";
                                            echo 
    "<tr>";
                                                echo 
    "<th>Auftragnummer</th>";
                                                echo 
    "<th>Zeitstempel</th>";
                                            echo 
    "</tr>";

                                            echo 
    "<tr>";
                                                echo 
    "<td>".$row['auftragsnummer']."</td>";
                                                echo 
    "<td>".$row['zeitstempel']."</td>";
                                            echo 
    "</tr>";
                                        echo 
    "</table>";
                                        }
                                    }
                
    ?>
            </div>
            <div id="foother">Fusszeile</div>
        </div>
    </body>
    </html>
    1. Problem
    PHP-Code:
                    $result "select * from general WHERE zeitstempel >= CURDATE()-1"
    Wenn ich dort == CURDATE()-1 eingebe, erhalte ich leider eine Fehlermeldung: Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\vsg_wesel\agenda.php on line 46
    Leider verstehe ich nicht warum.

    2. Problem
    PHP-Code:
    if (is_null($result))
                            {
                            echo 
    "Von gestern gibt es keine Datensätze.";
                            }
                                else 
    Leider kann ich das CURDATE()+1 setzen und habe keine Datensätze dafür in der Datenbank, aber er gibt mir nicht den ECHO aus "Von gestern gibt es keine Datensätze". Denke das hat noch mit dem select zu tun.

    3. Problem, Hauptproblem:

    Meine Tabelle funktioniert nicht, wie ich es will^^
    Er gibt die Überschrift aus, in der 2 Zeile den Inhalt der 1 Zeile und fängt wieder von vorne an. Also ich bekomme wieder die Überschrift je Datensatz raus.


    Wäre für Denkanstöße sehr Dankbar

  • #2
    1.) == ist falsch im SQL, ein einzelnes = wäre richtig.
    2.) Kurz vor der "is_null" Abfrage weist du $result einen String mit SQL zu. Das ist natürlich niemals null... Ein Ergebnis kannst du immer erst NACH dem Senden der Abfrage überprüfen.
    Also:

    PHP-Code:
    $sql "select * from general WHERE zeitstempel >= CURDATE()-1";
    $stmt $mysqli->query($result);
    if (!
    $stmt) {
      
    // Fehler bei der Abfrage!
    }
    else {
      if (
    $stmt->num_rows == 0) {
        
    // Abfrage erfolgreich, aber kein Datensatz gefunden
      
    }
      else {
        
    // Abfrage erfolgreich, 1 oder mehr Datensätze gefunden
      
    }

    3. Für jeden Datensatz machst du eine neue Tabelle auf. Das muss raus aus der Schleife.

    Kommentar


    • #3
      Dank Dir Istegelitz,

      Stoße gerade wohl selber bei mir auf den Fehler in Punkt 1. PHPMyAdmin habe ich Datetime formatiert. Nach meinem täglichen Import sieht das Feld aber folgendermaßen aus:

      Code:
      2017-10-18 13:45:34
      Dadurch, das CURDATE() Augenscheinlich aber das Feld als durchgehende Zahl haben möchte, bekomme ich nicht das gewünsche Ergebnis mit =CURDATE()-1 hin. Wenn ich dagegen >=CURDATE()-1 nutze, funktioniert dies.
      Ist da mein Ansatz richtig? Gibt es eine andere Funktion anstatt CURDATE() oder muss ich beim Import schon meine Unterstriche entfernen und spielt die Zeit eine Rolle?

      Danke für die anderen 2 Ansätze!

      Habe gerade für mein Problem die Funktion NOW() gefunden und werde es damit versuchen. NOW() beinhaltet ja CURDATE() + TIME

      Kommentar


      • #4
        Du kannst nicht einfach CURDATE()-1 schreiben. Was soll das sein? Der Tag davor? Den bekommst du für MySQL so
        Code:
         DATE_ADD(CURDATE(), INTERVAL -1 DAY)

        Kommentar


        • #5
          Naja, laut Mysql Doku sollte das CURDATE() entweder einen String oder eine Zahl zurückliefern, jenachdem in welchem Kontext die Funktion benutzt wird. Bei einem "-1" würde ich den Zahlenkontext erwarten.
          https://dev.mysql.com/doc/refman/5.5...nction_curdate

          Und das funktioniert auch, wobei die Stringrepresentation ein anderes Format aufweist.
          Code:
          MySQL [opst_gb0990]> select curdate();
          +------------+
          | curdate()  |
          +------------+
          | 2017-10-19 |
          +------------+
          1 row in set (0.00 sec)
          
          MySQL [opst_gb0990]> select curdate()-1;
          +-------------+
          | curdate()-1 |
          +-------------+
          |    20171018 |
          +-------------+
          1 row in set (0.00 sec)
          Welchen Datentypen hat denn das Vergleichsfeld (zeitstempel)?

          Kommentar


          • #6
            Code:
            mysql> SELECT CURDATE() - 19;
            +----------------+
            | CURDATE() - 19 |
            +----------------+
            |       20171000 |
            +----------------+
            1 row in set (0.00 sec)
            
            mysql> SELECT DATE_SUB(CURDATE(), INTERVAL 19 DAY);
            +--------------------------------------+
            | DATE_SUB(CURDATE(), INTERVAL 19 DAY) |
            +--------------------------------------+
            | 2017-09-30                           |
            +--------------------------------------+
            1 row in set (0.00 sec)

            Kommentar


            • #7
              Ich denke es ist mehr oder minder Konvention, die Variablen so zu benennen:

              PHP-Code:
              //Die in SQL geschriebene Abfrage
              $sql "SELECT * FROM general WHERE zeitstempel >= DATE_ADD(CURDATE(), INTERVAL -1 DAY)";

                  
              //Das Ergebnis (result) der Abfrage
                  
              if ($result $mysqli->query($sql)) {
                      if (
              $result->num_rows === 0) {
                          echo 
              "Von gestern gibt es keine Datensätze.";
                      } else {
                          
              //Die einzelnen Zeilen (rows) des Ergebnis (result) werden durchlaufen
                          
              while ($row $result->fetch_assoc()) {
                              
              //Hier Deine Tabellen
                          
              }
                      }
                  } 
              Willst Du tatsächlich pro Datensatz eine neue Tabelle anzeigen? Falls nicht solltest Du die Tabelle vlt. vor Schleifenbeginn mit Überschriften "öffnen" und nach der Schleife schließen.
              Innerhalb der Schleife dann nur noch die table rows (<tr></tr>).

              Kommentar


              • #8
                Zitat von jspit Beitrag anzeigen
                Du kannst nicht einfach CURDATE()-1 schreiben. Was soll das sein? Der Tag davor? Den bekommst du für MySQL so
                Code:
                DATE_ADD(CURDATE(), INTERVAL -1 DAY)
                Oder so
                Code:
                mysql> SELECT CURDATE() - INTERVAL 1 DAY;
                +----------------------------+
                | CURDATE() - INTERVAL 1 DAY |
                +----------------------------+
                | 2017-10-18                 |
                +----------------------------+
                1 row in set (0.00 sec)
                und rechnet auch richtig...
                Code:
                mysql> SELECT CURDATE() - INTERVAL 19 DAY;
                +-----------------------------+
                | CURDATE() - INTERVAL 19 DAY |
                +-----------------------------+
                | 2017-09-30                  |
                +-----------------------------+
                1 row in set (0.00 sec)
                steht auch so im Handbuch.

                Kommentar


                • #9
                  Zitat von lstegelitz Beitrag anzeigen
                  1.) == ist falsch im SQL, ein einzelnes = wäre richtig.
                  2.) Kurz vor der "is_null" Abfrage weist du $result einen String mit SQL zu. Das ist natürlich niemals null... Ein Ergebnis kannst du immer erst NACH dem Senden der Abfrage überprüfen.
                  Also:


                  PHP-Code:
                  $sql "select * from general WHERE zeitstempel >= CURDATE()-1";
                  $stmt $mysqli->query($result);
                  if (!
                  $stmt) {
                  // Fehler bei der Abfrage!
                  }
                  else {
                  if (
                  $stmt->num_rows == 0) {
                  // Abfrage erfolgreich, aber kein Datensatz gefunden
                  }
                  else {
                  // Abfrage erfolgreich, 1 oder mehr Datensätze gefunden
                  }

                  3. Für jeden Datensatz machst du eine neue Tabelle auf. Das muss raus aus der Schleife.

                  Gut, wieder was gelernt.
                  Ich möchte halt nur über einen Link nur das Ergebnis von Gestern anzeigen lassen. Wenn ich zum Beispiel Heute (23.10.2017)
                  PHP-Code:
                  "select * from general WHERE zeitstempel >= CURDATE()-1"
                  nutzen, erhalte ich keine Daten, da gestern nix importiert worden ist. Wenn ich nun - 4 eingebe, erhalte ich alles was ab dem 19.10. importiert worden ist, also auch den 20.10. Wenn ich dagegen nur
                  PHP-Code:
                  "select * from general WHERE zeitstempel = CURDATE()-1"
                  ein = benutze, erhalte ich gar kein Ergebnis.

                  Zitat von jspit Beitrag anzeigen
                  Du kannst nicht einfach CURDATE()-1 schreiben. Was soll das sein? Der Tag davor? Den bekommst du für MySQL so
                  Code:
                  DATE_ADD(CURDATE(), INTERVAL -1 DAY)


                  Richtig, sollte für mich der Tag davor sein
                  Müsste dann meine select so aussehen?
                  PHP-Code:
                  $result "select * from general WHERE zeitstempel = DATE_ADD(CURDATE(), INTERVAL -4 DAY)"
                  -4 habe ich genommen, damit ich überhaupt heute Werte erhalte.
                  Hier ist leider das selbe. Wenn ich nur das = benutze, erhalte ich keine Daten. Benutze ich >= , erhalte ich alle Datensätze natürlich vom 19. und 20.10.

                  Zitat von lstegelitz Beitrag anzeigen
                  Naja, laut Mysql Doku sollte das CURDATE() entweder einen String oder eine Zahl zurückliefern, jenachdem in welchem Kontext die Funktion benutzt wird. Bei einem "-1" würde ich den Zahlenkontext erwarten.
                  https://dev.mysql.com/doc/refman/5.5...nction_curdate

                  Und das funktioniert auch, wobei die Stringrepresentation ein anderes Format aufweist.
                  Code:
                  MySQL [opst_gb0990]> select curdate();
                  +------------+
                  | curdate() |
                  +------------+
                  | 2017-10-19 |
                  +------------+
                  1 row in set (0.00 sec)
                  
                  MySQL [opst_gb0990]> select curdate()-1;
                  +-------------+
                  | curdate()-1 |
                  +-------------+
                  | 20171018 |
                  +-------------+
                  1 row in set (0.00 sec)
                  Welchen Datentypen hat denn das Vergleichsfeld (zeitstempel)?


                  Das Feld Zeitstempel ist vom Typ datetime.

                  Inhalt zum Beispiel:
                  2017-08-03 10:06:51
                  2017-08-07 12:02:41

                  Wenn ich
                  PHP-Code:
                  select curdate(); 
                  im phpMyAdmin benutze, erhalte ich
                  curdate()
                  2017-10-23

                  Dagegen, wenn ich
                  PHP-Code:
                  select curdate()-1
                  probiere, erhalte ich
                  curdate()-1
                  20171022

                  Dort Fehlen die "-".

                  Zitat von hellbringer Beitrag anzeigen
                  Code:
                  mysql> SELECT CURDATE() - 19;
                  +----------------+
                  | CURDATE() - 19 |
                  +----------------+
                  | 20171000 |
                  +----------------+
                  1 row in set (0.00 sec)
                  
                  mysql> SELECT DATE_SUB(CURDATE(), INTERVAL 19 DAY);
                  +--------------------------------------+
                  | DATE_SUB(CURDATE(), INTERVAL 19 DAY) |
                  +--------------------------------------+
                  | 2017-09-30 |
                  +--------------------------------------+
                  1 row in set (0.00 sec)

                  Wenn ich
                  PHP-Code:
                  SELECT CURDATE() - 19
                  nutze, erhalte ich
                  CURDATE() - 19
                  20171004

                  Und wie vermutet mit
                  PHP-Code:
                  SELECT DATE_SUB(CURDATE(), INTERVAL 19 DAY); 
                  DATE_SUB(CURDATE(), INTERVAL 19 DAY)
                  2017-10-04

                  Zitat von drsoong Beitrag anzeigen
                  Ich denke es ist mehr oder minder Konvention, die Variablen so zu benennen:

                  PHP-Code:
                  //Die in SQL geschriebene Abfrage
                  $sql "SELECT * FROM general WHERE zeitstempel >= DATE_ADD(CURDATE(), INTERVAL -1 DAY)";

                  //Das Ergebnis (result) der Abfrage
                  if ($result $mysqli->query($sql)) {
                  if (
                  $result->num_rows === 0) {
                  echo 
                  "Von gestern gibt es keine Datensätze.";
                  } else {
                  //Die einzelnen Zeilen (rows) des Ergebnis (result) werden durchlaufen
                  while ($row $result->fetch_assoc()) {
                  //Hier Deine Tabellen
                  }
                  }

                  Willst Du tatsächlich pro Datensatz eine neue Tabelle anzeigen? Falls nicht solltest Du die Tabelle vlt. vor Schleifenbeginn mit Überschriften "öffnen" und nach der Schleife schließen.
                  Innerhalb der Schleife dann nur noch die table rows (<tr></tr>).


                  Nein, ich möchte nicht Pro Datensatz eine Tabelle anzeigen, deshalb ja oben die Frage Danke für den Tipp mit der Schleife und den Tabellen Funktionstipp <tr></tr>. Muss ich mir genau Mal anschauen.

                  Zitat von protestix Beitrag anzeigen
                  Oder so
                  Code:
                  mysql> SELECT CURDATE() - INTERVAL 1 DAY;
                  +----------------------------+
                  | CURDATE() - INTERVAL 1 DAY |
                  +----------------------------+
                  | 2017-10-18 |
                  +----------------------------+
                  1 row in set (0.00 sec)
                  und rechnet auch richtig...
                  Code:
                  mysql> SELECT CURDATE() - INTERVAL 19 DAY;
                  +-----------------------------+
                  | CURDATE() - INTERVAL 19 DAY |
                  +-----------------------------+
                  | 2017-09-30 |
                  +-----------------------------+
                  1 row in set (0.00 sec)
                  steht auch so im Handbuch.

                  Ich habe es ja getestet und gesehen, das es so, wie es im Handbuch natürlich steht, auch richtig ist.







                  Kommentar

                  Lädt...
                  X