Mail versenden pro Zeile aus DB


Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

EuroCent

KlappStuhl 2.0
#1
Hallo und guten Morgen zusammen,

ich sitze vor einer Herausforderung...
Ich habe in meiner Datenbank Tabelle Inhalt mit verschiedenen Parametern die für einen Report gebraucht werden.

Die Reports werden mit einem Intervall versehen (Tag, Woche, Monat).
In meinem Script möchte Ich zum einem den Report aufbauen und dann entsprechend per Mail versenden.
Und das soll pro Zeile aus der Datenbank passieren.

Der Report wird mittels PhpSpreadSheet erstellt.
Einen festen zu Definieren ist nicht möglich, da es immer unterschiedliche Reports sind. :)

Hoffe das einer eventuell einen Ansatz hat, wie Ich am besten vorgehe.

Mein aktueller Ansatz ist:
- Auslesen aus der Datenbank
- Aufbau der While-Schleife und Inhalt in ein Array speichern
- Array Filter und Mergen
- For Schleife um den Report pro Array-Inhalt aufbauen und genau hier Scheitere... :/

Mein Versuch:
PHP:
<?php
$test[] = array();

$sql_read_reports = "SELECT * FROM [mf_auto_report] WHERE [interval] = 'tag'";
$rs_read_reports = $mainPage->getDataFromDb($sql_read_reports);
while ($row = sqlsrv_fetch_array($rs_read_reports)) {
    $id = $row['id'];
    $json = unserialize($row['getjson']);

    $test[$id] = $json;
}

$setSheatHeader = "";
$setSheetContent = "";
$klarnamen = array(
    'mf_id' => 'MFID',
    'betreff' => 'Betreff',
    'trackid' => 'TrackingID',
    'Datumsfeld' => 'Datum',
    'Kundennummer' => 'Kundennummer',
    'Produkt' => 'Produkt',
    'Stoerungsbeschreibung' => 'Beschreibung',
    'von' => 'Absender',
    'erstelldatum' => 'erstellt',
    'versanddatum' => 'versandt',
    'an' => 'Empfaenger',
    'bcc' => 'Blind',
    'cc' => 'Kopie',
    'replyto' => 'Reply'
);

for ($i = 0; $i < count($test); $i++) {
    $alphabethArray = array('A', 'B', 'C', 'D', 'E', 'F', 'I', 'J', 'K', 'L', 'M', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');
    $alphCount = 0;
    $setSheatHeader .= "/* REPORT FÜR {$i} */\r";
    foreach ($test[$i]['datas'] as $key => $value) {
        if ($value['feld_name'] != '') {
            $setSheatHeader .= "\$sheet->setCellValue('{$alphabethArray[$alphCount]}1', '{$klarnamen[$value['feld_name']]}');\r";
            $setSheetContent .= "    \$sheet->setCellValue('{$alphabethArray[$alphCount]}' . \$cell, rawurldecode(\$row['{$value['feld_name']}']));\r\n";
            $alphCount++;
        }
    }
}
?>
 

Yaslaw

n/a
Moderator
#2
Geht es hier um das Erstellen des Reports oder ums versenden?
Was willst du in den Array schreiben und FIltern? Die Reportdaten?

Sorry, ich versteh die Frage nicht.
 

EuroCent

KlappStuhl 2.0
#3
Hauptsächlich um das Versenden.
Da die Verteiler liste immer jemand anderes ist.
Der Verteiler ist in dem Array hinterlegt und definiert.

Mein Problem liegt daran, dass wenn der Report erstellt wird/wurde, dass dann die Mail dazu versendet wird.
Erst dann soll er die nächsten Daten ziehen. :)

Ich steh nur zurzeit auf dem Schlauch. :)
 

Yaslaw

n/a
Moderator
#4
öhm. Ja, Einfach nach dem Erstellen der Datei jeweils den Mailversand anhängen.
Du solltest deine Variabeln sinnvoll bennenn. $test ist ein Array über die Reports?
$json ist ein Objekt oder ein Array. mit $json bezeichnet man normalerweise den JSON-String, nicht das Objekt, welches im JSON-String abgelegt wird.

Ich denke, der Mailversand kommt an den Schluss der ersten Schleife
 

EuroCent

KlappStuhl 2.0
#5
@Yaslaw
Wie die Variablen aktuell heißen, ist ja nicht wirklich interessant, aber verstehe was Du damit meinst. :)

Die Variablen bleiben namentlich nicht so bestehen, die werden dann so benannt, dass man versteht für was Sie sind bzw. deren Inhalt darstellt.

Hier mein neuer Versuch - hier wurden die Variablen bereits umbenennt:

PHP:
<?php
/* SQL QUERY DAYLY */
// TODO: SQL Abfrage für die Täglichen Formulare
$sql_read_reports = "SELECT * FROM [dbo].[mf_auto_report] WHERE [interval] = 'tag'";
$rs_read_reports = $mainPage->getDataFromDb($sql_read_reports);
$anzahl = sqlsrv_num_rows($rs_read_reports);
$fieldObject[] = (object) [];
$alphabeth = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');
$alphaCount = 0;
$klarnamen = array(
    'mf_id'             => 'MFID',
    'betreff'           => 'Betreff',
    'text'              => 'Nachricht',
    'emfaenger'         => 'An',
    'absender'          => 'Von',
    'erstelldatum'      => 'erstellt',
    'versand_datum'     => 'versandt',
    'tracking_id'       => 'TrackingID',
    'bcc'               => 'BCC',
    'cc'                => 'CC',
    'replyto'           => 'ReplyTo',
    'OFFNOT'            => 'OFFNOT',
    'OFFNOT_Datetime'   => 'OFFNOT erstellt'
);

for ($i = 0; $i < $anzahl; $i++) {
    echo "Fange bei " . $i ." an<br />";
    
    $row = sqlsrv_fetch_array($rs_read_reports);
    $jsonArray = json_decode($row['getjson']);
    $jsonFields = $jsonArray->datas;
    $sql_fields = "";
    
    foreach ($jsonFields as $key => $value) {
        foreach ($jsonFields[$key] as $key2 => $value2) {
            if ($jsonFields[$key]->felder && $key2 === 'felder') {
                $fieldObject[$row['mf_id']]->$key2[$key] = $jsonFields[$key]->felder;
                $sql_fields .=  "[e].[".$jsonFields[$key]->felder. "],\r";
                /* SET TITLEBAR HEADER */
                $sheet->setCellValue($alphabeth[$alphaCount].'1', '');
                $alphaCount++;
            }
        }
    }
    
    echo "Entferne Null-Wert aus dem Array von " . $i."<br />";
    unset($fieldObject[0]);

    echo "SQL wird erstellt von " . $i."<br />";
    $sql_create_report = "SELECT
        {$sql_fields}
        [ab].[benutzer_ad],
    [ab].[benutzer_ccb],
    [at].[benutzerteam_bez]
        FROM [dbo].[mf_email] e
        INNER JOIN [apps_benutzer] ab ON([ab].[GUID] = [e].[guid])
        LEFT JOIN [apps_benutzerteam] at ON([at].[benutzerteam_id] = [ab].[benutzer_team])
        WHERE
            [mf_id] = {$jsonObject->mfid}
            AND
            [e].[versand_datum] BETWEEN GETDATE()-7 AND GETDATE()
        ORDER BY [e].[versand_datum] ASC";
            
    echo "Schicke SQL an Datenbank von " . $i."<br />";
    
    $rs_create_export = $mainPage->getDataFromDb($sql_create_report);
    
    $sheet = $spreadsheet->getActiveSheet();
    $sheet->setTitle("MF{$jsonObject->mfid}_Report_taeglich");

    $cell = 1;

    printf('<pre>%s</pre>', print_r($sql_create_report, true));
    
    echo "Fertig von " . $i."<br /><br />";
}
?>
 

Yaslaw

n/a
Moderator
#6
Gute Variabelnamen helfen einem Aussenstehenden zu verstehen was der Code macht.

Ich versuche moment gerade 2 Dinge.
1) zu verstehen was deine Frage ist
2) zu vsrtehen was dein Code macht. Ist schwer, wenn man den AUfbau und die Logik nicht kennt.
Was it $key2?

Und ja, etwa auf Zeile 75 müsste der Versand rein. Das war doch deine Frage, wo der Versand hin soll.
 

EuroCent

KlappStuhl 2.0
#7
Gute Variabelnamen helfen einem Aussenstehenden zu verstehen was der Code macht.

Ich versuche moment gerade 2 Dinge.
1) zu verstehen was deine Frage ist
2) zu vsrtehen was dein Code macht. Ist schwer, wenn man den AUfbau und die Logik nicht kennt.
Was it $key2?

Und ja, etwa auf Zeile 75 müsste der Versand rein. Das war doch deine Frage, wo der Versand hin soll.
Guten Morgen @Yaslaw

zu 1.: Meine Frage war zum einem wo der Code dafür hin. :)
zu 2.: $key2 ist der Inhalt aus dem jsonArray... :)
In dem jsonArray gibt es den bezeichner "Felder" in diesem Bezeichner sind aber mehrere felder definiert die aber notwenig sind.

Man könnte auch meinen dass die felder den feldern in der Datenbank ähneln.
Ich hätte es zwar auch statisch rein schreiben können, aber da der Report dynamisch gehalten werden soll, kann Ich nicht alle Felder mitgeben, die nicht notwendig für den aktuellen Report sind/wären.

Aber deine Antwort ist vollkommend ausreichend :)

Vielen lieben Dank
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…