Login / Registrierung von Usern

  • Hallo zusammen,


    für einen speziellen Bereich sollen User sich nur auf "Einladung" registrieren können, gedacht ist folgendes; Der User benötigt einen Registrierungscode, diesen gibt er bei der Registrierung an z.B. "1788954a7" und nur wenn dieser Code gültig ist soll der User sich registrieren können.


    Ich hab dazu eine Datenbank mit den Tabellen securityid dort befinden sich in der Spalte sid alle Rgistrierungscodes, die es gibt und werden auch neue erzeugt. In der Tabelle User befinden sich dann die registrierten User, zu jedem registrieren User wird in der Spalte sidu der Registrierungscode gespeichert, den der User verwendet hat. Also dahcte ich mir, ich lass bei der Registrierung die Gültigkeit prüfen in der Tabelle securityid / sid und dann nochmal ob der Code noch frei ist in der Tabelle users/ sidu


    Leider bin ich mir gerade nicht sicher, ob ich ein Denkfehler habe oder ob ich ein Codefehler habe, denn es funktioniert nicht.




  • Da ich in den Thema auch noch an lernen bin gebe ich meine Antwort als Frage raus weil ich es erstmal so versuchen würde bevor ich da eine Extra SELECT abfrage mache.


    Würde es nicht reichen die Spalte mit den securityid auf Unique/Primary Key zu setzen ????

  • Hallo zusammen,


    zu dem Code: wenn ich es richtig sehe nutzt fetch() dies liefert laut der Docu nur im Fehlerfall ein False zurück, ansonsten (je nach Einstellung) das Resultset

    http://php.net/manual/en/pdostatement.fetch.php

    D.h. du solltest hier prüfen wie viele Einträge mit der sid zurückkommen.

    Dafür kannst du auch rowCount nutzen: http://php.net/manual/en/pdostatement.rowcount.php


    basti1012

    Auch dein vorgehen ist gängig, wenn wir prinzipiell davon ausgehen das es besser ist solches verhalten über Exceptions zu handeln (was es im bereich von OOP ist), dann würde hier nur ein Insert gestartet werden und dann eine PDOException gefangen.


    D.h. in MySql das Feld auf UNIQUE stellen und nach dem Insert per Try Catch prüfen



    Der Fehlercode 1062 wäre laut der List: https://www.fromdual.com/mysql…es-and-messages-1050-1099 Duplicate entry.

    ACHTUNG: Das ist Datenbank spezifisch, ich vermute man könnte den Fehler auch generisch finden, weiß gerade nur nicht wie.


    Grüße


    Timo

  • Danke für die Antwort,


    es ist so ich überprüfe mit genau dem gleichen vorgehen ob eine email adresse bereits registriert wurde und lehne dann die Registrierung ab. Das funktioniert super, wenn ich den Teil mit der securityid aus dem 1. Post rausnehme funktioniert das registrieren von Usern 1A. Wenn es mit einer Email geht dann sollte das doch auch mit einem anderen Eintrag gehen oder nicht?




    Hier für Emails nutzt ich das gleiche,

    Code
    if(!$error) { 
            $statement = $pdo->prepare("SELECT * FROM users WHERE email = :email");
            $result = $statement->execute(array('email' => $email));
            $user = $statement->fetch();
            
            if($user !== false) {
                echo 'Es ist bereits ein Account mit dieser Email Adresse vorhanden<br>';
                $error = true;
            }    
        }
  • Ich habe mir das Fetch auch nochmal angeschaut, tatsächlich liefert das bei keinem Ergebnis False zurück, d.h. im Standard, liefert Fetch bei einem SQL Fehler UND bei leerem Result ein False.


    Jetzt wäre meine Frage, was funktioniert denn nicht? Ist es bei deinem sid test immer false also kann sich jeder user auch mit existierender sid registrieren?

    Falls ja: dann solltest du mal prüfen ob dort sql error zurückgegeben werden. Falls nein, musst du glaube ich nochmal genauer erklären, was nicht funktioniert.


    Aber dennoch würde ich fetch nicht so benutzen (da ich es nicht so benutze und so wie Arne Drews geschrieben hat, nur mit dem ERRMODE_EXCEPTION) ist mir das bisher noch nicht aufgefallen. Ein RowCount zu machen um zu prüfen ob es existiert wäre die bessere alternative.


    Grüße


    Timo

  • Wenn Du das für die bessere Alternative hältst, dann erwähne aber auch, dass PDOStatement::rowCount() für SELECT Queries nur abhängig vom DBMS vertrauenswürdige Ergebnisse liefert. Ich halte das nicht für die bessere Wahl, anstatt Fehler abzufragen, wie es gedacht ist.

  • Hey Danke für eure Antworten,

    Was nicht funktioniert, ist das Prüfen der Gültigkeit, aktuell kann sich jeder registrieren ob die sid gültig ist oder nicht, der untere Teil ob die SID bereits verwendet wurde funktioniert super, wenn ein user eine sid verwendet, wird die auch in die tabelle users eingetragen und so dann blockiert....


    Ich habe jetzt auch ein Test gemacht und die ID 7899 angelegt ein USer damit registriert und es ging, dann ein zweiten user registriert mit der gleichen id, das ging nicht. EIn 3. User mit der ID 7890 ging dann aber obwohl die ID in sid nicht existiert.


    Anbei nur der Teil, der für die Gültigkeit zuständig ist


  • Arne Drews das ist auch richtig. Das mit Fetch ist eigentlich auch der Richtige weg. PHP und PDO sind furchtbar. Hab mir nebenher nochmal die Doku und einige eingräte auf StackOverflow angeschaut, scheint aber auch nicht das Stabilste Construct zu sein.


    MariusB Dann vermute ich eher, das du irgendwo in der Abarbeitung einen Logik Fehler hast. Ich kann frühestens heute Abend das ganze nochmal genau anschauen. Vielleicht kannst du den gesamten Code Posten und die Tabellen. Ich weiß was du versuchst und ich weiß auch das es heir einfachere oder Übersichtlichere Wege gibt das zu lösen.


    Grüße


    Timo

  • Arne Drews

    Ich bin mittlerweile im Enterprise Umfeld unterwegs, viel Azure, hauptsächlich .NET / Node.js. Wenn man sich an vieles dort gewöhnt hat und ich alle 2-3 Jahre mal wieder en PHP Projekt anfange, dann frage ich mich immer warum (mache es aber dennoch). Script sprachen vs. Application Sprachen.

  • Ich arbeite hauptberuflich auch im .NET Umfeld, PHP ist nur ein Hobby, aber die Behauptung PHP und PDO sei furchtbar ist imho unpassend.

    Du befindest Dich hier im PHP-Bereich, da kannst Du erstmal nicht von .NET und Azure ausgehen. PDO ist für PHP bspw. aus meiner Sicht eine der besten Erweiterungen der letzten Jahre.


    Aber ich teile Deine Meinung, dass man Script-Sprachen ( bspw. PHP ) und "Application"-Sprachen ( bspw. C# ) nicht vergleichen kann/sollte.

    Genau deshalb finde ich aber die Beurteilung über PHP und PDO unpassend an der Stelle. Für die Umsetzung von Webprojekten ist PHP eine akzeptable Wahl und in Bezug auf Datenbanken dann PDO eine der besten.

    ;)

  • Klar, offensichtlich kann man so viel hier nicht anhängen, habe den code der register.php daher ausgelagert -.-




    register.php


    https://piratenpad.de/p/PBDMhr58jOkC16qNcTL



    DB users

    Code
    CREATE TABLE `users` (
      `id` int unsigned NOT NULL AUTO_INCREMENT,
      `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
      `password` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
      `nick` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
      `sid` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
      `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
      `updated_at` timestamp NULL DEFAULT NULL,
      PRIMARY KEY (`id`), UNIQUE (`email`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

    DB securityid

    Code
    CREATE TABLE `securityid` (
      `id` int unsigned NOT NULL AUTO_INCREMENT,
      `sid` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
      `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
      `updated_at` timestamp NULL DEFAULT NULL,
      PRIMARY KEY (`id`), UNIQUE (`sid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  • MariusB

    Ich werde versuchen mir das heute Abend genauer anzuschauen und durchzuspielen. Kann dir dann bestimmt helfen eine Lösung zu finden :)



    Arne Drews Das ist richtig, ich nutze es deswegen ja auch für hobby Projekte. Scherzhaft sage ich auch nur, das alle Programmiersprachen furchtbar sind und ich die nutze, welche einem am wenigsten furchtbar erscheinen. Das oben, ging auch eher wieder an die Standard-Konfiguration und das vorgehen das Rückgaben "mixed" sind mit einer Inkonsequenten (und zum teil schlecht dokumentierten) Logik. Zudem, fällt es mir schwer, kein konsequentes OOP und Enterprise Architekturen zu verwenden und PHP zwingt einem manchmal da Brüche vorzunehmen :). 60% meines heutigen codes sind in JS/TS und das mag ich weit weniger als PHP, dennoch mache ich damit fast alles.

  • Naja, PHP bleibt typschwach, von daher ist mixed so ziemlich die genaueste Angabe der Rückgabe. Wäre diese fest typisiert, müsste PHP Overloading, wie echte Programmiersprachen beherrschen. Manche sind zwar der Meinung, dass es das kann, aber meine Meinung dazu ist: Nein.

    ;)

  • timtim ich wäre dir da echt dankbar, ich wäre auch mit einer anderen Lösung einverstanden wie ich die registrierung an eine sid binde damit sich nicht jeder registrieren kann sondern nur user, die vorher diese id bekommen haben, leider ist mir nichts anderes eingefallen als es so zu lösen.

  • Dein weg geht schon, kann es sein, das du lediglich in dem teil hier:

    Weil, es gibt "FALSE" zurück, wenn die sid nicht existiert. Damit willst du es ja beenden wenn ->fetch() false zurück gibt (keine reihe gefunden).



    Grüße


    Timo

  • In meiner Korrektur waren keine zwei Echos und registrieren kann er nicht wenn ein error kommt... dann hast du die Anpassungen nicht übernommen. Habe sie extra markiert.


    Und dann solltest du noch prüfen ob PDO ein Fehler in der Abfrage hat.


    Grüße


    Timo

  • ahhh ne ok ich sehe es, ich hatte die echo eh nur für mich drin, die kommen später raus. Ich hatte übersehen du hattest error auch auf true geändert, hab nur die === angepasst.


    Ja super das war das Problem es geht jetzt so wie es soll, danke

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!