Rolf B: Javascript: Problem bei `;` im CSV-Feld

Beitrag lesen

Hallo Linuchs,

ok, erklär mal kurz, warum Du zwingend bei CSV bleiben willst. Weil der Code für's Libre-Office eh schon existiert?

Und erkläre nebenbei, warum Du mysql statt mysqli-Funktionen benutzt. Hast Du das noch nicht umgestellt? Dafür solltest Du erstmal Energie investieren, denn mit mysqli kannst Du nach PHP7 wechseln und das ist von Hause aus mal deutlich fixer als PHP 5.

Wie auch immer, solchen Code kann man entkernen. Die Transformation des Query-Result in ein Array Of Array hast Du, die kann in eine Funktion.

Und das Funktionsergebnis kannst Du nun wie gehabt als CSV in den PHP Output schreiben, oder JSON-encoden und DAS in den PHP Output schreiben.

Die Spaltennamen in der ersten Zeile kannst Du in JS ebenfalls herausholen und daraus dein Key-Array erzeugen.

Im PHP:

  function results_as_array($result, $filename) 
  {
    // Array, erste Zeile enthält Spaltennamen
    $csv_arr    = [ "lfd", "titel", "sprache", "genre", 
                    "texter", "komponist", "verlag", "bearbeiter" ];
    $csv_arr[]  = [ "", $filename ];
    $csv_arr[]  = [ "", "Test Zeichencode UTF-8 ÄäÖöÜöß Санкт-Петербург" ];
    $csv_arr[]  = [ "", 'Test " und ; im Feld' ];
 
    while ( $row_csv = @mysql_fetch_assoc( $res_csv )) {
      $csv_arr[] = [
        ++$lfd
      , $row_csv['titel'] , $row_csv['sprache'], $row_csv['genre']
      , $row_csv['texter'], $row_csv['komponist']
      , $row_csv['verlag'], $row_csv['bearbeiter']
      ];
    }
  }

  header('content-type: application/json; charset=utf-8');
  header('Content-Disposition: attachment; filename="' . $csv_dateiname .'"');
  // fopen/fputs/fclose sind nicht nötig
  echo json_encode(results_as_array($res_csv));
  exit;

Und im JavaScript

var rows  = JSON.parse(json_string);    // Array der Adressen
var k     = rows[0].split( ";" );       // Erste Zeile enthält Feldnamen
for ( let i=0; i<k.length; i++ ) {
   k[ k[i] ] = i;
}
for (let row = 1; row < rows.length; row++) 
{
   let titel = rows[row][k['titel']];
}

Das Keys-Array und diese umständliche Ansprache ersparst Du Dir, wenn Du auf die Darstellung als array of arrays verzichtest. Du kannst die mit fetch_assoc geholten Zeilen auch einfach als Assoc-Array stehen lassen, json_encode codiert das automatisch als JavaScript-Objekte. Damit sparst Du am Server Zeit, und der Client hat weniger Mühe. Allerdings geht das Transfervolumen hoch, weil jede Zeile alle Spaltennamen enthält.

Kommt immer drauf an, wo der Engpass ist. Wenn es überhaupt einen gibt...

Rolf

--
sumpsi - posui - obstruxi