WBCE CMS – Way Better Content Editing.
You are not logged in.
Pages: 1
Hallo,
habe auf WBCE 1.6.5 upgedatet, die Module auch. Nun passiert bei einer Änderung in mpform folgendes, beim klick auf speichern wird der screen weiß und es tut sich einfach nichts mehr. Natürlich wenn ich abbreche sind die geänderten Daten fort.
Vermutlich liegt es an dieser Datei /modules/mpform/save_settings.php - leider kann ich nicht finden was falsch ist.
VG dedra
Last edited by dedra (22.04.2026 18:24:12)
Offline
Was steht denn im Errorlog?
Sorgen sind wie Nudeln: man macht sich meist zu viele.
Offline
uh je.. wo finde ich das denn wieder?
ChatGPT hat auch mal analysiert... und Fehler gefunden:
Thema: mpForm speichert Einstellungen nicht (White Screen bei save_settings.php)
Umgebung:
CMS: WBCE / WebsiteBaker
Modul: mpForm v1.3.44
PHP-Version: vermutlich ≥ 7.4 / 8.x
Problem:
Beim Speichern der Einstellungen im Backend (save_settings.php) passiert nichts:
keine Fehlermeldung
weißer Bildschirm
Daten werden nicht gespeichert
Reproduzierbarer Ablauf:
mpForm Backend öffnen
Einstellungen ändern
„Speichern“ klicken
→ White Screen
Bisherige Analyse:
Fehler tritt in /modules/mpform/save_settings.php auf
Ursache vermutlich:
$section_id wird zu spät gesetzt
DB-Query liefert kein Ergebnis
fetchRow() gibt false zurück
Zugriff auf $res['page_id'] → PHP Fatal Error
Vermuteter Fix:
$section_id und $page_id vor DB-Query setzen
Zugriff auf $res absichern
Code-Ausschnitt (relevant):
$query_content = $database->query(
"SELECT * FROM ".TABLE_PREFIX."sections WHERE section_id = '$section_id'"
);
$res = $query_content->fetchRow();
if ($res['page_id'] != $page_id)
Ziel im neuen Chat:
vollständiger PHP-8-kompatibler Patch für mpForm
stabile Speicherung ohne White Screen
Offline
Admintools > Errorlog Viewer
Sorgen sind wie Nudeln: man macht sich meist zu viele.
Offline
dedra
den Kommentar
// convert page/section id to numbers
// (already checked by /modules/admin.php but kept for consistency)
hat ChatGPT geflissentlich ignoriert. Das ist glaub ich noch ein Relikt aus WB 2.6 Zeiten oder so...
Zugegeben, wenn man das Setzen der $section_id und $page_id (eigentlich unnötigerweise) drin lässt, dann müsste man es auch vor die erste Verwendung dieser Variablen setzen, das ist schon richtig. Aber der Grund für den Fehler wird das wohl eher nicht sein, da das gleiche schon außerhalb der save_settings.php in der admin-Klasse passiert und die Variablen bereits vorbelegt sein müssten.
Offline
das steht im Errorlog viewer:
2026-04-22T21:53:18+00:00 [Visitor Request] https://testwebseite.de/modules/mpform/ … ttings.php
2026-04-22T21:53:18+00:00 [Exception] There was an unknown exception: idn_to_ascii(): Argument #1 ($domain) must not be empty in line (627) of /framework/class.wb.php
in der genannten Zeile steht: $email = @idn_to_ascii($email);
Last edited by dedra (23.04.2026 00:02:02)
Offline
Toll, auch dafür gab KI Lösungsvorschläge:
Du hast zwei Möglichkeiten: Den Datensatz korrigieren oder den Code "unkaputtbar" machen.
Lösung A: Fehlende Daten ergänzen (Der schnelle Weg)
Prüfe in deiner Datenbank (z. B. via phpMyAdmin) die Tabelle config oder die spezifische Einstellungs-Tabelle von mpform.
Suche nach Feldern, die E-Mail-Adressen enthalten sollten (z. B. SERVER_EMAIL, REPLY_TO, EMAIL_FROM).
Wenn eines dieser Felder leer ist, trage testweise eine gültige E-Mail-Adresse ein.
Versuche danach erneut, im Admin-Bereich zu speichern.
Lösung B: Code-Anpassung (Der dauerhafte Weg)
Du kannst die entsprechende Stelle im Framework absichern, damit leere Werte nicht zum Absturz führen.
Öffne die Datei: /framework/class.wb.php.
Suche die Zeile 627.
Dort steht vermutlich etwas wie:
PHP
$domain = idn_to_ascii($domain);
Ersetze diese Zeile (oder umschließe sie) mit einer Prüfung:
PHP
if (!empty($domain)) {
$domain = idn_to_ascii($domain);
}
Warum passiert das jetzt?
Da wir uns im Jahr 2026 befinden, läuft dein Server höchstwahrscheinlich auf einer modernen PHP-Version (vielleicht PHP 8.2 oder 8.3). Frühere PHP-Versionen waren bei leeren Argumenten oft gnädig und gaben einfach false zurück, während moderne Versionen eine Fatal Exception werfen.
Habe Lösung A umgesetzt, per phpMyAdmin die leeren E-Mail-Felder ausgefüllt.
Ergebnis: kein weißer screen mehr beim speichern, im Errorlog viewer steht dafür nun das hier:
2026-04-22T22:08:19+00:00 [Visitor Request] https://testwebseite.de/modules/adminer … n_id%5D=94
2026-04-22T22:08:19+00:00 [Deprecated] /modules/adminer/adminer/wrapper.php:[15] from /modules/adminer/adminer/wrapper.php:[15] exit "exit(): Passing null to parameter #1 ($status) of type string|int is deprecated"
Erstmal zufrieden, das es nun gefixt ist & wieder etwas dazu gelernt (auch Dank KI)
Offline
Fehler bestätigt.
Wie lässt sich das sinnvoll reparieren? Wenn ich in der class.wb.php
public function validate_email($email)
{
if (function_exists('idn_to_ascii')) {
// use pear if available
$email = @idn_to_ascii($email);
} else {
require_once WB_PATH . '/include/idna_convert/idna_convert.class.php';
$IDN = new idna_convert();
$email = $IDN->encode($email);
unset($IDN);
}
// regex from NorHei 2011-01-11
$retval = preg_match("/^((([!#$%&'*+\\-\/\=?^_`{|}~\w])|([!#$%&'*+\\-\/\=?^_`{|}~\w][!#$%&'*+\\-\/\=?^_`{|}~\.\w]{0,}[!#$%&'*+\\-\/\=?^_`{|}~\w]))[@]\w+(([-.]|\-\-)\w+)*\.\w+(([-.]|\-\-)\w+)*)$/", $email);
return ($retval != false);
}ändere zu
public function validate_email($email)
{
if (!empty($email)) {
if (function_exists('idn_to_ascii')) {
// use pear if available
$email = @idn_to_ascii($email);
} else {
require_once WB_PATH . '/include/idna_convert/idna_convert.class.php';
$IDN = new idna_convert();
$email = $IDN->encode($email);
unset($IDN);
}
}
// regex from NorHei 2011-01-11
$retval = preg_match("/^((([!#$%&'*+\\-\/\=?^_`{|}~\w])|([!#$%&'*+\\-\/\=?^_`{|}~\w][!#$%&'*+\\-\/\=?^_`{|}~\.\w]{0,}[!#$%&'*+\\-\/\=?^_`{|}~\w]))[@]\w+(([-.]|\-\-)\w+)*\.\w+(([-.]|\-\-)\w+)*)$/", $email);
return ($retval != false);
}scheint mir die Funktion gar nicht mehr ausgeführt zu werden.
Last edited by florian (23.04.2026 07:47:11)
Sorgen sind wie Nudeln: man macht sich meist zu viele.
Offline
Da ich ja kein Programmierer bin, war mir das mit phpMyAdmin "sicherer" und siehe da, es funktioniert nun ja auch.
Die KI kann einiges, macht aber auch viele Fehler, da muss man schon genau hinschauen.
Danke.
Offline
Hm ...
Einfacher geht es wenn man zum //alten// Verhalten zurück kehrt und
bei einem einfachen leeren String stumpf »false« zurück gibt:
[== PHP ==]
/**
* @brief Validate the supplied email address.
*
* @param string The email to test.
* @return bool False if not valid or emtpy.
*/
public function validate_email(string $email): bool
{
if (empty($email)) {
return false;
}
if (function_exists('idn_to_ascii')) {
// Use internal if available.
// See: https://www.php.net/manual/en/function.idn-to-ascii.php
$email = idn_to_ascii($email);
} else {
require_once WB_PATH . '/include/idna_convert/idna_convert.class.php';
$IDN = new idna_convert();
$email = $IDN->encode($email);
unset($IDN);
}
// regex from NorHei 2011-01-11
$retval = preg_match("/^((([!#$%&'*+\\-\/\=?^_`{|}~\w])|([!#$%&'*+\\-\/\=?^_`{|}~\w][!#$%&'*+\\-\/\=?^_`{|}~\.\w]{0,}[!#$%&'*+\\-\/\=?^_`{|}~\w]))[@]\w+(([-.]|\-\-)\w+)*\.\w+(([-.]|\-\-)\w+)*)$/", $email);
return ($retval != false);
}Hope it helps
Kant
Last edited by kant (24.04.2026 01:30:59)
Sapere aude!
Offline
florian, stefanek
Ja danke Kant, das mit dem "early return on empty" is der richtige Hinweis.
Danke auch Florian, dass Du mich auf diesen Thread aufmerksam gemacht hast.
Was mir auch auffällt, die Verwendung von idn_to_ascii ist hier etwas falsch (denn die funktion konvertiert hauptsächlich den Internationalisierten Domain Namen.
Auch der Fallback auf die idna_convert.class.php ist nicht wirklich zeitgemäß.
(Zumal idn_to_ascii heute fast überall vorinstalliert ist.)
Das Regex ist mittlerweile auch obsolet geworden und kann durch filter_var mit FILTER_VALIDATE_EMAIL ersetzt werden.
Mein Vorschlag:
[== PHP ==]
/**
* Validates the supplied email address.
*
* Handles internationalized domain names (IDN) by converting the domain
* part to its ASCII-compatible encoding (ACE/Punycode) before validation.
* Requires the intl extension for IDN support (idn_to_ascii).
* Falls back to raw domain validation if the extension is unavailable.
*
* @param string $email The email address to validate.
* @return bool Returns true if the email address is valid,
* false if empty or invalid.
*
* @see https://www.php.net/manual/en/function.idn-to-ascii.php
* @see https://www.php.net/manual/en/function.filter-var.php
*/
public function validate_email(string $email): bool
{
if (empty($email)) {
return false;
}
if (str_contains($email, '@')) {
[$local, $domain] = explode('@', $email, 2);
if (function_exists('idn_to_ascii')) {
$ascii = idn_to_ascii($domain, IDNA_DEFAULT, INTL_IDNA_VARIANT_UTS46);
// idn_to_ascii returns false on failure
if ($ascii !== false) {
$domain = $ascii;
}
}
// If intl is unavailable, fall through with the raw domain.
// filter_var will still catch obviously malformed addresses.
$email = $local . '@' . $domain;
}
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}Christian
P.S. so könnten wir auch den include Ordner etwas erleichtern, denn diese Klasse wird nur einmal in dieser obigen Methode verwendet.
“Success is the progressive realization of a worthy ideal.” ― Earl Nightingale
Online
Danke für Eure Hinweise, wenn es auch weiteren Nutzern hilft, um so besser.
Offline
stefanek
Hm ... so weit so gut ... getestet und bei GiT als PullRequest
https://github.com/WBCE/WBCE_CMS/pulls eingereicht - sehe nichts was dagegen sprechen sollte.
Gruß
Kant
Sapere aude!
Offline
stefanek
Vielen Dank für's Gegenchecken und für den PullRequest.
Christian
“Success is the progressive realization of a worthy ideal.” ― Earl Nightingale
Online
gemerged
Sorgen sind wie Nudeln: man macht sich meist zu viele.
Offline
kant
Gibt's ein Take-away für mpform? Ich nehme an, dass irgendwo eine Option zum Senden von Emails gesetzt war, aber keine Email-Adresse angegeben war. Das hat bisher funktioniert, fällt aber mit neueren php-Versionen auf die Nase.
Wenn wir den Fix aus dem Pull-Request im Core haben, dürfte der Code (unter diesem Aspekt) weiterhin so funktionieren, wie unter früheren php-Versionen, richtig?
Offline
Ja, so wie ich es sehe ist es genau das, was in Post#6 stand.
Und der early return verhindert, dass ein "empty" by der besagten funktion überhaupt ankommt.
Daher ja, es wird dann weiterhin auch unter neueren PHP Versionen nicht meckern, nachdem die Funktion jetzt dahingehend angepasst wurde.
Christian
“Success is the progressive realization of a worthy ideal.” ― Earl Nightingale
Online
florian
Pages: 1