MSSQL-Ausgabe exportieren in csv

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:
PHP:
//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.
 
Immer noch nicht anders. :(

Hier der komplette Code zw. den form-tags.

PHP:
<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!
 
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
PHP:
$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:
PHP:
$j=0;
Dann kannst du alle Spalten (hier nur das Beispiel für die erste) folgendermaßen ändern:
PHP:
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
PHP:
$j++;
Dann musst du natürlich auch mit einer doppelten Schleife über die $_POST - Array gehen:
PHP:
$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
 
Zuletzt bearbeitet:
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.
 
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!
 
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:

PHP:
[...]

// 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">
 
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?
 
msycho hat gesagt.:
Hm, wo sehe ich ob $pos = oder != 0 ist?
Wie wärs mit
PHP:
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)
 
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?

PHP:
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?
 
Zurück