MSSQL-Ausgabe exportieren in csv

msycho

Erfahrenes Mitglied
Hallo.

Mit Hilfe von PHP habe ich ein Script geschrieben welches mir die in der Datenbank gespeicherten Daten in Form einer Tabelle ausgibt.
Ich möchte nun eine Funktion einbauen, die die Ausgabe in eine *.csv-Datei exportiert. Dies möchte ich in Form eines Buttons umsetzen. Klickt man auf den Button, sollen die ausgegebenen/abgefragten Daten exportiert werden. Hierbei ist wirklich darauf zu achten, dass nicht die ganzen Daten der einzelnen Spalten aus der Tabelle exportiert, sondern lediglich die, die auch angezeigt bzw. abgefragt werden.
Es ist sicher möglich, nur ich habe meine Probleme mit der Umsetzung.
Könnt Ihr mir bitte weiterhelfen?

Gruß
 
Hallo auch,

Hierbei ist wirklich darauf zu achten, dass nicht die ganzen Daten der einzelnen Spalten aus der Tabelle exportiert, sondern lediglich die, die auch angezeigt bzw. abgefragt werden.
Versteh ich leider nicht ganz.

Ansonsten hab ich das so aufgefasst, dass du dir eine Tabelle baust (HTML?) und dabei Zeilenweise die Daten einfügst, also wahrscheinlich so:
PHP:
<table>
<?
while($zeilen)
{
echo "<tr>";
while($spalten)
{
echo "<td>$_POST['blub']</td>";
}
echo "</tr>";
}
?>
</table>

Genau hier kannst du auch einfach die Daten, die du in die Tabelle schreibst aneinanderhängen und dazwischen eben immer einen Seperator einfügen.

PHP:
<table>
<?
$out; $c=";";
while($zeilen)
{
echo"<tr>";
while($spalten)
{
echo"<td>$_POST['blub']</td>";
$out = $out . $c . $_POST['blub'];
}
echo"</tr>";
// Hier dann in die Datei schreiben
}
?>
</table>
Dann musst du halt noch nen output-Stream in ne Datei legen, den ich jetzt leider grad nicht parat hab, aber auf php.net sicher zu finden ist.

Grüße vom Gulasch
 
Zuletzt bearbeitet:
Hallo.

Die Abfrage sieht bei mir folgendermaßen aus. Je nachdem ob über ein Formular selektiert wird, wird entweder alles oder je nach Selektionskritierie ausgegeben:

PHP:
// Alles wird selektiert
// Gleichzeitig die Grundlage fuer alle anderen Abfragen
$query = "SELECT * FROM testtabelle";

// Ist eines der Textfelder gesetzt ...
if(!empty($kdnr) || !empty($artikelnr) || !empty($lieferant) || !empty($von) || !empty($bis)){
    $query .= " WHERE ";

    // ... dann wird der Abfrage-String erweitert
    if(!empty($kdnr))
        $query .= " testspalte = '$kdnr' AND ";

    if(!empty($artikelnr))
        $query .= " testspalte_2 = '$artikelnr' AND ";

    if(!empty($lieferant))
        $query .= " testspalte_6 = '$lieferant' AND ";

    if ((!empty($von)) && (!empty($bis)))
        $query .= " testspalte_7 >= '$von' AND testspalte_7 <= '$bis' AND ";

    // Abfrage-String wird gekuerzt um das AND am Schluss zu entfernen
    $query = substr($query, 0, strlen($query)-4);
}

$sql = mssql_query($query) or die (mssql_get_last_message());

Die eigentliche Ausgabe erfolgt dann über echo in Form einer HTML-Tabellen:

PHP:
// Ausgabe ueber echo
 echo "<tr>";
 echo "<td class=\"content2\">$dbspalte_1</td>";
 echo "<td class=\"content2\">$dbspalte_2</td>";
 echo "<td class=\"content2\">$dbspalte_3</td>";
 echo "<td class=\"content2\">$dbspalte_4</td>";
 echo "<td class=\"content2\">$dbspalte_5</td>";
 echo "<td class=\"content2\">$multiEKxP</td>";
 echo "<td class=\"content2\">$multiVKxP</td>";
 echo "<td class=\"content2\">$dbspalte_6</td>";
 echo "<td class=\"content2\">$dbspalte_7</td>";
 echo "</tr>";

Wie kann ich jetzt die Daten mit einem Semikolon getrennt aneinanderhängen und sie letztlich als csv speichern, bitte? Es soll aber nur gespeichert werden, wenn man auf einen dafür verantwortlichen Button gedrückt hat.
Ich hoffe Du verstehst mich jetzt etwas mehr.

Gruß.
 
Ah ok, ich versteh was du meinst. Du willst jetzt diese $db_spalte_i aneinanderhängen. Ich weiß ja nicht wie lang dann dieser String werden würde, aber um auf Nummer sicher zu gehen, empfehle ich dir mal folgendes:
- Pack die ganze Ausgabe in ein <form>-Tag
- Versehe deine <td>s mit IDs bzw. schreibe deine Tabelleneinträge in hidden-inputs
- Mache einen "Submit"-Button
- Schick das Forumlar an eine neue php-Datei (oder an die gleiche mit einem Flag, der dann eben 0,1,Zwerg oder was weiß ich was ist so dass nur der Schreib-in-die-Datei-Code genutzt wird) und schreib dann das Zeug in ne Datei.

Grob vielleicht so:
PHP:
<form action="in_file.php" method="POST">
<table>
<tr>
<td class=\"content2\">$dbspalte_1<input type="hidden" name="spalte _1" value=$dbspalte_1></td>
...
</tr>
</table>
<input type="submit" value="Schreib in Datei">
</form>
Und dann eben verarbeiten:
PHP:
$handle = fopen("/meineDatei.csv","w");
$out="";
$c = ";";
for($i=1;$i<$anzahl;$i++)
{
$out = $out . $_POST["spalte_".$i] . $c . "\n";
}
fwrite($handle,$out);
fclose($handle);

Allerdings ist das ganze sowas von ohne Gewähr, da ich es nicht getestet habe, mir aber ziemlich sicher bin, dass es so funktionieren sollte.
Für das Schreiben in Dateien kann ich dir das nur sehr empfehlen.
Ich hoff jetzt auch mal, dass wir nicht aneinander vorbeigeredet haben und ich dir wenigstens etwas helfen konnte.

Grüße vom Gulasch
 
Zuletzt bearbeitet:
Dank Dir schonmal. Ich habe es mal eben anhand einer Spalte ohne große Änderungen getestet:

PHP:
[...]
<form action="export.php" method="POST">
[...]
<td class=\"content2\"><?= $dbspalte_1 ?><input type="hidden" name="spalte_1" value="<?= $dbspalte_1;?>" /></td>
[...]
<input type="submit" value="Exportieren">
</form>
[...]

Die export.php sieht so aus:

PHP:
$dateiname = 'dataexport.csv';
$out='';
$c = ';';

$handle = fopen($dateiname,'w');
for($i=1;$i<$anzahl;$i++)
{
$out = $out . $_POST["spalte_1".$i] . $c . "\n";
}
fwrite($handle,$out);
fclose($handle);

Nachdem ich nun auch den Button geklickt habe, wurde auch die Datei angelegt. Allerdings ohne Inhalt. Irgenwas stimmt also noch nicht. Kannst Du mir bitte nochmals helfen?

/EDIT: Hab nochmal an der export.php ein paar kleine Änderungen vorgenommen:

PHP:
$dateiname = 'c:\dataexport.csv';
$c = ';';

$out = $_POST["spalte_1"] . $c . "\n"; 

$handle = fopen($dateiname,'w');

fwrite($handle,$out);
fclose($handle);

Jetzt gibt er mir den letzten Werte der Spalte aus, allerdings nur den letzten. Ich möchte aber gerne alle Werte ausgegeben haben, getrennt durch ein Semikolon. Hast Du Rat, bitte?
 
Zuletzt bearbeitet:
Hallo!

Mit $i wird eine Zahl, beginnend mit 1, an den Variablennamen gehängt.
msycho hat gesagt.:
Die export.php sieht so aus:

PHP:
$dateiname = 'dataexport.csv';
$out='';
$c = ';';
 
$handle = fopen($dateiname,'w');
for($i=1;$i<$anzahl;$i++)
{
$out = $out . $_POST["spalte_1".$i] . $c . "\n";
}
fwrite($handle,$out);
fclose($handle);
Bei Dir wird also ein $_POST["spalte_11"], $_POST["spalte_12"]..... usw. erwartet.
Diese Formularfelder gibt es bei Dir aber nicht, darum bleibt die CSV leer.
Es muss also so wie es im Beispiel von mc_gulasch schon steht heissen:
PHP:
$out = $out . $_POST["spalte_".$i] . $c . "\n";
Gruss Dr Dau
 
Du meinst also so:

PHP:
$dateiname = 'c:\dataexport.csv';
$c = ';';
$out = '';

for($i=1;$i<$anzahl;$i++)
{
$out = $out . $_POST["spalte_1".$i] . $c . "\n"; 
}

$handle = fopen($dateiname,'w');

fwrite($handle,$out);
fclose($handle);

Dann wird zwar die csv-Datei angelegt, aber ohne Inhalt. Wo ist mein Fehler, bitte?
 
Zuletzt bearbeitet:
*grrrrr*
Nein, so meine ich es nicht.
msycho hat gesagt.:
Wo ist mein Fehler, bitte?
Dein Fehler ist, dass es die Formularfelder "spalte_11", "spalte_12"..... usw. einfach nicht gibt.

Bei Deinem Formular gibt es nur die Formularfelder "spalte_1", "spalte_2"..... usw.
Fällt Dir an den Namen denn nichts auf?! :suspekt:

Und fällt Dir der Unterschied zwischen Deinem Code
PHP:
$out = $out . $_POST["spalte_1".$i] . $c . "\n";
und dem von mc_gulasch
PHP:
$out = $out . $_POST["spalte_".$i] . $c . "\n
nicht auf? :eek:
 
Ich habe Dein Post zwar erst jetzt gelesen, aber ich hatte das vorher auch schon gemerkt und daraufhin geändert. Hat aber an dem oben beschriebenen Sachverhalt nichts geändert: Die Datei wird angelegt, aber ohne Inhalt. :confused:

/EDIT: Die Variable $anzahl ist ja auch nicht definiert, oder verstehe ich das falsch?
 
Stimmt, $anzahl ist nicht definiert.
Ich bin mir nicht ganz sicher, aber wenn Du dem Submit-Button vom Formular einen Namen gibst, müsstest Du den Wert für $anzahl ungefähr so bekommen:
PHP:
$anzahl = count($_POST['name_des_submit_button']);
 
Zurück