Übertagung von Umlauten

alter_Bekannter

N.A.C.J.A.C.
Registriert
14 Juli 2013
Beiträge
4.767
Ort
Midgard
Das Ziel ist sowohl:
GET user=HalloÖÖdu
preg_match("/^[a-zA-Z1234567890öäüÖÄÜ]+$/", $_GET["user"]) == 1

als auch
HalloÖÖdu in der Datenbank, die entsprechende Spalte ist: utf8_general_ci
was aber: "HalloÖÖdu" im letzten Versuch ergab.

Der Ausdruck an sich funktioniert getestet wie folgt:
preg_match("/^[a-zA-Z1234567890öäüÖÄÜ]+$/", "HalloÖÖdu") == 1


Auch Post mit folgendem HTML Dokument produziert den selben Fehler:
[src=html4strict]<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Formular Beispiel</title>
</head>
<body>
<form action="auth.php" method=POST>
<label for="zuname">Zuname</label>
<input type="text" name="user" maxlength="20">

<button type="submit">Eingaben absenden</button>
</form>
</body>
</html>[/src]

Im Browser also wenn ich die Zeichenfolge einfach wieder ausgeben wird sie richtig angezeigt weswegen ich ganz schön suchen musste um das Problem einzugrenzen...

Die verwendete SQL Erweiterung ist mysqli eingefügt wird über ein prepared statement wie folgt:
[src=php]if ($stmt = mysqli_prepare($conn, 'insert into users VALUES(NULL, ?, md5(?), ?, now(), NULL)'))
{
/* bind parameters for markers */
mysqli_stmt_bind_param($stmt, "sss", $username, md5($password.$salt), $salt);

/* execute query */
mysqli_stmt_execute($stmt);

/* close statement */
mysqli_stmt_close($stmt);

return "okay";
}[/src]
 
ich kann mich daran erinnern, dass man irgendwie sowas aufrufen muss ... vllt Hilft dir das ^^

[src=php] mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET 'utf8'");
[/src]

für mysqli sieht das dann so aus (zweite Zeile)

[src=php]
$dbc = mysqli_connect(.... ) OR die(mysqli_connect_error());
mysqli_set_charset($dbc, "utf8");
[/src]
 
  • Thread Starter Thread Starter
  • #3
Danke, SQL klappt damit!
Und der reguläre Ausdruck? Wie schaffe ich es diese Daten zu validieren?

Das wäre in etwa genauso wichtig.
 
Aufgrund der besseren Zeichenabdeckung und der korrekten Sortierung solltest du bei MySQL verwenden.

Im HTML-Header hast du utf8 schon gesetzt.

mit UTF-8.
 
  • Thread Starter Thread Starter
  • #5
Also neu kompilieren wollte ich das jetzt nicht unbedingt, gibts nix in den Paketquellen bei Debian?
 
Neu compilieren ist eine Variante.

Eine andere, ist das Modifizieren des Preg_match-Ausdrucks:


[src=php]preg_match('(*UTF8)/H/u', "\xC2\xA1Hola!", $a_matches, PREG_OFFSET_CAPTURE);[/src]
 
  • Thread Starter Thread Starter
  • #8
Nö, das funktioniert tadellos, tut genau was es soll, denn es ist eine Zuweisung.

$stmt ist ein Verweis auf das Statement.

Ist übrigens eine 1:1 Kopie eines Anwendungsbeispiels von einem Nutzer der Doku. Integriert so recht nett das Errorhandling.

--- [2015-09-06 11:01 CEST] Automatisch zusammengeführter Beitrag ---


Ändert nichts.

Sobald ich alle früheren Korrekturversuche entferne klappts, danke.
 
Zuletzt bearbeitet:
Zurück
Oben