Array aus pdo Abfrage läuft nur einmal

luchs3

Erfahrenes Mitglied
Hi,
Ich möchte die aktuellen Werte mit den Inhalten im Array vergleichen.
Leider läuft die foreach Schleife nur einmal durch.

PHP:
$rain_result = $db_pdo->prepare("SELECT rain_date, rain_place, rain_mm, rain_... ");
$rain_result->execute();
$rain_result->fetch();

for ($i = $startdatum; $i < $enddatum; $i += 60) {
    echo date("Y-m-d H:i:s", $i);
    $n++;
    
    foreach ($rain_result as $row) {
        echo $row[rain_time];
        if ($row[rain_time] == date("H:i:s", $i)) {
            echo 'asdf';
        }
    }

    echo '<br>';
}
 
Hi,

1. $rain_result ist kein Array sondern ein PDOStatement-Objekt. Du möchtest auch den Rückgabewert speichern.
2. die Methode fetch() holt immer nur einen (den nächsten) Datensatz aus dem Ergebnis.

Du möchtest etwas in der Art machen:

PHP:
while($row = $rain_result->fetch(PDO::FETCH_ASSOC)) {
   ...
}

LG
 
Das habe ich auch schon probiert, aber das Ergebnis ist wieder das gleiche.
In der ersten Zeile (der for Schleife) bekomme ich alle Werte, die ich will, und dann ist Stille.

PHP:
for ($i = $startdatum; $i < $enddatum; $i += 60) {
    echo date("Y-m-d H:i:s", $i);
    $n++;

    while($row = $rain_result->fetch(PDO::FETCH_ASSOC)) {
        echo $row[rain_time];
    }
    echo '<br>';
}
 
So funktioniert es, aber da macht er doch insgesamt n SQL- Abfragen, oder?

PHP:
for ($i = $startdatum; $i < $enddatum; $i += 60) {
    echo date("Y-m-d H:i:s", $i);
    $n++;

    $rain_result->execute();
    while($row = $rain_result->fetch(PDO::FETCH_ASSOC)) {
        echo $row[rain_time];
    }
    echo '<br>';
}
 
Perfekt, danke.
Hast du vielleicht noch eine Idee, wie ich diesen Ablauf abspecken könnte?
Sobald der Zeitraum größer wird, läuft mir das ganze aus dem Ruder. Sowohl CPU als auch Speicher.

Bei mehr als 12 Tagen (15840x4148 vergleiche) macht er schlapp.
Dabei war das noch gar nicht alles, was er tun soll.

PHP:
$rain_result->execute();
$row = $rain_result->fetchAll(PDO::FETCH_ASSOC);

for ($i = $startdatum; $i < $enddatum; $i += 60) {

    $n++;
    
    $vdate = date("Y-m-d", $i);
    $vtime = date("H:i:s", $i);


    foreach ($row as $row2) {
        if ($row2[rain_date] == $vdate && $row2[rain_time] == $vtime) {
            $ba++;
        }
    }
}
 
Zuletzt bearbeitet:
Hi,

Du könntest das Datenbankergebnis vor der Schleife einmal durchlaufen und die Datensätze in ein Array mit dem Zeitstempel als Key speichern. Dann brauchst Du in der Schleife nur noch abfragen, ob ein entsprechender Eintrag im Array vorhanden ist. Funktioniert in der Form natürlich nur, wenn das gewollt ist, dass die DB-Einträge sekundengenau passen müssen.

Verrätst Du uns mal, was zur H**** Du da eigentlich treibst? Wofür braucht man ein Minutenzeitraster über 12 Tage (und mehr, wenn ich Dich richtig verstehe...)? :suspekt:

LG
 
Das gleiche habe ich mir heute morgen auch gedacht.
Ich habe mir überlegt, Datum und Zeit in eine Spalte zu bringen (db- Seitig) und dann ein Assoziatives Array zu erstellen.

Das soll eine Grafische Auswertung einiger Regensensoren werden. Man gibt seinen Zeitraum ein und erhält den Graphen. In der db sind nur Zeitpunkte mit Werten > 0 gespeichert. Um das jetzt zu Mitteln und anschließend an die Graphenklasse zu übergeben muss ich den gesamten Zeitraum erstellen. Da das Ganze bis zu einigen Jahren funktionieren soll, habe ich mir überlegt, die Mittelung schon beim Erstellen der Daten auf 5 Minuten zu erhöhen.
 
Hi,

wozu braucht man bei einem Graphen für z.B. Niederschlag über mehrere Jahre ein 5-Minutenraster? Wenn Du das wirklich on the fly machen und nicht z.B. Jahres- und Monatsübersichten einmal generieren willst, solltest Du das Raster entsprechend dem Zeitraum skalieren.

LG
 
Ich habe mir überlegt einen 1440 (1 Tag in Minuten) Raster zu erstellen, und dann die Daten auf diesen Wert zu Mitteln (Tage in Minuten / 1440 => Mittelungsfaktor). Damit habe ich die höchste Auflösung bei einem Tag und einen (glaube ich) ganz guten Mittelungsverlauf.
 
Zurück