Ankündigung

Einklappen
Keine Ankündigung bisher.

SELECT INTO OUTFILE clientseitig nachgebaut - bitte kurz drübersehen

Einklappen

Neue Werbung 2019

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

  • SELECT INTO OUTFILE clientseitig nachgebaut - bitte kurz drübersehen

    Hallo,

    Da SELECT INTO OUTFILE (MySQL) ja leider nur serverseitig läuft, ich diese Art "Dump" aber auf dem Client-Host brauche hab ich mir kurz was nachgebaut.

    Ein simples implode() oder fputcsv() "geht nicht", zumindest kommt nicht das Format bei raus, das SELECT INTO OUTFILE bringen würde, daher der ganze Aufwand.
    Speziell der Backslash am Ende einer Zeile, wenn es mehrzeilige Werte sind, fehlt und es wird nicht immer gequotet, was ich aber gerne hätte.
    Da ich nur äußerst selten mit so einem Export zu tun habe bin ich mir nun nicht sicher, ob ich was übersehen habe.

    PHP-Code:
    // SELECT * FROM `table`
    while($row $dbh->fetch_array()) {
          
    $buffer implodeForCSV($row);

          
    // write buffer to file
    }

    function 
    implodeForCSV(Array $data) {
          
    $string NULL;
          foreach(
    $data as $value) {
                if(
    is_null($value)) {
                      
    $string .= (strlen($string) ? ';' '').'\\N';
                }
                elseif(
    is_string($value)) {
                      
    $string .= (strlen($string) ? ';' '').'"'.preg_replace('/(\r\n|\n\r|\r|\n)/''\\\${1}'addslashes($value)).'"';
                }
                else {
                      
    $string .= (strlen($string) ? ';' '').'""';
                }
          }
          
          return 
    strlen($string) ? $string."\n" NULL;

    Sieht da jemand Probleme oder irgendwas nicht berücksichtigt?

    Danke im Voraus & schönes WE!
    VokeIT GmbH & Co. KG - VokeIT-oss @ github


  • #2
    Zitat von G.Schuster Beitrag anzeigen
    Da ich nur äußerst selten mit so einem Export zu tun habe bin ich mir nun nicht sicher, ob ich was übersehen habe.
    Dann definiere dir Testfälle, die zu den zu beachtenden Sonderfällen, die du identifiziert hast, passen, und werte deren Ergebnis aus.

    Kommentar


    • #3
      Wie jetzt, clientseitig?
      --

      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


      --

      Kommentar


      • #4
        er meint sicherlich auf MySQL-Ebene, Client <-> Server
        DevBlog|3D Online-Shopping|Xatrium

        Kommentar


        • #5
          Zitat von ChrisB Beitrag anzeigen
          Dann definiere dir Testfälle, die zu den zu beachtenden Sonderfällen, die du identifiziert hast, passen, und werte deren Ergebnis aus.
          Die SOnderfälle, die ich bisher auf die Schnelle gefunden habe, sind bereits getestet.
          Mir ging es mehr drum, ob ich eben Sonderfälle übersehen habe.

          er meint sicherlich auf MySQL-Ebene, Client <-> Server
          Richtig, MySQL-Client-seitig, da MySQL-Server und Export-Ziel auf unterschiedlichen Rechnern liegen.
          VokeIT GmbH & Co. KG - VokeIT-oss @ github

          Kommentar


          • #6
            Anyone?


            Nochmal zusammengefasst, bei was ich Hilfe benötige.

            Ich möchte Daten aus mehreren Tabellen exportieren, um diese später mit LOAD DATA INFILE in eine andere Datenbank importieren zu können.
            SELECT INTO OUTFILE kann ich nicht nutzen, da hierbei die Export-Datei auf dem MySQL-Server erstellt wird, ich zu diesem aber von einem anderen Server verbunden bin.
            Ausser der MySQL-Verbindung stehen mir keine Transferwege zur Verfügung, FTP etc. ist schlicht nicht installiert.
            Um diese Daten nun aber trotzdem zu exportieren muss ich das Format, das SELECT INTO OUTFILE erstellt, möglichst exakt nachbauen, damit es beim Import keine Probleme gibt.
            Bisher weiß ich, dass folgende "Sonderfälle" zu beachten sind:
            - Mehrzeilige Werte haben am Ende jeder Zeile einen Backslash (ausser die letzte Zeile)
            - Alle Werten können (sollten) gequoted sein
            - Quotes innerhalb von Werten werden mit einem Backslash maskiert
            - NULL-Werte werden nicht gequoted sondern als \N gespeichert

            So, konkrete Frage: habe ich in dieser Aufzählung etwas vergessen?
            VokeIT GmbH & Co. KG - VokeIT-oss @ github

            Kommentar


            • #7
              Ich würd mal in den Raum werfen: Probiers aus

              Programmier den Export mit den Regeln, exportiere deine Datenbank und importiere auf einem Testsystem.
              Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

              Kommentar


              • #8
                Das hab ich ja schon gemacht, ganz so doof oder faul bin ich dann auch wieder nicht.
                Du kennst das doch sicher selbst - User finden immer genau den Fall, auf den du selbst nicht gekommen bist.
                Deshalb eben die Frage, ob sich damit schonmal jemand beschäftigt hat und mir was dazu sagen kann.

                Und bitte jetzt nicht noch zum dritten Mal der Tipp, dass ich es ausprobieren soll.
                Danke.
                VokeIT GmbH & Co. KG - VokeIT-oss @ github

                Kommentar


                • #9
                  Blob-Felder mit Binärdaten müssten noch hexadezimal kodiert werden.

                  Aber warum ziehst du nicht einfach mit phpMyAdmin einen Dump?

                  Kommentar


                  • #10
                    Ah, da hatte ich nicht dran gedacht - dann hat sich's ja gelohnt das zu posten.
                    Das Ganze muss automatisiert laufen, deswegen fallen andere Tools weg.
                    VokeIT GmbH & Co. KG - VokeIT-oss @ github

                    Kommentar

                    Lädt...
                    X