Front end user form module mit datenbankeintrag

  • Liebe Jommla Coomuniy,


    ich habe hier schon echt viel gelernt und danke Eurch für die Hilfe. Nun habe ich noch ein Modul, welches ich programmiere. Kurzes Hintergrundwissen. Das Modul soll im Registrierten für eine Benutzergruppe vorhanden sein, Der Registierte User darf neue Benutzer einpflegen, sodass der neue Benutzer sich einloggen kann.


    Bisher habe ich die "provesorisch" die "default.php" und die "mod_entstellen_lspd" programmiert. Das Formular der default.php gibt somit alle Werte an die mod_entlassen_lspd weiter.


    Folgende DInge funktinierne nicht:


    - die insert Anweisung ist falsch und gibt mir folgende Mitteilung: 1062 - Duplicate entry '' for key 'idx_username' --> das Präfix idx benutze ich nicht und komme es auch nicht in MYSQL finden,

    - wie erstelle ich das Token für user_id

    - wie erstelle ich das Registrierungsdaten



    Könnt Ihr mir helfen, wie ich das hinbekomme.



    Bisher habe ich folgendes schon programmiert.


    default.php


    mod_einstellen_lspd



    helper.php


  • Oben musst natürlich alle zusammengehörenden Daten zusammen übergebn:

    Code
    modEinstellen_lspd::Einstellen($user_name, $ben_name, $email, $pwd);

    Und die 2. erhält alle und nutzt dann direkt eine Joomla-Klasse. Wie im Code vermerkt, habe ich keine Ahnung, wo bei dir die Benutzergruppe ist, damit Joomla auch die #__user_usergroup_map korrekt füllt.


    Beachte, dass der neue User je nach Joomla-Einstellungen dann auch gleich eine Info-Email bekommen wird (oder nicht).

    das Präfix idx benutze ich nicht und komme es auch nicht in MYSQL finden

    Das ist ein sog. Index, der z.B. eine Suche beschleunigen kann..


  • Anstatt dieser $_POST['spielername'] Sachen würde ich beim Joomla-Standard bleiben, weil es Dir einige Sachen mit Fehlerprüfung usw. schon abnimmt. Weitere Fehlerprüfungen kannst Du damit auch viel einfacher schreiben.


    Bei der Frage zum Deinem anderen Modul hatte ich Dir ja gezeigt, wie man die Formular-Eingaben empfängt:

    PHP
    use Joomla\CMS\Factory;
    $input = Factory::getApplication()->input;
    $val = $input->get(param_name, default_value, filter);

    Hier gibt es noch weitere Infos dazu: https://docs.joomla.org/Retrieving_request_data_using_JInput

    Wenn man die Lösung hat, dann muss man nur noch das passende Problem finden.

  • Hallo LukasHH


    ich habe ja die besprochen Sachen integriert. Also die Daten der input anweisungen werden übergeben das klappt. Ich habe die Post Anweisung rausgenommen und diese durch folgende ersetzt:


    mod_einstellen_lspd.php --> aktualisierung



    Damit möchte ich Prügen, ob jede input-Anweisung einen Wert hat.


    Ich bekomme wieder die Mitteilung: 1062 - Duplicate entry '' for key 'idx_username'

    Diese kommt wahrscheinlich vom meiner helper.php Datei, da die SQL Anweiung komplexer ist als ich dachte.

    Da ich seit ca 1.5 Wochen php und mysql lerne bin ich wirklich schon voran gekommen. Natürlich ist Joomla noch für mich etwas eigen und komplex. Aber wenn man da durchblickt dann geht es eigentlich.


    viele Grüße

    Sascha

  • Hallo Zusammen,


    ich habe die helper.php datei bearbeitet. DIe Benutzergruppe darf nur die Nr 10 (so steht es in der Datenbank unter #__usergroup_maps sein.


    Aber ich bekomme den selben Fehler -> 1062 - Duplicate entry '' for key 'idx_username'


    Wo ist bei mir der Fehler?


    helper.php


  • Wenn ich mich nicht täusche, dann besagt der Fehler, dass es diese Benutzernamen schon gibt.

    Der Benutzername darf nur 1x vorkommen.


    Zum Anlegen eines neuen Benutzer, darfst Du keine ID vergeben. So wie ich das sehe, möchtest Du die ID=0 mitgeben. Die ID wird automatisch vergeben.

    Wenn man die Lösung hat, dann muss man nur noch das passende Problem finden.

  • ich habe das drin:

    Code
    // User-ID wird automatisch gesetzt
        $data['id'] = 0;

    stimmt und müsste sowas haben:


    Code
    // User-ID wird automatisch gesetzt
        $data['id'] = ???; /* nehme das letzte UserID und erhöhe diese um 1 */

    Wenn ich die ID in der SQL insert abfrage lösche kommt trotzdem der Fehler. Ich habe keine Change etwas im Formular einzugeben, da diese Error Bildschirm von Joomla im View gezeigt wird anstatt die Fehlermeldung auf meiner HP.


    RE.Later hat mir oben ja geholfen und mir ein sheet gegeben, welches ich eingebaut habe:

    und habe da die Datenbankabfrage aufgesetzt:


  • Beim Insert die ID weg lassen, da diese automatisch von der DB vergeben wird.


    Vor dem Insert prüfen, ob der Benutzername schon existiert. Wenn der schon existiert, dann kannst Du den Insert nicht durchführen.

    Wenn man die Lösung hat, dann muss man nur noch das passende Problem finden.

  • Du machst das hier auch doppelt - mit $userModel->save($data); wird der Benutzer bereits hinzugefügt. aber auch hier die ID weg lassen.

    Die ID muss nur angegeben werden, wenn Du die Daten eines bestehenden User ändern möchtest.

    Wenn man die Lösung hat, dann muss man nur noch das passende Problem finden.

  • ich verstehe, und es funktioniert - danke


    ich habe jetzt die SQL Anweisung erweitert, da ich 3 Tabellen habe, wo etwas reingeschrieben werden soll. Das sind folgende:


    - #__users

    - #__mitarbeitertamm --> Spalten ( id, dienstnummer, rang, telefon) wobei die id = userid sein soll, damit die tabelle verbunden werden kann

    - #__usergroup_maps -> Spalten (id, group_id)


    ich habe die 3 Tabellen jetzt mit join left wie folgt verbunden.



    in der mod_erstellen_lspd habe ich rangname erweitert

    Code
    $rangname     = (int) $app->input->get('rangname');


    in der helper.php habe ich das Insert auf der Rangnummer sowie die Gruppen ID und erweitert:



    Zitat

    und erhalte den folgenden Fehlercode:

    1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'AS `a`
    (`a`.`name`,`a`.`username`,`a`.`email`,`a`.`password`,`b`.`group_id`,...' at line 1



    Wie kopiert man die User ID von #__users in die anderen beiden tabellen, sodass ich den Rang und die Gruppe festsetzen kann?

  • $userModel->save($data); wird der Benutzer bereits hinzugefügt. aber auch hier die ID weg lassen.

    uuuuuuund, weshalb ich das überhaupt gepostet habe, es werden die weiteren Tabellen gefüllt, die eben für korrektes User-Handling nötig sind und Fehler abgefangen. Mit deinem plumpem ursprünglichen Weg über $db und nur #__users zu füllen crasht du die Datenbank! Sie wird inkonsistent, was sich irgendwann rächen wird!


    Man kann dann zwar als Admin im Backend so einen unvollständigen User öffnen und vervollständigen, indem man ihn nochmals speichert, aber das ist natürlich aufwendig und mache ich nur im Ausnahmefall...


    Und nur nebenbei, für Professoren. Da die id auf is empty geprüft wird, darf sie auch 0 sein, wie bei mir oder weggelassen werden.

  • Hallo RE:Later,


    danke für den Kommentar ! Aber ich bin kein Profi noch Professor -> sonst würde ich hier Fragen beantworten. Zum Hintergrund: Ich habe vor 1.5 Wochen angefangen PHP und mysql zu lernen. Ich bin schon etwas weit gekommen und jeder war mal Unwissener. Ich versuche für eine kleine Spielegemeinschaft ein reporting in Joomla zu entwicklen, wobei der Spieler sich einloggen kann und interactiv Forms mit Internet of Thinks reporten kann, die zum Spiel gehören (z.B Dienstplan). Dabei sollen die Spieler sich selber managen und das nur im Front Bereich.


    Ich weiß, das die Datenbank inkonsistent ist, da nur die #__users abgefragen wurde. Wenn Du mein vorherigen post gelesen hättest , hättest Du gesehen, das ich gerne den neuen user eine Gruppe zuweisen möchte. Aber es hagt wegen unwissenheit.


    MIt der Empty Prüfung in der "mod" Datei wollte ich prüfen, ob alle Felder im Input ausgefüllt sind, damit die Daten des neuen Benutzers aufgenommen werden.


    Trotzdem danke für deine vorherige Hilfe und hoffe das DU Trotzdem Anfängern weiterhilfst.

  • sorry, aber ich gebe mir Mühe fragen zu beantworten, wenn ich dies weiß. Ich bin ja froh, das man mir hier auch geholfen hat. Ich habe oben unmut rausgelesen, wo ich nichts dafür kann. Auf der anderen Seite ist eine Dokumentation im Internet nicht so besonders gut.

  • Ich habe auch mal so angefangen und weiß bis heute auch noch nicht alles. Manches werde ich wahrscheinlich auch nie verstehen und stehe mit machen Dingen noch immer auf "Kriegsfuss". ;)

    Das Problem der Dokumentation im Internet ist auch immer so eine Sache. Es gibt schon sehr viele Infos - man muss sie nur finden. ;)
    Dann besteht auch oft das Problem darin, dass die Dokumentation meistens der Entwicklung hinterher hängt. Das liegt aber auch daran, weil die Entwicklung sehr schnelllebig ist.

    Was ich bei Joomla eben richtig toll finde, dass durch die Joomla-eigenen Klassen schon recht viel abgenommen wird und manches viel einfacher wird. Wird dann doch einmal in einer Klasse ein Fehler oder Sicherheitslücke gefunden und gefixt, muss man sich in den seltensten Fällen selbst noch darum kümmern.

    Was ich sehr oft als Doku verwende:
    - Aufbau und Funktionsweise des Joomla-Core verstehen (Komponenten, Module usw.) Hier kann man sich sehr viel abschauen

    - Die Dokus auf joomla.org (https://docs.joomla.org/Category:Module_Development oder https://docs.joomla.org/Portal:Developers)

    - Das Forum hier oder https://joomla.stackexchange.com/

    - Die UserGroups und nicht zu vergessen den JoomlaDay - wobei ich vor 2 Jahren beim JoomlaDay das erste mal dabei war - und es lohnt sich

    - Manche Bücher zu Joomla (Kleine Übersicht) - Elisa und David hatten für J3 ein spezielles für Entwickler geschrieben - Gibt es auch eins für J4?


    Vieles lerne ich über "Probieren und Studieren" ;) Und durch die Fragen der anderen hier lerne ich auch immer wieder mit dazu.

    Wenn man die Lösung hat, dann muss man nur noch das passende Problem finden.

  • Hallo Lukas,


    ich habe mir leztes Jahr das Joomla Handbuch gekauft. Aber dieses Buch beschreibt alles, aber nicht das was man benötigt :-). Also bin ich nochmals bei Amazon einkaufen gegangen und habe mir das Joomla Template Buch und das Modul /plugin / Component Buch von Jens *** gekauft.


    Die letzten beiden habe ich mir auch angesehen und die 5 Seiten für die Modulentwicklung angesehen. Vor ca 1.5 Wochen habe ich dann angefangen mir die Praxis anzueignen und hab einfach mal angefangen von O reilly php und SQL mir angesehen.


    Fazit: Du hast recht. Man investiert eine Menge Zeit. Geld möchte ich nicht damit verdienen und dient 100% als Hobby, da ich Spaß dran habe. Leider stößt man ganz schnell an seinen Grenzen.


    Nun sitze ich wieder seit ca 8 Std dran und habe mich wieder versucht: und es klappt nicht ...


    1. Prüfung: Leere Felder und doppelte Benutzernamen


    Eine Prüfung zu programmieren, damit Doppelte Benutzernamen nicht vorhanden sind.


    mod Datei


    helper.php


    2. SQL-Anweisung: insert mit drei verschiedenen Tabellen


    Ich habe ja mitbekommen das alle id's der 3 Tabellen automatisch gebucht werden. Aber irgendwie klappt das nicht.



    Danke für die Mühe mir zu Helfen und deine Info Sammlung. Ein wenig Frustrierend, aber "Probieren geht über Studieren".


    Mal sehen, wo ich Fehler gemacht habe.

  • Beim Programmieren ist es auf jeden Fall wichtig, dass man eine logische Reihenfolge und sämtliche mögliche Fehleingaben abfängt.

    Mit $app->input->get('benutzername') bekommst Du den Benutzernamen, das in das Formularfeld eingegeben wurde. Erst einmal prüfst Du, ob das überhaupt ausgefüllt wurde. Danach prüfst Du, ob dieses schon existiert bzw. noch nicht existiert. Wenn dieses noch nicht existiert, dann kann das verwendet werden.

    Die Prüfung, ob der Username schon existiert kann man recht einfach machen mit:
    https://docs.joomla.org/Accessing_the_current_user_object

    Wenn man die Lösung hat, dann muss man nur noch das passende Problem finden.

  • Hallo LukasHH,


    es klappt, danke Dir vielmals.


    - Dann brauche ich eine Prüfung, ob eine Variable Numerisch ist . z.B. bei den Telefonnummer dürfen keine Buchstaben eingegeben werden.

    Ich würde es wie folgt lösen:


    Code
     <?PHP 
        if (is_int ( $app->input->get('telefon'))) {
            $telefon         = (int) $app->input->get('telefon');
        }
         else {
            echo 'Es dürfen nur Nummern verwendet werden. ';
        }
    
    ?>

    Die Prüfungen werden kann verschachtelt gegliedert und wenn alle zustimmen, dann wird der ausgeführt.



    - Ich habe da noch ein Problem mit dem ID in den drei SQL Tabellen: Der Aufbau ist im Anhang

    Immer wenn ich ein neuen Benutzer im Frontend über das Modul anlege, werden die ID's in den Tabellen (mitarbeiterstamm, user_group_map)

    falsch gesetzt. Die ID der User Tabelle ist fortlaufend mit 835 und wird jeweils im 1 erhöht. Die Anderen beiden Tabellen fangen bei 0 an oder bleiben 0.


    Wie sage ich SQL das die Primary Nr der user-tabelle auch in den anderen beiden Tabellen gesetzt wird, wobei die Nummer um 1 erhöht wird und einen Anfang bei 835 hat.



    PS: Deine Dokumentation werden ich in den nächsten Tagen mal durcharbeiten. Du hast Recht. Es klappt immer besser. Man muss es nur machen...

  • Problem mit dem ID in den drei SQL Tabellen

    Das ist ein Thema des DB-Design.

    Die ID kennzeichnet einen eindeutigen Datensatz und sollte immer von der DB automatisch vergeben werden. Du müsstest in Deinen DB-Tabellen ein weiteres Feld z.b. userid hinzufügen, in das dann die UserID eingetragen wird. Bestenfalls wird das Feld ID als Primary Key (Primärschlüssel) definiert und das Feld userid als Fremdschlüssel (Foreign Key). Das Feld userID referenziert dabei auf die ID in #__users Damit werden dann die Beziehungen zu den Tabellen in der DB hergestellt.

    Wenn man die Lösung hat, dann muss man nur noch das passende Problem finden.

  • Hallo Lukas,


    danke dir !! Ich hab es geschafft und werde immer Motivierter etwas zu Programmieren.


    Im PHP Kurs hat man gesagt, das man folgende Dinge noch machen muss und werde jetzt mal recharchieren.


    1. Prüfung ob variable Eingabe eine Emailadresse ist: Hier wird immer das @ Zeichen in der Datenbank entfernt

    2. In der Datenbank werden die Passwörter nicht verschlüsselt (md4 oder sowas fehlt)

    3. User können im Formularfeld Code eingeben und muss unterbunden werden (TRIM ??)