Seite 1 von 1

PHP Warning bei Newsletter-Job erstellen

Verfasst: Do 19. Okt 2023, 08:19
von achiboy
Ist es ok, wenn ich für jeden Punkt ein eigenes Thema mache?

Beim Erstellen des Newsletter-Jobs wird folgende Warning geschrieben:

Code: Alles auswählen

PHP Warning:  Undefined variable $sValue in ...\contenido\plugins\newsletter\classes\class.newsletter.php on line 399
In der ...\contenido\plugins\newsletter\classes\class.newsletter.php wird in der Funktion _deChunkHTTPBody der Header zusammengebaut:

Code: Alles auswählen

        $aParts = preg_split("/\r?\n/", $sHeader, -1, PREG_SPLIT_NO_EMPTY);

        $aHeader = [];
        for ($i = 0;$i < sizeof ($aParts); $i++) {
            if ($i != 0) {
                $iPos       = cString::findFirstPos($aParts[$i], ':');
                $sParameter = cString::toLowerCase(str_replace(' ', '', cString::getPartOfString($aParts[$i], 0, $iPos)));
                $sValue     = trim(cString::getPartOfString($aParts[$i], ($iPos + 1)));
            } else {
                $sField      = 'status';
                $aParameters = explode(' ', $aParts[$i]);
                $sParameter  = $aParameters[1];
            }

            if ($sParameter == 'set-cookie') {
                $aHeader['cookies'][] = $sValue;
            } elseif ($sParameter == 'content-type') {
                if (($iPos = cString::findFirstPos($sValue, ';')) !== false) {
                    $aHeader[$sParameter] = cString::getPartOfString($sValue, 0, $iPos);
                } else {
                    $aHeader[$sParameter] = $sValue;
                }
            } else {
                $aHeader[$sParameter] = $sValue;
            }
        }
Das Problem scheint beim "Status" zu liegen. Denn da werden die folgenden Werte ermittelt:
  • $sParameter: 200
  • $sValue:
Liegt das Problem also in den folgenden Zeilen?

Code: Alles auswählen

                $sField      = 'status';
                $aParameters = explode(' ', $aParts[$i]);
                $sParameter  = $aParameters[1];
$sField wird nirgends verwendet.
In $sParameter scheint der Wert zu liegen, den wir als $sValue brauchen?

ich bin wirklich sehr unsicher, aber könnte in dem Fall der folgende Code korrekt sein?

Code: Alles auswählen

                $sParameter  = 'status';
                $aParameters = explode(' ', $aParts[$i]);
                $sValue      = $aParameters[1];

Re: PHP Warning bei Newsletter-Job erstellen

Verfasst: Fr 20. Okt 2023, 16:29
von Faar
achiboy hat geschrieben:
Do 19. Okt 2023, 08:19
Ist es ok, wenn ich für jeden Punkt ein eigenes Thema mache?
Eher nein, weil das sonst kein Ende nimmt. Lieber sammeln in einem Posting.
Es sind nur PHP Warnungen, keine fatale Fehler.
Beim Erstellen des Newsletter-Jobs wird folgende Warning geschrieben:

Code: Alles auswählen

PHP Warning:  Undefined variable $sValue in ...\contenido\plugins\newsletter\classes\class.newsletter.php on line 399
Ja, wieder eine der vielen Variablen, die nicht vorher deklariert wurden.
Vermutlich trifft eine IF Entscheidung nicht zu und dann gibt es $sValue einfach nicht, wird aber später leichtsinnigerweise abgefragt, ohne vorher festzustellen, ob sie überhaupt existiert. Ja, das ist PHP 8.x

Re: PHP Warning bei Newsletter-Job erstellen

Verfasst: Sa 28. Okt 2023, 10:51
von achiboy
wie muss ich vorgehen, damit ich beim Beheben von so Kleinigkeiten, wie undefinierte Variabeln definieren, mithelfen kann?

Re: PHP Warning bei Newsletter-Job erstellen

Verfasst: So 29. Okt 2023, 11:14
von Faar
achiboy hat geschrieben:
Sa 28. Okt 2023, 10:51
wie muss ich vorgehen, damit ich beim Beheben von so Kleinigkeiten, wie undefinierte Variabeln definieren, mithelfen kann?
Der einfachste Fall ist, wenn sowas auftaucht:

Code: Alles auswählen

<?php
echo $broetchen." Brötchen wurden gekauft.";
// falsch, $broetchen ist nicht definiert
?>

<?php
$broetchen = 0; // Variable wird erzeugt und mit 0 als Zahl definiert, "" wäre dann ein String
$broetchen = 2; // Der Variablen wird die Zahl 2 zugewiesen, als String wäre es "2". Wenn man mit der Variablen rechnen will, nimmt man Zahl.
echo $broetchen." Brötchen wurden gekauft."; // sollte als Ergebnis '2 Brötchen wurden gekauft.' ausgeben.
?>

<?php
$broechten = $_POST["anzahl"]; // $_POST["anzahl"] gibt es erst, wenn das Formular abgeschickt wurde, also existiert es beim ersten Seitenaufruf noch nicht, Fehler
echo $broetchen." Brötchen wurden gekauft.";
<form action="cassa.php" method="post">
...
?>

<?php
$broechten = $_POST["anzahl"] ?? "0"; // Wenn $_POST["anzahl"] noch nicht existiert, wird hier das Zeichen "0" übergeben, als String. Damit wird kein Fehler ausgelöst.
echo $broetchen." Brötchen wurden gekauft."; // das würde dann '0 Brötchen wurden gekauft.' beim ersten Seitenaufruf ausgeben.
<form action="cassa.php" method="post">
...
?>
Natürlich kann die Sache komplizierter werden und.
In den alten Modulen findet sich oft genug auch noch NULL als Zuweisung für eine Variable, die eigentlich ein String erwartet aber NULL ist kein String. Beispiel altes Modul content_text:

Code: Alles auswählen

// alt
if ($edit) {
    $label = mi18n("LABEL_TEXT");
} else {
    $label = NULL;
}
// Hier oben sind gleich 2 Fehler, weil $edit nicht immer definiert ist und $label eine String-Variable sein sollte, da sie im Folgenden dann den String an das Template übergibt. Das Template würde dann ein NULL bekommen, was nun gar nicht passt.

// neu
if (cRegistry::isBackendEditMode()) {
    $label = mi18n("LABEL_TEXT");
} else {
    $label = '';
}

Re: PHP Warning bei Newsletter-Job erstellen

Verfasst: So 29. Okt 2023, 12:38
von achiboy
Nein, ich meine, wie kann ich beim Contenido Projekt mithelfen

Re: PHP Warning bei Newsletter-Job erstellen

Verfasst: Mo 30. Okt 2023, 09:34
von Faar
achiboy hat geschrieben:
So 29. Okt 2023, 12:38
Nein, ich meine, wie kann ich beim Contenido Projekt mithelfen
Hier, über Github:
https://github.com/CONTENIDO/CONTENIDO
Einen eigenen Fork machen, seine Sachen darauf entwickeln und mit dem original Quellcode aktuell halten, weil Xmurrix manchmal schnell und viel arbeitet, und wenn man meint, man hat was brauchbares, dann einen Pull Request starten.