Variablen innerhalb for-Schleife berechnen

VARIOmatic

Grünschnabel
Hallo Gemeinde,
nachdem ich nun ca. 100 Threads zum Thema durchsucht und ausprobiert habe, muss ich "leider" um Hilfe bitten.
Für das Backend eines Shops unseres e.V. auf unserer Seite oldie-camping.de arbeite ich an einer Art " Statistikseite". Dort sollen diverse Kennzahlen aber auch sämtliche Belege wie z.B. Ein- und Ausgangsrechnungen angezeigt werden. Dies funktioniert bis hierher alles gut.
Problem: Einzelsummen (positiv und negativ) die über eine zusätzliche DB-Abfrage je Belegnummer ermittelt werden, sollen - am liebsten - außerhalb der for-Schleife berechnet bzw. für weitere Aktionen bereitgestellt werden.
PHP:
$vehicles = unserialize ( $data1 ['mplace_rechnung'] );
     if (! empty ( $vehicles1 [0] ['nummer'] )) {
         for($i = 0; $i < $data1['zeilen']; $i ++) {
             $ccp_result = dbarray(dbquery("SELECT rechnung,tag,monat,jahr,valuta,comment FROM ".$db_prefix."ccp_buchungen WHERE rechnung='" . ($vehicles1 [$i] ['nummer']) . "'")); 
              if ( $ccp_result['rechnung'] == ($vehicles1 [$i] ['nummer'])) { 
                   // Beispielausgabe
                   echo "".$ccp_result['valuta'] = sprintf("%01.2f", $ccp_result['valuta'])."";

}
}
}

Kann mir jemand auf die Sprünge helfen?
Vorab besten Dank, Ingo
 
Hallo Yaslaw,
der vorige Code wird in einer While-Schleife platziert, in der ich den jeweiligen Artikel nach artikle_id abrufe. Dort ist unter anderem folgendes gespeichert, was mit vehicle1 [$i] ... aufgerufen wird

PHP:
a:10:{i:0;a:5:{s:4:"name";s:22:"Rechnung Stempelfabrik";s:6:"nummer";s:9:"101544194";s:4:"date";s:10:"12.06.2017";s:4:"zahl";s:3:"0.5";s:6:"aktion";s:1:"2";}i:1;a:5:{s:4:"name";s:40:"Ausgangsrechnung (ohne Beleg) T. Bublitz";s:6:"nummer";s:10:"3730744603";s:4:"date";s:10:"10.06.2017";s:4:"zahl";s:4:"0.28";s:6:"aktion";s:0:"";}i:2;a:5:
 
Das ist irrelevant.
Wichtig zu wissen ist, ob $vehicles1 auch aus der Datenbank kommt. Wenn ja, wie sieht der SQL-Code dazu aus?
ggf. Kann man beide SQL zu einer kombinieren, was sich positiv auf die Performance auswirken dürfte.
 
Ich speichere $vehicles1 folgendermaßen in der DB Spalte "mplace_rechnung"
PHP:
if (isset($_POST['mplace_submit'])) {
           $vehicles = "";
   for($i = 0; $i < 10; $i ++) {
   $vehicles [$i] ['name'] = $_POST ['vehicle' . $i . ''];
   $vehicles [$i] ['nummer'] = $_POST ['nummer' . $i . ''];
   $vehicles [$i] ['date'] = $_POST ['date' . $i . ''];
   $vehicles [$i] ['zahl'] = $_POST ['zahl' . $i . ''];
   $vehicles [$i] ['aktion'] = $_POST ['aktion' . $i . ''];
   $vehicles [$i] ['freigabe'] = $_POST ['freigabe' . $i . ''];
}
$mplace_changedate = time();
       $result = dbquery("UPDATE ".$db_prefix."marketplace SET
                                       mplace_changedate='$mplace_changedate',
                                         mplace_rechnung='" . serialize ( $vehicles ) . "'
                                          WHERE mplace_id='$mplace_id'");
 
OK. Kommt aus $_POST.

item: Der If if ( $ccp_result['rechnung'] == ($vehicles1 [$i] ['nummer'])) ergibt keinen Sinn, da du dies ja bereits mit dem WHERE im SQL erschlagen hast.
Am besten zuerst die Daten auslesen und dann ausgeben. In etwa so
PHP:
//Alle nummern extrahieren
//AB PHP 5.5 array_column(), ansonsten http://wiki.yaslaw.info/doku.php/php/functions/array/arrayextractsubitem
$numbers = array_column($vehicles , 'nummer');

//Annahme, nummer ist eine Zahl. Ansonsten muss mit einer Schlaufe jede Nummer in '' gefasst werden

//SQL für das Total
//Info zur Darstellung: http://wiki.yaslaw.info/doku.php/php/tutorials/sqlreadable#mit_variablen_im_sql-statement
$sqlSum = <<<SQL
    SELECT
        SUM(rechnung) AS total
    FROM
        %sccp_buchungen
    WHERE
        rechnung IN (%s)
SQL;


$sql = sprintf($sqlDetail, $db_prefix, implode(',', $numbers));
$sumResult =  dbarray(dbquery($sql));
// Das Total ausgeben
echo $sumResult['total'];

//SQL für die Details
$sqlDetail = <<<SQL
    SELECT
        rechnung,
        tag,
        monat,
        jahr,
        valuta,
        comment
    FROM
        %sccp_buchungen
    WHERE
        rechnung IN (%s)
SQL;
$sql = sprintf($sqlDetail, $db_prefix, implode(',', $numbers));
$details =  dbquery($sql);
//Da ich das Resultat von dbQuery nicht kenne, ist hier die Schleifge nur angedeutet
for each $ccp_result in $details{
    echo $ccp_result['valuta'];
}
 
Zuletzt bearbeitet:
Danke erstmal dafür. Das ist so gaaaanz anders wie ich es bis dato kenne... da muss ich mich zunächst mal reinfuchsen...
Lieben Dank
Ingo
 
Sollte performanter sein, weil du nicht pro Schleifendurchgang eine Abfrage an die DB machst.
 
Habe den Code mal probiert... klappt leider nicht. Zu meinem Verständnis: Ich ersetze meine for-Schleife mit deinem Code?!
Da nur PHP-Version 5.3.29, habe ich
PHP:
$numbers = array_extract_sub_item($vehicles , 'nummer');
angegeben. In Ordnung?

In dem Snippet
PHP:
for each $ccp_result in $details{
    echo $ccp_result['valuta'];
}
scheint ein Fehler zu sein, nur wenn ich diesen auskommentiere wird die Seite überhaupt geladen.

Außerdem wird bei
PHP:
echo $sumResult['total'];
kein Ergebnis angezeigt
 
Das Problem ist, ich kenne deine db-Funktionen nicht. Was ist der Rückgabewert von dbquery?
Ich zitiere den Kommentar in meinem Code: //Da ich das Resultat von dbQuery nicht kenne, ist hier die Schleifge nur angedeutet

Läuft da im Hintergurnd PDO? Oder MYSLQi? Oder eine Oracle-Zugriff?

Du musst wissen, was da kommen sollte.
 
Zurück