INSERT elegant ...

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • INSERT elegant ...

    Hallo an alle.

    Folgendes generelles PHP-MySQL-Problem beschäftigt mich schon seit längerem:

    Angenommen, ich habe eine Tabelle, die aus, sagen wir mal, 30 Spalten besteht und diese Tabelle fülle ich jetzt mit Daten aus einem Formular (logischerweise auch 30 Eingabefelder). Verständlich, dass es ein sehr langer "INSERT"-Befehl wird:
    PHP-Code:
    $dbErg $db->sql("INSERT INTO tabelle (spalte1 ... spalte30) VALUES ('$argFeld1', ... '$argFeld30')"); 
    Dies ist aber eine sehr fehleranfällige Zeile (Spaltenname falsch geschrieben oder vergessen etc.). Elegant wäre es jetzt, wenn man eine Funktion hätte, die die Spaltennamen ausliest, in die "INSERT"-Anweisung schreibt (vor VALUES) und dann, weil die Eingabefelder genauso heißen wie die Spaltennamen sollen, dasselbe noch einmal hinter VALUES. Es soll einfach nicht nötig sein, 30 Spaltennamen und 30 Eingabefeldernamen tippen zu müssen.

    Ich weiß, dass ich mit den folgenden Zeilen die Spaltennamen auslesen und in ein Array schreiben kann.
    PHP-Code:
    $q mysql_query ('show fields from '.$table);
    $fields = array();
    while (
    $x mysql_fetch_array($q))
     
    $fields[] = $x['Field'];
    mysql_free_result ($q); 
    Wie aber jetzt die Spaltennamen in die "INSERT"-Anweisung bekommen?
    Würde es funktionieren, wenn ich die "INSERT"-Anweisung, die ja eine Zeichenkette ist, als eben diese Zeichenkette zusammensetze? Folgende Code-Idee ist sicher mehr als fehleranfällig, soll aber nur die Idee verdeutlichen (Spaltenname und Eingabefeldername sind gleich):

    PHP-Code:
    # Anfang INSERT-Anweisung
    $sqlInsert "INSERT INTO tabelle (";

    # Spaltennamen auslesen und $sql zusammensetzen
    for ($i=0;$i<=count($fields);$i++) // $fields kommt vom obigen Beispiel
    {
     if (
    $i<count($fields)
      
    $sqlInsert .= $fields[$i].", ";
      
    // solange nicht letzter Wert erreicht, Komma schreiben wegen Trennung der Spaltennamen
     
    else
      
    $sqlInsert .= $fields[$i];
    }
    $sqlInsert .= ") VALUES (";

    # Eingabefeldername auslesen und $sql zusammensetzen
    for ($i=0;$i<=count($fields);$i++) // $fields kommt vom obigen Beispiel
    {
     if (
    $i<count($fields)
      
    $sqlInsert .= "'$".$fields[$i]."', ";
      
    // solange nicht letzter Wert erreicht, Komma schreiben wegen Trennung der Eingabefeldernamen
     
    else
      
    $sqlInsert .= "'$".$fields[$i]."'";
    }

    # Ende INSERT-Anweisung
    $sqlInsert .= ")";

    # Jetzt SQL-Befehl ausführen (hier wird eine Klasse benutzt)
    $dbErg $db->sql($sqlInsert); 
    Ist soetwas überhaupt möglich? Und wenn ja, wie könnte man es lösen? Ich hoffe, mein Problem war verständlich ausgedrückt. Und bitte kein "Probiere es doch einfach mal aus". Ich werde es erst ausprobieren, wenn ich weiß, dass meine Idee richtig ist.
    Danke im Voraus.

    Innuendo
    Zuletzt geändert von ; 18.10.2003, 18:00.

  • #2
    PHP-Code:
    <?php

        $table 
    'tabellenname';

        
    // eingabefelder anzeigen.
        
    $sql 'SELECT * FROM '.$table.' LIMIT 1';
        
    $res mysql_query($sql) or die(mysql_error());
        if (
    mysql_num_rows($res)>0)
        {
            echo 
    '<form action="'.$_SERVER['PHP_SELF'].'" method="post">';
            
    $row mysql_fetch_assoc($res);
            foreach (
    $row as $key => $val)
            {
                echo 
    'Feldname: '.$key.' -> ';
                echo 
    '<input type="text" name="felder['.$key.']" value="feldinhalt für insert">';
                echo 
    '<br />';
            }
            echo 
    '</form>';
        }

        
    // eintragen in DB vorbereiten.
        
    if (isset($_POST['felder']) && is_array($_POST['felder']) && count($_POST['felder'])>0)
        {
            
    $feldnamen = array();
            
    $feldvalues = array();
            foreach (
    $row as $key => $val)
            {
                
    $feldnamen[] = $key;
                
    $feldvalues[] = "'".$val."'";
            }
            
    $sql 'INSERT INTO '.$table.' ';
            
    $sql.= '('.implode(','$feldnamen).') ';
            
    $sql.= 'VALUES ('.implode(','$feldvalues).')';
            
            
    // demoausgabe der sql-query
            
    echo $sql;
            
            
    // datensatz eintragen.
            // $res = mysql_query($sql) or die(mysql_error());
        
    }

    ?>
    natürlich ungetestet...
    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


    Kommentar


    • #3
      Das muss ich erstmal verdauen und begreifen.

      Kommentar


      • #4
        Re: INSERT elegant ...

        Original geschrieben von Innuendo
        Elegant wäre es jetzt, wenn man eine Funktion hätte, die die Spaltennamen ausliest, in die "INSERT"-Anweisung schreibt (vor VALUES) und dann, weil die Eingabefelder genauso heißen wie die Spaltennamen sollen, dasselbe noch einmal hinter VALUES.
        wenn du vorhast, dass vor jedem insert erneut zu machen, würde ich das nicht elegant, sondern eher unperformant nennen.

        klar muss man beim erstellen der query aufpassen, um keine flüchtigkeitsfehler reinzubringen.
        aber eine einmal feststehende query ist viel performanter, als eine bei jedem insert erneut auf diese weise zusammengebastelte.
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          War nur eine Frage.

          Kommentar


          • #6
            Original geschrieben von Innuendo
            War nur eine Frage.
            war ja auch nur eine antwort.
            I don't believe in rebirth. Actually, I never did in my whole lives.

            Kommentar


            • #7
              bastel dir lieber ein kleines tool, welches dir dein Query zusammenbaut, was ich dennoch für zu viel arbeit halte.

              BTW: du kennst die Syntax von Update? dann nimm doch die!

              Kommentar


              • #8
                Original geschrieben von TobiaZ
                BTW: du kennst die Syntax von Update? dann nimm doch die!
                Hä?

                Kommentar


                • #9
                  naja, dadurch wird der query etwas weniger anfäliger.

                  Kommentar


                  • #10
                    Original geschrieben von Innuendo
                    Hä?
                    -> http://www.mysql.com/doc/en/INSERT.html
                    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                    Kommentar


                    • #11
                      Original geschrieben von TobiaZ
                      naja, dadurch wird der query etwas weniger anfäliger.
                      Ach so. Ich dachte, ich sollte UPDATE statt INSERT nehmen. Aber das wird wohl nicht gehen, wenn der Datensatz noch gar nicht vorhanden ist.

                      Kommentar


                      • #12
                        nee, aber gewöhns dir mal an ...

                        Kommentar


                        • #13
                          Dann aber eine grundlegende Frage (wenn ich es mir schon angewöhnen soll): Wie funktioniert UPDATE bei einem noch nicht existierenden Datensatz?

                          Kommentar


                          • #14
                            UPDATE zum anlegen? nene tobi, das geht doch nicht.
                            INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                            Kommentar


                            • #15
                              UPDATE zum anlegen? nene tobi, das geht doch nicht.
                              wieso tobi und nicht rene? ich weiß wie ich ds anlege.

                              der tipp war folgender:

                              statt insert into bla 1-n values(1-n)
                              sollst du insert into set 1 =1, n=n benutzen!

                              Kommentar

                              Lädt...
                              X