Werte aus sql-Datenbank in csv schreiben

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

  • Werte aus sql-Datenbank in csv schreiben

    Hi,

    erster Post und gleich ne doofe frage, so haben wir es gerne
    Ja Sorry. Bin der absolute php-Anfänger und versuche hier die ganze Zeit Datenbankinhalte in eine csv zu schreiben.
    Aber egal was ich ausprobiere, er sagt mir immer, dass ich was falsch mache.

    Hier mal der Code. Das funktioniert auch soweit, dass meine Daten richtig formatiert am Bildschirm angezeigt werden.
    Code:
            $sql  = "SELECT .....
    	$db = mysqli_connect($dbhost, $dbuser, $dbpasswd, $dbname);
    	$db->set_charset('utf8');
    	$erg = $db->query($sql)
    		or die( $db->error);
    	//Ausgabe Ergebnis
    	if ($erg->num_rows) {
    		echo "<p>Daten vorhanden: Anzahl ";
    		echo $erg->num_rows;
                    $fp=fopen("datei.csv", "w");
    	}
    	while ($zeile = $erg->fetch_object()) {
    		echo '<br>'. $zeile->username, ", ", $zeile->pf_strasse, ", ", $zeile->pf_ort, ", ", $zeile->user_id; 
    	}
    	fclose($fp);
    	$erg->free();
    	$db->close();
    Ich habe nun versucht über verschiedenste Varianten mit fputcsv oder fwrite versucht die Daten in eine Datei zu schreiben. Aber es kommen immer Fehlermeldungen, dass das Format nicht stimmt.

    Es wäre echt nett, wenn mir hier jemand die richtige Codezeile zur Ausgabe basteln könnte.

    Danke im voraus

    gruß Werner

  • #2
    Ich sehe in dem Code weder ein fwrite, noch ein fputcsv.

    Kommentar


    • #3
      Den habe ich wieder gelöscht, da er ja eh falsch war

      Kommentar


      • #4
        Zitat von wernerx Beitrag anzeigen
        Den habe ich wieder gelöscht, da er ja eh falsch war
        Und man soll jetzt erraten, was du falsch gemacht hast?

        Kommentar


        • #5
          Das Problem hat sich teilweise erledigt.
          Habe parallel natürlich weiter probiert und bin jetzt auf eine Lösung gestoßen, die teilweise funktioniert.
          Meine While Schleife sieht jetzt so aus:
          Code:
          	while ($zeile = $erg->fetch_object()) {
          		echo '<br>'. $zeile->username, ", ", $zeile->pf_strasse, ", ", $zeile->pf_ort, ", ", $zeile->user_id; 
          		$daten = (array) $zeile;
          		fputcsv($fp, $daten);
          ich hatte bei den vorherigen Tests das so stehen:
          Code:
          		$daten = $zeile;
          		fputcsv($fp, $daten);
          Aber jetzt habe ich ein anderes "Problem"
          Das Ergebnis sieht in der Datei jetzt so aus:

          Code:
          975,riza,"Irgendwo 10a",57057
          1093,taing,"Hinsenweg 3","12345 testhausen"
          Immer wenn ein Leerzeichen dabei ist, werden meine Werte in Anführungszeichen gesetzt.
          Bei der Ausgabe mit echo nicht. Das stört aber, kann man die irgendwie weg bekommen? Darf ich hier weiter Fragen, oder soll ich dazu ein neues Thema aufmachen?

          Danke Gruß Werner

          Kommentar


          • #6
            Zitat von wernerx Beitrag anzeigen
            Immer wenn ein Leerzeichen dabei ist, werden meine Werte in Anführungszeichen gesetzt.
            Ja, das ist bei CSV so.

            Zitat von wernerx Beitrag anzeigen
            Bei der Ausgabe mit echo nicht. Das stört aber, kann man die irgendwie weg bekommen?
            Warum? Das ist ein korrektes CSV-Format. Ich dachte du wolltest eine CSV-Datei erstellen?

            Kommentar


            • #7
              Mein Fehler, Sorry.
              Ich verarbeite die csv mit einem anderen Programm weiter und da waren in allen Beispieldateien keine Anführungszeichen. Aber ich habe es jetzt mal getestet, die Schnittstelle kommt auch mit Zeichenfolgen in Anführungszeichen zurecht.

              Danke für deine Hilfe.

              gruß Werner
              PS. Wenn ich gerade dabei bin, vielleicht kannst du mir bei einem anderen Thema noch mal drüber schauen.
              Parallel lese ich die Datei für Auswertungen mit Excel ein, dabei macht er Probleme mit den umlauten. Ich habe folgende Zeile in meinem php-Script:
              Code:
              header('Content-Type: text/html; charset=utf-8');
              Damit sollte doch sicher gestellt sein, dass die Datei die er erzeugt utf-8 kodiert ist. Richtig?

              Ich muss leider diesen Weg über Excel gehen, da ich die Datei noch sehr umfangreich über bubbelsort mit einer anderen Datei auswerten muss. Und das kriege ich in php aufgrund der Komplexität nie hin.

              Kommentar


              • #8
                Zitat von wernerx Beitrag anzeigen
                Parallel lese ich die Datei für Auswertungen mit Excel ein, dabei macht er Probleme mit den umlauten. Ich habe folgende Zeile in meinem php-Script:
                Code:
                header('Content-Type: text/html; charset=utf-8');
                Damit sollte doch sicher gestellt sein, dass die Datei die er erzeugt utf-8 kodiert ist. Richtig?
                1. Ich dachte du möchtest eine CSV-Datei und keine HTML-Datei erzeugen? Warum sagst du dann im Header, dass du HTML ausgibst?

                2. Nur weil du im Header sagst, dass du UTF-8 ausgibst, wird nicht automagisch alles in dieser Kodierung ausgegeben. Darum musst du dich schon selber kümmern. Im Fall der Datenbank musst du die Datenbankverbindung auf UTF-8 setzen. Und wenn die Daten von Excel gelesen werden, beachte, dass Excel einen UTF-8 BOM erwartet. Den musst du auch noch am Anfang des Datenstroms ausgeben.

                Kommentar


                • #9
                  Hi,

                  der Fehler mit dem Header ist halt meinem Copy und paste programmieren geschuldet. danke für den Hinweis.

                  vielleicht kannst du mir helfen, wie ich die csv-datei richtig erstelle?
                  Wenn ich meine derzeitige csv-Datei mit einem Editor öffne, wird mir als Codierung Unix UTF-8 angezeigt. Also UTF-8 ist schon mal richtig.
                  Aber die Umlaute werden trotzdem in Excel nicht richtig verarbeitet.

                  Wenn ich eine Textdatei auf meinem PC erstelle (Codierung Windows / Ansi) und kopiere die Daten per copy und paste aus der UNIX Datei, werden die Umlaute richtig verarbeitet.

                  Eine Hilfe wäre toll, Danke.

                  gruß Werner

                  Kommentar


                  • #10
                    PHP-Code:
                    $db = new PDO('mysql:host=localhost;dbname=test;charset=utf8''root''', [
                        
                    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
                    ]);

                    $db->query('
                        CREATE TEMPORARY TABLE test (
                            id INT NOT NULL AUTO_INCREMENT,
                            foo VARCHAR(255) NOT NULL,
                            PRIMARY KEY (id)
                        )
                    '
                    );

                    $stmt $db->prepare('INSERT INTO test (foo) VALUES (?)');
                    $stmt->execute(["B\xC3\xA4rlauch"]);
                    $stmt->execute(["R\xC3\xB6mer"]);
                    $stmt->execute(["Wei\xC3\x9Fer Tee"]);


                    $result $db->query('SELECT id, foo FROM test');


                    /**
                     * CSV-Ausgabe
                     */

                    header('Content-Type: text/csv; charset=utf-8');
                    header('Content-Disposition: attachment; filename="export.csv"');

                    echo 
                    "\xEF\xBB\xBF"// UTF-8 BOM

                    $fp fopen('php://output''w');
                    while (
                    $row $result->fetch(PDO::FETCH_NUM)) {
                        
                    fputcsv($fp$row';');
                    }
                    fclose($fp); 

                    Kommentar


                    • #11
                      Also probier es aus

                      <?php
                      $servername = "localhost";
                      $username = "username";
                      $password = "password";

                      // Create connection
                      $conn = new mysqli($servername, $username, $password);
                      // Check connection
                      if ($conn->connect_error) {
                      die("Connection failed: " . $conn->connect_error);
                      }

                      // Create database
                      $sql = "CREATE DATABASE myDB";
                      if ($conn->query($sql) === TRUE) {
                      echo "Database created successfully";
                      } else {
                      echo "Error creating database: " . $conn->error;
                      }

                      $conn->close();
                      ?>
                      Zuletzt geändert von Kropff; 23.04.2018, 22:40.

                      Kommentar


                      • #12
                        @Hernando: Weiß gerade nicht was du mir mit dem Zitat von h3ll sagen willst?

                        @ThomasTailor: Bei dir geht es mir ähnlich. Das Script erstellt eine Datenbank? Eine Datenbank habe ich schon, daher fehlt mir gerade die Idee was mir dein Script bei dem UTF-8 Problem helfen soll?

                        @h3ll: Danke, muss mal schauen ob ich vor meinem Urlaub noch dazu komme das zu testen, wenn nicht nach meinem Urlaub. Aber vorab schon mal Danke für deine Mühen.

                        Gruß Werner

                        Kommentar

                        Lädt...
                        X