Datenschutz Impressum

NOF-Schule | Forum

zur Schule NOF-NetObjects-Tutorials von Tommy Herrmann

Die Foren sind geschlossen. Für Fragen zu MR, NOF & mehr steht Tommys Forum zur Verfügung. Ich danke für die langjährige Treue und Mitarbeit! Eure Administratorin.

Illegal mix of collations
#1
Hallo,

ich bin gerade dabei meine Internetseite (erstellt mit NOF-9) auf utf-8 umzustellen da mein Hoster nur noch utf-8 unterstützt.
Ich bekomme jetzt bei einem Anmeldeformular die Fehlermeldung:

Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation '<>'

Die Formulardaten werden in eine Datenbank eingetragen und es wird eine Mail mit der Anmeldebestätigung verschickt.

Die PHP-Version meines Hosters ist auf 5.6.40 eingestellt.
Der PHP default_charset ist auf UTF-8 eingestellt.
Die Kollation aller Datenbank Tabellen habe ich auf utf8_general_ci umgestellt.
Meine Internetseite enthällt das Mata-Tage: <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

Woher kommt diese Fehlermeldung?
Alle Beiträge dieses Benutzers finden
#2
Hallo,

NOF ist total veraltet und kann die meisten seiner Komponenten nur noch bis PHP 5.4 ausführen. Eigentlich ist PHP 7 aktuell und dann geht mit NOF gar nichts mehr.

Du sollest Dich langsam mal mit einer neuen Software beschäftigen, denn NOF ist tot und wird seit dem Jahr 2015 nicht mehr gepflegt und schon gar nicht mehr weiter entwickelt.

NOF 9 geht schon überhaupt nicht mehr, denn da sind noch nicht einmal die internen Komponenten auf UTF-8 konvertiert. Alles steht noch auf ANSI.

Du kannst aber in NOF externe Skripte, wie jene von "Werner-Zenk.de", sehr einfach einbinden. Hier ein Formular-Beispiel Tutorial von meiner Seite:

http://www.nof-tutorials.com/Kontakt-For...torial.php
Alle Beiträge dieses Benutzers finden
#3
Vielleicht hilft das?
https://interworks.com/blog/bbausili/201...collation/

Ich vermute eine der Spalten in einem Vergleich <> hat eine andere collation.
Alle Beiträge dieses Benutzers finden
#4
(23.10.2020, 21:18)Klaus2 schrieb: Ich vermute eine der Spalten in einem Vergleich <> hat eine andere collation.

Ich finde in dem Quelltext überhaupt keine Operation: "<>".
Ich habe lediglich einen Vergleich: "!=":
$sql="SELECT status FROM kunden WHERE E_Mail='$Mail' and status != 'gelöscht'";
Kann es daran liegen?
Alle Beiträge dieses Benutzers finden
#5
Ggf. wird von MySQL eine Fehlermeldung bei einem fehlgeschlagenem Befehl mit != als <> ausgegeben da es ja dasselbe ist.

https://dev.mysql.com/doc/refman/8.0/en/...ators.html

Ist das "MySQL Skript" auch auf UTF-8 eingestellt oder noch auf ANSI?

Die Codierung kann man z.B. in Notepad++ nachsehen und im Menü "Kodierung" auf "UTF-8 ohne BOM" umstellen.
Alle Beiträge dieses Benutzers finden
#6
Das Problem bei NOF ist doch, dass erst mit dem Update 1 von NOF 15 bestimmte Editoren nun auf UTF-8 konvertiert wurden.

In NOF 9 geht das gar nicht in UTF-8.

Alle Einträge in den Editoren wurden früher im ANSI Format abgelegt. Es kommt also ganz darauf an, wo das Skript eingebaut wurde.

Selbst der Code im "Objekt Editor" und auch im "Head Bereich" von NOF 15 ist immer noch nicht in UTF-8, sondern nur und ausschließlich der "HTML Code Editor" ist für UTF-8 geeignet und das nur in NOF 15 inklusive Update 1.

Alle Datenbank-Komponenten von NOF funktionieren nicht mehr. NOF ist hoffnungslos veraltet.

Die HTML-Ausgabe muss in NOF auf UTF-8 stehen, wenn PHP verwendet werden soll. Da spielen aber etliche Komponenten und Editoren von NOF nicht mit. Deswegen war bei mir mit NOF ab der PHP-Version PHP 5.6 eben auch Schluss.

Schon der Umlaut im Wort 'gelöscht' wird dann von NOF falsch übergeben.

Ich denke mal, da könnte und wird das Problem liegen.
Alle Beiträge dieses Benutzers finden
#7
Falls der Code tatsächlich über NOF 9 in die Seite eingebaut wurde kann man das auch lösen wenn man den richtig codierten Code über "Datei einfügen..." aus einer Datei einläd.

... wobei ggf. auch zu Überlegen ist ob man über die DB nicht einen "Trafo" laufen lässt und den status von gelöscht auf etwas anderes ohne Umlaute setzt und die Skripte entsprechend anpasst.


.png  NOF9Uml.PNG (Größe: 14,35 KB / Downloads: 53)
Alle Beiträge dieses Benutzers finden
#8
Folgende Punkte sind wichtig:
1. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="UTF-8">

2. Das Formular-Script auf "UTF-8 ohne BOM" umstellen, beachte den Kommentar von Klaus2

3. Bei der Verbindung zur Datenbank muss die Kodierung gesetzt sein.
Bei den alten mysql()-Funktionen ist das dann:
mysql_set_charset("utf8", $link);  https://www.php.net/manual/de/function.m...harset.php

soso schrieb:Die Kollation aller Datenbank Tabellen habe ich auf utf8_general_ci umgestellt.

"Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation '<>'"

utf8_general_ci ist nicht utf8mb4_general_ci, stelle deine Spalten in der Datenbank auf eine einheitliche Kodierung um. Mit phpMyAdmin geht das eigentlich sehr einfach, die Frage ist jetzt nur wie war die Kodierung vor der Umstellung. Möglicherweise sind die Daten in der DB-Tabelle beschädigt, überprüfe das mit phpMyAdmin, schaue dir die Einträge in den Spalten an!

soso schrieb:$sql="SELECT status FROM kunden WHERE E_Mail='$Mail' and status != 'gelöscht'";

Besonders die Spalte status in der gespeichert wird ob die E_Mail 'gelöscht' werden soll!

https://werner-zenk.de/tipps/schriftzeic...tellen.php
Alle Beiträge dieses Benutzers finden
#9
1. Ich hab jetzt mal die SQL-Abfrage auskommentiert. Damit ist diese Fehlermeldung erst mal weg. Ich füge den PHP-Code mit der SQL-Abfrage unter Tabellen-HTML vor dem Tag manuell ein.

2. mysql_set_charset("utf8", $db); nach dem $db=mysql_connect() eingefügt und die SQL-Abfrage wieder zugelassen. Jetzt kommt auch keine Fehlermeldung mehr.

3. Es werden auch die Umlaute aus den Eingabefeldern richtig in der Datenbank eingetragen.

4. Leider wird die Mail noch nicht zum Anmelder geschickt. Das mache ich mit folgendem Code:
Code:
//  Bestätigungs-Mail an Kunden:
    if(!$Datei=fopen("../Anmelde_Mail.txt","r")){
      error(307,"Datei Anmelde_Mail.txt kann nicht ge&oumlffnet werden!",true);
      }
    while(!feof($Datei)){
      $Nachricht.=fgets($Datei,1024);
      }
    fclose($Datei);
    $Nachricht=pc_html2ascii($Nachricht);
    eval("\$Nachricht=\"$Nachricht\";");
    $header   = array();
    $header[] = "MIME-Version: 1.0";
    $header[] = "Content-type: text/plain; charset=utf-8";
    $header[] = "From: meine Mail-Adresse";
    $header[] = "X-Mailer: PHP/".phpversion();
    if(!mail($Mail, "Ihre Anmeldung zur Fernwartung", "$Nachricht", implode("\r\n",$header))) {
      error(308,"Es gab einen Mail-Sendefehler zu Ihrer Mail-Adresse!",true);
      }
    $K_Anrede_HTML = htmlspecialchars($K_Anrede);
    $K_Nachname_HTML = htmlspecialchars($K_Nachname);
    echo "
<font size='4' color='green'><b>Danke $K_Anrede_HTML $K_Nachname_HTML,<br>
<br>
Ihre Anmeldung war erfolgreich.<br>
Sie erhalten in K&uumlrze eine E-Mail mit Ihren Zugangsdaten.<br><b></font>
";
    }
  }
Hat dazu noch jemand eine Idee?
Alle Beiträge dieses Benutzers finden
#10
Es sind da immer noch Probleme mit der Zeichenkodierung erkennbar ...
"Datei Anmelde_Mail.txt kann nicht ge&oumlffnet werden!"
"Sie erhalten in K&uumlrze eine E-Mail mit Ihren Zugangsdaten."

Verwende konsequent meine vorherigen Tipps, und eine Umwandlung der Umlaute ist nicht mehr notwendig.
Zum Thema Mail, ist es am besten eine Mailerklasse zu verwenden, auf meiner Website empfehle ich den PHPMailer (Version: 5.2) damit kann man relativ einfach eine E-Mail versenden. Ohne das man sich um das Format der E-Mail kümmern muss, das macht der PHPMailer automatisch.

Man sieht an dem Script das es schon lange nicht mehr aktualisiert wurde.
Wer schreibt noch: <font size='4' color='green'> ...
Auch das PHP selbst ist veraltet, zb.: eval("\$Nachricht=\"$Nachricht\";");
Die eval()-Funktion stellt ein Sicherheitsrisiko dar und sollte nicht verwendet werden.
Alle Beiträge dieses Benutzers finden
#11
(25.10.2020, 10:54)Werner123 schrieb: Folgende Punkte sind wichtig:
1. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="UTF-8">

2. Das Formular-Script auf "UTF-8 ohne BOM" umstellen, beachte den Kommentar von Klaus2

3. Bei der Verbindung zur Datenbank muss die Kodierung gesetzt sein.
Bei den alten mysql()-Funktionen ist das dann:
mysql_set_charset("utf8", $link);  https://www.php.net/manual/de/function.m...harset.php
Zu 1. : ich habe in NOF-9 den Zeichensatz der Startseite auf Unicode (UTF-8) eingestellt und für alle Unterseiten Site Zeichensatz verwenden eingestellt. Den Rest macht dann NOF-9.

Zu 2. Ich füge das PHP-Script mit dem NOF-9 HTML-Editor ein. Wo kann ich da UTF-8 einstellen?
Alle Beiträge dieses Benutzers finden
#12
Ich hab mir Deine Seite mal kurz angesehen und eine Testmail vesendet.
(Die Seite kenne ich noch aus einem Screenshot von Dir von früher.)

Die Anmelde_Mail.txt ist zwar UTF-8 hat aber einen BOM, also am Anfang der Datei die Bytesequenz Hex "EF BB BF".
->Bitte z.B. im Notepad++ auf "UTF-8 ohne BOM" umstellen.

Ggf. war es das schon!?


Der DOCTYPE und das meta wird so von NOF 9 genieriert und ist "halt so".
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

Glaube mit viel Fummelei im Code könnte man das sogar ändern,
ein Tool dafür hatten wir auch mal dafür, sehe ich aber gerade nicht als das Problem.
Es bleibt so oder so HTML 4.

Der POST des Formulars ist korrekt im UTF-8 also z.B. für ä = %C3%A4%.

Die action des Formulars zeigt auf sich selber und im HTML Quellcode sind oben 2 Leerzeilen daher gehe ich davon aus dass das PHP zum Verarbeiten des Formulares am Anfang der PHP Seite steht.

Da NOF 9 im keinem HTML Bereich UTF-8 direkt (eintippen) kann muss wie von mir im Beitrag #7 geschrieben das PHP im UTF-8 Format eingefügt werden. Die Umlaute sehen hier erst mal nicht gut aus sind aber nur so richtig codiert.

... ob die Funktion pc_html2ascii für das anschließende sichere Ausführen von eval ausreichend ist kann ich nicht beurteilen, die Info von Werner dazu hast Du ja schon bekommen.
Alle Beiträge dieses Benutzers finden
#13
Hattest Du vorher PHP 4 und register_globals auf on und daher kein $_POST verwendet?
Ich sehe in Deinem Skript kein $_POST .

->Das geht so nicht mehr!

https://www.php.net/manual/de/security.globals.php

... wobei dann aber in der DB auch nichts ankommen dürfte?



Lang ist her ... das hatte ich schon total vergessen, eines meiner ersten PHP Formularskripte die ich von paby verwendet habe:
http://www.paby.de/nof-tips/netobjects_t...jects_.php
Alle Beiträge dieses Benutzers finden
#14
@Soso,

(26.10.2020, 22:23)soso schrieb: Zu 2. Ich füge das PHP-Script mit dem NOF-9 HTML-Editor ein. Wo kann ich da UTF-8 einstellen?

hattest Du meinen Beitrag #6 gelesen?

NOF9 ist für UTF-8 Skripte nicht gemacht und das kannst Du auch nicht umstellen. Die Editoren werden die Ausgabe immer im ANSI-Format vornehmen.

Wie schon oben in meinem Beitrag # 6 geschrieben hatte, geht das selbst mit dem neuesten NOF15 nur bedingt in einem der Editoren. NOF hat da leider die Zeit verschlafen und ist nicht mehr für so etwas zu gebrauchen.
Alle Beiträge dieses Benutzers finden
#15
(27.10.2020, 00:11)Klaus2 schrieb: ->Bitte z.B. im Notepad++ auf "UTF-8 ohne BOM" umstellen.

Hab ich gemacht. Leider kommt die Mail zum Kunden immer noch nicht an. Kann ich UTF-8 auch mittels PHP iconf() erzeugen? Ich könnte dann mit dem normalen Notepad und ansi codierung arbeiten und würde die Umwandlung dann mittels iconf() vornehmen. Das hat den Vorteil wenn in einem Jahr eine Anderung an den .txt-Files notwendig wird ich nicht immer an die Umkodierung denken muss.

$_POST habe ich natürlich. das steht weiter vorne. Ich habe hier nicht das ganze .php gepostet sondern nur den Abschnitt in dem die Mail gesendet wird.

Deine Testmail ist übrigens mit den korrekten Umlauten angekommen. der entsprechende Code dafür sieht übrigens so aus:
Code:
// Mail zu mir:
    $mail_to_me="meine_Mail_Adresse";
    $Nachricht1=date("d.m.Y - H:i") . " Nachricht von ".$K_Anrede." ".$K_Nachname.":\n".$Nachricht;
    $header   = array();
    $header[] = "MIME-Version: 1.0";
    $header[] = "Content-type: text/plain; charset=utf-8";
    $header[] = "From: {$Mail}";
    $header[] = "X-Mailer: PHP/".phpversion();
    if(!mail($mail_to_me, "Nachricht von DF-Consulting (Fernwartung)", $Nachricht1, implode("\r\n",$header))) {
      error(701,"Es gab einen Mail-Sendefehler zu DF-Consulting!",true);
      }

//  String-Umwandlung wegen Cross-Site-Scripting
    $K_Nachname_HTML = htmlspecialchars($K_Nachname);
    $K_Anrede_HTML   = htmlspecialchars($K_Anrede);
    echo "
<font size='4' color='green'><br><b>Danke $K_Anrede_HTML $K_Nachname_HTML,<br>
<br>
Ihre Nachricht wurde &uumlbermittelt.<br><br><br><br><br><br><br><br><br><b></font>
    ";
Ich kann auf den ersten Blick keinen wesentlichen Unterschied erkennen zum code aus Post #9. Mit der Ausnahme das in #9 der Mailtext aus einer Datei kommt und hier aus einer  $Post-Variable.

Die eval() Funktion wende ich doch nur auf die zu sendende Mail-Nachricht an. Die wird doch nicht mit echo ausgeführt.
Alle Beiträge dieses Benutzers finden




Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste
nach oben An den Anfang der Seite scrollen
NetObjects Fusion Infos, Downloads und Updates Diese Website wird durch Bot-Trap vor Spam geschützt!