MySql + Unique

Hallo bplaced User ich habe einen Login und eine Registrierung gebastelt,
und jetzt habe ich in der MySql Tabelle einen Unique Feld oder wie man das nennt bei dem Feld Email dazugetan, also dass sich keiner zweimal mit derselben Emailadresse registrieren kann. Wenn ich mich ich mich registriere dann wird das doppelte auch nicht in die Datenbank geschrieben jedoch kommt meine Meldung sie haben sich erfolgreich registriert wie kann ich machen wenn die Email doppelt ist dass da steht diese Email wurde schon verwendet Danke im voraus

Ich würde diese Abfrage mit PHP realisieren.

Ich kenne mich mit Unique nicht aus, aber wenn bei der Query ein Fehler zurückgegeben, kann man den ja abfangen.
Aber dazu kann ich nichts genaues sagen :slight_smile:

Mfg :wink2:

Einfach die Fehlernummer nach der Abfrage auswerten.
Welche Nummer für die Verletzung eines unique index steht, kannst du entweder im Handbuch nachschlagen; oder du provozierst diesen Fall einfach mal, und schaust sie dir dann an.

[code]if(mysql_query($sql)) {

echo “Vielen Dank für deine Registierung alles hat geklappt”;

} else {

echo “Leider trat ein fehler auf”;
}[/code]

Du kannst nach der Einfügeoperation mit mysql_errno (und den anderen Funktionen, die auf der velinkten Seite genannt sind) den Fehler abfangen und entsprechend reagieren.

hab jetzt anderen weg gefunden also das ich die emails rauslese aus datenbank und prüfe ob die schon vorhanden ist, aber irgendwie funktioniert das auch ned ?

Hier Code


$prüfen = mysql_query("SELECT email FROM users");
$numrows = mysql_num_rows($prüfen);
while ($row = mysql_fetch_assoc($prüfen))
 {
     $dbemail = $row['email'];
 }

if($dbemail==$email)
{
header('Location: index.php?page=reg_error'); /*Hier wenn die Email vorhanden ist weiterleitung auf Error Page */
exit();
}
else
{
Hier wenn Email nicht vorhanden ist
}

Natürlich nicht, weil du ja alle Adressen ausliest und in einer Schleife durchläufst.
Nach der Schleife enthält $dbemail also nur noch die Adresse des letzten Datensatzes, den die DB geliefert hat - und wenn die „doppelte“ Adresse nicht zufällig in diesem stand, dann merkt deine Abfrage davon also nichts.

Arbeite bitte wirklich ein Grundlagentutorial durch.

PS: wenn du jetzt doch kein Unique mehr magst, dann nimm wenigstens nen gescheiten Query anstatt alles selbst zu prüfen :stuck_out_tongue: z.B.
SELECT email FROM users WHERE email==‘name@example.com’ LIMIT 1;
Hoffe das der Query so stimmt…

[quote=“White-Tiger”]SELECT email FROM users WHERE email==‘name@example.com’ LIMIT 1;
Hoffe das der Query so stimmt…[/quote]
Ich würde mal sagen ein = reicht und bei dem limit fehlt ggf. noch 0,1 kann des sein also:

Vielen Dank für die Hilfe ! :smiley:

[quote=“Ryon_”][quote=“White-Tiger”]SELECT email FROM users WHERE email==‘name@example.com’ LIMIT 1;
Hoffe das der Query so stimmt…[/quote]
Ich würde mal sagen ein = reicht und bei dem limit fehlt ggf. noch 0,1 kann des sein also:

es mag sein das nen “=” reicht, nur ist nen Gleich ne Zuweisung und ich will nen eindeutigen Vergleich. Daher “==”. Auch wenn hier beides das selbe macht, es geht ums Prinzip das “=” ne Zuweisung ist und ich nen Vergleich will.

z.B. nervts mich in AutoIt welches auch beides nimmt da es leider keine Zuweisung während einer If unterstützt [size=85](anders als C/C++ und PHP bzw. jede gescheite “Sprache”)[/size] Ist daher teils verwirrend weils eigl. ne Zuweisung sein müsste^^ Nachteil so ist z.B. das man es auch schlecht Einbauen könnte da dann die Scripte einiger Spezies nicht kompatibel wären^^ Jedenfalls verwirrt nen “=” mehr als es nützt.

LIMIT ist übrigens richtig wie ichs nannte :wink:
LIMIT mit einer Zahl ist nen LIMIT. LIMIT mit 2 Zahlen ist nen OFFSET+LIMIT, das 1. eben das OFFSET und das 2. das LIMIT, wobei das OFFSET hier eben unnötig ist weshalb nen “echtes” LIMIT reicht.^^

PS: SQLite/MySQL unterstützt:
=, ==, LIKE, IS
<>, !=, IS NOT

Dein „Prinzip“ ist MySQL aber vollkommen egal.
Die Regeln von PHP oder sonsteiner anderen Sprache sind an der Stelle vollkommen irrelevant.

MySQL definiert das einfache Gleichheitszeichen als den Vergleichsoperator.

Dein Vorschlag mit == ist schlicht und einfach falsch*, MySQL wird dir bei Verwendung einen entsprechenden Fehler liefern,

[quote]SELECT 4711 == 4711
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘== 4711’ at line 1[/quote]

[quote]PS: SQLite/MySQL unterstützt:
=, ==, LIKE, IS
<>, !=, IS NOT[/quote]
Nein, == unterstützt MySQL per Default nicht.

  • Mag sein, dass es da noch irgendeine Konfigurationsmöglichkeit o.ä. gibt, mit dem man == auch als Vergleichsoperator akzeptieren lassen kann - aber bspw. hier auf bplaced passiert oben geschildertes.

Wozu die zusätzlichen Mühen, wenn es doch ausreicht mysql_errno auf den Wert 1062 (“Duplicate entry ‘%s’ for key %d”) zu prüfen und dann halt den auszugeben, dass der Name/E-Mail schon vergeben ist?

[quote=„chrisb“][]

[quote=„White-Tiger“][]
PS: SQLite/MySQL unterstützt:
=, ==, LIKE, IS
<>, !=, IS NOT[/quote]
Nein, == unterstützt MySQL per Default nicht.

  • Mag sein, dass es da noch irgendeine Konfigurationsmöglichkeit o.ä. gibt, mit dem man == auch als Vergleichsoperator akzeptieren lassen kann - aber bspw. hier auf bplaced passiert oben geschildertes.[/quote]hmm… ne ich hatte mich nach der SQLite Documentation gerichtet :wink: [size=85](da die von MySQL zu umständlich ist… zumindest fand ichs in der von SQLite einfacher)[/size]
    Da SQLite eigentlich, wie der Name auch schon sagt, Lite ist [size=85](daher einiges nicht unterstützt)[/size] ging ich davon aus das alles was SQLite kann auch für MySQL zutrifft^^
    Dem scheint aber wohl net so :stuck_out_tongue: Scheiß MySQL :ps:
    Ich hatte früher auch immer nur „=“ genutzt… das ist/war mir klar, nur da man ja so früher alles mögliche dumme anstellt, nahm ich an das ichs einfach net besser wusste bzw. mir so ab geguckt hatte^^ Gut zu wissen das ich keine andere Wahl hatte xD

[quote=„zvn“]Wozu die zusätzlichen Mühen, wenn es doch ausreicht mysql_errno auf den Wert 1062 („Duplicate entry ‚%s‘ for key %d“) zu prüfen und dann halt den auszugeben, dass der Name/E-Mail schon vergeben ist?[/quote]Jap das hatte ich mich auch gefragt :stuck_out_tongue:

PS: sry Ryon_ das ich dich wegen „=“ verbessern wollte… hätte mich doch von Anfang an durch die MySQL Doc kämpfen sollen^^ Jedenfalls gut das du mich korrigiert hast :wink: [size=85](abgesehn vom LIMIT natürlich)[/size]

Hi,

nein kein problem war mir ja selber nicht 100%ig sicher ich kenns halt nur mit einem (=) :wink: und des Limit naja kenn ich eig auch nur mit 2 zahlen … aber man lernt halt immer was dazu :smiley:

lg flo