Hallo Jochen,
worauf Tom abzielte, war eine Überprüfung des empfangenen JSON-Objekts (das Du in PHP als assoziatives Array empfängst).
Eine Festlegung, welche Einträge Pflichtfelder sind, und eine Prüfung auf Erfüllung dieser Pflicht ist eine gute Idee. Du möchtest ja beispielsweise nicht str_replace mit NULL als drittem Parameter aufrufen. Ab PHP 8.1 haut Dir das eine deprecated-Meldung um die Ohren (warum auch immer die NULL mal erlaubt war).
Was Du definitiv nochmal gut überlegen solltest, ist utf8_decode.
Erster Grund für die Ablösung ist PHP 8.2, ab da ist diese Funktion deprecated. Schlauerweise sagt das PHP Handbuch nicht, was man statt dessen tun sollte, unter anderem deshalb, weil es 4 Alternativen gibt:
- Den alten Kram in die Tonne kloppen und statt dessen konsequent mit Unicode arbeiten. Darauf gehe ich im Anschluss ein - das ist zwar die beste Alternative, bei existierenden Projekten aber einiges an Arbeit.
- iconv (setzt ein "neueres Posix-konformes Betriebssystem" voraus - was auch immer das genau heißt)
- mb_convert_encoding (Die Multibyte-Extension braucht keine externen Libs, muss aber bein Compilieren von PHP aktiviert werden)
- UConverter::transcode (Teil der intl-Extension, braucht die ICU Library)
Lies Dir unter php.net durch, wie man die Funktionen verwendet. Du möchtest von UTF-8 nach ISO-8859-15 konvertieren.
Mit geht ein bisschen das Verständnis für die ganzen Voraussetzungen ab, die im PHP Handbuch für diese 3 Varianten gelistet sind. Zum einen bin ich kein PHP Selbstkompilierer, zum anderen bin ich mit PHP unter Linux unerfahren. Ich würde einfach ausprobieren, welche Variante funktioniert - vermutlich tun es alle 3. Welche davon speichersparender oder schneller ist, weiß ich auch nicht.
Wenn es funktioniert, wäre meine unmaßgebliche Empfehlung als zweitbeste Lösung diese:
$description = iconv("UTF-8", "ISO-8859-15//TRANSLIT", $jsonData['description']);
Die TRANSLIT-Option sucht Ersatzzeichen für nicht übersetzbare Codepoints und würde Dir aus "Pjotr Żyła" ein "Pjotr Zyla" machen. Nicht wirklich gut, aber besser als "?y?a" (utf8_decode), "ya" (UConverter::transcode), "ya" (iconv mit "ISO-8859-15//IGNORE" oder FALSE (iconv mit "ISO-8859-15", ohne Option).
Wichtig ist dann auch, dass deine DB-Verbindung und deine Datenbank-Collation auf ISO-8859-15 eingestellt sind. Der MYSQL-Default ist schwedisch. Besser ist natürlich UTF8, und zwar in der mb4-Variante. Auch da hat MYSQL den blöden Default "mb3", also UTF-8 Encoding mit maximal 3 Byte langen Codes, was beim Speichern eines Emojis zu einem SQL Fehler führt.
Und nun zur besten Lösung: Dass Du diese Funktion verwendest, bedeutet ja, dass Du PHP-seitig ISO-8859-1 (oder Latin-1) als Zeichencodierung verwendest. Das ist oft hinreichend für Anwendungen in deutscher Sprache, bis auf das € Zeichen. Das ist in ISO-8859-1 nicht enthalten, das gibt's nur in ISO-8859-15 (Latin-9).
Der schon erwähnte "Pjotr Żyła" springt Dir damit aber ins Gesicht. Und wenn der springt, hat das Wucht… Den speicherst Du bei ISO-8859-15 je nach Transcodingverfahren als ?y?a, Zyla, ya oder ya. Moderne Software sollte intern definitiv Unicode verwenden. Dazu musst Du
- PHP auf Unicode einstellen (was es per Default eigentlich sein sollte). Aber guck in deine PHP.ini, was da an encoding-Schaltern gesetzt ist.
- Deinen PHP Sourcecode als UTF-8 speichern (und zwar ohne BOM, sonst haut er Dir das BOM schneller raus als Du Fragezeichen Pe Ha Pe sagen kannst)
- Wenn Du eine Datenbank nutzt: Deine DB-Connection für Unicode einrichten (kann man beim Öffnen der Connection angeben oder im Server als Default setzen), und deine Datenbank und deine Tabellen vom bekloppten MySQL Default "schwedisch" auf mb4 umstellen (UTF-8 mit bis zu 4 Bytes langen Encodings - mb3 rastet aus wenn es ein Emoji bekommt). Diese Frage bei Stackoverflow scheint Antworten zu haben, die ziemlich ausführlich sind
- gründlich testen
- Bei jedem Aufruf einer Stringfunktion in PHP dringend überlegen, ob man dafür nicht besser das mb_...-Gegenstück verwendet.
Rolf
--
sumpsi - posui - obstruxi