PHP for $i und MySQL Abfrage

Hallo zusammen,
beisse mir gerade die Zähne aus.

  • Aufgabe: MySQL: Maximalwert einer Spalte soll mit weiteren Werten in ein Array ausgegeben werden.
    Das ganze soll in einer For-Schleife für fortlaufende Tage wiederholt werden.

  • Problem: Wenn ich einen Tag in der Zeitauswahl fix vorgebe funktioniert das. Wenn ich aber die Tagesauswahl mit „mktime(0,0,0,1,1+$i,2013)“ hochzähle ändert sich zwar der Start (und Endzeitunkt), aber die Daten kommen immer vom 1. Tag.

  • Frage: Wie bekomm ich die Abfrage in der Schleife so hin, dass die Daten jedes Tages ausgegeben werden?

Anbei das Script. Hoffe, dass jemand Lust u Zeit hat mal drüber zu schauen und mir einen Tipp zu geben.

<?
//------------------------------------------------------------------------------
// MySQL DB-Daten:
$MySQLConn=mysql_connect($MySQLIP.$MySQLPort, $MySQLAdmin, $MySQLAdminPW);
$db = $IPS_DB;
$SQLTable = $TBL_Wetter_Sonnenlauf_Std;

//------------------------------------------------------------------------------
// MySQL Verbindung prüfen
if (!$MySQLConn)
    {IPS_LogMessage('FillTable', 'error= '. mysql_error());}
     $db_selected = mysql_select_db($db, $MySQLConn);
if (!$db_selected)
    {IPS_LogMessage('FillTable', 'opendb= '. mysql_error());}

//------------------------------------------------------------------------------
//Abfrage und Ausgabe für X Tage
for ($i = 0; $i <=2; $i++)
{
    //echo 1+$i ."
";
    //Zeitraum festlegen
    $CfgDaten['StartTime'] = mktime(0,0,0,1,1+$i,2013);
    $CfgDaten['EndTime'] = mktime(23,59,59,1,1+$i,2013);

    $SQLStart = "'".date("Y-m-d H:i:s",$CfgDaten["StartTime"])."'";
    $SQLEnd = "'".date("Y-m-d H:i:s",$CfgDaten["EndTime"])."'";
   echo $SQLStart." ".$SQLEnd."
";
   
        //in der Abfrage soll der höchste Wert von Elevation im Zeitraum ausgewählt werden und die entsprechenden Werte von DatumZeit und Azimut
        $sql_Ergebnis = mysql_query("SELECT Elevation, DateX, Azimut
                                                FROM " . $SQLTable . " " .
                                                "WHERE DateX >= ".$SQLStart." AND DateX <= ".$SQLEnd.
                                                " ORDER BY Elevation desc LIMIT 1".
                                                ";")
                                                OR die("'".$sql_Ergebnis."':".mysql_error());

            while($data = mysql_fetch_array($sql_Ergebnis, MYSQL_ASSOC))
            {
                $Ergebnis[]    = array("ElevMax"=>$data['Elevation'], "DateX"=>$data['DateX'], "AzimElevMax"=>$data['Azimut']);
                Print_r("Var i = ".$i."
");
              print_r($Ergebnis[0]);
            }
            $sql_Ergebnis = "";
}

//------------------------------------------------------------------------------
//MySQL Verbindung beenden
mysql_close($MySQLConn);

?>

Und hier die Ausgabe;

'2013-01-01 00:00:00' '2013-01-01 23:59:59'
Var i = 0
Array
(
    [ElevMax] => 20.1278
    [DateX] => 2013-01-01 11:00:00
    [AzimElevMax] => 172.625
)
'2013-01-02 00:00:00' '2013-01-02 23:59:59'
Var i = 1
Array
(
    [ElevMax] => 20.1278
    [DateX] => 2013-01-01 11:00:00
    [AzimElevMax] => 172.625
)
'2013-01-03 00:00:00' '2013-01-03 23:59:59'
Var i = 2
Array
(
    [ElevMax] => 20.1278
    [DateX] => 2013-01-01 11:00:00
    [AzimElevMax] => 172.625
)


"SELECT Elevation, DateX, Azimut
                                                FROM " . $SQLTable . " " .
                                                "WHERE DateX >= ".$SQLStart." AND DateX <= ".$SQLEnd.
                                                " ORDER BY Elevation desc LIMIT 1".
                                                ";")

Schreib mal den SQL-String in eine eigene Variable und lass die vorher ausgeben.

Nur mal als ein erster Anhaltspunkt, wo es vielleicht schief läuft …

Was passiert, wenn Du mit dem 02.01. beginnst? Kommt dann 3x der 02.01. raus?

Hallo ernie,
danke für Deine Hilfe.

zu 1. wenn ich die query in eine Variable schreibe:

<?
//------------------------------------------------------------------------------
// MySQL DB-Daten:
$MySQLConn=mysql_connect($MySQLIP.$MySQLPort, $MySQLAdmin, $MySQLAdminPW);
$db = $IPS_DB;
$SQLTable = $TBL_Wetter_Sonnenlauf_Std;

//------------------------------------------------------------------------------
// MySQL Verbindung prüfen
if (!$MySQLConn)
    {IPS_LogMessage('FillTable', 'error= '. mysql_error());}
     $db_selected = mysql_select_db($db, $MySQLConn);
if (!$db_selected)
    {IPS_LogMessage('FillTable', 'opendb= '. mysql_error());}

//------------------------------------------------------------------------------
//Abfrage und Ausgabe für X Tage
for ($i = 1; $i <=2; $i++)
{
    //echo 1+$i ."
";
    //Zeitraum festlegen
    $CfgDaten['StartTime'] = mktime(0,0,0,1,1+$i,2013);
    $CfgDaten['EndTime'] = mktime(23,59,59,1,1+$i,2013);

    $SQLStart = "'".date("Y-m-d H:i:s",$CfgDaten["StartTime"])."'";
    $SQLEnd = "'".date("Y-m-d H:i:s",$CfgDaten["EndTime"])."'";
    
   echo $SQLStart." ".$SQLEnd."
";
   
   $qry = "SELECT Elevation, DateX, Azimut FROM " . $SQLTable . " " . "WHERE DateX >= ".$SQLStart." AND DateX <= ".$SQLEnd." ORDER BY Elevation desc LIMIT 1;";
    print_r($qry."

");
        //in der Abfrage soll der höchste Wert von Elevation im Zeitraum ausgewählt werden und die entsprechenden Werte von DatumZeit und Azimut
        $sql_Ergebnis = mysql_query($qry)
                                                OR die("'".$sql_Ergebnis."':".mysql_error());
                                                
            while($data = mysql_fetch_array($sql_Ergebnis, MYSQL_ASSOC))
            {
                $Ergebnis[]    = array("ElevMax"=>$data['Elevation'], "DateX"=>$data['DateX'], "AzimElevMax"=>$data['Azimut']);
                Print_r("Var i = ".$i."
");
              print_r($Ergebnis[0]);
            }
            $sql_Ergebnis = "";
}

//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
//MySQL Verbindung beenden
mysql_close($MySQLConn);

?>

kommt das Echo so raus:

'2013-01-02 00:00:00' '2013-01-02 23:59:59'
SELECT Elevation, DateX, Azimut FROM tbl_Wetter_Sonnenlauf_Stunde WHERE DateX >= '2013-01-02 00:00:00' AND DateX  20.3194
    [DateX] => 2013-01-02 12:00:00
    [AzimElevMax] => 187.513
)
'2013-01-03 00:00:00' '2013-01-03 23:59:59'
SELECT Elevation, DateX, Azimut FROM tbl_Wetter_Sonnenlauf_Stunde WHERE DateX >= '2013-01-03 00:00:00' AND DateX  20.3194
    [DateX] => 2013-01-02 12:00:00
    [AzimElevMax] => 187.513
)

Der string wird nach dem 2. DateX in der where klausel abgeschnitten. eben so wie die Ausgabe von $i und der 1. Teil der Ausgabe des Arrays. Dieses beginnt erst mit dem 1. Wert.

Confused.

zu 2. wenn ich einen Tag später beginne bekomme ich für diesen und alle folgenden Tage die Werte des 1. Ergebnisses.

Hab jetzt mal alle Ausgaben rausgenommen und nur noch $qry drin.

<?
//------------------------------------------------------------------------------
// MySQL DB-Daten:
$MySQLConn=mysql_connect($MySQLIP.$MySQLPort, $MySQLAdmin, $MySQLAdminPW);
$db = $IPS_DB;
$SQLTable = $TBL_Wetter_Sonnenlauf_Std;
//------------------------------------------------------------------------------
//Abfrage und Ausgabe für X Tage
for ($i = 1; $i <=3; $i++)
{
    //echo 1+$i ."
";
    //Zeitraum festlegen
    $CfgDaten['StartTime'] = mktime(0,0,0,1,1+$i,2013);
    $CfgDaten['EndTime'] = mktime(23,59,59,1,1+$i,2013);
    //echo $CfgDaten['EndTime']."
";

    $SQLStart    = "'".date("Y-m-d H:i:s",$CfgDaten["StartTime"])."'";
    $SQLEnd        = "'".date("Y-m-d H:i:s",$CfgDaten["EndTime"])  ."'";

   //echo $SQLStart." ".$SQLEnd."
";

   $qry = "SELECT Elevation, DateX, Azimut FROM " . $SQLTable . " " . "WHERE DateX >= ".$SQLStart." AND DateX <= ".$SQLEnd." ORDER BY Elevation desc LIMIT 1;";
    echo $qry;
}
//------------------------------------------------------------------------------
//MySQL Verbindung beenden
mysql_close($MySQLConn);
?>

Ausgabe:

SELECT Elevation, DateX, Azimut FROM tbl_Wetter_Sonnenlauf_Stunde WHERE DateX >= '2013-01-02 00:00:00' AND DateX = '2013-01-03 00:00:00' AND DateX = '2013-01-04 00:00:00' AND DateX <= '2013-01-04 23:59:59' ORDER BY Elevation desc LIMIT 1;

Das verwirrt mich jetzt noch mehr. Die For-Schleife wird nur noch 1x durchlaufen und in der qry werden noch mehr UND verknüpfungen eingefügt. Da ist bestimmt irgend wo der Haken. Wenn ich die qry Ausgabe wieder raus nehme und die echo $SQLStart." „.$SQLEnd.“
"; wieder rein, bekomm ich wieder 3 Durchläufe.

Hallo wolfgang,

irgendwie gibt es ein problem mit dem „größer / kleiner“ Zeichen in einer Schleife.

<?
for ($i = 1; $i <=4; $i++)
{
	  $qry = "><" . $i;
    echo($qry."
");
}
?>

ergibt schon wirres Zeug.
Eine Abhilfe kann ich aber auch nicht liefern :mad:

Gruß