Registrierungsscript: Problem mit MySQL-abfrage

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) ?>

[/php]

Nils aka XraYSoLo

okay, danke Xraysolo, ich werds mal ausprobieren :wink:

zu dem Aber: Es funktioniert(e) halt nicht^^

//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.

Nils aka XraYSoLo

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]

<?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.

Nils aka XraYSoLo

Ah, danke XraYSoLo :wink:

danke für die Belehrung :wink:

s. meinen letzten post.

Nils aka XraYSoLo

hab ich :wink: 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.

Nils aka XraYSoLo

ich versuchs…

ALSO: Wenn ich if(isset()) nehme, dann bleibt das Fenster komplett weiß.

Und jetzt nimmt er gar keinen User mehr an >.>

viellciht hab ich aber auch am quelltext was falsch gemacht:

[PHP]<?php
mysql_connect(„localhost“,„shinobi-no-kage“,„PW“);
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 (isset($_POST[‚Absenden‘]))
{
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‘;
}
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]

musstes halt dementsprechend ausbauen, einfach nur abkupfern bringt nicht. wenn ich zeit hab’, poste ich dir hier mal das komplette und funktionierende skript ab.

Nils aka XraYSoLo

hmm…okay, danke dir :wink: werde mal verscuhen das richtig auszubaun OO

da haben wirs (is’ getestet, läuft):

[php]

<?php mysql_connect("localhost","shinobi-no-kage","**PW**"); mysql_select_db("shinobi-no-kage"); ?>

hier das HTML-formular hin

<?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 '

sie wurden erfolgreich registriert. weiter

'; } } ?>

[/php]

btw, es war nicht mysql_fetch_array(), sondern mysql_num_rows(). hätte demnach auch gar nicht gehen können.

Nils aka XraYSoLo

vielen vielen dank xray :slight_smile: habs immer versucht, aber wenns mit fetch_num_row geht, dann hättt ichs nich hingekriegt >.>

danke nochmal

Jedoch: Wenn man sich neu registriert, ist da ne leere seite und nicht „Sie wurden jetzt registriert weiter“ OO aber trtozdem danke :wink:

schu recht ;-).

Nils aka XraYSoLo

Ich glaub ich bin ein Trottel Oo

Das Script geht i-wie nicht mehr =O

es werden zumindest keine User mehr in die Datenbank eingefügt.

Ich habe es auch nochmal komplett hier rauskopiert und es ging immer noch nicht.

mfg

Barzul

liegt vielleicht daran, dass deine tabelle für die user keinen inkrementierten primärschlüssel besetzt, der jedem eintrag eine eindeutige ID verpasst…

Nils aka XraYSoLo

Also: In der mysql tabelle steht im Feld ID unter extra auto_incrediment.
Also müsste da doch der schlüssel sein oder??

Fehlermeldung nach absenden des Formulars:

Column count doesn’t match value count at row 1