MySQLi Abfrage String Suche genau

EuroCent

Klappstuhl 2.0
Hallo zusammen,

irgendwie stehe Ich auf dem Schlauch.

Und zwar, loggen Sich benutzer bei mir mit: Vorname.Nachname ein.
PHP:
if(isset($_POST['sendLogin'])) {
    $username = isset($_POST['username']) ? htmlspecialchars($_POST['username']) : 'noName';
    $passwd = isset($_POST['password']) ? $_POST['password'] : 'none';

    $errmsg = '';

    $errmsg .= __getMessage("danger", "SELECT `username` FROM `mitarbeiter` WHERE `username`='".$username."'");

    $sql2 = $db->__query("SELECT COUNT(*) as user FROM `mitarbeiter` WHERE `username`='".$username."'");
    $row2 = $db->__fetchArray($sql2);

   $errmsg .= __getMessage("danger", $row2['user']);
}

Aber wenn der Name in der Datenbank mit beispielsweise: Dännis.Müller hinterlegt ist, findet er sogar Dannis oder Dennis.Müller.

Ich bin der Meinung dass Ich irgendwo einen Denkfehler habe, Ich ihn aber irgendwie nicht sehen :/

Hoffe dass man abhilfe schaffen kann :)
 
Glaub ich nicht.
Die abgebildeten SQL finden Nur Dännis.Müller. Ansonsten müsste die Bedinung mit LIKE sein, nicht mit =

Aber $row2['user'] ist immer vorhanden. 0 oder 1 steht da drin.

Des weiteren überprüfst du nirgens ob der User vorhanden ist.
 
Na die Abfrage ob der Benutzer vorhanden ist überprüfe Ich schon.

Hier mal die login.php - Vollständig und Original:
PHP:
if(isset($_POST['sendLogin'])) {
    $username = isset($_POST['username']) ? htmlspecialchars($_POST['username']) : 'noName';
    $passwd = isset($_POST['password']) ? $_POST['password'] : 'none';

    $errmsg = '';

    $sql_user = $db->__query("SELECT COUNT(*) as user FROM mitarbeiter WHERE username = '{$username}'");
    $sql_pass = $db->__query("SELECT COUNT(*) as pass FROM mitarbeiter WHERE username = '{$username}' AND passwd = '".sha1($passwd)."'");
    $Urows = $db->__fetchArray($sql_user);
    $Prows = $db->__fetchArray($sql_pass);

    if($Urows['user'] < 1) {
        $errmsg .= __getMessage("danger", "Es konnte kein Mitarbeiter gefunden werden.");
        session_destroy();
    } elseif($Prows['pass'] < 1) {
        $errmsg .= __getMessage("danger", "Das Passwort ist leider nicht korrekt.");
        session_destroy();
    } else {
        $_SESSION['user'] = $username;
        $_SESSION['loggedin'] = true;
        header('LOCATION: ./index.php');
    }
}

Damit funktionieren Namen, ohne Umlaute. Sobald ich aber jemanden habe mit einem Umlaut, dann kann er nicht einloggen.

Die Abfrage kann man sicherlich kürzen :)
 
Aber wenn der Name in der Datenbank mit beispielsweise: Dännis.Müller hinterlegt ist, findet er sogar Dannis oder Dennis.Müller.
Damit funktionieren Namen, ohne Umlaute. Sobald ich aber jemanden habe mit einem Umlaut, dann kann er nicht einloggen.
Was denn nun. Erkennt er alles oder nix? Deine Aussagen wiedersprechen sich um 180 Grad.

dann kann er nicht einloggen.
Welche deiner Meldungen erscheint? Username oder Passwort?

Sind die Usernamen auch mit htmlspecialchars() gespeichert worden?
Zitat aus der onlinehilfe zu htmlspecialchars(). Ev. hat es etwas damit zu tun.
Be aware of the encoding of your source files!!!

Some of the suggestions here make reference to workarounds where you hard-code an encoding.
PHP:
<?php
  echo htmlspecialchars('<b>Wörmann</b>');  // Why isn't this working?
?>
As it turns out, it may actually be your text editor that is to blame.

As of PHP 5.4, htmlspecialchars now defaults to the UTF-8 encoding. That said, many text editors default to non-UTF encodings like ISO-8859-1 (i.e. Latin-1) or WIN-1252. If you change the encoding of the file to UTF-8, the code above will now work (i.e. the ö is encoded differently in UTF-8 and ISO-8859-1, and you need the UTF-8 version).

Make sure you are editing in UTF-8 Unicode mode! Check your UI or manual for how to convert files to Unicode. It's also a good idea to figure out where to look in your UI to see what the current file encoding is.

PS: Zur Sicherheit sollte man nicht angeben ob der Name oder das Passwort falsch ist. Nur, dass etwas falsch ist.
 
@Yaslaw
Das Problem ist, ja, dass die derzeitige Abfrage funktioniert, die Ich nutze.
Nur eben nicht mit Umlauten.

Ich kann allerdings nicht erkennen wo der Fehler sitzt. Wenn Ich die Abfrage per SQL mache, sei es mit oder ohne Umlaut, dann findet er den Benutzer. oO
Was sehr merkwürdig ist. :D

Denn genau dass soll ja nicht sein.

Wenn Ich aber einen Benutzer der vorher mit Mueller hinterlegt war auf Müller ändere, dann ist ein, einloggen nicht möglich.
Ich kann auch den Fehler nicht erkennen, woran es liegt, sei es mit htmlspecialchars() oder mit mysqli_real_escape_string().

Bei der Codierung des Feldes habe Ich utf8_general_ci.

In der Login-Page verwende Ich natürlich mysqli_real_escape_string() statt htmlspecialchars() :)

Nur kann Ich mir keinen Reim daraus machen, warum die Abfrage mit den Umlauten nicht funktioniert oO
Geb Ich es var_dump() aus, wird der Name per Umlaut auch richtig übermittelt. :(
 
mysqli_real_escape_string() und htmlspecialchars() ist nicht dasselbe
Verwende beide male mysqli_real_escape_string()

Lass dir mal dein SQL ausgeben: PHP/MySQLi Debug Queries
Dann schau es dir gut an, teste es mit phpMyAdmin gegen deine Datenbank.
Mach dasselbe mit dem Insert-SQL, wenn der User angelegt wird. Vergleich die Textwerte im SQL.
 
Guten Morgen,

vielen lieben Dank, für die Info.

Ich habe es mal per SQL getestet, und dabei ist es egal ob Ich in der WHERE mit umlaut angeben, oder ohne Umlaut.
Er gibt mir per COUNT() immer wieder 1 zurück.

In der Datenbank existiert ein Benutzer mit dem Namen: Dennis.Wolf
Wenn ich aus Dennis.Wolf zum beispiel zu Dennis.Wölf mache in der WHERE Abfrage, dann findet er egal in welcher Schreibweise = Dennis.Wolf.

Und genau hier liegt der Hase im Pfeffer.

SQL ignoriert hier scheinbar die art der Schreibweise :)
Kann es an der Kollations liegen?
 
Werd Ich machen, kann mir nur nicht vorstellen, warum es mit der Originalen klappt, also ohne Umlaute.
Jedoch mit Umlauten nicht oO

Werd mich mal intensiver wieder ran setzen :)
Vielen Dank @Yaslaw

Zurzeit steckt bei mir irgendwie der Wurm drin.
Die Lösung ist sicherlich einfach, aber irgendwie überseh Ich es :D
 
Zurück