Christian: SQL: Überpfüfen ob ein Eintrag schon vorhanden ist...

Hallo, ich bräuchte mal wieder Hilfe. ^^
Ich bin gerade für meine Homepage ein "Newslettersystem" am basteln. Eintragen funktioniert wunderbar.
Da ich aber nicht möchte das man sich mehrfach mit der selben E-Mail-Adresse eintragen kann, möchte ich vor dem eintragen überprüfen ob der Eintrag schon vorhanden ist.

Ich habe es so versucht:
»  $search = mysql_query('SELECT * FROM liste WHERE mail='.$\_POST['mail'].' LIMIT 0 , 30');
»  if(!$search) {
»   print "Eintrag schon vorhanden!";
»   return;
»  }

Naja, als Ausgabe bekomme ich immer den Fehler: "Eintrag schon vorhanden!";

Und wenn ich das so ändere:
»  $search = mysql_query('SELECT * FROM liste WHERE mail='.$\_POST['mail'].' LIMIT 0 , 30');
»  if($search) {
»   print "Eintrag schon vorhanden!";
»   return;
»  }

Wird der Punkt irgendwie ganz übersprungen und es wird immer eingetragen.

Was ist daran falsch? Wie würde es richtig sein?

Danke
Christian

  1. Hallo,

    schau dir bitte mal an, was die Rückgabe von mysql_query ist: Ein Result-Handle (oder false falls die Abfrage fehlgeschlagen ist).
    Du könntest z.B. im Anschluss an die Abfrage mittels mysql_num_rows prüfen, ob du Treffer gefunden hast. Oder du machst ein SELECT COUNT(*) FROM... und liest nach der Abfrage den ersten Wert aus. Steht 0 drin wurden keine Treffer gefunden, ansonsten halt so viele wie da drin stehen.

    MfG
    Rouven

    --
    -------------------
    He is entertaining both out of the car and in the car because if you tell him that a corner is almost flat then he is the guy who is going to try to take it flat even if it means shunting it the other side of it, he will come with the data and say 'hey, I may have crashed and destroyed the car, but I was flat-out'. That is an interesting quality that he has!  --  Team Member on Jacques Villeneuve
  2. Hallo,

    Ich habe es so versucht:
    »  $search = mysql_query('SELECT * FROM liste WHERE mail='.$\_POST['mail'].' LIMIT 0 , 30');
    »  if(!$search) {
    »   print "Eintrag schon vorhanden!";
    »   return;
    »  }

    Ich verstehe grad nicht, warzm da LIMIT 0 , 30 steht ... was hat das für einen Sinn?

    Warum machst du es nicht so:

    $mail_eingabe = die eingegebene Mail-Adresse vom Benutzer

    SELECT * FROM liste WHERE mail='$mail_eingabe'

    dann lässt du dir die Anzahl der Zeilen ausgeben, die diese Abfrage bringt. Ist die Anzahl gleich Null, so ist die E-Mail-Adresse noch nicht eingetragen. Andernfalls doch.

    Gruß Christian

    1. Ich habe es so probiert, aber es klappt nicht. Ich probiere es mal wie es Rouven gesagt hat.

      Danke trotzdem. :)

      Christian

  3. Hi,

    Da ich aber nicht möchte das man sich mehrfach mit der selben E-Mail-Adresse eintragen kann, möchte ich vor dem eintragen überprüfen ob der Eintrag schon vorhanden ist.

    der Eintrag ist schon vorhanden, wenn der Versuch eines INSERT am Unique-Constraint scheitert, welches Du angelegt hast. Wieso willst Du da vorher noch irgendwelche SQL-Roundtrips abfeuern? Schickst Du auch jemanden zum Supermarkt, um nachsehen zu lassen, ob die noch Tiefkühlpizza mit Peperoni-Schokoladen-Geschmack haben, damit Du anschließend hingehen kannst, um sie zu kaufen?

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Also dein Beitrag ist sehr Hilfreich, aber aber INSERT funktioniert auch wenn der selbe Inhalt schon vorhanden ist. Nur was ist "Unique-Constraint". Ich habe gerade mal eben dannach geGooglelt, aber konnte nichts wirklich Hilfreiches finden.
      Was ist das?

      Christian

      1. Hallo Christian!

        Also dein Beitrag ist sehr Hilfreich, aber aber INSERT funktioniert auch wenn der selbe Inhalt schon vorhanden ist. Nur was ist "Unique-Constraint". Ich habe gerade mal eben dannach geGooglelt, aber konnte nichts wirklich Hilfreiches finden.

        Die Suche nach Fachausdrücken hilft nicht immer.
        Also zuerst etwas Theorie:
        http://de.wikipedia.org/wiki/Sql
        http://de.wikipedia.org/wiki/Schlüssel_(Datenbank)

        Wenn du die Tabelle selbst erstellt hast, solltes du die Spalte „mail” mit einem eindeutigen Schlüssel versehen können. Dann ist es nicht mehr möglich, den selben Wert ein zweites Mal einzutragen.

        SQL ist es Wert, erlernt zu werden:
        http://www.computerjockey.de/mcdba/SQL_in_21_Tagen/inhalt.htm#TopOfPage
        Indizes werden dich besonders interessieren:
        http://www.little-idiot.de/mysql/mysql-112.html

        Als erste Hinweise sollte das helfen, jetzt musst du erst einmal viel lesen. Ich kann dir sagen, es ist wirklich nützlich.
        http://www.gulp.de/kb/mk/chanpos/relationaledb.html#fuenf

        Viele Grüße

        H-P Ortner

        1. yo,

          wobei ein constraint UNIQUE alleine nicht reicht, sondern noch der Constraint NOT NULL zusätzlich eingerichtet werden.

          Ilja

        2. Hi,

          Die Suche nach Fachausdrücken hilft nicht immer.

          keine Suche hilft immer - es kommt auf die Suchstrategie an. Die Suche nach "Unique-Constraint" ist äußerst erfolgreich, wenn man sie auf den Teil des Internets anwendet, der das Thema am ehesten behandeln[1] muss.

          Cheatah

          [1] Die Site ist bereits recht weit gefasst. Wenn das immer noch zu unpräzise ist, dürfte dev.mysql.com helfen.

          --
          X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
          X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
          X-Will-Answer-Email: No
          X-Please-Search-Archive-First: Absolutely Yes
      2. Hallo Christian,

        ... Nur was ist "Unique-Constraint". Ich habe gerade mal eben dannach geGooglelt, aber konnte nichts wirklich Hilfreiches finden.
        Was ist das?

        Hättest du mal ein Wörterbuch befragt:

        "constraint" kann man mit "Einschränkung" übersetzen.
        "unique" mit "eindeutig/einmalig/singulär".

        Wenn du mit CREATE TABLE eine Tabelle anlegst, kannst du hinter den Spaltenbezeichnungen neben dem Datentyp auch Einschränkungen angeben. Das Datenbanksystem prüft dann bei einem späteren INSERT, ob der einzufügende Wert den Einschränkungen entspricht. UNIQUE bedeutet in dem Fall, dass jedes Datenfeld in einer so markierten Spalte einen eindeutigen Wert besitzt. Oder anders ausgedrückt: Jeder Wert darf nur maximal ein Mal vorkommen.

        Im PostgreSQL-Handbuch ist das ordentlich beschrieben:
        http://www.postgresql.org/docs/8.1/static/ddl-constraints.html

        Im MySQL-Handbuch nicht so schön (aber dafür auf deutsch):
        http://dev.mysql.com/doc/refman/5.1/de/create-table.html

        Neben den "Constraints" für einzelne Spalten gibt es auch noch Einschränkungen, die für mehrere Spalten oder die ganze Tabelle gelten ...

        MffG
        EisFuX

        --
        Auch meine Hosenträger sind intelligent, in dem Sinne, dass man sie regulieren kann. Sie besitzen ein adaptives Verhalten.
        Stanisław Lem