Sabine: while Schleife in if Abfrage

Hallo

kann mir jemand helfen?

Ich bekomme immer eine Fehlermeldung bzgl while in folgender if-Schleife:

for ($i=0; $i < 7; $i++)
{
if (
($heumonat==1 or $heumonat==3 or $heumonat==5 or $heumonat==7 or $heumonat==8 or $heumonat==10) and $day>32 ):{
$day=$heutag+$i-31;
$month=$heumonat+1;
$njahr=$heujahr; };

elseif (
($heumonat==2 or $heumonat==4 or $heumonat==6 or $heumonat==9 or $heumonat==11) and $day>31 ):{
$day=$heutag+$i-30;
$month=$heumonat+1;
$njahr=$heujahr; };

elseif (
$heumonat==12  and $day>31 ):{
$day=$heutag+$i-31;
$month=1;
$njahr=$heujahr+1;};

else :{
$day=$heutag+$i;
$month=$heumonat;
$njahr=$heujahr; };
endif;
echo "
    <h4>$day.$month.$njahr</h4>";

$satz = mysql_query("SELECT * FROM $dbtabelle WHERE tag=$day AND monat=$hmonht AND jahr=$njahr ORDER BY stunde,minute");
    while($row = mysql_fetch_array($satz))  {
     extract($row);
            echo "
      <table>
      <tr valign='top'><td width=100>$stunde.$minute Uhr</td><td>
      $ort <br>
      $beschreibung
      </td></tr></table>  ";
    };

};

Gibt es einen anderen Befehl, mit dem ich die Daten aus der mysql-Datenbank ziehen kann?

Wo liegt der Fehler?

Für eine Hilfe wäre ich dankbar,

Sabine

  1. Moin!

    Hallo

    kann mir jemand helfen?

    Ich bekomme immer eine Fehlermeldung bzgl while in folgender if-Schleife:

    wie lautet die fehermeldung?
    tschüssi
    ichen

  2. Hallo Sabine,

    Du wirfst hier offenbar verschiedene Syntaxtypen durcheinander. Es gibt unter PHP verschiedene Möglichkeiten für Conditional Structures, naemlich:

    1. if(bedingung)
       {
         machwas();
       }

    2. if(bedingung):
         machwas();
       endif;

    Du kombinierst beide und das geht natuerlich nicht gut

    ($heumonat==1 or $heumonat==3 or $heumonat==5 or $heumonat==7 or $heumonat==8 or $heumonat==10) and $day>32 ):{

    if(bedingung): //<-- Doppelpunkt
       {
         machwas();
       }

    Bei Deinen zahlreichen elseif wuerde ich eher einen switch vorziehen
    switch($heumonat)
    {
      case 1:
      case 2:
      case 5:
      case 7:
        if($day > 32)
        {
          $day   = $heutag + $i - 31;
          $month = $heumonat + 1;
          $njahr = $heujahr;
        }
        break;

    Ist doch elegant, oder? http://de3.php.net/manual/de/control-structures.switch.php
    Das solltest du erstmal in Ordnung bringen, dann kann man weitersehen. Ein paar Leerzeichen hier und da waeren auch nicht zu verachten, ich finde Deinen Code schwer zu lesen.

    Gruß,

    Dieter

    1. Hallo

      ich habe das Programm jetzt folgendermaßen geändert

      $heutag=date("j");
      $heumonat=date("n");
      $heujahr=date("Y");

      for ($i=0; $i < 7; $i++)
      {
         switch($heumonat){

      case 1: case 3: case 5: case 7 : case 8 : case 10:
           if($day > 32)
          {
            $day   = $heutag + $i - 31;
            $month = $heumonat+1;
            $njahr = $heujahr;
          }
          break;

      case 2 :case 4 : case 6 : case 9 : case 11 :
             if($day > 31)
          {
            $day   = $heutag + $i - 30;
            $month = $heumonat + 1;
            $njahr = $heujahr;
          }
          break;

      case 12 :
           if($day > 32)
          {
            $day   = $heutag + $i - 31;
            $month = 1;
            $njahr = $heujahr+1;
          }
          break;

      default:
            $day=$heutag+$i;
            $month=$heumonat;
            $njahr=$heujahr;
          };

      echo "
          <h4>$day.$month.$njahr</h4>";

      $satz = mysql_query("SELECT * FROM $dbtabelle WHERE tag=$day AND monat=$hmonht AND jahr=$njahr ORDER BY stunde,minute");
                while($row = mysql_fetch_array($satz))
      {
                extract($row);
                  echo "
            <table>
            <tr valign='top'><td width=100>$stunde.$minute Uhr</td><td>
            $ort <br>
            $beschreibung
            </td></tr></table>  ";

      };

      };

      und als Fehlermeldung erhalte ich in xampp:

      Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in

      Wieder die Frage: Wo liegt der Fehler? Ich brauche doch einen Befehl, um die Sätze der Datenbank zu extrahieren!!
      Grüße,

      Sabine

      1. Hi,

        $satz = mysql_query("SELECT * FROM $dbtabelle WHERE tag=$day AND
        monat=$hmonht AND jahr=$njahr ORDER BY stunde,minute");

        ^^^

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        Schreinerei Waechter
        Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
        1. Hallo

          ich habe den Rechtschreibfehler korrigiert, die Fehlermeldung bleibt die gleiche!!!!!!!!

          Grüße,

          Sabine

          1. Hallo Sabine

            ich habe den Rechtschreibfehler korrigiert, die Fehlermeldung bleibt die gleiche!!!!!!!!

            Ein Schritt nach vorne :-)

            $satz = mysql_query("SELECT * FROM $dbtabelle WHERE tag=$day AND monat=$hmonht AND jahr=$njahr ORDER BY stunde,minute");
            while($row = mysql_fetch_array($satz))

            es ist meiner Meinung nach besser,

            • zuerst die SQL-Anweisung in einer Variablen zusammenzustellen,
            • zu Debugzwecken die SQL-Anweisung ausgeben können,
            • dann die SQL-Anweisung an MySQL durchzureichen,
            • überprüfen, ob ein Fehler aufgetreten ist
            • Wenn nein, die Daten in einer Schleife auszulesen und weiterverarbeiten

            etwa in der Art:

            $strSQL = "SELECT * FROM $dbtabelle WHERE tag=$day AND monat=$hmonth AND jahr=$njahr ORDER BY stunde, minute"
              # Dazu könnte man ggf. die Anweisung strukturierter hinschreiben,
              # den Tabellennamen und die Felder geeignet quoten,
              # es schadet nicht, siehe auch https://forum.selfhtml.org/?t=102252&m=629231 ff.
            echo $strSQL; # Debugausgabe, wird später auskommentiert oder gelöscht
            $satz = mysql_query($strSQL) or die ("Fehler: " . mysql_error() . "<br>\n");
            while ($row = mysql_fetch_array($satz) ) {
              # verarbeite Daten ...

            Ich kann mir gut vorstellen, dass die SQL-Anweisung nicht so aussieht, wie Du Dir dies denkst.

            Freundliche Grüße

            Vinzenz

          2. Hi Sabine,

            ich habe den Rechtschreibfehler korrigiert, die Fehlermeldung bleibt die gleiche!!!!!!!!

            Ein Ausrufezeichen reicht dicke, Danke!

            Hast du das Script aus so zum Debuggen umgeschrieben, wie Dieter es hier geschrieben hast?

            Noch mal in Kurzform:

            $sql = "SELECT foo, bar FROM xy WHERE foo = 'bla'";

            $result = mysql_query($sql) OR die(mysql_error());

            Unterschied von meinem oben zu dem von Dieter ist nur, dass ich die Fehlermeldung nicht schön formatiert ausgeben lasse und das Script beim Auftreten eines Fehlers abbreche.

            MfG, Dennis.

            --
            Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:( mo:} zu:| [decode]
            Das Leben ist kein Warenhaus - es nimmt nichts zurück. (Anette Louisan)
            1. Hallo Dennis,

              Unterschied von meinem oben zu dem von Dieter ist nur, dass ich die Fehlermeldung nicht schön formatiert ausgeben lasse und das Script beim Auftreten eines Fehlers abbreche.

              Ich darf Dich korrigieren, es gibt zwei Unterschiede:
              1. Ich bin offenbar zu blöd fuer Copy and Paste und habe einen Fehler mitgepostet
              2. Bei meiner Funktion wird nichts ausgegeben, wenn das error_reporting ausgeschaltet ist, was ja bei der Live-Seite so sein wird. Du musst also nichts mehr am Script aendern.

              Gruß,

              Dieter

              1. Hi Dieter,

                1. Bei meiner Funktion wird nichts ausgegeben, wenn das error_reporting ausgeschaltet ist, was ja bei der Live-Seite so sein wird. Du musst also nichts mehr am Script aendern.

                Ich lasse bei meinen Seiten auch Live Fehler ausgeben, dann sehe ich direkt wenn was nicht funktioniert - und gibt es dann keine Fehlermeldungen, kann ich stolz darauf sein, dass alles klappt :-P

                Aber bei größeren Projekten hast du natürlich Recht.

                MfG, Dennis.

                --
                Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:( mo:} zu:| [decode]
                Das Motto des SELFForums ist das _self_made, also das selbermachen. Deshalb sollte man bevor man irgendetwas fragt, immer erst öffentliche Quellen zu Rate ziehen!
      2. Hallo Sabine,

        ich habe das Programm jetzt folgendermaßen geändert

        Sehr huebsch!

        Was das SQL anbetrifft, will ich mal etwas weiter ausholen. Im PHP-Manual ist unter http://de3.php.net/manual/de/function.mysql-error.php erklaert, wie man sich Fehler ausgeben laesst, ich hab mir einem Buch mal eine nette Weiterentwicklung abgeschaut.

        Du hast ja deine Datenbankverbindung wahrscheinlich in einer eigenen Datei, dort fuegst du ein:

        function sql_error($show_error)
        {
            if(error_reporting())
            {
              print '<p style="font-weight:bold">MySQL Error '
                    . mysql_errno() . ': ' . mysql_error() . '</p>';
          }
        }

        Damit werden, solange du Fehlermeldungen eingeschaltet hast, immer auch komplette Meldungen vom MySQL-Server ausgegeben, Beispiel sie weiter unten.

        $satz = mysql_query("SELECT * FROM $dbtabelle WHERE tag=$day AND monat=$hmonht AND jahr=$njahr ORDER BY stunde,minute");

        Das ist ein haeufig gemachter 'Fehler', der eine wichtige Debugmoeglichkeit vorenthaelt. Es ist besser zu schreiben:
        $sql = "SELECT * FROM $dbtabelle WHERE tag=$day AND monat=$hmonht AND jahr=$njahr ORDER BY stunde,minute";
        Du kannst jetzt naemlich mit echo $sql die Query ausgeben lassen und direkt an der der Kommandozeile oder phpMyAdmin ausfuehren. In der naechsten Zeile kommt die Fehlerfunktion.
        $satz = mysql_query($sql) or sql_error();

        Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in

        Bedeutet ungueltige Abfrage, sollte mit der Fehlerfunktion ans Tageslicht kommen.

        Wieder die Frage: Wo liegt der Fehler?

        Ich weiss nicht, wo der Fehler liegt, wuerde aber erstmal Anfuehrungszeichen verdaechtigen. Mysql wird dir wesentlich mehr darueber erzaehlen als bisher.

        Gruß,

        Dieter

        1. Hallo

          ich werde die Fehlermeldung nicht los! Ich habe nun geschrieben:

          $heutag=date("j");
          $heumonat=date("n");
          $heujahr=date("Y");

          for ($i=0; $i < 7; $i++)
          {
             switch($heumonat){

          case 1: case 3: case 5: case 7 : case 8 : case 10:
               if($day > 32)
              {
                $day   = $heutag + $i - 31;
                $month = $heumonat+1;
                $njahr = $heujahr;
              }
              break;

          case 2 :case 4 : case 6 : case 9 : case 11 :
                 if($day > 31)
              {
                $day   = $heutag + $i - 30;
                $month = $heumonat + 1;
                $njahr = $heujahr;
              }
              break;

          case 12 :
               if($day > 32)
              {
                $day   = $heutag + $i - 31;
                $month = 1;
                $njahr = $heujahr+1;
              }
              break;

          default:
                $day    =$heutag+$i;
                $month  =$heumonat;
                $njahr  =$heujahr;
              };

          echo "
              <h4>$day.$month.$njahr</h4>";

          $sql="SELECT * FROM $dbtabelle WHERE tag=$day AND monat=$hmonth AND jahr=$njahr ORDER BY stunde,minute";
          $satz = mysql_query($sql) or sql_error();

          while($row = mysql_fetch_array($satz))
          {
                    extract($row);
                      echo "
                <table>
                <tr valign='top'><td width=100>$stunde.$minute Uhr</td><td>
                $ort <br>
                $beschreibung
                </td></tr></table>  ";

          };

          };

          und bekomme als Fehlermeldung

          Warning: Missing argument 1 for sql_error() in C:\php\xampp\htdocs\Volkmar\termin\config.inc.php on line 22

          MySQL Error 1064: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND monat= AND jahr= ORDER BY stunde,minute' at line 1

          Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\php\xampp\htdocs\Volkmar\termin.php on line 63
          ..

          Line 22 ist die Zeile nach dem switch-Befehl
          line 63 wieder dort, wo die while Schleife beginnt!

          Wo ist der Wurm?

          Grüße,

          Sabine

          1. Wo ist der Wurm?

            Füge an den Anfang deines Scripts error_reporting(E_ALL); ein und schau mal nach Notices.

            Das Stück Script was du uns gegeben hast verwendet z.B. ein nicht initialisiertes $day in (nach deiner Zeilenrechnung) Zeile 24.

            1. Hallo

              So, es läuft!! Aber noch nicht richtig. Mein Fehler war, daß ich mit day, month und njahr angefangen habe.

              Nun habe ich aber noch ein Problem, und zwar gibt es mir jetzt 7 mal das gleiche aus, d.h. er ändert nicht wirklich das Datum beim Abrufen der DB. Wie mache ich das denn?

              Ich denke, ich muß die echo-Anweisung näher in die Schleife bringen. Aber ich möchte nicht jedes Mal das Datum wieder ausgegeben haben, sondern einmalig und dann alle Termine des Tages dazu.

              Hier noch mal das Skript:

              $heutag=date("j");
              $heumonat=date("n");
              $heujahr=date("Y");

              for ($i=0; $i < 7; $i++)
              {
                 switch($heumonat){

              case 1: case 3: case 5: case 7 : case 8 : case 10:
                   if($heutag > 32)
                  {
                    $heutag   = $heutag + $i - 31;
                    $heumonat = $heumonat+1;
                  }
                  break;

              case 2 :case 4 : case 6 : case 9 : case 11 :
                     if($heutag > 31)
                  {
                    $heutag   = $heutag + $i - 30;
                    $heumonat = $heumonat + 1;
                  }
                  break;

              case 12 :
                   if($heutag > 32)
                  {
                    $heutag   = $heutag + $i - 31;
                    $heumonat = 1;
                    $heujahr = $heujahr+1;
                  }
                  break;

              default:
                    $heutag    =$heutag+$i;
                   };

              echo "
                  <h4>$heutag.$heumonat.$heujahr</h4>";

              $sql="SELECT * FROM $dbtabelle WHERE tag=$heutag AND monat=$heumonat AND jahr=$heujahr ORDER BY stunde,minute";
              $satz = mysql_query($sql) or mysql_error();

              while($row = mysql_fetch_array($satz))
              {
                        extract($row);
                          echo "
                    <table>
                    <tr valign='top'><td width=100>$stunde.$minute Uhr</td><td>
                    $ort <br>
                    $beschreibung
                    </td></tr></table>  ";

              };

              };

              Grüße,

              Sabine

              P.S.: Eigentlich doch nicht ganz schlecht für eine Anfängerin in php und mysql ;-)

              1. Hallo Sabine

                So, es läuft!!

                Sehr schön.

                Aber noch nicht richtig. Mein Fehler war, daß ich mit day, month und njahr angefangen habe.

                Das wird noch.

                Ich denke, ich muß die echo-Anweisung näher in die Schleife bringen. Aber ich möchte nicht jedes Mal das Datum wieder ausgegeben haben, sondern einmalig und dann alle Termine des Tages dazu.

                Da Deine Abfrage genau ein spezielles Datum abfragt und Du dieses Datum kennst, gib' doch das Datum _vor_ der Schleife aus, innerhalb der Schleife nur die Termine zum Tag.

                Freundliche Grüße

                Vinzenz

                1. Hallo Vinzenz

                  Da Deine Abfrage genau ein spezielles Datum abfragt und Du dieses Datum kennst, gib' doch das Datum _vor_ der Schleife aus, innerhalb der Schleife nur die Termine zum Tag.

                  Ich möchte doch 7 nachfolgende Tage ausgeben...........

                  Wenn ich so wie DU vorschlägst mache, bekomme ich doch nur die Termine eines Tages ausgegeben, oder?

                  Grüße,

                  Sabine

                  1. Hallo Sabine

                    Wenn ich so wie DU vorschlägst mache, bekomme ich doch nur die Termine eines Tages ausgegeben, oder?

                    Bitte schrei' mich doch nicht an (Schreiben in Großbuchstaben ist verdammt laut), es klingelt in meinen Augen.

                    Ich hatte Dein Posting bisher immer nur unter dem SQL-Aspekt betrachtet und den Rest vernachlässigt, ein klarer Fehler meinerseits :-(

                    Hier noch mal Deine switch-Anweisung, die nicht das tut, was Du von ihr erwartest, sondern das, was Du ihr sagst.

                    switch($heumonat){

                    case 1: case 3: case 5: case 7 : case 8 : case 10:
                         if($heutag > 32)
                        {
                          $heutag   = $heutag + $i - 31;
                          $heumonat = $heumonat+1;
                        }
                        break;

                    case 2 :case 4 : case 6 : case 9 : case 11 :
                           if($heutag > 31)
                        {
                          $heutag   = $heutag + $i - 30;
                          $heumonat = $heumonat + 1;
                        }
                        break;

                    case 12 :
                         if($heutag > 32)
                        {
                          $heutag   = $heutag + $i - 31;
                          $heumonat = 1;
                          $heujahr = $heujahr+1;
                        }
                        break;

                    default:
                          $heutag    =$heutag+$i;

                    Hier steckt Dein Denkfehler. Du gehst davon aus, dass der default-Zweig für jeden Fall abgearbeitet wird, bei dem der Ausdruck in der if-Anweisung false ergibt. Dies ist nicht der Fall.

                    Der default-Zweig wird nur für die Werte von $heumonat abgearbeitet, die durch die case-Zweige nicht abgedeckt sind. Die case-Zweige decken aber alle denkbaren Monate ab, d.h. der default-Zweig wird nie abgearbeitet. Das was bei Dir unter default steht, gehört in jeden else-Zweig bei jedem case. (Verständlich?)

                    };

                    Weiterhin bezweifle ich, dass Du den Februar korrekt behandelst. Soweit ich mich erinnere (es ist ja so lange her), hatte der Februar dieses Jahr 28 Tage. Es soll auch Jahre mit einem 29. Februar geben ;-)

                    Übrigens könnten Dir die Kalenderfunktionen von PHP weiterhelfen. Schau bitte mal unter http://www.php.net/manual/de/function.cal-days-in-month.php nach.

                    Freundliche Grüße

                    Vinzenz

                    1. Hallo

                      erstmal, das mit dem DU war nicht so gemeint, war eher ein Tippfehler ;-) (Ich sollte mir meine Antworten vorher mal durchlesen.)

                      So, nun zum eigentlichen:

                      Der Februar hat mal 28, mal 29 Tage, ich denke, daß kann ich nachher, wenn alles funktioniert mit modulo 4 bzgl. Jahr definieren (ist schon spät, weiß nicht mehr den Endbuchstaben von modul... - ich glaube, ich muß mein Diplom abgeben ). Das mache ich aber später, also nicht das Diplom abgeben, sondern den Februar definieren.

                      Nun habe ich das Skript umgeschrieben und natürlich werden jetzt alle Termine des Monats ausgegeben (wahrscheinlich wegen switch ($heumonat). Ich will doch aber nur die folgenden 7 Tage ....... :-(

                      Hier ist noch mal das neue Skript:

                      for ($i=0; $i < 7; $i++)
                      {
                         switch($heumonat){

                      case 1: case 3: case 5: case 7 : case 8 : case 10:
                           if($heutag > 32)
                          {
                            $heutag   = $heutag + $i - 31;
                            $heumonat = $heumonat+1;
                          }
                      else $heutag    =$heutag+$i;
                          break;

                      case 2 :case 4 : case 6 : case 9 : case 11 :
                             if($heutag > 31)
                          {
                            $heutag   = $heutag + $i - 30;
                            $heumonat = $heumonat + 1;
                          }
                      else $heutag    =$heutag+$i;
                          break;

                      case 12 :
                           if($heutag > 32)
                          {
                            $heutag   = $heutag + $i - 31;
                            $heumonat = 1;
                            $heujahr = $heujahr+1;
                          }
                      else $heutag    =$heutag+$i;
                          break;

                      };

                      echo "  <h4>$heutag.$heumonat.$heujahr</h4>";

                      $sql="SELECT * FROM $dbtabelle WHERE tag=$heutag AND monat=$heumonat AND jahr=$heujahr ORDER BY stunde,minute";
                      $satz = mysql_query($sql) or mysql_error();

                      while($row = mysql_fetch_array($satz))
                      {
                                extract($row);
                                  echo "
                            <table>
                            <tr valign='top'><td width=100>$stunde.$minute Uhr</td><td>
                            $ort <br>
                            $beschreibung
                            </td></tr></table>  ";

                      };

                      };

                      Grüße,

                      Sabine

                      1. Hallo Sabine

                        erstmal, das mit dem DU war nicht so gemeint, war eher ein Tippfehler ;-) (Ich sollte mir meine Antworten vorher mal durchlesen.)

                        *g*, sowas passiert jedem mal, siehe z.B. https://forum.selfhtml.org/?t=102524&m=630442, ein abschreckendes Beispiel ;-)

                        Der Februar hat mal 28, mal 29 Tage, ich denke, daß kann ich nachher, wenn alles funktioniert mit modulo 4 bzgl. Jahr definieren (ist schon spät, weiß nicht mehr den Endbuchstaben von modul... - ich glaube, ich muß mein Diplom abgeben ). Das mache ich aber später, also nicht das Diplom abgeben, sondern den Februar definieren.

                        Dann kriegst Du im Jahr 2100 einen Fehler. Der wird Dir wohl egal sein ;-)

                        Nun habe ich das Skript umgeschrieben und natürlich werden jetzt alle Termine des Monats ausgegeben (wahrscheinlich wegen switch ($heumonat). Ich will doch aber nur die folgenden 7 Tage ....... :-(

                        Alle? Deine for-Schleife nimmt nur 7 Werte an, das dürfte nur 7 Tage geben, aber Du hast immer noch einen Fehler drin:

                        $heutag=date("j");
                        $heumonat=date("n");
                        $heujahr=date("Y");

                        for ($i=0; $i < 7; $i++)
                        {
                           switch($heumonat){

                        case 1: case 3: case 5: case 7 : case 8 : case 10:
                             if($heutag > 32)

                        Wie kommst Du dahin? Was passiert mit dem 32.

                        Inkrementiere zuerst!

                        $heutag = $heutag + 1;     // Alternative: $heutag++;
                          switch ($heumonat) {
                          case 1:
                          case 3:
                          case 5:
                          case 7:
                          case 8:
                          case 10:
                              if ($heutag > 31) {    // Du siehst den Unterschied?
                                  $heutag = $heutag - 31;
                                  $heumonat++;
                              }
                              break;
                           ...

                        Außerdem entfällt die Notwendigkeit, den else-Zweig zu betrachten.

                        Bitte gib' zu Debug-Zwecken die SQL-Anweisung aus.

                        Freundliche Grüße

                        Vinzenz

                        1. Hallo

                          Bitte gib' zu Debug-Zwecken die SQL-Anweisung aus.

                          Was soll ich machen???????? Wie kann ich das machen????

                          Ich habe wieder das Skript wie Du mir geraten hast, verändert.
                          Das Ergebnis ist das gleiche: Ich bekomme 7 Termine ausgegeben: vom
                          3.3., 4.3., 6.3., 9.3.13.3.,18.3.3,24.3.. Die Termine sind willkürlich, da ich meine Datenbak so gefüllt habe, daß die kommende 7 Tage Termine angegeben sind. Ich finde kein System in den Daten, Du?

                          Hier nochmals das Skript:

                          $heutag=date("j");
                          $heumonat=date("n");
                          $heujahr=date("Y");

                          for ($i=0; $i < 7; $i++)
                          {
                          $heutag=$heutag+$i;
                             switch($heumonat){

                          case 1: case 3: case 5: case 7 : case 8 : case 10:
                               if($heutag > 31)
                              {
                                $heutag   = $heutag - 31;
                                $heumonat = $heumonat+1;
                              }
                              break;

                          case 2 :case 4 : case 6 : case 9 : case 11 :
                                 if($heutag > 30)
                              {
                                $heutag   = $heutag - 30;
                                $heumonat = $heumonat + 1;
                              }
                              break;

                          case 12 :
                               if($heutag > 31)
                              {
                                $heutag   = $heutag - 31;
                                $heumonat = 1;
                                $heujahr = $heujahr+1;
                              }
                              break;

                          };

                          echo "  <h4>$heutag.$heumonat.$heujahr</h4>";

                          $sql="SELECT * FROM $dbtabelle WHERE tag=$heutag AND monat=$heumonat AND jahr=$heujahr ORDER BY stunde,minute";
                          $satz = mysql_query($sql) or mysql_error();

                          while($row = mysql_fetch_array($satz))
                          {
                                    extract($row);
                                      echo "
                                <table>
                                <tr valign='top'><td width=100>$stunde.$minute Uhr</td><td>
                                $ort <br>
                                $beschreibung
                                </td></tr></table>  ";

                          };

                          };

                          Grüße,

                          Sabine

                          1. Moin!

                            Das Ergebnis ist das gleiche: Ich bekomme 7 Termine ausgegeben: vom
                            3.3., 4.3., 6.3., 9.3.13.3.,18.3.3,24.3.. Die Termine sind willkürlich, da ich meine Datenbak so gefüllt habe, daß die kommende 7 Tage Termine angegeben sind. Ich finde kein System in den Daten, Du?

                            Bitte beachte https://forum.selfhtml.org/?t=102511&m=630981

                            • Sven Rautenberg
                            1. Hallo

                              mir gefällt das Format 000-00-00 00:00:00 aber nicht.

                              Ich möcht gerne das Format tt.mm.jjjj haben!

                              Grüße,

                              Sabine

                              1. Hallo Sabine

                                mir gefällt das Format 000-00-00 00:00:00 aber nicht.

                                Das brauchst Du auch nicht zu verwenden, das ist DATETIME, obwohl es für Deine Termine ideal ist *g*

                                Ich möcht gerne das Format tt.mm.jjjj haben!

                                Das geht nicht ganz, DATE ist YYYY-MM-DD. Aber wo ist das Problem? Du kannst, soweit es sich um Angaben im Wertebereich von Timestamps handelt, die PHP-eigenen Funktionen mktime() und date() zur Umwandlung verwenden. Ansonsten hindert Dich nichts daran, Dir ein paar Funktionen zu schreiben, die Dir

                                a) Dein bevorzugten Format in DATETIME umwandelt
                                b) aus DATETIME Dein bevorzugtes Format erzeugt.

                                womit ich beim nächsten Punkt wäre. Es ist eine gute Idee, systematisch ans Programmieren heranzugehen. Teile Aufgaben in einzelne Teilaufgaben auf, untergliedere diese Teilaufgaben wiederum, wenn das sinnvoll ist. Eine Einzelaufgabe wird dann typischerweise von einer Funktion erledigt. Manche Funktionen, die Du so nach und nach schreibst, kannst Du wiederverwenden. Diese legst Du in Funktionsbibliotheken ab...

                                Als Grobgliederung für Deine Aufgabe, die Du Dir gestellt hast:

                                Gebe alle Termine der nächsten 7 Tage aus:

                                Mögliche Untergliederung (so wie Du sie gemacht hast)

                                Ermittle das heutige Datum
                                  Für die nächsten 7 Tage
                                     Ermittle das Datum des Tages
                                     Gebe das Datum aus
                                     Ermittle die Termine des Datums
                                     Für alle Termine
                                         Gebe den Termin aus

                                Bei Verwendung von DATETIME als Datentyp für Deine Termine kannst Du Dir viel Arbeit sparen: Du sagst der Datenbank folgendes:

                                Gib mir alle Termine zwischen Anfangsdatum und Enddatum, nach Termin aufsteigend sortiert.

                                Deine Ausgabefunktion muss nur noch dafür sorgen, dass jedesmal, wenn sich der Tag ändert, der Tag extra ausgegeben wird. Denke daran, dass Datenbankabfragen im Vergleich zur Ausführung von normalem PHP-Code sehr teuer sind.

                                Freundliche Grüße

                                Vinzenz

                                1. Hallo

                                  Denke daran, dass Datenbankabfragen im Vergleich zur Ausführung von normalem PHP-Code sehr teuer sind.

                                  Was heißt, sie sind sehr teuer? Ich möchte bitte gerne lernen..

                                  Teuer bzgl. Zeit oder wie?

                                  Viele Grüße,

                                  Sabine

                                  1. Hallo Sabine

                                    Was heißt, sie sind sehr teuer? Ich möchte bitte gerne lernen..

                                    Das ist die richtige Einstellung.

                                    Teuer bzgl. Zeit oder wie?

                                    Ich verweise einfach mal auf die heftige Diskussion in folgendem Archiv-Thread.

                                    Bitte ganz lesen.

                                    http://forum.de.selfhtml.org/archiv/2004/12/t97702/#m594834 ist auch ganz lustig, nebenbei bekommst Du ein paar Informationen über die Probleme bei der effizienten Implementierung einer Suche. *g*

                                    Freundliche Grüße

                                    Vinzenz

                                    1. Hallo Vinzenz

                                      Archiv-Thread.

                                      Da wären wir ja auch schon bei der Suche.

                                      Aber so ganz erschließt sich mir noch nicht, wie ich es machen soll.

                                      Ich habe eine Suche auf meiner Site installiert, die den Server absucht. Da muß es doch eine Möglichkeit geben, daß ich auch Kontakt zur Datenbank knüpfe, die Suche dort weiterführe und dann das bertreffende php-Skript als Ergebnis anzeige. Oder?

                                      http://forum.de.selfhtml.org/archiv/2004/12/t97702/#m594834

                                      Das ist doch sehr abgefahren. Und ich merke mal wieder, daß ich mir alles selbst gelernt habe und auf einer einsamen Insel sitze und nur wenig von den Fachbegriffen mitbekomme. Ich habe mich bei der Hash-Funktion dann ausgeblendet.

                                      Viele Grüße,

                                      Sabine

                              2. Hallo

                                ich hab's: Ich muß

                                $heutag=$heutag+1;

                                schreiben, nicht

                                $heutag=$heutag+$i;

                                Jetzt geht alles!  Danke für die Hilfe und jetzt ab mit diesem Thread ins Archiv!!!!!!

                                Grüße,

                                Sabine

                              3. Moin!

                                Hallo

                                mir gefällt das Format 000-00-00 00:00:00 aber nicht.

                                Ich möcht gerne das Format tt.mm.jjjj haben!

                                Dann mach das doch beim SELECT direkt:

                                SELECT DATE_FORMAT(datum,'%d.%m.%Y') AS datum, weitere, felder FROM $dbtabelle....

                                Das wird einmal im SELECT festgelegt und dann (im Prinzip) nie wieder angefaßt. Oder du lagerst den Format-String '%d.$m.$Y' aus in eine PHP-Variable, dann kannst du dein Datumsformat zentral für alle Datumsabfragen bestimmen und dir beispielsweise überlegen, dass du statt immer-zweistelligen Tages- und Monatsangaben vielleicht lieber einstellige Angaben hättest:
                                DATE_FORMAT(datum,'%e.%c.%Y')

                                Oder mit Uhrzeit dabei, oder mit Monatsnamen, oder mit Wochentag, oder....

                                Durch die Verwendung von DATETIME (oder DATE) gewinnst du die Fähigkeiten von MySQL hinzu, mit Daten rechnen zu können, ohne dir selbst viele Gedanken über die tatsächlichen Vorkommnisse im Kalender machen zu müssen.

                                Sowas hatten wir nämlich unlängst erst: Das Jahr 2000 war ein Schaltjahr. Aber warum? Alle 4 Jahre gibts ein Schaltjahr, das stimmt. Aber alle hundert Jahre gibt es KEIN Schaltjahr. Aber alle 400 Jahre gibt es DOCH wieder ein Schaltjahr. aber alle 3000 Jahre gibts doch KEIN Schaltjahr.

                                Willst du das also tatsächlich selbst ausrechnen und berücksichtigen, oder findest du es nicht doch einfacher, wenn MySQL-Programmierer sich darüber den Kopf zerbrechen, und du einfach sieben Tage auf das heutige Datum addierst?

                                • Sven Rautenberg
          2. Hallo Sabine

            $sql="SELECT * FROM $dbtabelle WHERE tag=$day AND monat=$hmonth AND jahr=$njahr ORDER BY stunde,minute";

            Füge hier bitte ein

            echo $sql;

            ein.

            $satz = mysql_query($sql) or sql_error();

            Warning: Missing argument 1 for sql_error() in C:\php\xampp\htdocs\Volkmar\termin\config.inc.php on line 22

            Die hast Du uns ja nicht gepostet, können wir nichts dazu sagen.

            MySQL Error 1064: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND monat= AND jahr= ORDER BY stunde,minute' at line 1

            In $hmonth steht der Leerstring drin, bzw. $hmonth ist nicht gesetzt.
            Gleiches gilt für $njahr.

            Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\php\xampp\htdocs\Volkmar\termin.php on line 63

            Folgefehler

            Wo ist der Wurm?

            Ganz sicher in der SQL-Anweisung.
            Eventuell auch noch sonstwo.

            Freundliche Grüße

            Vinzenz

            1. Hi Vinzenz,

              die bewusste Errorfunktion habe ich weiter oben gepostet, natuerlich mit einem Fehler ;-( grmmpf!

              OT: Sollen wir mal Anfang naechster Woche?

              Gruß,

              Dieter

              1. Hallo Dieter

                OT: Sollen wir mal Anfang naechster Woche?

                Dienstag passt, sagen wir 19.00 Uhr? Ich käme vorbei.

                Freundliche Grüße

                Vinzenz

                1. Hallo Vinzenz,

                  Dienstag passt, sagen wir 19.00 Uhr? Ich käme vorbei.

                  OK, kommst Du zu mir oder gehen wir zu Nauwies/UBU/Mono/kurzes Eck

                  Gruß,

                  Dieter

                  1. Hallo Dieter

                    Dienstag passt, sagen wir 19.00 Uhr? Ich käme vorbei.
                    OK, kommst Du zu mir oder gehen wir zu Nauwies/UBU/Mono/kurzes Eck

                    Splitte Kneipenliste mit geeignetem Trennzeichen in Array auf.
                    $ziel = $kneipen[1];

                    Freundliche Grüße

                    Vinzenz

                    1. Hallo Vinzenz,

                      Splitte Kneipenliste mit geeignetem Trennzeichen in Array auf.
                      $ziel = $kneipen[1];

                      Hmmm, mal sehen
                      <?php
                      class KneipenFinder
                      {
                        var $kneipen;

                      function KneipenFinder($kneipen_string)
                        {
                          $this -> kneipen = explode($kneipen_string);
                        }

                      function find($nr)
                        {
                          return !empty($kneipen[$nr]) ? $kneipen[$nr] : 'Heimatmuseum';
                        }
                      }

                      $foo  = new KneipenFinder('Nauwies/UBU/Mono/kurzes Eck');
                      $ziel = $foo -> find(1);
                      ?>

                      <script type="text/javascript">
                        alert('Hurrah, am Dienstag, um 19:00 Uhr gehen Vinzenz und ich in's <?php print $ziel ?>');
                      </script>

                      Gruß,

                      Dieter

                      1. Huch, noch schnell ein kleines Argument an explode() ueberreichen

                          
                        <?php  
                        class KneipenFinder  
                        {  
                          var $kneipen;  
                          
                          function KneipenFinder($kneipen_string)  
                          {  
                            $this -> kneipen = explode('/',$kneipen_string);  
                          }  
                          
                          function find($nr)  
                          {  
                            return !empty($kneipen[$nr]) ? $kneipen[$nr] : 'Heimatmuseum';  
                          }  
                        }  
                          
                        $foo  = new KneipenFinder('Nauwies/UBU/Mono/kurzes Eck');  
                        $ziel = $foo -> find(1);  
                        ?>  
                          
                        <script type="text/javascript">  
                          alert('Hurrah, am Dienstag, um 19:00 Uhr gehen Vinzenz und ich in\'s <?php print $ziel ?>');  
                        </script>  
                        
                        
                        1. Hi,

                          $this -> kneipen = explode('/',$kneipen_string);

                          Du sollst keine Kneipen sprengen …

                          cu,
                          Andreas

                          --
                          Warum nennt sich Andreas hier MudGuard?
                          Schreinerei Waechter
                          Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
                          1. Hallo MudGuard,

                            Du sollst keine Kneipen sprengen …

                            Erst sagt Vinzenz, ich soll, jetzt kommst Du und sagst ich soll nicht! Wem soll ich jetzt denn glauben? ;-)

                            Gruß,

                            Dieter

                            1. Hallo Dieter

                              Du sollst keine Kneipen sprengen …
                              Erst sagt Vinzenz, ich soll, jetzt kommst Du und sagst ich soll nicht! Wem soll ich jetzt denn glauben? ;-)

                              Verwende split() statt explode() …
                              wir sind doch nicht in der Prohibition;
                              denke außerdem an das 11. Gebot :-)

                              Freundliche Grüße

                              Vinzenz

                          2. Hallo Andreas,

                            $this -> kneipen = explode('/',$kneipen_string);

                            Du sollst keine Kneipen sprengen …

                            das 0. Gebot?

                            Freundliche Grüße

                            Vinzenz

          3. Hallo Sabine,

            Warning: Missing argument 1 for sql_error() in C:\php\xampp\htdocs\Volkmar\termin\config.inc.php on line 22

            Mea culpa, sorry

            function sql_error($show_error) <-- Das ist Quatsch

            function sql_error()            <-- Das ist richtig

            also _ohne_ das $show_error

            Gruß,

            Dieter

  3. Moin!

    kann mir jemand helfen?

    Klar.

    Ich bekomme immer eine Fehlermeldung bzgl while in folgender if-Schleife:

    Du hast ein Datumsproblem und benutzt MySQL. Frage: Warum benutzt du nicht die Datumstypen für die Felder, welche MySQL anbietet? Dann hast du VIEEEEL weniger Probleme beim Datumsrechnen.

    Deine ganze Schleifenproblematik mit der nicht datumsfesten Tagesberechnung fällt weg, außerdem auch die siebenfache Malträtierung der Datenbank mit einem SELECT.

    $satz = mysql_query("SELECT * FROM $dbtabelle WHERE tag=$day AND monat=$hmonht AND jahr=$njahr ORDER BY stunde,minute");

    Und die DB-Abfrage wird ersetzt durch:

    SELECT feld1,feld2 FROM $dbtabelle WHERE datum BETWEEN now() AND ADDDATE(now(), INTERVAL 7 DAY) ORDER BY datum

    Deine ganzen Tages-, Monats-, Jahres-, Stunden- und Minutenfelder kommen alle in ein Feld "datum" vom Typ "DATETIME".

    Ganz easy und einfach - und auch nach Monaten noch irgendwie leicht zu verstehen. Oder?

    • Sven Rautenberg