Regiestrieungsformular

Da ich auf dem Gebiet Anfänger bin, frage ich euch wie man folgendes umsetzen kann:

  1. Ich möchte überprüfen ob es den Benutzernamen in der MySQL-DAtenbank schon gibt.

  2. ich möchte überprüfen ob die eingegeben angaben der max. o. min. länge entsprechen.

Danke im voraus.

sowas ungefähr:

  1. Nutzernamen überprüfen
$eingabe = "hanspeter";
$query = mysql_query("SELECT COUNT(*) as anzahl FROM `tabelle_user` WHERE `username` = '".$eingabe."'");
$ds = mysql_fetch_assoc($query);
if($ds['anzahl'] > 0){
    //Benutzer ist vorhanden; abbrechen
}else{
    //Benutzer ist nicht vorhanden
}
  1. Mindest/Maxi Länge
$eingabe = "meinpasswort";
if(strlen($eingabe) < 5 || strlen($eingabe) > 30){
    //passwort zu lang oder zu kurz
}else{
    //passwort ist in ordnung
}

das || in der If-Abfrage bedeutet ODER
eine UND Verknüpfung wäre: &&

mfg Balmung

dev.mysql.com/doc/refman/5.1/de/ … tions.html :wink:
Das geht alles in einem MySQL-Query. Bei Datanbank-Querys heißt es immer: so viel wie geht das DB-System übernehmen lassen, weil das viel schneller ist, als ständige Querys :wink:

Ja natürlich - erfüllt aber hier die Aufgabe nicht da es ja um eine Registrierungsformular geht , also vor der Speicherung die Länge gecheckt werden muss.

Der Vorschlag von Balmung trifft die Frage exakt.

ich habe bereits erfolgreich ein loginforumlar geschrieben, welches die groß und kleinschreibung des benutzernamen bei der anmeldung nicht beachtet (na ja ich hab es nicht selbst geschrieben, sondern Dreamweaver hat eins erstellt, welches aber ein bisschen zu kompliziert ist um es umzuschreiben), dewegen ist es wichtig das ein bereits bestehender Benutzername egal wie er groß oder kleingeschrieben ist abgelehnt wird.

Ich hab aber noch ein Problem:
Ich möchte bestimmte sonderzeichen im benutzernamen ausschließen (oder nur bestimmte zeichen erlauben) die ich vorgebe, Wie kann ich das machen? Ich hab zwar im php-manual schon einiges gefunden, aber nichts was ich verstanden habe oder dafür geeignet wär, vielleicht gibt es auch eine Möglichkeit die ich direkt im Formular verwenden kann?!?

$query = mysql_query("SELECT COUNT(*) as anzahl FROM `tabelle_user` WHERE `username` = '".$eingabe."'");

MySQL verarbeitet die abfragen üblicherweise “incasesenitive”, d.h. MySQL Beachtet beim abfragen die groß und kleinschreibung nicht, von daher sollte die Abfrage auf alles zutreffen, egal ob USERNAME, username oder UsErNaMe.
Ansonsten musst du alle Datensätze auslesen und mit php und strtolower/strtoupper abfragen ob diese übereinstimmen. Ich glaub es gibt auch sowas wie strcmp, welches man einstellen kann, dass es ohne berücksichtung auf groß/kleinschreibung vergleichen soll.

Edit: strcasecmp() unterscheidet nicht :wink:

Dein zweites Problem löst du am besten mit preg_match(), welches aber ein bisschen komplizierte Ausdrücke zum vergleichen verwendet.
Möchtest du nur Buchstaben von A-Z (groß und klein) und Zahlen von 0-9 erlauben, sähe das in etwa so aus:

if(preg_match('/^[A-Z0-9]+$/i', $username)){
    //gültig
}else{
    //ungültige zeichen sind enthalten
}

mfg Balmung

verwandelt strtolower/strtoupper strings nicht nur zu GROSS und kleinschreibung?

Also, was wäre dann mit schreibweisen, wie z.B. “PlInFa”?

[quote=“Plinfa”]verwandelt strtolower/strtoupper strings nicht nur zu GROSS und kleinschreibung?

Also, was wäre dann mit schreibweisen, wie z.B. “PlInFa”?[/quote]

nehmen wir an, in der Datenbank steht "PlInFa"
und ich hab im loginfeld eingegeben: "plinfa"
dann vergleich ich mit strtolower() in etwa so:

$datenbank = "PlInFa";
$loginfeld = "plinfa";

if(strtolower($datenbank) == strtolower($loginfeld)){
    //stimmt
}else{
    //stimmt nicht
}

einfach beides während der abfrage in kleinbuchstaben verwandeln :wink:

besser wäre wohl aber die alternative mit strcasecmp:

if(strcasecmp($datenbank, $loginfeld)){
    //stimmt
}

da diese Funktion nicht zwischen groß und klein unterscheidet.

siehe dort: de.php.net/manual/de/function.strcasecmp.php

mfg Balmung

ach so meinst du das! danke für die antwort! :smiley:

aber wie kann ich bestimmte zeichen bei der registierung ausschließen? bin ziemlich ratlos… :qst:

[quote=“Balmung”]Dein zweites Problem löst du am besten mit preg_match(), welches aber ein bisschen komplizierte Ausdrücke zum vergleichen verwendet.
Möchtest du nur Buchstaben von A-Z (groß und klein) und Zahlen von 0-9 erlauben, sähe das in etwa so aus:

if(preg_match('/^[A-Z0-9]+$/i', $username)){
    //gültig
}else{
    //ungültige zeichen sind enthalten
}

mfg Balmung[/quote]

Zeichen ausschließen ist die schwierigere variante, besser ist es nur bestimmte zeichen zu erlauben. Umlaute würde ich nicht erlauben, lässt sich aber theoretisch regeln.

Edit: generell mach ich es immer so, dass ich einen loginnamen für die user hab, der nur buchstaben und zahlen (wie oben) beinhalten darf. und einen “anzeigenamen”, der auch sonderzeichen haben darf, und für die anderen benutzer sichtbar ist. Während der loginname nur für den benutzer selber sichtbar ist und vor den anderen usern verborgen bleibt. Steigert auch ein wenig die sicherheit :wink:

Ich würde gerne folgende zeichen erlauben:
[a-z]
[A-Z]
[0-9]
[!],[?],[#],[-],[+],[*],[$],[<],[>],[=],[ß],[_]

Na ja das wär es soweit.

Kannst du mir ein bespiel liefern?

[a-z]
[A-Z]
[0-9]
[!],[?],[#],[-],[+],[*],[$],[<],[>],[=],[ß],[_]

if(preg_match('/^[a-zA-Z0-9!\?#\-\+\*\$<>=ß_]+$/', $username)){
    //stimmt
}else{

}

die zeichen: ? - + * $ müssen mit einem backslash \ “escaped” werden, da es sich um bestandteile der preg_match-syntax handelt.

das “ß” ist so eine sache, genau so schlimm wie die umlaute, da es wenn es anders kodiert ist, nicht mehr passt…

Edit: kannst ja mal probieren:

$username = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz!?#-+ß*$<>=_";
if(preg_match('/^[a-zA-Z0-9!\?#\-\+\*\$<>=ß_]+$/', $username)){
	echo "jupp";
}else{
	echo "nope";
}

mfg Balmung

ok das ß muss nicht umbedingt sein. und die slashes kann man mit der addslashes() hinzufügen.

*unbedingt
und nein, addslashes hat eine andere Funktion und gehört hier zu preg_match nicht hin.

EDIT:
wenn ich nichts vergessen, oder übersehen hab, sollte diese Funktion die zeichenkette RegExp-gerecht „escapen“:

function escape_regexp($str){
    return preg_replace('/(\\\\|\?|\+|\*|\.|\-|\||\(|\)|\{|\}|\[|\]|\^|\$)/', '\\\\$1', $str);
}

„\\“ ist nötig, weil es einmal vom PHP interpreter in „\“ umgewandelt wird und anschließend von preg_repalce in "".

ein beispiel:

$zeichen = "abc$^()*+def".chr(92);   // chr(92) ist ein backslash "\"
$zeichen = escape_regexp($zeichen);
echo $zeichen;

das hatte ich immer gedacht… na ja ist auch egal, ich hoffe das ich jetzt alles auf die reihe kriege.

//EDIT: Sry wenn ich nicht immer alles mitbekomme, aber die wlanverbindung bricht ständig ab.

addslashes() fügt backslashes hinzu, aber nur zu bestimmten Zeichen, was lediglich dazu dient, um bei MySQL die „Injektionen“ zu verhinden… die Zeichen wären \ ’ und " wenn ich mich nicht irre.
Bei RegExp sind es andere Zeichen, und auch ein Paar mehr: ^$(){}+*?-.|

Kann sein dass ich welche vergessen hab

mfg Balmung :slight_smile:

Auf jeden Fall danke für deine Hilfe. Ich werde jetzt erstmal versuchen alles in die tat umzusetzen.

EDIT: Wenn ich noch fragen hab meld ich mich nochmal.

muss ich außer dem escapen der zeichen noch etwas anderes machen um die daten in die datenbank zu speichern, oder muss einfach nur den normalen syntax verwenden?

öhm escapen brauchst du nur, wenn die “magic quotes” nicht aktiviert sind.
Sind sie aktiviert, wurden die “slashes” nämlich schon automatisch von PHP hinzugefügt.
in PHP 6 werden magic quotes afaik wieder entfernt sein, da man darauf nicht vertrauen soll, dass sie aktiviert sind, und deshalb in vielen Scripts ein Sicherheitsrisiko verursachen können.
Man müsste ab PHP 6 also immer addslashes verwenden.

Aber für die Aktuelle PHP Version hier auf den bplaced servern, sollte das hier ausreichen:

$username = $_POST['username'];

if(!get_magic_quotes_gpc()){
    $username = addslashes($username);
}

$sql = "INSERT INTO `tabelle` SET `username`='".$username."'";
...

so ungefähr.

Edit: dies ist mein 256. Beitrag :3 hübsche Zahl

Meine Tabelle enthält folgende Spalten:
user_username, < Text
user_password, < Text/MD5-Hash
user_name, < Text
user_surname, < Text
user_email, < Text
user_restriction < Text

Was muss ich tun um alle Daten einzufügen?