Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Prüfung ob Wert bereits in DB vorhanden (case sesitive?!)

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Prüfung ob Wert bereits in DB vorhanden (case sesitive?!)

    Hallo,

    ich möchte gerne nach dem Abschicken eines Formulars prüfen ob die eingegebenen Werte bereits in der Datenbank vorhanden sind.

    Konkrekt geht es um: Name, Vorname, Email

    Es soll nur anhand der Email überprüft werden, ob diese schon vorhanden ist.

    Ich schicke das Formular ab und übergebe 3 POST Vars an meine add_user.php. In der add_user.php starte ich dann zuerst eine DB-Abfrage
    PHP-Code:
    $sql1 'SELECT name, vorname, email FROM tabperson WHERE email = "'.$email.'"';
    $db_erg1 mysql_query$sql1 );
            if ( ! 
    $db_erg1 )
            {
        die(
    'Ungültige Abfrage: ' mysql_error());
        }    
    $db_pers mysql_fetch_assoc($db_erg1);
        if (
    $email == $db_pers['email'])
            {
                echo 
    'Der Benutzer ist bereits vorhanden!';
            }....
    ....
    .... 
    Wie kann ich die Abfrage jetzt "nicht" Case-sensitiv machen?

    Email in DB: test@web.de
    Email im Formular: TEST@web.de

    In dem Fall fügt er trotzdem den benutzer zu =/ Kann mir jemand einen Tipp geben?

    mfg

  • #2
    LIKE 'email@example.com'

    Wenn du LIKE ohne die Prozentzeichen verwendest, ist das wie ein case-insensitives "Gleich"

    Kommentar


    • #3
      PHP-Code:
      $sql1 'SELECT name, vorname, email FROM tabperson WHERE LOWER(email) = "' strtolower($email) . '"'

      Kommentar


      • #4
        Datenbankabfragen sin im allgemeinen ci (Kollation). Was nicht ci ist, ist dein PHP-Vergleich:
        PHP-Code:
        $email == $db_pers['email'
        Warum machst du den überhaupt? Du kannst auch mysql_num_rows() benutzen. Außerdem gibt es einen Fehler, wenn du kein Ergebnis erhältst - bitte error_reporting und display_errors vernünftig einstellen!

        Kommentar


        • #5
          Zitat von lstegelitz Beitrag anzeigen
          Wenn du LIKE ohne die Prozentzeichen verwendest, ist das wie ein case-insensitives "Gleich"
          Nein, ist es nicht - es ist dann exakt das Gleiche wie "gleich", d.h. es berücksichtigt ebenso die Collation.

          Kommentar


          • #6
            Zitat von hts Beitrag anzeigen
            Datenbankabfragen sin im allgemeinen ci (Kollation). Was nicht ci ist, ist dein PHP-Vergleich:
            PHP-Code:
            $email == $db_pers['email'
            Warum machst du den überhaupt? Du kannst auch mysql_num_rows() benutzen. Außerdem gibt es einen Fehler, wenn du kein Ergebnis erhältst - bitte error_reporting und display_errors vernünftig einstellen!
            Hm wieso denn mysql_num_rows() ? Das liefert doch die Anzahl der gefundenen Datensätze bei einem SELECT zurück. Soll ich dann einfach prüfen ob die Anzahl == 0 ist?!

            Bewirkt das nicht im Endeffekt genau das gleiche?


            PS: WHERE email = $email ist doch das gleiche wie LIKE = $email oder nicht?!

            Kommentar


            • #7
              PS: WHERE email = $email ist doch das gleiche wie LIKE = $email oder nicht?!
              Ja, aber da hast Du wieder das Problem TEST@example.com != test@example.com

              Workaround: #3

              Kommentar


              • #8
                Ist es nicht so, das mysql die Groß und Kleinschreibung nicht beachtet außer der Typ ist BINARY?!

                Wenn ich einen Nicknamen in die Datenbank schreibe mit dem ich mich einloggen will (bsp. test) dann kann ich mich sowohl mit test als auch mit Test tEst oder TEST einloggen.

                Alternativ, wie wäre es wenn du sofort von Beginn an sicherstellt das du nur Kleinbuchstaben in die Datenbank schreibst? ([MAN]strtolower[/MAN])

                gruß

                Kommentar


                • #9
                  Wenn ich einen Nicknamen in die Datenbank schreibe mit dem ich mich einloggen will (bsp. test) dann kann ich mich sowohl mit test als auch mit Test tEst oder TEST einloggen.
                  Kann es sein, daß Deine Umgebung auf Windows läuft? Da wird das nämlich nicht unterschieden.



                  EDIT
                  Auch wenn es keine Glanzlösung ist, aber man kann auch den Hash vergleichen, dann ist's auf jeden Fall CaseSensitive:
                  PHP-Code:
                  $sql "SELECT irgendwas FROM irgendwo WHERE MD5(irgendwas)='" md5($irgendwas) . "'"

                  Kommentar


                  • #10
                    Zitat von Arne Drews Beitrag anzeigen
                    Kann es sein, daß Deine Umgebung auf Windows läuft? Da wird das nämlich nicht unterschieden.
                    Jetzt verwechselst du aber Datenbank- und Tabellennamen mit Werten. Ersteres hängt vom Dateisystem ab, letzteres von der eingestellten Kollation. Wenn sie mit _ci endet (z.B. utf8_unicode_ci) sind Vergleiche darauf case insensitive, unterscheiden also nicht zwischen Groß- und Kleinschreibung.

                    Kommentar


                    • #11
                      Stimmt, hast recht. Habe es eben selbst getestet.
                      Daher auch mein EDIT (s.o.)

                      Kommentar


                      • #12
                        Besser man gibt die zu verwendende Kollation explizit an (wenn man den Standardwert für die Tabelle nicht ändern will):

                        http://dev.mysql.com/doc/refman/5.0/...t-collate.html

                        Kommentar


                        • #13
                          Hm schon 2 Seiten lang der Thread, aber keine wirkliche Lösung, oder? Eigentlich ist es mir egal obs groß oder klein geschrieben ist.

                          Meine DB Kollation ist latin1_swedish_ci eingestellt. Also ist es mysql ja egal ob Groß- oder Kleinschreibung.

                          Ich habe in meiner Tabelle die E-Mail: Test@web.de

                          Wenn ich nun im Formular auch exakt Test@web.de eingebe, gibt er mir mein echo aus
                          PHP-Code:
                              if ($email == $db_pers['email'])
                                  {
                                      echo 
                          'Der Benutzer ist bereits vorhanden!';
                                  } 
                          Wenn ich aber in das Formular test@web.de oder tEst@web.deschreibe und abschicke trifft der Fall $email == $db_pers nicht zu und er arbeitet den Else-Fall ab.

                          Mir ist die Schreibweise also egal. Es geht rein um den Inhalt. Muss ich dann diese BINARY Version nehmen?

                          Kommentar


                          • #14
                            Dir wurde ganz am Anfang schon gesagt, dass diese zusätzliche Abfrage in PHP nicht nötig wäre...

                            Kommentar


                            • #15
                              War nicht deutlich für mich, aber ich denke das war gemeint oder?

                              PHP-Code:
                              $db_pers mysql_num_rows($db_erg1);
                                  if (
                              $db_pers == 1)
                                      {
                                          echo 
                              'Der Benutzer ist bereits vorhanden!';
                                      }
                                      else 
                                          {
                                          
                              //Datenbank füllen    
                                                       

                              EDIT: Er springt trotzdem in den Elsefall...

                              Sry ich steh irgendwie auf dem Schlauch

                              Kommentar

                              Lädt...
                              X