Registrierungsscript(jetzt: Loginscript): Problem mit MySQL
Hi,
Ich bin gerade dabei ein registrierungsscript zu schreiben, und hänge an einem Problem:
Ich möchte erreichen, dass soich kein user mit der gleichen e-mail oder den gleichen namen registrieren kann, aber man kann sich immer noch zweimal mit dem namen Barzul Registrieren.
Hier mal der Quelltext:
[PHP]<?php
mysql_connect(„localhost“,„shinobi-no-kage“,„Passwort“);
mysql_select_db(„shinobi-no-kage“);
$abfrage_name = „SELECT * FROM snk_user WHERE name LIKE „.$_POST[‚name‘].““;
$abfrage_email = „SELECT * FROM snk_user WHERE name LIKE „.$_POST[‚email‘].““;
$ergebnis_name = mysql_query($abfrage_name);
$ergebnis_email = mysql_query($abfrage_email);
$name = $_POST[„name“];
$pw = $_POST[„pw“];
$pw2 = $_POST[„pw2“];
$email = $_POST[„email“];
if ($pw != $pw2 OR $ergebnis_name == $name OR $ergebnis_email == $email)
{
echo „Die beiden angegebenen Passwörter stimmen nicht überein, der NAme ist bereits vergeben,
oder die Email wird bereits benutzt!“;
}
else
{
$eintrag = „INSERT INTO snk_user(name, pw, email) VALUES (‚$name‘, ‚$pw‘, ‚$email‘)“;
$eintragen = mysql_query($eintrag);
echo ‚Sie wurden erfolgreich registriert! weiter‘;
}
?>[/PHP]
aber?
du musst nicht einmal LIKE nehmen, eine direktabfrage geht auch:
[php]
<?php
$sql[1] = "SELECT * FROM snk_user WHERE name = '".$_POST['name']."' ";
$sql[2] = "SELECT * FROM snk_user WHERE email = '".$_POST['email']."' ";
/*
invertierte kommata vergessen, da es kein ausdruck sondern ein suchwert ist.
außerdem sollte das feld doch eher "email" als "name" heißen, wenn du
die mail checken willst.
*/
?>
[/php]
OR mit || ersetzen, das wird schneller verarbeitet und die $_POST-arrays nicht nochmal als variablen abspeichern, das verlangsamt erst wieder:
[php]
<?php
//braucht man alles nicht
$name = $_POST["name"];
$pw = $_POST["pw"];
$pw2 = $_POST["pw2"];
$email = $_POST["email"];
//besser:
if ($_POST["pw"] != $_POST["pw2"] OR $ergebnis_name == $name OR $ergebnis_email == $email)
?>
//EDIT:Es ist ein großes problem -.-* wenn man daen gleiche namen oder email eingibt, steht im DB-eintrag bei name und email gar nichts. Und nachdem mand as formular abgeschickt hat, wird man trptzdem noch weitergeleitet Oo
wenn du LIKE nimmst, muss der ausdruck %e enthalten: LIKE %suchwert%. ist aber von abzuraten, da du ja nach einem bekannten wert und nicht nach einem bruchstück suchst.
LIKE habe ich jetzt auch rausgenommen gehabt, dann giung es immer noch nciht. Jetzt habe ich das script nochmal geändert udn es müsste eigentlich gehen nur das Problem ist, Die meldung wird angezeigt, dass man sich registriert hat und in der DB steht ein eintrag mit „“ bei name und email.
Mein Quellcode sieht jetzt so aus:
[PHP]<?php
mysql_connect(„localhost“,„shinobi-no-kage“,„**“);
mysql_select_db(„shinobi-no-kage“);
$abfrage_name = „SELECT * FROM snk_user WHERE name = '“.$_POST[‚name‘]."’ „;
$abfrage_email = „SELECT * FROM snk_user WHERE email = '“.$_POST[‚email‘].“’ ";
$ergebnis_name = mysql_query($abfrage_name);
$ergebnis_email = mysql_query($abfrage_email);
if ($_POST[„pw“] != $_POST[„pw2“] OR $ergebnis_name == $_POST[‚name‘] OR $ergebnis_email == $_POST[‚email‘])
{
echo „Die beiden angegebenen Passwörter stimmen nicht überein, der Name ist bereits vergeben,
oder die Email wird bereits benutzt!“;
}
elseif ($ergebnis_name != $_POST[‚name‘] OR $ergebnis_email != $_POST[‚email‘])
{
$eintrag = „INSERT INTO snk_user(name, pw, email) VALUES (‚$name‘, ‚$pw‘, ‚$email‘)“;
$eintragen = mysql_query($eintrag);
echo ‚Sie wurden erfolgreich registriert! weiter‘;
}
?>[/PHP]Ich habe das OR jetzt nicht durch || ersetzt, da ich die variante nicht mag^^
EDIT: und noch ein Problem: Wenn man sich jetzt mit anderem namen und anderer email anmeldet, wird in die spalte name , email UND Pw nichts mehr eingegeben OO
<?php
elseif ($ergebnis_name != $_POST['name'] OR $ergebnis_email != $_POST['email'])
//OR durch AND ersetzen, da beides NICHT zutreffen darf
?>
[/php]
liegt wohl daran, dass nach korrektur die neuen werte nicht übernommen werden.
sichere das ganze mit einer abfrage ab, ob das formular überhaupt gesendet wurde:
[php]
<?php
if(isset($_POST['submit']))
{
/*
dann deine anweisungen
"submit" ist sinngemäß durch die betitelung des abschick-buttons zu ersetzen.
*/
}
?>
[/php]
das ganze nennt sich „affenformular“, da auch nach eingabe einer million AFFEN (nachäffen) das skript nicht weiterarbeitet und sich immer wieder in den ausgangszustand versetzt.
hab ich aber es will immer noch nicht >o> ich schicke wieder das formular mit gleicher email und gleichem username ab und da steht das ich registriert wurde. in der db is es auch eingetragen >o<.
Quellcode:
[PHP]<?php
mysql_connect(„localhost“,„shinobi-no-kage“,„Passwort“);
mysql_select_db(„shinobi-no-kage“);
$abfrage_name = „SELECT * FROM snk_user WHERE name = '“.$_POST[‚name‘]."’ „;
$abfrage_email = „SELECT * FROM snk_user WHERE email = '“.$_POST[‚email‘].“’ ";
$ergebnis_name = mysql_query($abfrage_name);
$ergebnis_email = mysql_query($abfrage_email);
if ($_POST[„pw“] != $_POST[„pw2“] OR $ergebnis_name == $_POST[‚name‘] OR $ergebnis_email == $_POST[‚email‘])
{
echo „Die beiden angegebenen Passwörter stimmen nicht überein, der Name ist bereits vergeben,
oder die Email wird bereits benutzt!“;
}
elseif ($ergebnis_name != $_POST[‚name‘] AND $ergebnis_email != $_POST[‚email‘])
{
$eintrag = „INSERT INTO snk_user(name, pw, email) VALUES ('“.$_POST[‚name‘].„', '“.$_POST[‚pw‘].„', '“.$_POST[‚email‘].„')“;
$eintragen = mysql_query($eintrag);
echo ‚Sie wurden erfolgreich registriert! weiter‘;
}
?>[/PHP]
fi(isset… hab ich weggelassen, da es nur ne fehlermeldung gab
if(isset()) eben NICHT weglassen, sonst verliert sich der sinn.
jetzt fällts mir auf, das kann auch gar nicht funktionieren, da du die beiden werte ja nie vergleichst.
versuch’ mal:
[php]
<?php
$abfrage_name = "SELECT * FROM snk_user WHERE name = '".$_POST['name']."' ";
$abfrage_email = "SELECT * FROM snk_user WHERE email = '".$_POST['email']."' ";
$ergebnis_name = mysql_query($abfrage_name);
$ergebnis_email = mysql_query($abfrage_email);
if(mysql_fetch_array($ergebnis_name) == 1)
{
echo 'dieser benutzername wird bereits verwendet';
}
if(mysql_fetch_array($ergebnis_email) == 1)
{
echo 'diese e-mail-adresse wird bereits verwendet';
}
?>
[/php]
du musst doch nachsehen, ob es das nochmal in der datenbank gibt. wenn ja, abbrechen, wenn nein, eintragen.
mit mysql_fetch_array() holst du sämtliche einträge in den temporären speicher und siehst nach, ob EINES ( == 1) dieser einträge den abfragewert enthält. wenn ja (und einer reicht schon), wird abgebrochen.
musstes halt dementsprechend ausbauen, einfach nur abkupfern bringt nicht. wenn ich zeit hab’, poste ich dir hier mal das komplette und funktionierende skript ab.
<?php
$sql = array();
//SQL-anweisungen der übersicht halber auf arrays umgebaut
$sql[1] = "SELECT * FROM snk_user WHERE name = '".$_POST['name']."' ";
$sql[2] = "SELECT * FROM snk_user WHERE email = '".$_POST['email']."' ";
$ergebnis_name = mysql_query($sql[1]);
$ergebnis_email = mysql_query($sql[2]);
if(isset($_POST['submit']))
{
//man sollte auch prüfen, ob überhaupt was in den feldern drinsteht
if(empty($_POST['name']) || empty($_POST['email']))
{
echo 'bitte füllen sie BEIDE felder aus.';
}
elseif(mysql_num_rows($ergebnis_name) == 1)
{
echo 'dieser benutzername wird bereits verwendet.';
}
elseif(mysql_num_rows($ergebnis_email) == 1)
{
echo 'diese e-mail-adresse wird bereits verwendet.';
}
else
{
//an deiner stelle würde ich das passwort mit md5 verschlüsseln
$sql[3] = "
INSERT INTO snk_user
VALUES
(
'".$_POST['name']."',
'".md5($_POST['pw'])."',
'".$_POST['email']."'
)
";
mysql_query($sql[3]) or die(mysql_error());
echo '