freshman2017
Goto Top

MySQL Tabelle exportieren

Liebe Gemeinde,

ich stehe gerade mal wieder vor einer Herausforderung, ich möchte gerne Werte aus einer MySQL Tabelle exportieren. Hierzu habe ich folgende Datenbankaufbau:

CREATE TABLE `users` (
  `user_id` int(11) NOT NULL,
  `user_email` varchar(255) NOT NULL,
  `user_name` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `users`
  ADD PRIMARY KEY (`user_id`),
  ADD UNIQUE KEY `user_email` (`user_email`),
  ADD KEY `user_name` (`user_name`);

ALTER TABLE `users`
  MODIFY `user_id` int(11) NOT NULL AUTO_INCREMENT;

INSERT INTO `users` (`user_id`, `user_email`, `user_name`) VALUES
(1, 'Jane Doe', 'jane@doe.com'),  
(2, 'Joe Doe', 'joe@doe.com'),  
(3, 'John Doe', 'john@doe.com'),  
(4, 'Julie Doe', 'julie@doe.com'),  
(5, 'Johan Doe', 'johan@doe.com'),  
(6, 'Joanne Doe', 'joanne@doe.com'),  
(7, 'Juliet Doe', 'juliet@doe.com'),  
(8, 'June Doe', 'june@doe.com'),  
(9, 'Juan Doe', 'juan@doe.com'),  
(10, 'Jamir Doe', 'jamir@doe.com'),  
(11, 'Jaden Doe', 'jaden@doe.com'),  
(12, 'James Doe', 'james@doe.com'),  
(13, 'Janus Doe', 'janus@doe.com'),  
(14, 'Jason Doe', 'jason@doe.com'),  
(15, 'Jay Doe', 'jay@doe.com'),  
(16, 'Jeff Doe', 'jeff@doe.com'),  
(17, 'Jenn Doe', 'jenn@doe.com'),  
(18, 'Joah Doe', 'joah@doe.com'),  
(19, 'Joyce Doe', 'joyce@doe.com'),  
(20, 'Joy Doe', 'joy@doe.com'),  
(21, 'Juke Doe', 'juke@doe.com'),  
(22, 'Johnnie Doe', 'johnnie@doe.com'),  
(23, 'Jim Doe', 'jim@doe.com'),  
(24, 'Jess Doe', 'jess@doe.com'),  
(25, 'Jabril Doe', 'jabril@doe.com');  

Dabei nutze ich folgendes PHP Skript:

<?php

$dbHost = "localhost";  
$dbName = "test";  
$dbChar = "utf8";  
$dbUser = "root";  
$dbPass = "";  
try {
  $pdo = new PDO(
    "mysql:host=$dbHost;dbname=$dbName;charset=$dbChar",  
    $dbUser, $dbPass, [
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_NAMED
    ]
  );
} catch (Exception $ex) { exit($ex->getMessage()); }

$csvFile = "export.txt";  
$handle = fopen($csvFile, "w");  
if ($handle === false) { exit("Error creating $csvFile"); }  

$stmt = $pdo->prepare("SELECT * FROM `users`");  
$stmt->execute();
while ($row = $stmt->fetch()) {

  fputcsv($handle, [$row["user_id"], $row["user_email"], $row["user_name"]]);  
}
fclose($handle);

?>

Die Ausgabe ist wie folgt:

1,"Jane Doe",jane@doe.com  
2,"Joe Doe",joe@doe.com  
3,"John Doe",john@doe.com  
4,"Julie Doe",julie@doe.com  
5,"Johan Doe",johan@doe.com  
6,"Joanne Doe",joanne@doe.com  
7,"Juliet Doe",juliet@doe.com  
8,"June Doe",june@doe.com  
9,"Juan Doe",juan@doe.com  
10,"Jamir Doe",jamir@doe.com  
11,"Jaden Doe",jaden@doe.com  
12,"James Doe",james@doe.com  
13,"Janus Doe",janus@doe.com  
14,"Jason Doe",jason@doe.com  
15,"Jay Doe",jay@doe.com  
16,"Jeff Doe",jeff@doe.com  
17,"Jenn Doe",jenn@doe.com  
18,"Joah Doe",joah@doe.com  
19,"Joyce Doe",joyce@doe.com  
20,"Joy Doe",joy@doe.com  
21,"Juke Doe",juke@doe.com  
22,"Johnnie Doe",johnnie@doe.com  
23,"Jim Doe",jim@doe.com  
24,"Jess Doe",jess@doe.com  
25,"Jabril Doe",jabril@doe.com  

Allerdings würde ich gerne folgende Ausgabe habe (in der 2. Spalte soll kein Anführungszeichen stehen):

1,Jane Doe,jane@doe.com
2,Joe Doe,joe@doe.com
3,John Doe,john@doe.com
4,Julie Doe,julie@doe.com
5,Johan Doe,johan@doe.com
6,Joanne Doe,joanne@doe.com
7,Juliet Doe,juliet@doe.com
8,June Doe,june@doe.com
9,Juan Doe,juan@doe.com
10,Jamir Doe,jamir@doe.com
11,Jaden Doe,jaden@doe.com
12,James Doe,james@doe.com
13,Janus Doe,janus@doe.com
14,Jason Doe,jason@doe.com
15,Jay Doe,jay@doe.com
16,Jeff Doe,jeff@doe.com
17,Jenn Doe,jenn@doe.com
18,Joah Doe,joah@doe.com
19,Joyce Doe,joyce@doe.com
20,Joy Doe,joy@doe.com
21,Juke Doe,juke@doe.com
22,Johnnie Doe,johnnie@doe.com
23,Jim Doe,jim@doe.com
24,Jess Doe,jess@doe.com
25,Jabril Doe,jabril@doe.com

Content-ID: 2957578938

Url: https://administrator.de/contentid/2957578938

Ausgedruckt am: 21.11.2024 um 21:11 Uhr

mbehrens
mbehrens 01.06.2022 um 17:23:20 Uhr
Goto Top
Es wäre einen Versuch Wert, mit dem Parameter enclosure der Funktion fputcsv zu experimentieren.
StefanKittel
StefanKittel 02.06.2022 um 01:00:12 Uhr
Goto Top
Hallo,

das " ist ja aus gutem Grund da wegen der Leerzeichen.
Aber Deine Daten, Deine Verantwortung.

Ich würde die Ausgabe einfach in einen String schreiben und diesen am Ende in eine Datei schreiben.

$output = ""  

while ($row = $stmt->fetch()) {
$output .= $row["user_id"] . ", " . $row["user_email"] . ", " . $row["user_name"] . "\n";  
}

file_put_contents($csvFile, $output);

Bei größeren Datenmenge wird das zum Speicherproblem. Da muss man mehr speichern.
it-frosch
it-frosch 02.06.2022 um 08:11:25 Uhr
Goto Top
Hallo freshman2017,

mich würde einmal der Grund für deinen Wunsch interessieren.

Grüße vom it-frosch
ukulele-7
ukulele-7 02.06.2022 aktualisiert um 09:06:44 Uhr
Goto Top
Mich wundert eher das der String ohne Leerzeichen ohne Fieldquote daher kommt. Ist das irgend ein Standard? Da muss ja beim Export unterschieden werden ob eine komplette Spalte Leerzeichen enthält oder nicht.
freshman2017
freshman2017 02.06.2022 um 10:30:02 Uhr
Goto Top
Hallo stefankittel,

an welche Stelle müsste ich es bei dem Skript einfügen?


Zitat von @StefanKittel:

Hallo,

das " ist ja aus gutem Grund da wegen der Leerzeichen.
Aber Deine Daten, Deine Verantwortung.

Ich würde die Ausgabe einfach in einen String schreiben und diesen am Ende in eine Datei schreiben.

$output = ""  

while ($row = $stmt->fetch()) {
$output .= $row["user_id"] . ", " . $row["user_email"] . ", " . $row["user_name"] . "\n";  
}

file_put_contents($csvFile, $output);

Bei größeren Datenmenge wird das zum Speicherproblem. Da muss man mehr speichern.
2965329348
2965329348 02.06.2022 aktualisiert um 10:53:54 Uhr
Goto Top
(in der 2. Spalte soll kein Anführungszeichen stehen):
Da freut sich das nachfolgende Programm wenn in der Spalte dann Mustermann, Max steht face-wink. Wie gesagt die String-Separator's gibt es nicht ohne Grund in CSV Dateien!
StefanKittel
Lösung StefanKittel 02.06.2022 um 12:19:31 Uhr
Goto Top
<?php

$dbHost = "localhost";  
$dbName = "test";  
$dbChar = "utf8";  
$dbUser = "root";  
$dbPass = "";  
try {
  $pdo = new PDO(
    "mysql:host=$dbHost;dbname=$dbName;charset=$dbChar",  
    $dbUser, $dbPass, [
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_NAMED
    ]
  );
} catch (Exception $ex) { exit($ex->getMessage()); }

$csvFile = "export.txt";  
$output = ""  

$stmt = $pdo->prepare("SELECT * FROM `users`");  
$stmt->execute();
while ($row = $stmt->fetch()) {
$output .= $row["user_id"] . ", " . $row["user_email"] . ", " . $row["user_name"] . "\n";  
}
file_put_contents($csvFile, $output);

?>