Ankündigung

Einklappen
Keine Ankündigung bisher.

pack eines gesamten Arrays

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

  • pack eines gesamten Arrays

    Hallo zusammen,

    ich habe mal wieder ein kleines Problem:
    Ich lade mehrere Tabellen einer Datenbank nacheinander ein und will diese in eine Datei schreiben, aber nicht als einfachen Text, das ganze soll Binär gespeichert werden.
    Soweit ist auch kein Problem.
    Da es aber 33 Tabellen sind, mit teilweise mehr als 50 Spalten, habe ich mir überlegt das ganze zu Automatisieren, bevor ich alle Tabellen von Hand eintippe.
    Daher meine Frage: Gibt es eine Möglichkeit den array $row so auszugeben, dass der Code wie unten gezeigt funktioniert?
    Also im Prinzip eine foreach-Schleife in den pack-Befehl einfügen.

    PHP-Code:
    $row_query"SELECT * FROM  `continent`;";
    $row_result $mysqli->query($row_query);
    while(
    $row $row_result->fetch_assoc()){
            
    $continent[$i] = pack('dlZ4Z25Z26c',$row['ContinentRegionalStrength'],$row['ContinentID'],$row['ContinentNameThreeLetter'],$row['ContinentName'],$row['ContinentNameContinentality'],$row['ContinentGenderName']);
        
    $i++;


    Vielen Dank schon einmal für eure Hilfe!
    Du suchst neue Herausforderungen? - IkoBB sucht neue Entwickler!
    Komm jetzt in ein junges, offenes und motiviertes Team und entwickle das Forum von morgen!


  • #2
    Wie wäre es, wenn du ein String daraus machst und beim Entpacken entsprechend diesen zerlegst?
    PHP-Code:
    $continent = array();
    $row_query"SELECT * FROM  `continent`;";
    $row_result $mysqli->query($row_query);
    while(
    $row $row_result->fetch_assoc())
       
    $continent[] = pack('dlZ4Z25Z26c'implode("||"$row)); 
    Die Deutsche Rechtschreibung ist Freeware! Du darfst sie kostenlos nutzen, allerdings ist sie nicht Open Source, d.h. Du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

    Kommentar


    • #3
      Habe ich prinzipiell auch schon gedacht, da allerdings die Dateien für ein externes Programm sind, habe ich auf den Entpack-Vorgang keinen Einfluss. Daher muss die Struktur erhalten bleiben.
      Du suchst neue Herausforderungen? - IkoBB sucht neue Entwickler!
      Komm jetzt in ein junges, offenes und motiviertes Team und entwickle das Forum von morgen!

      Kommentar


      • #4
        PHP-Code:
        $row_query "SELECT * FROM  `" $file "`;";
            
        $row_result $mysqli->query($row_query);
            while (
        $row $row_result->fetch_assoc()) {
                if (!isset(
        $header[$file])) {
                    
        $j 0;
                    foreach (
        $row as $key => $value) {
                        
        $header[$file][$j] = "\$row['" $key "']";
                        
        $j++;
                    }
                }
                
        $packer[$file] = "\$packed[\$i] = pack('" $byte "'," implode(','$header[$file]) . ");";
                eval(
        $packer[$file]); 
        Auch wenn es nicht sauber und schön ist, aber so funktioniert es jetzt wenigstens.
        Falls jemand eine bessere Variante weiß, darf er sich gerne bei mir melden.
        Du suchst neue Herausforderungen? - IkoBB sucht neue Entwickler!
        Komm jetzt in ein junges, offenes und motiviertes Team und entwickle das Forum von morgen!

        Kommentar


        • #5
          eval() ist böse.

          http://php.net/manual/en/function.ca...func-array.php

          Kommentar


          • #6
            Werde es mal mit call_user_func_array ausprobieren.

            Aber wieso ist eval() eigentlich böse. Habe ich schon öfters gehört aber noch nie eine Begründung dazu gesehen.
            Du suchst neue Herausforderungen? - IkoBB sucht neue Entwickler!
            Komm jetzt in ein junges, offenes und motiviertes Team und entwickle das Forum von morgen!

            Kommentar


            • #7
              eval() ist langsam.
              eval() ist schlecht lesbar.
              eval() ist schwer debugbar.
              eval() ist eine potenzielle Sicherheitslücke.
              eval() ist zu 99,99999% unnötig.

              Die Wahrscheinlichkeit, dass eval() der richtige Lösungsweg ist geringer als ein 6er im Lotto.

              Kommentar


              • #8
                Habe es gerade mal versucht mit call_user_func_array hinzubasteln, aber da bekomme ich dann wieder das Problem von meinem ersten Post.
                Also dass der array $row nicht flexibel in das pack() eingefügt werden kann.
                Oder wie hast du dir das vorgestellt damit?
                Du suchst neue Herausforderungen? - IkoBB sucht neue Entwickler!
                Komm jetzt in ein junges, offenes und motiviertes Team und entwickle das Forum von morgen!

                Kommentar


                • #9
                  PHP-Code:
                  call_user_func_array('pack'array_merge(array($byte), $row)); 
                  Und bitte kein SELECT * verwenden, sondern die Spalten selektieren, die man im Ergebnis erwartet.

                  Kommentar


                  • #10
                    Zitat von hellbringer Beitrag anzeigen
                    eval() ist langsam.
                    eval() ist schlecht lesbar.
                    eval() ist schwer debugbar.
                    eval() ist eine potenzielle Sicherheitslücke.
                    eval() ist zu 99,99999% unnötig.

                    Die Wahrscheinlichkeit, dass eval() der richtige Lösungsweg ist geringer als ein 6er im Lotto.
                    Bin so frei.. das hatte ich schon lange mal vor... ergänzt in der FAQ.

                    Danke!
                    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                    PHP.de Wissenssammlung | Kein Support per PN

                    Kommentar


                    • #11
                      array_merge() bringt dabei doch auch nichts.
                      Ich versuche das noch mal etwas genauer zu beschreiben was für ein Problem ich habe:

                      PHP-Code:
                      // Ich habe (hier vereinfacht) 3 Tabellen, die alle unterschiedliche Spalten und Spaltenanzahl haben.
                      // Für pack() benötige ich ein Format, was ich hier mit packcode1 - ...3 vereinfacht habe. Diese sind alle entsprechend der Spalten anders.
                      $data = array( 'tabelle1' => 'packcode1''tabelle2' => 'packcode2''tabelle3' => 'packcode3');
                      foreach(
                      $data as $file=>$format)
                      {
                      $query "SELECT * FROM  `" $file "`;"//SELECT * wird hier genommen, weil es wie gesagt mehr als 30 Unterschiedliche Tabellen sind, mit mehr als 50 unterschiedlichen Spalte je Tabelle
                      $result $mysqli->query($query);
                      while (
                      $row $result->fetch_assoc()) {
                      // So und jetzt beginnt der "Spaß"
                      // pack() benötigt als erstes das Format und dann all die Variablen. Dies müssen nacheinander stehen und mit "," getrennt werden.
                      // Die Variablen sind dabei hier einzelnen Werte der Spalten, also $row['column1_1'] für die erste Spalte der ersten Tabelle und $row['column1_2'] für die erste Spalte der zweiten Tabelle usw. Die eigentlichen Spaltennamen sind aber nicht so einfach, sondern Textnamen ohne Zahlen oder Indizes.

                      // Nächste Zeile ist nur schematisch gedacht!
                      $packed[$i] = pack($format, foreach($row) do {$row['column1_1'],});
                      // Also jedes Element von $row nacheinander in das pack() schreiben
                      }

                      Hoffe dass es jetzt etwas verständlicher ist
                      Du suchst neue Herausforderungen? - IkoBB sucht neue Entwickler!
                      Komm jetzt in ein junges, offenes und motiviertes Team und entwickle das Forum von morgen!

                      Kommentar


                      • #12
                        Verwende bitte kein SELECT *, das macht es nicht gerade einfacher den Code zu verstehen.

                        Und was willst du mit Kontinenten?

                        Warum heißt die Variable $file, wenn sie doch offensichtlich einen Tabellenname enthält?

                        Warum heißt die Variable $byte, obwohl sie kein Byte enthält?

                        Bemühe dich bitte um verständliche Variablennamen. Ich hab ehrlich gesagt keine Lust hier ein Rätsel zu entschlüsseln.

                        Kommentar


                        • #13
                          Zitat von hellbringer Beitrag anzeigen
                          Verwende bitte kein SELECT *, das macht es nicht gerade einfacher den Code zu verstehen.
                          Wie oben geschrieben, es ist hier noch vorhersehbar was für Spalten ich abfrage, da es abhängig ist von den Tabellen.

                          Zitat von hellbringer Beitrag anzeigen
                          Und was willst du mit Kontinenten?
                          "continent" ist der Name einer der 30 Tabellen, habe ich in meiner letzten Nachricht vergessen abzuändern, werde es gleich in $packed abändern

                          Zitat von hellbringer Beitrag anzeigen
                          Warum heißt die Variable $file, wenn sie doch offensichtlich einen Tabellenname enthält?
                          $file heißt $file, weil es der Dateiname ist, in der der Text nach durchlaufen der pack()-Funktion geschrieben wird.

                          Zitat von hellbringer Beitrag anzeigen
                          Warum heißt die Variable $byte, obwohl sie kein Byte enthält?
                          Weil es das Format der Bytes ist. Werde ich ebenfalls anpassen in $format.


                          Du suchst neue Herausforderungen? - IkoBB sucht neue Entwickler!
                          Komm jetzt in ein junges, offenes und motiviertes Team und entwickle das Forum von morgen!

                          Kommentar


                          • #14
                            PHP-Code:
                            $continent[$i] = call_user_func_array('pack'array_merge(array($byte), $row)); 

                            Kommentar


                            • #15
                              Vielen tausend Dank!
                              Ich weiß zwar nicht wieso es jetzt mit der Funktion klappt, aber ist ja auch egal solange es jetzt funktioniert.
                              Ich werde mich bemühen in nächster Zeit meinen Code ordentlicher und verständlicher zu gestalten!

                              Noch mals Danke an dich!
                              Du suchst neue Herausforderungen? - IkoBB sucht neue Entwickler!
                              Komm jetzt in ein junges, offenes und motiviertes Team und entwickle das Forum von morgen!

                              Kommentar

                              Lädt...
                              X