# MSSQL-Ausgabe exportieren in csv



## msycho (14. August 2006)

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ß


----------



## mc_gulasch (15. August 2006)

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:

```
<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. 


```
<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


----------



## msycho (15. August 2006)

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:


```
// 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:


```
// 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ß.


----------



## mc_gulasch (15. August 2006)

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:

```
<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:

```
$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


----------



## msycho (15. August 2006)

Dank Dir schonmal. Ich habe es mal eben anhand einer Spalte ohne große Änderungen getestet:


```
[...]
<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:


```
$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:


```
$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?


----------



## Dr Dau (15. August 2006)

Hallo!

Mit $i wird eine Zahl, beginnend mit 1, an den Variablennamen gehängt.


			
				msycho hat gesagt.:
			
		

> Die export.php sieht so aus:
> 
> 
> ```
> ...


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:

```
$out = $out . $_POST["spalte_".$i] . $c . "\n";
```
Gruss Dr Dau


----------



## msycho (15. August 2006)

Du meinst also so:


```
$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?


----------



## Dr Dau (15. August 2006)

*grrrrr*
Nein, so meine ich es nicht.


			
				msycho hat gesagt.:
			
		

> Wo ist mein Fehler, bitte?


Dein Fehler ist, dass es die Formularfelder "spalte_1*1*", "spalte_1*2*"..... 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

```
$out = $out . $_POST["spalte_1".$i] . $c . "\n";
```
und dem von mc_gulasch
	
	
	



```
$out = $out . $_POST["spalte_".$i] . $c . "\n
```
nicht auf?


----------



## msycho (15. August 2006)

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. 

/EDIT: Die Variable $anzahl ist ja auch nicht definiert, oder verstehe ich das falsch?


----------



## Dr Dau (15. August 2006)

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:

```
$anzahl = count($_POST['name_des_submit_button']);
```


----------



## Dr Dau (15. August 2006)

OK, dann halt ganz anders.....

```
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST"> 
<table> 
<tr> 
<td class="content2\"><?php echo $dbspalte_1; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_1; ?>"></td> 
<td class="content2\"><?php echo $dbspalte_2; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_2; ?>"></td> 
<td class="content2\"><?php echo $dbspalte_3; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_3; ?>"></td> 
<td class="content2\"><?php echo $dbspalte_4; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_4; ?>"></td> 
<td class="content2\"><?php echo $dbspalte_5; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_5; ?>"></td> 
<td class="content2\"><?php echo $multiEKxP; ?><input type="hidden" name="spalte[]" value="<?php echo $multiEKxP; ?>"></td> 
<td class="content2\"><?php echo $multiVKxP; ?><input type="hidden" name="spalte[]" value="<?php echo $multiVKxP; ?>"></td> 
<td class="content2\"><?php echo $dbspalte_6; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_6; ?>"></td> 
<td class="content2\"><?php echo $dbspalte_7; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_7; ?>"></td> 
</tr> 
</table> 
<input type="submit" name="make_csv" value="Schreib in Datei"> 
</form>  
 
<?php
if(isset($_POST['make_csv'])) {
    $anzahl = count($_POST['spalte']);
 
    for($i=0;$i<$anzahl;$i++) {
        $print = implode(";", $_POST['spalte']);
    }
 
    $handle = fopen("./meineDatei.csv","w");
    fwrite($handle,$print."\r\n");
    fclose($handle);
}
?>
```


----------



## msycho (16. August 2006)

Hallo!

Ich danke Dir. Es kommt jedoch zu einem Fehler, sogar schon wenn ich auf die Abfrage-Datei zugreifen möchte:



> Parse error: syntax error, unexpected $end in ***\ausgabe.php on line 217



Der Code sieht jetzt folgendermaßen aus:


```
<!-- Ausgabe der Abfrage -->
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
<table cellspacing="0" cellpadding="0" align="center" class="tableouter2">
 <tr>
  <td class="content2"><?php echo $dbspalte_1; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_1; ?>" /></td>
  <td class="content2"><?php echo $dbspalte_2; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_2; ?>" /></td> 
  <td class="content2"><?php echo $dbspalte_3; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_3; ?>" /></td> 
  <td class="content2"><?php echo $dbspalte_4; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_4; ?>" /></td> 
  <td class="content2"><?php echo $dbspalte_5; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_5; ?>" /></td> 
  <td class="content2"><?php echo $multiEKxP; ?><input type="hidden" name="spalte[]" value="<?php echo $multiEKxP; ?>" /></td> 
  <td class="content2"><?php echo $multiVKxP; ?><input type="hidden" name="spalte[]" value="<?php echo $multiVKxP; ?>" /></td> 
  <td class="content2"><?php echo $dbspalte_6; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_6; ?>" /></td> 
  <td class="content2"><?php echo $dbspalte_7; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_7; ?>" /></td>
 </tr>
</table> 
 <input type="submit" name="make_csv" value="Schreib in Datei"> 
</form>  

<?php

if(isset($_POST['make_csv'])) {
    $anzahl = count($_POST['spalte']);
 
    for($i=0;$i<$anzahl;$i++) {
        $print = implode(";", $_POST['spalte']);
    }
 
    $handle = fopen("./dataexport.csv","w");
    fwrite($handle,$print."\r\n");
    fclose($handle);
}

?>
```

Zeile 217 enthält das </html>-tag.

An fehlenden Klammern kann es nicht liegen, wenn ich das richtig kontrolliert habe, und nichts übersehen habe. Weisst Du wo der Fehler liegt, bitte?


----------



## Dr Dau (16. August 2006)

Da muss schon irgendwo vorher ein Zeichen fehlen.
Oder kommt danach noch mehr?
Dann könnte auch danach ein Zeichen fehlen.
An dem von mir geposteten Code liegt es jedenfalls nicht..... der funktioniert bei mir wunderbar.


----------



## msycho (16. August 2006)

Stimmt, Du hattest Recht. Eine } hatte gefehlt.

Allerdings, klappt das jetzt nicht mehr mit der Abfrage bzw. der Ausgabe. Es wird je Spalte nur noch der letzte Datensatz ausgespuckt und nicht alle.
Wie kann ich dem nun bitte vorbeugen?

/EDIT: Hm, je nachdem wo ich die } setze, ändert das die Ausgabe. Momentan ist es so, dass jeder Datensatz ausgegeben wird in einer Zeile, pro Zeile aber der Button "Schreib in Datei" angezeigt wird. Ich möchte es aber unter der gesamten HTML-Tabelle nur einmal angezeigt haben.
Wo soll ich jetzt die } hinsetzen, bitte? Kannst Du mir weiterhelfen? Ich poste hier mal fast den gesamten Code des Scriptes:


```
<table cellspacing="0" cellpadding="0" align="center" class="tableouter2">
 <tr>
  <td class="headline2" width="15%">Kunden-Nr.</td>
  <td class="headline2" width="15%">Art.-Nr.</td>
  <td class="headline2" width="10%">Menge EK</td>
  <td class="headline2" width="10%">Menge VK</td>
  <td class="headline2" width="10%">Preis (in &euro;)</td>
  <td class="headline2" width="10%">MengeEKxP</td>
  <td class="headline2" width="10%">MengeVKxP</td>
  <td class="headline2" width="10%">Lieferantenname</td>
  <td class="headline2" width="10%">Monat-Jahr</td>
 </tr>
</table>

<?php

// Verbindung zur Datenbank herstellen
$dbverbindung = mssql_connect ($sqlhost, $sqluser, $sqlpass) or die (mssql_get_last_message());
mssql_select_db ($database, $dbverbindung) or die (mssql_get_last_message());

// 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());

// Auslesen des Ergebnisses
while ($result = mssql_fetch_object($sql)){

//---> MS SQL Datenbank Spaltennamen <---\\
 $dbspalte_1 = $result -> testspalte;    // Spaltenname von KundenNr
 $dbspalte_2 = $result -> testspalte_2;  // Spaltenname von ArtikelNr
 $dbspalte_3 = $result -> testspalte_3;  // Spaltenname von Menge_Ek
 $dbspalte_4 = $result -> testspalte_4;  // Spaltenname von Menge_Vk
 $dbspalte_5 = $result -> testspalte_5;  // Spaltenname von Preis
 $dbspalte_6 = $result -> testspalte_6;  // Spaltenname von LiefName
 $dbspalte_7 = $result -> testspalte_7;  // Spaltenname von MeldDatum
//---> MS SQL Datenbank Spaltennamen <---\\

// Multiplikation zw. MengeEK bzw. MengeVK und Preis in jeweils einer neuen Variable
$multiEKxP = $dbspalte_3 * $dbspalte_5;
$multiVKxP = $dbspalte_4 * $dbspalte_5;

// Addition der Produkte aus jeweils einer Spalte
// Produkte aus MengeEK x Preis werden in ein Array eingelesen
$addition1[] = $multiEKxP;
// Alle im Array enthaltenen Zahlen werden addiert
$summe1 = array_sum($addition1);
// Produkte aus MengeVK x Preis werden in ein Array eingelesen
$addition2[] = $multiVKxP;
// Alle im Array enthaltenen Zahlen werden addiert
$summe2 = array_sum($addition2);


?>

<!-- Ausgabe der Abfrage -->
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
<table cellspacing="0" cellpadding="0" align="center" class="tableouter2">
 <tr>
  <td class="content2"><?php echo "$dbspalte_1"; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_1; ?>" /></td>
  <td class="content2"><?php echo "$dbspalte_2"; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_2; ?>" /></td> 
  <td class="content2"><?php echo "$dbspalte_3"; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_3; ?>" /></td> 
  <td class="content2"><?php echo "$dbspalte_4"; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_4; ?>" /></td> 
  <td class="content2"><?php echo "$dbspalte_5"; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_5; ?>" /></td> 
  <td class="content2"><?php echo "$multiEKxP"; ?><input type="hidden" name="spalte[]" value="<?php echo $multiEKxP; ?>" /></td> 
  <td class="content2"><?php echo "$multiVKxP"; ?><input type="hidden" name="spalte[]" value="<?php echo $multiVKxP; ?>" /></td> 
  <td class="content2"><?php echo "$dbspalte_6"; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_6; ?>" /></td> 
  <td class="content2"><?php echo "$dbspalte_7"; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_7; ?>" /></td>
 </tr>
</table> 
 <input type="submit" name="make_csv" value="Schreib in Datei"> 
</form>  

<?php

if(isset($_POST['make_csv'])) {
    $anzahl = count($_POST['spalte']);
 
    for($i=0;$i<$anzahl;$i++) {
        $print = implode(";", $_POST['spalte']);
    }
 
    $handle = fopen("./dataexport.csv","w");
    fwrite($handle,$print."\r\n");
    fclose($handle);
}

?>

<table cellspacing="0" cellpadding="0" align="center" class="tableouter3">
 <tr>
  <td width="60%"></td>
  <td class="content3" width="10%">&sum;: <?php echo "$summe1" ?></td>
  <td class="content4" width="10%">&sum;: <?php echo "$summe2" ?></td>
  <td width="20%"></td>
 </tr>
</table>

<?php
}

mssql_close() or die (mssql_get_last_message());
?>
```

Das Problem liegt hier:


```
// Auslesen des Ergebnisses
while ($result = mssql_fetch_object($sql)){
```

bzw. hier:


```
}

mssql_close() or die (mssql_get_last_message());
```

oder besser gesagt an der }.


----------



## mc_gulasch (17. August 2006)

Die Klammer lässt du schon dort, wo sie in deinem letzten Post war. Natürlich ändert sich die Ausgabe je nach Klammerposition, da du die HTML - Tags in ner while-Schleife hast. Klar. 
Ausserdem ist dann noch ein bisschen was im Argen. Wenn ich dich richtig verstanden habe, willst du die *komplette* Tabelle als csv speichern. Daher:

```
<!-- Ausgabe der Abfrage -->
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
<table cellspacing="0" cellpadding="0" align="center" class="tableouter2">
```
Das kommt VOR

```
// Auslesen des Ergebnisses
while ($result = mssql_fetch_object($sql)){
```
Dementsprechend kommt NACH

```
<?php
}

mssql_close() or die (mssql_get_last_message());
?>
```
folgendes:

```
</table> 
 <input type="submit" name="make_csv" value="Schreib in Datei"> 
</form>
```
Warum?
1. Du willst die Tabelle zeilenweise aufbauen und nicht ständig Tabellen aufbauen. 
2. Du willst die komplette Tabelle verschicken, daher muss alles aussenrum in ein Form Tag. Wenn du zig <form>-Tags hast, kennt sich "submit" nicht aus, was es schicken soll.

So, viel Erfolg und sag Bescheid wie´s läuft.


----------



## msycho (17. August 2006)

Klasse! Ich danke Dir. Es lag wie Du bereits gesagt hast daran, dass das


```
</table> 
 <input type="submit" name="make_csv" value="Schreib in Datei"> 
</form>
```

vor und nicht nach dem stand:


```
}

mssql_close() or die (mssql_get_last_message());
```

Es gibt nur ein Manko was die Datei betrifft, die angelegt wird und in der die Datensätze exportiert werden: Es wird alles in einer Zeile gespeichert und dargestellt wenn ich die csv mit MS Excel aufrufe. Ich hätte es aber gerne von der Ansicht in der csv-Datei so wie in der HTML-Tabelle: 9 Spalten mit x beliebiegen Zeilen, je nach Datensätzen.
Kann ich das auch noch umsetzen? Wenn ja, wie bitte?


----------



## mc_gulasch (17. August 2006)

> ```
> $print = implode(";", $_POST['spalte']);
> ```


änderst du in 

```
$print = implode(";", $_POST['spalte']) . "\n";
```
das '\n' ist ein Steuerzeichen und bedeutet Zeilenumbruch. Falls das nicht geht (was ich mir nicht vorstellen kann),  Zeilenumbruch php oder schei bei php.net nach (die Seite gibts auch auf deutsch).


----------



## msycho (17. August 2006)

Das Steuerzeichen ändert leider nichts am Sachverhalt: Der Inhalt der exportierten csv-Datei wird immer noch in einer Zeile ausgegeben und nicht wie gewünscht wie in der HTML-Tabelle.
Ich habe auch auf diversen Seiten nachgeschaut, überall wird das o.g. Steuerzeichen als Zeilenumbruch bei PHP genannt, von anderen Steuerzeichen/Befehlen, die das selbe bewirken, ist dort jedoch nicht die Rede.


----------



## mc_gulasch (17. August 2006)

Ich hab mal bei  "Zeilenumbruch php" eingegeben und folgende Möglichkeiten gefunden. Probier die doch bitte einfach aus, irgendwas sollte echt gehen, ansonsten nochmal Code posten bitte:
1. '\n' statt "\n" 
2. "\r\n"  oder '\r\n'

Auf welchem Betriebssystem programmierst du (bzw. Server) und mit was schaust du dir die txt-Files an?


----------



## msycho (17. August 2006)

Hm, es klappt immer noch nicht.
Betriebssystem ist WindowsXP. Die csv-Datei schau ich mir mit MS Office Excel an. Ist hier alles lokal.


```
//Formular wird verarbeitet fuer den Export
if(isset($_POST['make_csv'])) {
    $anzahl = count($_POST['spalte']);

    for($i=0;$i<$anzahl;$i++) {
        $print = implode(";", $_POST['spalte']) . "\r\n";
    }

    $handle = fopen("./dataexport.csv","w");
    fwrite($handle,$print."\r\n");
    fclose($handle);
}
```


----------



## mc_gulasch (17. August 2006)

Aha, mhm....merkwürdig. Ok, schau dir die csv-File mal in Notepad an.
Ausserdem könntest du noch folgende Möglichkeiten probieren, aber dann weiß ich grad auch nicht weiter:

```
//Nach implode():
$print = $print . "\r\n";
$print = $print . '\r' . '\n'
//oder statt fwrite
fprintf($handle,%s,$print)
```
ausserdem: Wo öffnest und schließst du die Datei, also wann bringst du fopen() ? Schick bitte nochmal den kompeltten Code ab dem Auslesen aus der DB, also ab dem <form>-Tag.


----------



## msycho (17. August 2006)

Immer noch nicht anders.  

Hier der komplette Code zw. den form-tags.


```
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
 <table cellspacing="0" cellpadding="0" align="center" class="tableouter2">
  <tr>
   <td class="headline2" width="15%">HSP-Nr.<input type="hidden" name="spalte[]" value="HSP-Nr." /></td>
   <td class="headline2" width="15%">Art.-Nr.<input type="hidden" name="spalte[]" value="Art.-Nr." /></td>
   <td class="headline2" width="10%">Menge EK<input type="hidden" name="spalte[]" value="Menge EK" /></td>
   <td class="headline2" width="10%">Menge VK<input type="hidden" name="spalte[]" value="Menge VK" /></td>
   <td class="headline2" width="10%">Preis (in &euro;)<input type="hidden" name="spalte[]" value="Preis (in &euro;)" /></td>
   <td class="headline2" width="10%">MengeEKxP<input type="hidden" name="spalte[]" value="MengeEKxP" /></td>
   <td class="headline2" width="10%">MengeVKxP<input type="hidden" name="spalte[]" value="MengeVKxP" /></td>
   <td class="headline2" width="10%">Lieferantenname<input type="hidden" name="spalte[]" value="Lieferantenname" /></td>
   <td class="headline2" width="10%">Monat-Jahr<input type="hidden" name="spalte[]" value="Monat-Jahr" /></td>
  </tr>

<?php

// Verbindung zur Datenbank herstellen
$dbverbindung = mssql_connect ($sqlhost, $sqluser, $sqlpass) or die (mssql_get_last_message());
mssql_select_db ($database, $dbverbindung) or die (mssql_get_last_message());

// 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());

// Auslesen des Ergebnisses
while ($result = mssql_fetch_object($sql)){

//---> MS SQL Datenbank Spaltennamen <---\\
 $dbspalte_1 = $result -> testspalte;    // Spaltenname von KundenNrHSP
 $dbspalte_2 = $result -> testspalte_2;  // Spaltenname von ArtikelNr
 $dbspalte_3 = $result -> testspalte_3;  // Spaltenname von Menge_Ek
 $dbspalte_4 = $result -> testspalte_4;  // Spaltenname von Menge_Vk
 $dbspalte_5 = $result -> testspalte_5;  // Spaltenname von Preis
 $dbspalte_6 = $result -> testspalte_6;  // Spaltenname von LiefName
 $dbspalte_7 = $result -> testspalte_7;  // Spaltenname von MeldDatum
//---> MS SQL Datenbank Spaltennamen <---\\

// Multiplikation zw. MengeEK bzw. MengeVK und Preis in jeweils einer neuen Variable
$multiEKxP = $dbspalte_3 * $dbspalte_5;
$multiVKxP = $dbspalte_4 * $dbspalte_5;

// Addition der Produkte aus jeweils einer Spalte
// Produkte aus MengeEK x Preis werden in ein Array eingelesen
$addition1[] = $multiEKxP;
// Alle im Array enthaltenen Zahlen werden addiert
$summe1 = array_sum($addition1);
// Produkte aus MengeVK x Preis werden in ein Array eingelesen
$addition2[] = $multiVKxP;
// Alle im Array enthaltenen Zahlen werden addiert
$summe2 = array_sum($addition2);

?>

<!-- Ausgabe der Abfrage -->
  <tr>
   <td class="content2"><?php echo "$dbspalte_1"; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_1; ?>" /></td>
   <td class="content2"><?php echo "$dbspalte_2"; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_2; ?>" /></td>
   <td class="content2"><?php echo "$dbspalte_3"; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_3; ?>" /></td>
   <td class="content2"><?php echo "$dbspalte_4"; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_4; ?>" /></td>
   <td class="content2"><?php echo "$dbspalte_5"; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_5; ?>" /></td>
   <td class="content2"><?php echo "$multiEKxP"; ?><input type="hidden" name="spalte[]" value="<?php echo $multiEKxP; ?>" /></td>
   <td class="content2"><?php echo "$multiVKxP"; ?><input type="hidden" name="spalte[]" value="<?php echo $multiVKxP; ?>" /></td>
   <td class="content2"><?php echo "$dbspalte_6"; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_6; ?>" /></td>
   <td class="content2"><?php echo "$dbspalte_7"; ?><input type="hidden" name="spalte[]" value="<?php echo $dbspalte_7; ?>" /></td>
  </tr>
 
<?php
// Ende der while-Schleife
}

// Verbindung zum MS SQL Server wird geschlossen
mssql_close() or die (mssql_get_last_message());
?>

 </table>
 <table cellspacing="0" cellpadding="0" align="center" class="tableouter3">
  <tr>
   <td width="15%"></td>
   <td width="15%"></td>
   <td width="10%"></td>
   <td width="10%"></td>
   <td width="10%"></td>
   <td class="content3" width="10%">&sum;: <?php echo "$summe1"; ?><input type="hidden" name="spalte[]" value="<?php echo $summe1; ?>" /></td>
   <td class="content4" width="10%">&sum;: <?php echo "$summe2"; ?><input type="hidden" name="spalte[]" value="<?php echo $summe2; ?>" /></td>
   <td width="10%"></td>
   <td width="10%"></td>
  </tr>
 </table>

<?php

//Formular wird verarbeitet fuer den Export
if(isset($_POST['make_csv'])) {
    $anzahl = count($_POST['spalte']);

    for($i=0;$i<$anzahl;$i++) {
        $print = implode(";", $_POST['spalte']) . "\r\n";
    }

    $handle = fopen("./dataexport.csv","w");
    fwrite($handle,$print . "\r\n");
    fclose($handle);
}

?>
 <div class="spacer2"></div>
 <div class="export">Klicken Sie hier um die Anzeige zu speichern:<br /><input class="button2" type="submit" name="make_csv" value="Exportieren"></div>
 <div class="spacer2"></div>
</form>
```

Ich danke Dir für Deine Hilfe!


----------



## mc_gulasch (18. August 2006)

Ich bin mir ziemlich sicher dein Problem gefunden zu haben. Teste bitte erstmal folgendes:
- Mache deine csv - Datei in Notepad oder Editor auf.
- Schau nach, ob genau eine Zeile drinsteht und ob du von dieser aus mit der "pfeil nach unten" - Taste in die nächste Zeile kommst => es ex. der Break und es ist fein und du darfst weiterlesen.
Lösung:
Du machst eine Schleife, in der du ALLE Spalten JEDER Zeile in den spalte[] - Array Speicherst, dadurch ist klar, dass du bei

```
$print = implode(";", $_POST['spalte']) . "\r\n";
```
auch die gesamten Spalteneinträge in einer Zeile kriegst und er DANACH den Break macht. Verständlich?
Aaaaalso, was du machen musst, ist, dass du die einzelnen Spalten unterscheidest. Spontan fällt mir da folgendes ein:
vor while:

```
$j=0;
```
Dann kannst du alle Spalten (hier nur das Beispiel für die erste) folgendermaßen ändern:

```
echo "<td class=\"content2\">" . $dbspalte_1 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $dbspalte_1 ."\" /></td>";
```
und dann nach dem <tr> - Tag, aber noch vor der "}" für das Ende der while-Schleife 

```
$j++;
```
Dann musst du natürlich auch mit einer doppelten Schleife über die $_POST - Array gehen: 

```
$handle = fopen("./dataexport.csv","w");
$j=0;
while (!empty($_POST['spalte'.$j]))
{
 $anzahl = count($_POST['spalte'.$j]);
 for($i=0;$i<$anzahl;$i++) {                 //<----- Ich bin mir garnicht sicher, ob du die for- Schleife überhaupt brauchst. Dadurch weist imho doch nur $anzahl - mal $print nen String zu
        $print = implode(";", $_POST['spalte'.$j]) . "\r\n";
    }
    fwrite($handle,$print . "\r\n");
$j++
}
fclose($handle);
```
So in etwa. Code ist nicht getestet und es geht bestimmt noch einfacher, aber wenn du mal auf die Posting-Zeit schaust, verstehst du, warum ich keine besondere Lust hatte mehr darüber nachzudenken 

Ich hoffe aber, dass das Problem klar geworden ist. Vielleicht fällt dir sogar noch ne coolere Lösung ein. Kannst jederzeit Laut geben, wenn was nicht passt. 

Viel Erfolg vom Gulasch


----------



## msycho (28. August 2006)

Danke!
Es gibt bis dato nur noch zwei kleine Mankos.
Nach allen Spalten jeder Zeile wird nun die Zeile in der Exportdatei umgebrochen, sprich eine neue Zeile beginnt. Es ist aber so, dass zwischen jeder Zeile in der Exportdatei nochmals eine leere Zeile steht. Hoffe Du verstehst was ich meine. Wie krieg ich diese leere Zeile, die jetzt immer auftaucht weg, bitte?
Das zweite Manko ist, dass ich nun noch eine weitere HTML-Zeile ( <tr>-tag ) in die Exportfunktion über hidden Inputfelder aufgenommen habe. Diese HTML-Zeile beinhaltet die Beschreibung der jeweiligen Spalten. Es ist jetzt so, dass zwischen den ersten <tr>-tags, sprich zwischen der einen Beschreibungszeile und den folgendenen <tr>-tags, sprich den Ausgabezeilen (die vorher über ein SQL-Befehl aus einer MSSQL-DB abgefragt wurden) fehlt der Zeilenumbruch. Danach passt wieder alles.
Ich hoffe Du verstehst meine Anliegen.


----------



## mc_gulasch (29. August 2006)

msycho hat gesagt.:
			
		

> Nach allen Spalten jeder Zeile wird nun die Zeile in der Exportdatei umgebrochen, sprich eine neue Zeile beginnt. Es ist aber so, dass zwischen jeder Zeile in der Exportdatei nochmals eine leere Zeile steht. Hoffe Du verstehst was ich meine. Wie krieg ich diese leere Zeile, die jetzt immer auftaucht weg, bitte?


Quellcode wär fein, aber probier doch einfach mal das '\n' wegzulassen...vielleicht (mir schleierhaft wie) wird mittels fprint() automatisch umgebrochen oder du hast in den zu printenden String schon irgendwo ein '\n' stehen (hierfür kannst du dir mal die Zeichen deines Strings als Zahlen ausgeben lassen, wenn dort eh schon 10 drinsteht, existiert bereits ein Zeilenumbruch..Funtionen hierfür unter php.net unter "String").


			
				msycho hat gesagt.:
			
		

> Es ist jetzt so, dass zwischen den ersten <tr>-tags, sprich zwischen der einen Beschreibungszeile und den folgendenen <tr>-tags, sprich den Ausgabezeilen (die vorher über ein SQL-Befehl aus einer MSSQL-DB abgefragt wurden) fehlt der Zeilenumbruch.


Lässt du diese extra ausgeben oder ist sie auch in der Schleife? Wenn letzteres der Fall ist, dann ist das, was ich oben geschrieben hab schon wieder wahrscheinlicher. Also machst du folgendes:
1. Gib die Spalte mit den Beschreibungen extra aus und hänge ein '\n' dran.
2. Gib den Rest in einer Schleife aus und hänge *kein* '\n' dran. 
Wenn das nicht klappt, musst du fast den Quellcode wieder mitschicken, da ich mir sonst leider herzlich wenig drunter vorstellen kann 

Viel Erfolg!


----------



## msycho (29. August 2006)

Das '\n' zu entfernen hatte keinen Erfolg gebracht. Das mit den Zeichen des Strings als Zahlen verstehe ich nicht. Das andere auch nicht. oO

Hier mal der jetztige Quellcode:


```
[...]

// Unterscheidung der Spalten beim Exportieren
$j = "0";

echo "<table cellspacing=\"0\" cellpadding=\"0\" align=\"center\" class=\"tableouter2\">";
echo "<tr>";
echo "<td class=\"headline2\" width=\"15%\">" . $name1 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name1. "\" /></td>";
echo "<td class=\"headline2\" width=\"15%\">" . $name2 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name2. "\" /></td>";
echo "<td class=\"headline2\" width=\"10%\">" . $name3 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name3. "\" /></td>";
echo "<td class=\"headline2\" width=\"10%\">" . $name4 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name4. "\" /></td>";
echo "<td class=\"headline2\" width=\"10%\">" . $name5 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name5. "\" /></td>";
echo "<td class=\"headline2\" width=\"10%\">" . $name6 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name6. "\" /></td>";
echo "<td class=\"headline2\" width=\"10%\">" . $name7 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name7. "\" /></td>";
echo "<td class=\"headline2\" width=\"10%\">" . $name8 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name8. "\" /></td>";
echo "<td class=\"headline2\" width=\"10%\">" . $name9 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name9. "\" /></td>";
echo "</tr>";

[DB Verbindung und Co]

echo "<tr>";
echo "<td class=\"content2\">" . $dbspalte_1 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $dbspalte_1 ."\" /></td>";
echo "<td class=\"content2\">" . $dbspalte_2 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $dbspalte_2 ."\" /></td>";
echo "<td class=\"content2\">" . $dbspalte_3 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $dbspalte_3 ."\" /></td>";
echo "<td class=\"content2\">" . $dbspalte_4 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $dbspalte_4 ."\" /></td>";
echo "<td class=\"content2\">" . $dbspalte_5 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $dbspalte_5 ."\" /></td>";
echo "<td class=\"content2\">" . $multiEKxP . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $multiEKxP ."\" /></td>";
echo "<td class=\"content2\">" . $multiVKxP . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $multiVKxP ."\" /></td>";
echo "<td class=\"content2\">" . $dbspalte_6 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $dbspalte_6 ."\" /></td>";
echo "<td class=\"content2\">" . $dbspalte_7 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $dbspalte_7 ."\" /></td>";
echo "</tr>";

$j++;

[...]

echo "</table>";

// Ausgabe wird verarbeitet fuer den Export
if(isset($_POST['make_csv'])) {
  $handle = fopen("./dataexport.csv","w");
  $j=0;
   while (!empty($_POST['spalte'.$j])) {
    $anzahl = count($_POST['spalte'.$j]);
    $print = implode(";", $_POST['spalte'.$j]) . "\r";
    fwrite($handle,$print . "\r");
    $j++;
   }
  fclose($handle);
}

<input class="button2" type="submit" name="make_csv" value="Exportieren">
```


----------



## mc_gulasch (29. August 2006)

Mach mal:

```
$pos = strpos($print,"\n");
```
und sag mr ob $pos = 0 oder !=0 ist. Ausserdem lass auch mal das "\r" weg.


----------



## msycho (29. August 2006)

Hm, wo sehe ich ob $pos = oder != 0 ist?

Ich habe das zweite "\r" mal entfernt. Nun hat es keine leere Zwischenzeile mehr.  Danke!
Lediglich der Zeilenumbruch der ersten HTML-Zeile zur zweiten HTML-Zeile fehlt. Hast Du ne Idee?


----------



## mc_gulasch (29. August 2006)

msycho hat gesagt.:
			
		

> Hm, wo sehe ich ob $pos = oder != 0 ist?


Wie wärs mit

```
echo ($pos);
```
Naja, wie schon gesagt. Die Daten, die du aus der DB ausliest, haben wohl schon einen Zeilenumbruch irgendwo gespeichert. Die andere Zeile baust du ja selber. Jetzt gibt es zwei Möglichkeiten:
1. Füge im letzen Eintrag der ersten HTML - Zeile, den du übergibst mit "hidden" ein "\n" an
2. Gib die Zeile, die du oben beschrieben hast, ausserhalb deiner while-Schleife extra aus
(kann dir das jetzt nicht genauer sagen, weil ich in deinem Code nicht finde, wo diese Zeile sein soll)


----------



## msycho (29. August 2006)

Ich versuch erstmal die erste Möglichkeit. Nur wie füge ich jetzt in die letzte Spalte der ersten HTML-Zeile ein Zeilenumbruch ein, bitte?


```
echo "<td class=\"headline2\" width=\"10%\">" . $name9 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name9. "\" /></td>";
```

Nebenbei, besteht die Möglichkeit Strings in der Exportdatei formatiert, z.B. fett, darzustellen, bitte?


----------



## mc_gulasch (29. August 2006)

Das soll jetzt keine Provokation sein, aber hast du vorher schon jemals was mit PHP oder HTML etc. gemacht?
Also


			
				msycho hat gesagt.:
			
		

> ```
> echo "<td class=\"headline2\" width=\"10%\">" . $name9 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name9 . "\n" . "\" /></td>";
> ```


Also einfach "\n" dranhängen mit dem "." Operator von PHP. Solltest du vorhaben noch mehr oder weitere Projekte mit PHP zu machen, empfehle ich dir mal die Grundsätze zu lernen und ausserdem das Umgehen mit der Funktionen-Referenz auf php.net. Das wirst du brauchen. 


			
				msycho hat gesagt.:
			
		

> Nebenbei, besteht die Möglichkeit Strings in der Exportdatei formatiert, z.B. fett, darzustellen, bitte


IMHO nicht, da es ja bspw. nicht möglich ist in Notepad einzelne Chars zu formatieren. Das einzige was mir einfällt (da du ja die Dateien mit Excel öffnest, wenn ich es richtig in Erinnerung habe), dass du dir ein kleines VBA-Makro schreibst, das die Dateien dieser Form entsprechend formatiert anzeigt.

Tante Edit(h) hat Fehler gefunden


----------



## msycho (29. August 2006)

Ich wusste schon wie und wo, nur nachdem ich keine Änderung festgestellt habe, spriche den gewollten Zeilenumbruch an besagter Stelle, dachte ich, ich hätte vllt. etwas falsch gemacht. 
Da Du nun aber auch das geschrieben hast, was ich bereits versucht habe, es aber nicht funktioniert, weiss ich wirklich nicht mehr weiter.


----------



## mc_gulasch (29. August 2006)

Wenn ich mir deine Ausgabe anschaue

```
if(isset($_POST['make_csv'])) {
  $handle = fopen("./dataexport.csv","w");
  $j=0;
   while (!empty($_POST['spalte'.$j])) {
    $anzahl = count($_POST['spalte'.$j]);
    $print = implode(";", $_POST['spalte'.$j]) . "\r";
    fwrite($handle,$print . "\r");
    $j++;
   }
  fclose($handle);
}
```
seh ich grad nicht, wo du diese Zeile ausgibst...
Magst du mir mal die Ausgabe (in Datei) im Quellcode von dieser Zeile posten? Danke!


----------



## msycho (29. August 2006)

Ähm, wieso muss ich denn was an dem Code der Ausgabe ändern? Ich habe doch bei der einen HTML-Spalte der ersten HTML-Zeile ein hidden Zeilenumbruch gesetzt. 

Ich hoffe ich habe Dich richtig verstanden was den Quellcode betrifft, den Du haben möchtest:


```
// Ausgabe der ersten HTML-Zeile
echo "<table cellspacing=\"0\" cellpadding=\"0\" align=\"center\" class=\"tableouter2\">";
echo "<tr>";
echo "<td class=\"headline2\" width=\"15%\">" . $name1 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name1. "\" /></td>";
echo "<td class=\"headline2\" width=\"15%\">" . $name2 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name2. "\" /></td>";
echo "<td class=\"headline2\" width=\"10%\">" . $name3 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name3. "\" /></td>";
echo "<td class=\"headline2\" width=\"10%\">" . $name4 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name4. "\" /></td>";
echo "<td class=\"headline2\" width=\"10%\">" . $name5 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name5. "\" /></td>";
echo "<td class=\"headline2\" width=\"10%\">" . $name6 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name6. "\" /></td>";
echo "<td class=\"headline2\" width=\"10%\">" . $name7 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name7. "\" /></td>";
echo "<td class=\"headline2\" width=\"10%\">" . $name8 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name8. "\" /></td>";
echo "<td class=\"headline2\" width=\"10%\">" . $name9 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name9 . "\n" . "\" /></td>"; 
echo "</tr>";
```


----------



## mc_gulasch (29. August 2006)

Nein, den mit dem du in die Datei schreibst.


----------



## msycho (29. August 2006)

Ich übergebe den Dateinamen jetzt über ein Inputfeld:


```
$exportdatei = $_POST['dateiname'];

if(isset($_POST['make_csv'])) {
  $handle = fopen("./$exportdatei.csv","w");
  $j=0;
   while (!empty($_POST['spalte'.$j])) {
    $anzahl = count($_POST['spalte'.$j]);
    $print = implode(";", $_POST['spalte'.$j]) . "\r";
    fwrite($handle,$print);
    $j++;
   }
  fclose($handle);
}
```


----------



## mc_gulasch (29. August 2006)

```
$exportdatei = $_POST['dateiname'];

if(isset($_POST['make_csv'])) {
  $handle = fopen("./$exportdatei.csv","w");
  $j=0;
   while (!empty($_POST['spalte'.$j])) {
    $anzahl = count($_POST['spalte'.$j]);
    $print = implode(";", $_POST['spalte'.$j]) . "\r";
    
    if($j == 0)
    {
      $print = $print."\n";
   }
   

    fwrite($handle,$print);
    $j++;
   }
  fclose($handle);
}
```
Davon ausgehend, dass die beschriebene Zeile die *1.* ist und dass die Indizierung der einzelenen Zeilen mit *0* beginnt.


----------



## msycho (29. August 2006)

Es kommt immer noch zu keinem Zeilenumbruch. Wahrscheinlich erfülle ich Dein Ausgangspunkt nicht.


----------



## mc_gulasch (30. August 2006)

Ich hab´s, das gleiche Problem wie damals schon: Du musst natürlich nach der Erstellung der ersten Zeile $j auch hochzählen!


----------



## msycho (30. August 2006)

Ich dacht das wird umgesetzt mit $j++; oder versteh ich was falsch?


----------



## mc_gulasch (30. August 2006)

```
/ Unterscheidung der Spalten beim Exportieren
$j = "0";

echo "<table cellspacing=\"0\" cellpadding=\"0\" align=\"center\" class=\"tableouter2\">";
echo "<tr>";
echo "<td class=\"headline2\" width=\"15%\">" . $name1 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name1. "\" /></td>";
echo "<td class=\"headline2\" width=\"15%\">" . $name2 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name2. "\" /></td>";
echo "<td class=\"headline2\" width=\"10%\">" . $name3 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name3. "\" /></td>";
echo "<td class=\"headline2\" width=\"10%\">" . $name4 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name4. "\" /></td>";
echo "<td class=\"headline2\" width=\"10%\">" . $name5 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name5. "\" /></td>";
echo "<td class=\"headline2\" width=\"10%\">" . $name6 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name6. "\" /></td>";
echo "<td class=\"headline2\" width=\"10%\">" . $name7 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name7. "\" /></td>";
echo "<td class=\"headline2\" width=\"10%\">" . $name8 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name8. "\" /></td>";
echo "<td class=\"headline2\" width=\"10%\">" . $name9 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $name9. "\" /></td>";
echo "</tr>";

$j++; //<------------------------- HIIIIEEEER!!

[DB Verbindung und Co]

echo "<tr>";
echo "<td class=\"content2\">" . $dbspalte_1 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $dbspalte_1 ."\" /></td>";
echo "<td class=\"content2\">" . $dbspalte_2 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $dbspalte_2 ."\" /></td>";
echo "<td class=\"content2\">" . $dbspalte_3 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $dbspalte_3 ."\" /></td>";
echo "<td class=\"content2\">" . $dbspalte_4 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $dbspalte_4 ."\" /></td>";
echo "<td class=\"content2\">" . $dbspalte_5 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $dbspalte_5 ."\" /></td>";
echo "<td class=\"content2\">" . $multiEKxP . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $multiEKxP ."\" /></td>";
echo "<td class=\"content2\">" . $multiVKxP . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $multiVKxP ."\" /></td>";
echo "<td class=\"content2\">" . $dbspalte_6 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $dbspalte_6 ."\" /></td>";
echo "<td class=\"content2\">" . $dbspalte_7 . "<input type=\"hidden\" name=\"spalte" . $j . "[]\" value=\"". $dbspalte_7 ."\" /></td>";
echo "</tr>";

$j++;

[...]

echo "</table>";
```
Ja, tut es, aber halt an der *RICHTIGEN* Stelle. Wenn du das nicht machst, zählt es natürlich erst ab der zweiten Zeile hoch und die erste und zweite werden mittels implode() zusammengefasst....genau das gleiche Problem wie wir schon mal hatten, weil du alles mit spalte[] bezeichnet hast und nicht wie jetzt mit spalte.$j.[]. Spalte0[] ist jetzt noch die erste *und* zweite Zeile. Daher an der beschriebenen Stelle das $j++


----------



## msycho (30. August 2006)

Jetzt wo Du es mir so erklärst, erscheint es mir auch logisch. Es kommt nun zum gewünschten Zeilenumbruch. 
Ich danke Dir sehr herzlich für Deine Geduld und Hilfe!

Ich habe allerdings noch ein klitze kleines Anliegen. Ich möchte jetzt eine Meldung ausgeben, wenn die Datei erfolgreich angelegt wurde, ebenso wenn sie nicht erfolgreich angelegt werden konnte.
Ersteres habe ich umgesetzt indem ich eine echo bei der if-schleife setze:


```
echo "<div class=\"export\"><strong>Die Datei <em>$exportdatei.csv</em> wurde erfolgreich angelegt.</strong></div>";
```

Komplett:


```
$exportdatei = $_POST['dateiname'];

if(isset($_POST['make_csv'])) {
  $handle = fopen("./". $exportdatei .".csv","w");
  $j=0;
   while (!empty($_POST['spalte'.$j])) {
    $anzahl = count($_POST['spalte'.$j]);
    $print = implode(";", $_POST['spalte'.$j]) . "\r";
     if($j == 0) {
       $print = $print."\n";
     }
    fwrite($handle,$print);
    $j++;
   }
  fclose($handle);
  echo "<div class=\"export\"><strong>Die Datei <em>$exportdatei.csv</em> wurde erfolgreich angelegt.</strong></div>";
}
```

Nur wie krieg ich eine Kontrolle hin wenn es nicht klappt mit einer Ausgabe, bitte?


----------



## mc_gulasch (30. August 2006)

```
<?php
$filename = 'test.txt';
$somecontent = "Add this to the file\n";

// Let's make sure the file exists and is writable first.
if (is_writable($filename)) {

   // In our example we're opening $filename in append mode.
   // The file pointer is at the bottom of the file hence 
   // that's where $somecontent will go when we fwrite() it.
   if (!$handle = fopen($filename, 'a')) {
         echo "Cannot open file ($filename)";
         exit;
   }

   // Write $somecontent to our opened file.
   if (fwrite($handle, $somecontent) === FALSE) {
       echo "Cannot write to file ($filename)";
       exit;
   }
   
   echo "Success, wrote ($somecontent) to file ($filename)";
   
   fclose($handle);

} else {
   echo "The file $filename is not writable";
}
?>
```
Das ist ein Auszug aus der Beschreibung von der Referenzseite zu fwrite() auf php.net. Schau sie dir an, da steht alles dabei, was du brauchst. Jetzt musst du´s nur noch auf dein Problem umschreiben, aber das dürfte wirklich kein Problem sein. 
Viel Erfolg.


----------



## msycho (30. August 2006)

Jop, das hatte ich mir schon vor Tagen angeschaut und auch versucht damit weiterzukommen. Allerdings ohne Erfolg. Wie bereits oben genannt, wird ja eine Meldung ausgespuckt, wenn man den Button gedrückt hat und die Datei angelegt wurde. Der Dateiname wird über eine manuelle Eingabe bestimmt. Ich möchte diesbzgl. noch eine Meldung, die die Datei nicht anlegt, wenn kein Dateiname angegeben ist und gleichzeitig dazu eine Meldung ausgibt.


----------



## mc_gulasch (30. August 2006)

Aha, dann poste mal den Code, wo der Dateiname eingelesen wird.


----------



## msycho (30. August 2006)

Hier das input-feld:


```
echo "<td class=\"content1\">Dateiname: (ohne Dateiendung) <input class=\"eingabe\" size=\"20\" type=\"text\" name=\"dateiname\" value=\"$exportdatei\"></td>";
```

Das kennst Du ja schon:


```
$exportdatei = $_POST['dateiname'];
if(isset($_POST['make_csv'])) {
  $handle = fopen("./". $exportdatei .".csv","w");
  $j=0;
   while (!empty($_POST['spalte'.$j])) {
    $anzahl = count($_POST['spalte'.$j]);
    $print = implode(";", $_POST['spalte'.$j]) . "\r";
     if($j == 0) {
       $print = $print."\n";
     }
    fwrite($handle,$print);
    $j++;
   }
  fclose($handle);
  echo "<div class=\"export\"><strong>Die Datei <em>$exportdatei.csv</em> wurde erfolgreich angelegt.</strong></div>";
}
```

Die Variable $exportdatei holt sich seinen Wert aus dem inputfeld, welches dann der Dateiname ist.


----------



## mc_gulasch (30. August 2006)

Einfachste Lösung:
Am Anfang wo dein <html> Tag steht, folgendes einfügen:

```
<html>
<head>
<title></title>
<script type="text/javascript">
function chkFormular () {
if (document.Formular.dateiname.value == "") 
{
 alert("Bitte einen Dateinamen eingeben");
 document.Formular.Ort.focus();
 return false;
}
}
</script>
</head>
<body>
...
```
wobei du deinem Fomular noch den Namen "Formular" geben musst. 
Dann fügst du in deinem Submit - Button noch 

```
onsubmit="return chkFormular()"
```
hinzu.
"Schwierigere" Lösung (falls Leute javascript aus haben):
Geh in deine 

```
if(isset($_POST['make_csv']))
```
Abfrage und fügst 

```
&& isset($_POST['dateiname'])
```
Falls dies nicht der Fall ist, machst du einfach "else" und verweist auf ne andere Seite, oder gehst zurück auf die eigentliche und schreibst rot rein "Dateiname fehlt" oder oder oder ....


----------



## msycho (30. August 2006)

Von der JavaScript-Lösung möchte ich erstmal Abstand halten.

Wenn ich die Abfrage wie Du gesagt hast erweitere, dann wird jedoch bei jeder normalen Ausgabe der Abfrage selber die Meldung angezeigt, dass das Dateiname-Feld leer ist. Es soll aber nur angezeigt werden, wenn ich den Button gedrückt habe. Das ist ja mein Problem. Hoffe Du verstehst.


----------



## mc_gulasch (30. August 2006)

Ja, verstehe, du hast mit Sicherheit eine If-Abfrage oder sowas vergessen. Mal wieder Code posten bitte (btw: Kannst eigentlich immer machen, dann sparst du dir das "hoffe").
Andererseits wäre auch ein bisschen Eigenkreativität nicht schlecht, da du dabei am meisten lernst. Probier doch selber ein wenig rum bevor du eine Zeile einfügst und wenn die nicht geht gleich hier rein schreibst. 
Die Logik hinter deinem Problem ist die absolut gleiche wie dein ganzes Programm. Du hast auch erst eine Tabelle ausgegeben, diese wird verarbeitet mittels Button und wenn über das Drücken des Buttos ein bestimmter Wert gesetzt ist, dann wird es in die Datei geschrieben. 
Genauso kannst du das auch mit dem Dateinamen machen. Wenn ein bestimmter Wert gesetzt ist, dann soll was gemacht werden oder wenn nicht, dann eben nicht. 
Genau das gleiche wie

```
if(isset($_POST['make_csv']))
```
nur jetzt eben auf Dateinamen. Probier selber rum, ich bin mir sicher, wenn du halbwegs was mitgenommen hast aus dem, was wir hier die ganze Zeit machen, schaffst du das. Heute werd ich auf jeden Fall nicht mehr posten. 

Viel Erfolg


----------



## msycho (31. August 2006)

Ich habe jetzt ewig rumprobiert, aber es will nicht funktionieren.

Der letzte Stand der Dinge ist folgender:


```
$exportdatei = $_POST['dateiname'];
if(isset($_POST['make_csv']) && isset($_POST['dateiname'])) {
  $handle = fopen("./". $exportdatei .".csv","w");
  $j=0;
   while (!empty($_POST['spalte'.$j])) {
    $anzahl = count($_POST['spalte'.$j]);
    $print = implode(";", $_POST['spalte'.$j]) . "\r";
     if($j == 0) {
       $print = $print."\n";
     }
    fwrite($handle,$print);
    $j++;
   }
  fclose($handle);
  echo "<div class=\"export\"><strong>Die Datei <em>$exportdatei.csv</em> wurde erfolgreich angelegt.</strong></div>";
} 
else (isset($_POST['make_csv']) && empty($_POST['dateiname']) == "") {
  echo "<div class=\"export\"><strong>Bitte geben Sie einen Dateinamen an.</strong></div>";
exit;
}
```

Theorie: Drückt man den Button "Exportieren" und ist ein Name im Feld "Dateiname" eingegeben, wird die Datei angelegt und eine Meldung erscheint. Drückt man den Button "Exportieren" und es ist aber kein Name im Feld "Dateiname" eingegeben, wird die Datei nicht angelegt und eine Meldung erscheint. 
Das ganze praktisch umzusetzen, macht mir anscheinend Schwierigkeiten, oder besser gesagt kommt bei dem jetztigen Code die Meldung, dass das { in der echo-Zeile der else-Schleife unerwartet ist. 
Hast Du mir ne Anregung, was ich falsch mache, bitte?


----------



## mc_gulasch (31. August 2006)

Das glaub ich jetzt nicht. Debuggen ist wohl wirklich nicht schwer. 
1. Basiswissen

```
if (ANWEISUNG)
{

}
elseif (ANWEISUNG)
{

}
else  //<- hier natürlich keine Anweisung, da Gegeteil von obenigen voraussetzungen
```
Soviel zu deiner unerwarteten Klammer. *Kopfschüttel*
2. Dein Problem:
Du brauchst "elseif". Ansonsten schaut das ganze ja schon recht gut, fein und richtig aus.


----------



## msycho (31. August 2006)

Danke, aber irgendwie will es nicht so recht.

Hab es jetzt erst mit empty() versucht, jetzt mit boolean:


```
// das andere ist gleich geblieben wie im letzten post

elseif (isset($_POST['make_csv']) && $_POST['dateiname'] == FALSE) {
  echo "<div class=\"export\"><strong>Bitte geben Sie einen Dateinamen an.</strong></div>";
}
else {
  "<div class=\"export\"><strong>Fehler beim Anlegen der Datei.</strong></div>";
}
```

Auch wenn kein Dateiname angegeben ist, wird die Datei erzeugt. Also nicht so wie ich es möchte.
ABer jetzt stimmt es doch eigentlich, oder?


----------



## mc_gulasch (1. September 2006)

```
!isset($_POST['dateiname'])
```
statt

```
$_POST['dateiname'] == FALSE
```
und lass bei 

```
echo "<td class=\"content1\">Dateiname: (ohne Dateiendung) <input class=\"eingabe\" size=\"20\" type=\"text\" name=\"dateiname\" value=\"$exportdatei\"></td>";
```
sicherheitshalber mal das "$exportdatei" in "value" weg.


----------



## msycho (1. September 2006)

Mit !isset hatte ich es auch schon versucht - vergeblich. Auch die leere "value" ändert daran nichts.
Irgendwie finde ich das merkwürdig.


----------



## mc_gulasch (1. September 2006)

Jetzt seh ich´s erst. Was soll den bitte

```
empty($_POST['dateiname']) == ""
```
 Mach mal einfach nur

```
empty($_POST['dateiname'])
```
Wenn es dann immer noch nicht geht, gib vor der if-Verzweigung folgendes aus:

```
echo "empty: " . empty($_POST['dateiname'])  . "\n";
echo "isset: " . isset($_POST['dateiname']) . "\n";
echo "POST: " . $_POST['dateiname'] "\n";
```
und poste hier das Ergebnis.


----------



## msycho (1. September 2006)

Das hatte ich auch schon. ^^ Auch ohne Erfolg.

Hier das Ergebnis mit leerer "value":



> empty: 1 isset: POST:


----------



## mc_gulasch (1. September 2006)

Hab das zwar selber noch nicht ausprobiert, dürft aber ziemlich sicher klappen. Einfach 1:1 übernehmen und nach den obigen Ausgaben einfügen:

```
foreach (count_chars($_POST['dateiname'], 1) as $i => $val) 
{
   echo "There were $val instance(s) of \"" , int($i) , "\" in the string.\n";
}
```


----------



## msycho (1. September 2006)

Wenn ich Dich richtig verstanden habe, dann kommt der o.g. Codeschnipsel unter das hier:


```
echo "empty: " . empty($_POST['dateiname'])  . "\n";
echo "isset: " . isset($_POST['dateiname']) . "\n";
echo "POST: " . $_POST['dateiname'] . "\n";
```

Wird aber nicht mehr als vorher ausgegeben, oder hab ich was falsch gemacht?


----------



## mc_gulasch (1. September 2006)

Nein, das zeigt nur, dass der String leer ist. Komplett leer. Wie auch empty() schon richtig sagt. Warum deine if elseif else Abfrage nicht klappt, weiß ich jetzt ehrlichgesagt auch nicht. Probier rum, oder setze einfach den value vom input-Feld auf den vordef. Wert "leer" (also tatsächlich der String "leer") und frag dann einfach ab, ob $_POST['dateiname'] == "leer" ist oder so. Vielleicht klappts dann. Darf halt keiner seine Datei "leer.csv" nennen wollen.


----------



## msycho (1. September 2006)

Hm, wenn ich dem input-Feld bzw. dessen "value" den Wert "leer" gebe, dann steht im Feld selber ja leer, und die Datei heisst ja auch leer.csv. Hab ich dich jetzt falsch verstanden?


----------



## mc_gulasch (2. September 2006)

Was genau hast du jetzt nicht verstanden? Du setzt halt einen Default (vordefinierten) - Wert in das Input Feld, der herzlich sinnfrei ist. Dadurch hast du die Möglichkeit diesen Wert (in meinem Bsp. "leer") abzufragen statt mit empty() isset() oder sonstwas rumzuhantieren, was unter Umständen einfacher sein könnte. Ich weiß es aber nicht. Vielleicht hast du auch im Restcode irgendwo nen Fehler oder weiß der Geier was. PHP kann da ziemlich ekelhaft sein. Allerdings wär das ein Widerspruch zu deinen anderen Abfragen. Naja, keine Ahnung worans liegt, echt. Wenn ich mal Zeit hab, schau ich vielleicht alles nochmal von Anfang an durch. Wenn du Böcke hast kannst auch mal den ganze Code senden (also von der Datei, in der die Abfragen sind).


----------



## Yaslaw (13. Dezember 2010)

Bitte das Problem in einem Thread diskutieren:
-> http://www.tutorials.de/php/370166-db-csv-exportieren.html


----------

