Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] In mehrere Tabellen gleichzeitig Datensätze hinzufügen/löschen

Einklappen

Neue Werbung 2019

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

  • [Erledigt] In mehrere Tabellen gleichzeitig Datensätze hinzufügen/löschen

    Hi Leute,

    ich programmiere zurzeit ein kleines Login System in PHP, u.a. mit Nutzerverwaltung.
    Und in dieser Nutzerverwaltung kann man natürlich aus Nutzer hinzufügen.

    Meine Abfragen für das hinzufügen sehen so aus:
    PHP-Code:
    mysqli_query($connection"INSERT INTO user (username, password, email, AccountCreation) VALUES ('$username', '$pw', '$email', now())");
    mysqli_query($connection"INSERT INTO permissions (admin, socket1, socket2, socket3) VALUES ($admin$socket1$socket2$socket3)");
    mysqli_query($connection"INSERT INTO reset_pw (valid) VALUES (0)"); 
    Die Tabelle "user" beinhaltet allgemeine Nutzerdaten, die Tabelle "permissions" beinhaltet die Rechte und die Tabelle "reset_pw" beinhaltet ChallengeID und sonstiges, für das Reset-PW System halt.

    Der Eintrag in der "reset_pw" wird nur erstellt, damit der Platz reserviert ist für den jeweiligen Nutzer, da alle Tabellen eine Spalte "ID" enthalten, über die die einzelnen Datensätze zugeordnet werden könnnen.
    Da ich die "ID" auf AUTO_INCREMENT hab, muss der Datensatz bei der Registrierung direkt hinzugefügt werden.

    Sollten aber nun zufällig durch verschiedene Administratoren 2 Benutzer gleichzeitig hinzugefügt werden, könnte es doch sein, dass das mit den ID's, die ja automatisch erhöht werden, sollte ein neuer Datensatz hinzukommen, irgendwie durcheinandergerät und am Ende die falschen Berechtigungen dem falschen Nutzer zugeordnet sind.
    So denke ich mir das zumindest, kann natürlich auch sein, dass das nicht möglich ist.

    Auf jeden Fall lautet deshalb meine Frage, ob ich obige Querys auch zu einem zusammenfassen kann. Beim auslesen geht das ja ganz leicht mit INNER JOIN, nur weiß ich nicht, wie das beim schreiben funktioniert.

    Wäre nett, wenn mir da jemand weiterhelfen kann.

    Danke schonmal im voraus.

    LG

    jkhsjdhjs

  • #2
    Moin.
    Da ich die "ID" auf AUTO_INCREMENT hab, muss der Datensatz bei der Registrierung direkt hinzugefügt werden.
    -> Auto Increment ist an dieser Stelle falsch.

    Sollten aber nun zufällig durch verschiedene Administratoren 2 Benutzer gleichzeitig hinzugefügt werden, könnte es doch sein, dass das mit den ID's, die ja automatisch erhöht werden, sollte ein neuer Datensatz hinzukommen, irgendwie durcheinandergerät und am Ende die falschen Berechtigungen dem falschen Nutzer zugeordnet sind.
    Da wäre diese Funktion etwas für dich: http://php.net/manual/de/mysqli.insert-id.php
    Dadurch bekommst du die zuletzt eingefügte (während dieser Verbindungssession, auto-incrementete) User-ID und kannst damit die weiteren Relationen anlegen.
    [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
    [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

    Kommentar


    • #3
      Hast recht, werde auto increment an dieser Stelle weglassen.

      Und Danke für die Funktion!
      Gut, dass PHP so gut dokumentiert ist, direkt verstanden!

      EDIT: Habe das auto increment jetzt bei permissions und reset_pw entfernt. Ist jetzt nur noch in der Tabelle user.
      Das sieht jetzt so aus:
      PHP-Code:
          mysqli_query($connection"INSERT INTO user (username, password, email, AccountCreation) VALUES ('$username', '$pw', '$email', now())");
      $userid mysqli_insert_id($connection);
      mysqli_multi_query($connection"INSERT INTO permissions (userid, admin, socket1, socket2, socket3) VALUES ($userid$admin$socket1$socket2$socket3);
                          INSERT INTO reset_pw (userid, valid) VALUES (
      $userid, 0)"); 
      Und funktioniert einwandfrei! Danke nochmals!
      Aber ist es nicht rein theoretisch möglich, dass zwischen dem Eintrag in die Tabelle user und der mysqli_insert_id Abfrage noch eine zweite seperat gestartete Abfrage startet, die dann nach der ersten Abfrage an der Reihe ist und so eine falsche auto increment id durch mysqli_insert_id ausgelesen wird?

      Kommentar


      • #4
        Die Funktion ist abhängig von der Verbindung. Du bekommst immer dem Auto Increment Wert des letzten in der Verbindung eingefügten Datensatzes zurück.

        Kommentar


        • #5
          Ah ok! Dann ist ja gut!

          Danke für eure Hilfe @VPh & @erc !

          Kommentar

          Lädt...
          X