Array mit Datenbankfeldnamen füllen und ausgeben

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

  • Array mit Datenbankfeldnamen füllen und ausgeben

    Guten Morgen

    Ich habe dieses Forum vorhin entdeckt und muss sagen wirklich tolles Forum. Habe schon einige nützliche Tipps hier gefunden die ich bereits benötigt habe.

    Jedoch habe ich auch schon meine erste Frage und hoffe jemand von euch kann mir da helfen und hoffe ich habe den Thread nicht zu unübersichtlich gemacht.

    Ich verwende bisher den Code den ich am ende dieses Posts habe, um etwas aus einer Datenbank in einen Array zu packen und anschliessend dann so auch wieder zu importieren. Dies funktioniert wunderbar.

    Nun möchte ich das umschreiben, damit ich eine grössere Tabelle einfügen kann und auch mehrere datensätze: Mal genauer erklärt:
    Die Tabelle sieht so aus:
    Code:
    test2
    -test2id
    -begruendung
    -test2status
    -guest
    -ats
    -gtaktiv
    -gtyon
    -weitere Felder
    Mit dieser Tabelle bekomme ich leider weder den export noch den import hin. Bei der anderen Tabelle waren es wenige felder, so das ich diese im array angeben konnte. Hier wären es fast zuviele, weshalb ich die felder ggf im array automatisch benennen möchte um nicht jedes aufzuzählen, und möchte so z.B. 5 einträge exportieren und importieren.

    Kann mri da einer ein Codeschnippsel geben oder weiterhelfen wie ich das bewerkstelligen kann? Habe schon schnippsel gefunden mit mysql_num_fields um die feldernamen zu bekommen. Aber komme damit leider nicht wirklich weiter.

    Danke schonmal für jede Hilfe.

    Gruss Olli4

    Hier was ich bisher habe:
    Ich habe bisher eine Tabelle die so aussieht:
    Code:
    testelements
    -testid
    -testelement
    -testvalue
    So exportiere ich das ganze in den array:
    PHP-Code:
    $data['test'] = array();
    $data['test']['testelements'] = array();
    $result _mysql_query("SELECT * FROM testelements WHERE testid='1'");
    while (
    $row mysql_fetch_array($result)) $data['test']['testelements'][$row['testelement']]
    = array(
    "testelement" => $row['testelement'], "testvalue" => $row['testvalue']); 
    Und so Importiere ich das ganze wieder:
    PHP-Code:
    if (isset($data['test']['testelements']) && count($data['test']['testelements'])) {
     while (list(, 
    $testelement) = each($data['test']['testelements'])) 
    mysql_unbuffered_query("INSERT INTO testelements (testelement, testvalue)
    VALUES ('"
    .addslashes($testelement['testelement'])."', '".addslashes($testelement['testvalue'])."')");

    Zuletzt geändert von Olli4; 25.03.2008, 10:31.

  • #2
    Bitte brich mal als erstes deinen Code um. Ich scrolle nur einmal nach rechts, um den Antwortbutton zu finden.
    Und dann versuche nochmals dein aAnliegen verständlich zu formulieren. Willst du einfach etwas aus einer Tabelle exportieren, und dann in eine identische wieder einlesen? Oder was auch immer. Das mit den x-fach verschachtelten Arrays ist kaum die Lösung. Aber wie gesagt zuerst eine präzise Problembeschreibung.
    Gruss
    H2O

    Kommentar


    • #3
      Original geschrieben von H2O
      Bitte brich mal als erstes deinen Code um. Ich scrolle nur einmal nach rechts, um den Antwortbutton zu finden.
      Und dann versuche nochmals dein aAnliegen verständlich zu formulieren. Willst du einfach etwas aus einer Tabelle exportieren, und dann in eine identische wieder einlesen? Oder was auch immer. Das mit den x-fach verschachtelten Arrays ist kaum die Lösung. Aber wie gesagt zuerst eine präzise Problembeschreibung.
      Hi

      Tschuldige bitte. Habe es nun geändert.

      Also folgendes:
      In meinem beispiel was bereits funktioniert, werden alle werte in diesen Array $data gespeichert.
      Diese werte werden später dann verarbeitet und in einer datei exportiert.
      Später kann ich diese Datei dann einlesen, dies wird wieder in den array gelesen und in eine entsprechende Datenbank gelesen (wie im untersten teil des codes gezeigt)

      Das selbe möchte ich nun mit einer grösseren Tabelle machen. Bei der kleinen habe ich einfach dies:
      PHP-Code:
      while ($row mysql_fetch_array($result)) $data['test']['testelements'][$row['testelement']]
      = array(
      "testelement" => $row['testelement'], "testvalue" => $row['testvalue']); 
      Aber bei grösseren Tabellen wäre dies sehr umständlich jedes einzelne Feld so einzutragen. Daher suche ich eine lösung, dass der arraywert selber beim feldnamen eingelesen wird und mir dieser erstellt wird.

      Dies habe ich FAST mit diesem Code nun geschafft.
      PHP-Code:
          $result="SELECT * FROM test2";
          
      $resultmysql_query($result);
          while (
      $row mysql_fetch_array($result,MYSQL_NUM)) {
           for(
      $i=0;$i<mysql_num_fields($result);$i++) {
            
      $key=mysql_field_name($result,$i);
            
      $data[$key]=$row[$i];
           }
          } 
      Jedoch scheint hier noch etwas zu fehlen oder falsch zu sein, da ich mit print_r nur die ausgabe eines Eintrages in der Datenbank bekomme, obwohl mehrere einträge bereits gespeichert sind. Aber ob dies richtig ist, damit ich dies dann wieder so einlesen kann weiss ich nicht genau. Dies war nur mal ein versuch es hinzubekommen.

      Was bei dem Code oben noch fehlt, was ich auch noch nicht hinbekommen habe wäre in dem array ein array mit datenbankname, wo er den datenbankname einspeichert, und diesen wert dann für das importieren im zweiten teil verwenden würde da ich am schluss mehr als eine Tabelle gleichzeitig exportieren möchte.

      Ich hoffe ich konnte es ein wenig besser erklären.

      Danke schonmal für deine Mühe hier zu antworten.

      Gruss

      Olli4
      Zuletzt geändert von Olli4; 25.03.2008, 10:47.

      Kommentar


      • #4
        Was spricht denn gegen:
        PHP-Code:
        $data = array();
        $sql "
            SELECT
                attr_1,
                attr_2,
                ...
            FROM
                tabelle"
        ;
        $res mysql_query($sql) || or die(mysql_error());
        while (
        $row mysql_fetch_assoc($res)){
            
        $data[] = $row;

        Oder verstehe ich dich immer noch falsch?
        Gruss
        H2O

        Kommentar


        • #5
          @H20: Benutzt du immer ein doppeltes oder?
          Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
          var_dump(), print_r(), debug_backtrace und echo.
          Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
          Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
          Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

          Kommentar


          • #6
            Hi

            Herzlichen Dank. Ich kam einfach nciht auf die Idee.

            Im ersten Thread hast du ja gesehen, wie ich diese dann wieder in die Datenbank einspiele. Könntest du mir da eventuell nochmals helfen und sagen wie dies bei diesem Code aussehen müsste?

            Gäbe es ggf ne möglichkeit den Datenbankname mit zu übergeben? Also das ich beim wieder einspielen nicht den datenbanknamen direkt angebe, sondern das er diesen auch aus dem array lesen kann falls ich mal beim array erstellen mehr als nur eine tabelle einlese?

            Danke nochmals.

            Gruss Olli4

            Kommentar


            • #7
              @H20: Benutzt du immer ein doppeltes oder?
              Wie reagiert denn eigentlich PHP auf so was? Fatal Error, Warning oder Notice? Würde mich wundernehmen (kann's aber nicht testen, da ich bei der Arbeit kein PHP habe)

              Gruss

              tobi
              EDIT:

              Frage beantwortet
              Parse error: syntax error, unexpected T_LOGICAL_OR in ****/misc/test/upload.php on line 3

              Zuletzt geändert von jahlives; 25.03.2008, 12:00.
              Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

              [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
              Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

              Kommentar


              • #8
                Original geschrieben von Shurakai
                @H20: Benutzt du immer ein doppeltes oder?


                @Olli4
                Ich vermute, dass du nicht den Datenbank- sondern den Tabellennamen meinst. Nun spricht grundsätzlich nichts dagegen, diesen als Element 0 im Array zu speichern. Er muss dann einfach vor dem Import wieder raus.
                Der Import könnte dann etwa so aussehen:
                PHP-Code:
                $table $data[0];
                unset(
                $data[0]);
                $values = array();
                foreach (
                $data as $zeile){
                    
                $values[] = "('" implode("', '"$zeile) . "')";
                }
                $sql "
                    INSERT INTO 
                $table (" implode(', 'array_keys($data[1])) . ")
                    VALUES (" 
                implode(', '$values) . ")";
                mysql_query($sql) ..... 
                Selbstverständlich ungetestet.
                Aber ehrlich gesagt, kann ich mir nicht vorstellen, wozu so etwas gut sein soll.
                Gruss
                H2O

                Kommentar


                • #9
                  Hallo

                  Danke schonmal.

                  Dies soll eine Art schnittstelle zwischen zwei laufenden Projekten sein um keinen externen mysql Zugriff zu benötigen damit man ab und an so etwas exportieren kann.

                  Zu deinem Code:
                  Den Import habe ich zwar noch nicht getestet, jedoch frage ich mich ob da nicht irgendwas fehlt. Weiss aber nicht was oder wie ändern.

                  - Wird bei diesem Import den du hier hast nicht nur ein Fehld eingetragen? Beim export können ja so auch z.B. 10 Einträge drin sein.
                  - Wie könnte ich denn den Tabellennamen besser übergeben? Das Problem wäre ja, dass ich dies ggf gerne erweitern würde um nicht nur werte aus einer Tabelle zu exportieren.

                  Danke schonmals für deine wirklich gigantische Hilfe.

                  Gruss

                  Olli4
                  Zuletzt geändert von Olli4; 25.03.2008, 12:45.

                  Kommentar


                  • #10
                    Original geschrieben von Olli4

                    - Wird bei diesem Import den du hier hast nicht nur ein Fehld eingetragen?
                    In meinem Beispiel werden soviele Zeilen, wie der Array $data enthält, importiert. Und jede dieser Zeilen enthält soviel Attribute, bzw Felder, wie die ursprüngliche Tabelle. Das fertige INSERT-Statement sieht dann z.B etwa so aus
                    Code:
                    INSERT INTO tabelleA (feld1, feld2, feld3, ..., feld7)
                    	VALUES ('xx', 'yy', '77', ..., '99'), 
                    		   ('ab', 'bc', '1', ..., '999'), 
                    		   ..., 
                    		   ('erstes Feld', 'abcde', '-888', ..., '0')
                    Den Tabellennamen kannst du ja auch in eine beliebige Variable schreiben. Aber da du sowieso für jede Tabelle einen eigenen Array benötigst, ist das im Beispiel nicht das dümmste. Natürlich könntest du auch alle Tabellen in einen Array schreiben, indem du einfach eine zusätzliche Dimmension, die z.B. als zusätzlichen Index den Tabellennamen enthält. Da ich aber sehe, dass du so schon Mühe hast, und dauernd Datenbank, Tabelle, Felder Zeilen etc verwechselst, würde ich dir davon abraten.
                    Gruss
                    H2O

                    Kommentar


                    • #11
                      Original geschrieben von H2O
                      In meinem Beispiel werden soviele Zeilen, wie der Array $data enthält, importiert. Und jede dieser Zeilen enthält soviel Attribute, bzw Felder, wie die ursprüngliche Tabelle. Das fertige INSERT-Statement sieht dann z.B etwa so aus
                      Code:
                      INSERT INTO tabelleA (feld1, feld2, feld3, ..., feld7)
                      	VALUES ('xx', 'yy', '77', ..., '99'), 
                      		   ('ab', 'bc', '1', ..., '999'), 
                      		   ..., 
                      		   ('erstes Feld', 'abcde', '-888', ..., '0')
                      Den Tabellennamen kannst du ja auch in eine beliebige Variable schreiben. Aber da du sowieso für jede Tabelle einen eigenen Array benötigst, ist das im Beispiel nicht das dümmste. Natürlich könntest du auch alle Tabellen in einen Array schreiben, indem du einfach eine zusätzliche Dimmension, die z.B. als zusätzlichen Index den Tabellennamen enthält. Da ich aber sehe, dass du so schon Mühe hast, und dauernd Datenbank, Tabelle, Felder Zeilen etc verwechselst, würde ich dir davon abraten.
                      Hallo

                      Ja dies verwechsle ich beim schreiben/beschreiben oft. In der Praxis aber nicht.

                      Darf ich dich denn hier nochmals nerven und fragen wie ich die zusätzliche Dimension ala ['tabellenname'] in den array bekomme und das ganze Problem so dass es eigentlich gehen sollte wie nun unten beschrieben mit dem export und import (einfach die zeilen für den array schreiben und auslesen mit dem insert?

                      Beim Insert habe ich mich wohl etwas falsch ausgedrückt. Entschuldige bitte. Beim Export soll am ende eigentlich folgendes möglich sein:
                      Tabelle 1 (z.B. 3 Datensätze)
                      Tabelle 2 ( z.B. 1 Datensatz)
                      Tabelle 3 (z.B. 5 Datensätze)
                      Entschuldige bitte die verwirrung die ich hier gestifftet habe.

                      Ist dies denn möglich dies in den array zu packen mit der zusätzlichen Dimension und darf ich dich nochmals bitten mir hierbei zu helfen? Habe nun lange gesucht und auch rumgebastelt. Bekomme aber das komplette nicht so richtig hin.

                      Gruss Olli4
                      Zuletzt geändert von Olli4; 25.03.2008, 14:30.

                      Kommentar


                      • #12
                        Dynamisches Auslesen mehrerer Tabellen in einen Array:
                        PHP-Code:
                        // $tabellen = Liste der zu exportierenden tabellen
                        foreach ($tabellen as $tabelle){
                            
                        $data[$tabelle] = array();
                            
                        $sql "SELECT * FROM $tabelle"
                            
                        $res mysql_query($sql) || or die(mysql_error());
                            while (
                        $row mysql_fetch_assoc($res)){
                                
                        $data[$tabelle][] = $row;
                            }

                        Ausnamsweise mit SELECT * FROM
                        Und as Gegenstück dann etwa:
                        PHP-Code:
                        foreach ($data as $table => $tabelle){
                            
                        $values = array();
                            foreach (
                        $tabelle as $zeile){
                                
                        $values[] = "('" implode("', '"$zeile) . "')";
                            }
                            
                        $sql "
                                INSERT INTO 
                        $table (" implode(', 'array_keys($zeile)) . ")
                                VALUES (" 
                        implode(', '$values) . ")";
                            .....

                        Wozu das allerdings gut sein soll, ist mir immer noch unklar. Wenn du die Daten einfach in eine andere DB übertragen willst, kannst du das doch direkt mit
                        PHP-Code:
                        INSERT INTO db2.tabelle SELECT from DB1.tabelle 
                        lösen.
                        Gruss
                        H2O

                        Kommentar


                        • #13
                          Danke nochmals.

                          Du bist super.

                          Danke nochmals für alle deine Hilfe wirklich genial.

                          Gruss Olli4
                          Zuletzt geändert von Olli4; 25.03.2008, 16:44.

                          Kommentar

                          Lädt...
                          X