Michael: Export nach cvs klappt nur teilweise...

Hallo Forum,

vielleicht könnt Ihr mir bei meinem stümperhaften Versucht helfen das es klappt...

Der Code funktioniert soweit ganz gut, bis auf das der letzte Datensatz in der MySQL Tabelle immer doppelt aufgelistet wird.

Könnt Ihr mir sagen wie ich den Code so umschreiben muß, daß es klappt?

Wäre super wenn Ihr mir helfen könntet...

Code:

<?php
$verbindung = mysql_pconnect( "localhost", "root", "KENNWORT");

if (!$verbindung)
                        {
                        exit;
                        }
                        mysql_select_db("mein_kundenstamm");

$query = "SELECT KUST01_firma1, KUST01_strasse, KUST01_plz, KUST01_ort, KUST02_nachname, KUST02_telefon1, KUST02_fax, KUST02_mobil, KUST02_email, KUST01_branche FROM KUST01 WHERE kust01_adressenart = 'N'";

$result = mysql_query($query) or die("Anfrage fehlgeschlagen: " . mysql_error());

while ($row = mysql_fetch_array($result, MYSQL_NUM)) {

$ql_branche = "$row[9]";
          if($ql_branche == "101") {
        $branche = "101-Architekten"; }
    elseif($ql_branche == "102") {
        $branche = "102-öffentliche Stellen"; }
    elseif($ql_branche == "103") {
        $branche = "103-Wohnbaugesellschaft"; }
          elseif($ql_branche == "104") {
        $branche = "104-Bauträger"; }
    elseif($ql_branche == "109") {
        $branche = "109-sonst. ausschreibende Stellen"; }
          elseif($ql_branche == "201") {
        $branche = "201-Bedachungsfachhandel"; }
          elseif($ql_branche == "202") {
        $branche = "202-Baustoffhandel"; }
          elseif($ql_branche == "209") {
        $branche = "209-sonst. Handel"; }
          elseif($ql_branche == "301") {
        $branche = "301-Dachdecker"; }
          elseif($ql_branche == "302") {
        $branche = "302-Holzverarbeiter"; }
          elseif($ql_branche == "309") {
        $branche = "309-sonst. Verarbeiter"; }
          elseif($ql_branche == "701") {
        $branche = "701-Sachverständige"; }
          elseif($ql_branche == "705") {
        $branche = "705-Innung"; }
          elseif($ql_branche == "801") {
        $branche = "801-Hausverwaltung"; }

$data = "$row[0]\t$row[1]\t$row[4]\t$row[5]\t$row[6]\t$row[7]\t$row[8]\t$row[9]\t$branche\r\n";

$line .= $data;
$data .= trim($line)."\n";
}

//$data = str_replace("\r","",$data);

if ($data == "") {
    $data = "\n(0) Records Found!\n";
}
header("Content-type: application/x-msdownload");
header("Content-Disposition: attachment; filename=export.xls");
header("Pragma: no-cache");
header("Expires: 0");
print "$header\n$data";
?>

Danke und viele Grüße
Michael

  1. Hallo Michael,

    Schau dir mal diese Zielen genauer an. Hier ist meiner Meinung nach der Grund für die doppelten Ausgaben zu finden:

    $line .= $data;
    $data .= trim($line)."\n";

    Grüße
    crille

    1. Hallo Crille,

      $line .= $data;
      $data .= trim($line)."\n";

      Daran hab ich auch schon gedacht, aber wie könnte ich es anders lösen...
      sobald ich daran etwas verändere -> bekomm ich nur noch einen Datensatz statt mehrerer ausgegeben...

      Keine Ahnung wie ich das hindrehen soll...

      Viele Grüße
      Michael

      1. Hello Michael,

        brauchst Du noch Hilfe?

        <?php

        $verbindung = mysql_connect("localhost", "root", "KENNWORT");

        $out = '';

        if (!$verbindung)
          {
              $out = 'Fehler bei der Serververbindung';
          }
          elseif (!mysql_select_db("mein_kundenstamm");
          {
              $out = 'Fehler bei der Datenbankauswahl';
          }
          else
          {
              $query = "SELECT KUST01_firma1,".
                             " KUST01_strasse,".
                             " KUST01_plz,
                             " KUST01_ort,".
                             " KUST02_nachname,".
                             " KUST02_telefon1,".
                             " KUST02_fax,".
                             " KUST02_mobil,".
                             " KUST02_email,"
                             " KUST01_branchenname".
                             " FROM KUST01, BRANCHE WHERE kust01_adressenart = 'N'".
                             " and BRANCHE_branche = KUST01_branche";

        $result = mysql_query($query);

        if ($result)
               {
                  $data = '';
                  while ($row = mysql_fetch_assoc($result, MYSQL_NUM))
                  {
                     $data .= implode("\t",$row)."\r\n";
                  }

        header("Content-type: application/x-msdownload");
                  header("Content-Disposition: attachment; filename=export.xls");
                  header("Pragma: no-cache");
                  header("Expires: 0");
                  echo $data;
                  exit;
               }

        }

        echo $out;   ## Eventuell auch mit Headern oder vollständiger HTML-Seite

        ?>

        So ungefähr würde ich mir das vorstellen.

        1. Wir fragen aus der Datenbank keine Spalten ab, die wir später nicht verwerten

        2. Wir fragen die Spalten in der Reihenfolge ab, in der wir sie verwerten wollen

        3. Wir lassen die Datenbank die Übersetzung von Schlüsselnummern machen
           Dafür richten wir die Tabelle BRANCHE ein, in der diese Nummern
           und die Klartexte stehen, wenn es sie nicht sowieso schon gibt.

        4. Excel erkennt numerische Felder daran, dass sie ohne Häkchen kommen und
           Textfelder daran, dass sie in Häckhen verpackt geliefert werden.
           Das muss anstelle eines einfachen Implode() eventuell noch berücksichtigt werden.

        5. ich habe für Excel-Webabfragen einen anderen Header:

        header("Content-Type: application/vnd.ms-excel");
           header("Content-Disposition: inline; filename="export.xls"");

        Dann kann man die Abfrage direkt aus Excel heraus anstoßen
           Ich bin nur darauf gekommen, dass Du das vielleicht willst, weil du TABS
           als Feldtrenner benutzt hast.

        Ein harzliches Glückauf

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hallo Tom,

          super... jetzt klappt es super!!!

          Vielen viele Dank!!!

          Viele Grüße
          Michael

  2. Hi,

    Der Code funktioniert soweit ganz gut, bis auf das der letzte Datensatz in der MySQL Tabelle immer doppelt aufgelistet wird.

    Na dann schau dir doch mal an, was du da eigentlich machst ...

    while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
    ...
    $data = "...";

    $line .= $data;
    $data .= trim($line)."\n";
    }

    Was passiert denn da jetzt genau?

    Erster Schleifendurchlauf:

    $data = "datensatz 1";
    $line .= $data; // $line hat jetzt den Inhalt "datensatz 1" (und du bekommst - sofern du das error_reporting vernuenftig eingestellt hast - eine Warnmeldung, weil du $line ueberhaupt nicht initialisiert hast)
    $data .= trim($line)."\n"; $data hat jetzt den Inhalt "datensatz 1".trim("datensatz 1")."\n", also "datensatz 1datensatz 1\n"

    Naechster Schleifendurchlauf:

    $data = "datensatz 2";
    $line .= $data; // $line hat jetzt den Inhalt "datensatz 1datensatz 2"
    $data .= trim($line)."\n"; $data hat jetzt den Inhalt "datensatz 2".trim("datensatz 1datensatz 2")."\n", also "datensatz 2\ndatensatz 1datensatz 2\n"

    ...

    Computer sind dumm, die tun nur genau was du ihnen sagst - also musst du aufpassen, dass du ihnen keinen Bloedsinn erzaehlst.

    Vorschlag:
    Jetzt schreibst du dir noch mal auf Papier auf, was in jedem Schleifendurchlauf *wirklich* passieren soll, spielst das mal analog fuer ein paar Datensaetze durch - und setzt es dann in entsprechenden PHP-Code um.

    MfG ChrisB

    --
    "The Internet: Technological marvel of marvels - but if you don't know *what* you're lookin' for on the Internet, it is nothing but a time-sucking vortex from hell."