Ankündigung

Einklappen
Keine Ankündigung bisher.

SQL Massen insert

Einklappen

Neue Werbung 2019

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

  • SQL Massen insert

    Ich habe wieder mal eine Frage an die Experten.

    Und zwar wie man einen Massen insert mit einer query machen kann.
    Online habe ich das ganze leider nicht dynamisch gefunden.

    Beispiel:
    Man ordnet jedem Namen eine Aufgabe zu und wenn man anschließend auf den Button drückt sollen alle Werte in die Datenbanktabelle "arbeiter_aufgaben" eingefügt werden, wenn keine Aufgabe zugewiesen worden ist, soll nichts hinzugefügt werden.

    "inpute box name="tag" " = Dienstag
    name aufgabe
    Tobias Garten aufräumen
    Max Müll rausbringen
    Klaus
    Hans Hund füttern
    "Button"


    Sobald der Button gedrückt ist sollen nur die Werte eingefügt werden bei denen etwas steht, anschließend sollen wieder keine Werte angezeigt werden und man kann Ihnen wieder eine neue Aufgabe zuordnen.

    Code (ohne Insert) zum testen:
    PHP-Code:


    <input type="text" size="40"  maxlength="250" name="tag" value="">


    <table class="table-fill">

    <tr>

        <th>Name</th>
        <th>Aufgabe</th>

    </tr>

    <?php

    $statement 
    $pdo->prepare("SELECT name FROM arbeiter");
    $result $statement->execute(array());

    while(
    $row $statement->fetch()) {

    echo 
    "<tr>";
    echo 
    "<td>".$row['name']."</td>";

    ?>

    <form action="" method="post">

        <input type="text" size="40"  maxlength="250" name="aufgabe" value="">
        <td><input class="btn" type="submit"  value="zuteilen"></td>

    </form>

    <?php

    echo "</tr>";

    }
    ?>

    </table>
    Datenbanktabelle für personen_aufgaben
    PHP-Code:
    CREATE TABLE IF NOT EXISTS `personen_aufgaben` (
      `
    aufgabe_idint(11NOT NULL,
      `
    namevarchar(255NOT NULL,
      `
    aufgabevarchar(255NOT NULL,
      
    PRIMARY KEY (`aufgabe_id`)
    ); 
    Datenbanktabelle für namen
    PHP-Code:
    CREATE TABLE IF NOT EXISTS `arbeiter` (
      `
    arbeiter_idint(11NOT NULL,
      `
    namevarchar(255NOT NULL,
      
    PRIMARY KEY (`arbeiter_id`)
    );

    INSERT INTO `arbeiter` (`arbeiter_id`, `name`) VALUES
    (1'Tobias'),
    (
    2'Max'),
    (
    3'Klaus'),
    (
    4'Hans'
    Kann man das Ganze überhaupt so machen oder sollte/muss man es anders lösen?


  • #2
    Ein bisschen Umdenken solltest Du.

    Die Verbindung zwischen der Tabelle arbeiter und personen_aufgaben sollte nicht der Name als Zeichenkette sein, sondern über die ID.
    Diese kannst Du in der Tabelle pro Datensatz dann mitführen und erstellst ein Formular für alle Zeilen, anstatt ein Formular pro Zeile, wie Du es jetzt machst.

    Weiterhin hoffe ich, dass Du eine Tabelle für die Aufgaben hast?
    Ich würde für Deinen Fall die DB ähnlich so aufbauen:
    Code:
    CREATE TABLE IF NOT EXISTS `arbeiter` (
      `arbeiter_id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) NOT NULL,
      PRIMARY KEY (`arbeiter_id`)
    );
    Code:
    CREATE TABLE IF NOT EXISTS `aufgaben` (
      `aufgabe_id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) NOT NULL,
      `aufgabe` varchar(255) NOT NULL,
      PRIMARY KEY (`aufgabe_id`)
    );
    Code:
    CREATE TABLE IF NOT EXISTS `arbeiter_aufgaben` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `arbeiter_id int(11) NOT NULL,
      `aufgabe_id` int(11) NOT NULL,
      PRIMARY KEY (`id`)
    );
    Dann würde ich ein Formular für alle Zeilen erstellen und nicht wie jetzt, pro Datensatz ein Formular.
    Die Auswahl der Aufgaben würde ich dann über eine SelectBox realisieren, um Tippfehler zu vermeiden.

    Nach dem Submitten, wird das Formular ausgewertet und die einzelnen Insert-Values in einem Array für den MultiInsert vorbereitet.
    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

    Kommentar


    • #3
      Vielen Dank für dein Feedback. Ich verstehe noch nicht ganz wie ich ein Formular für alle Zeilen erstellen kann.
      Diese Beispiel hier ist nicht Dynamisch,da ich ja nur 2 werte eingeben kann, was wenn ich jetzt aber 200 habe soll das Ganze ja immer noch funktionieren.
      PHP-Code:
        INSERT INTO MyTable Column1Column2 VALUES Value1Value2 ), ( Value1Value2 
      Die Aufgaben sollen nicht über eine Select geschehen, da ich will das es flexibel bleibt, also man soll schnell alles reinschreiben können was einem gerade in den Sinn kommt.

      Kommentar


      • #4
        Dann nimm ein Textfeld dafür.
        Ausserdem scheint mir, dass du den Beitrag von Arne Drews gar nicht verstanden hast.

        Datenbanken arbeiten Zeilenweise nicht Spaltenweise.
        Wenn du zu einer ID aus Tabelle Nutzer mehrere Aufgabe hast, dann musst diese in eine extra Tabelle schieben und nciht hundert Spalten erzeugen.

        Lies dir zudem mal den Artikel Normalisierung durch. Die 3. Normalform sollte immer angestrebt werden.

        Kommentar


        • #5
          Also ich muss das Ganze so machen.
          Namen:
          PHP-Code:
          CREATE TABLE IF NOT EXISTS `arbeiter` (
            `
          arbeiter_idint(11NOT NULL,
            `
          namevarchar(255NOT NULL,
            
          PRIMARY KEY (`arbeiter_id`)
          );

          INSERT INTO `arbeiter` (`arbeiter_id`, `name`) VALUES
          (1'Tobias'),
          (
          2'Max'),
          (
          3'Klaus'),
          (
          4'Hans'
          Aufgaben:
          PHP-Code:
          CREATE TABLE IF NOT EXISTS `personen_aufgaben` (
            `
          aufgabe_idint(11NOT NULL,
            `
          arbeiteridvarchar(255NOT NULL,
            `
          aufgabevarchar(255NOT NULL,
            
          PRIMARY KEY (`aufgabe_id`)
          ); 
          Da die aufgabe alles sein kann soll nicht festgelegt werden was es für Aufgaben gibt.

          Mir ist beim erneuten anschauen meiner Frage aufgefallen, dass ich meine Frage falsch gestellt habe.

          Sie sollte lauten: "Ich verstehe nur nicht wie der Code für den Massen insert aussehen soll".

          Kommentar


          • #6
            Wenn du
            Code:
             `arbeiterid` varchar(255) NOT NULL,
            zu
            Code:
             `arbeiterid` int(11) NOT NULL,
            änderst, und die `aufgabe_id` ein auto icrement erhält,dann kannst du nachfolgendes Beispiel umsetzen:
            Nochmal die Tabelle, wie sie aussehen sollte
            PHP-Code:
            CREATE TABLE IF NOT EXISTS `personen_aufgaben` (
              `
            aufgabe_idint(11NOT NULL AUTO_INCREMENT,
              `
            arbeiteridint(11NOT NULL,
              `
            aufgabevarchar(255NOT NULL,
              
            PRIMARY KEY (`aufgabe_id`)
            ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=
            Hans erhält 3 neue Aufgaben:
            PHP-Code:
            INSERT INTO `personen_aufgaben` (`aufgabe_id`, `arbeiterid`, `aufgabe`)
            VALUES
                
            (NULL4'erste Aufgabe' ),
                (
            NULL4'zweite Aufgabe'),
                (
            NULL4'dritte Aufgabe'); 
            Wie du siehst ist die erste Spalte immer mit NULL belegt, da sie die Eigenschaft auto_increment hat, wird von der DB die nächste Id für die Aufgabe automaitsch vergeben, darum musst du dich nicht kümmern.

            Jetzt hast du also hans mit der id 4 3 Aufgaben zugeordnet die dort auch erscheinen.

            Mit einem join kannst du die Aufgaben für Hans dann einfach abfragen.
            PHP-Code:
            SELECT a.namep.aufgabe_idp.aufgabe
            FROM 
            `personen_aufgabenp
            LEFT JOIN 
            `arbeitera ON p.arbeiterid a.arbeiter_id
            WHERE 
            `name` = 'Hans' 
            Deine Spaltenbenenung ist ausserdem ungünstig gewählt. Mal mit Unterstrich, mal ohne, hinzu kommt, dass du den Tabelllennamen in dem Spaltennamen gar nicht aufführen musst. Eine id ist eine id egal wie die Tabelle heisst und personen_aufgaben ist meiner Meinung nach auch ein schlimmer Name für eine Tabelle.
            Mach es dir ncht so schwer und nimm die einfachste Variante.
            Tabelle Aufgabe und Tabelle Arbeiter schlicht und selbsterklärend.

            Kommentar


            • #7
              Ich verstehe den Satz nicht:
              Also ich muss das Ganze so machen.
              Wer gibt das vor? Eine Prüfungsaufgabe o.ä. wird das nicht sein, denn dann sind die Vorgaben Müll...
              Competence-Center -> Enjoy the Informatrix
              PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

              Kommentar


              • #8
                Wegen dem Satz "Also ich muss das Ganze so machen" sollte ich mich entschuldigen. Er sollte eher lauten: "Also muss ich das Ganze so machen?"

                Kommentar


                • #9
                  Zitat von protestix Beitrag anzeigen
                  Hans erhält 3 neue Aufgaben:
                  PHP-Code:
                  INSERT INTO `personen_aufgaben` (`aufgabe_id`, `arbeiterid`, `aufgabe`)
                  VALUES
                  (NULL4'erste Aufgabe' ),
                  (
                  NULL4'zweite Aufgabe'),
                  (
                  NULL4'dritte Aufgabe'); 
                  Wie du siehst ist die erste Spalte immer mit NULL belegt, da sie die Eigenschaft auto_increment hat, wird von der DB die nächste Id für die Aufgabe automaitsch vergeben, darum musst du dich nicht kümmern.

                  Jetzt hast du also hans mit der id 4 3 Aufgaben zugeordnet die dort auch erscheinen.

                  Das was du hier zeigt ist aber nicht Dynamisch oder? Hier werden ja jetzt nur 3 Aufgaben zugeteilt, was wenn ich aber soviel aufgaben zuteilen will, wie es personen gibt?

                  Kommentar


                  • #10
                    Dafür hast du PHP, damit du dir das Statement zusammenbauen kannst. Es gibt auch foreach zum durchlaufen der unbekannten Anzahl und so weiter. Wenn du programmieren willst, dann musst du dich auch ein wenig mit der Materie befassen. Alternativ kannst du natürlich auch prepared statements verwenden, ich denke aber dass ein Multi-Insert hier schneller ist, habe ich aber nie getestet.

                    Kommentar


                    • #11
                      Zitat von protestix Beitrag anzeigen
                      Alternativ kannst du natürlich auch prepared statements verwenden, ich denke aber dass ein Multi-Insert hier schneller ist.
                      Das ist so. Schneller ist nur noch LOAD DATA INFILE. Das "Zusammenbauen" per php ist aber nicht ganz ohne, denn dort muss der Kontextwechsel PHP->MySQL selbst realisiert werden.

                      Wen konkrete Zeiten interessieren, hier ist ein Test (Comment insert many rows from array ,Line 341) zu sehen.



                      Kommentar

                      Lädt...
                      X