mySQL in CSV speichern - "mysql_num_rows() / mysql_fetch_row()" Fehler

Also, gaaanz langsam.

Was zeigt der var_dump() nun innerhalb der while-Schleife, also dort wo der Fehler auftritt, den nun?

Und wenn wir grad dabei sind: Lass dir auch gleich $j ausgeben um zu sehen welchen Index er sucht
 
Naja, er zeigt mir ein Array mit meinen gesuchten Daten.
Code:
array(7) { [0]=> string(6) "Moritz"...usw

Bei $j gibt er folgendes aus:
Code:
int(0) int(1) int(2) int(3) int(4) int(5) int(6)
 
Zuletzt bearbeitet:
Also ich habe ja 7 Werte die ich auslesen möchte.
$j besteht ja auch aus int()`s (0 - 6)

Nur macht das Script dann irgendwie nicht halt sondern versucht noch mehr auszulesen.
Da fangen dann die Fehler an.
Code:
Notice: Undefined offset: 7 in /var/www/web187/html/SALES/sales_db_csv.php on line 37
 
So kommen wir nicht weiter. Verschönern wir doch mal dein Code ein wenig und bringen diese Zählerei weg. Das macht mehr Sinn als da alle Variablen akribisch zu kontrollieren

Diese Schleife kann man locker auf einen eleganten 3-Reiher reduzieren
PHP:
while ($rowr = mysql_fetch_row($values)) {
    $csv_output .= implode('; ', $rowr)."\n";
}

Das gefährliche ist, dass du alle Felder der Tabelle zählst, aber nachher im SQL die Felder einzeln auswählst. So kann es sein, dass $i grösser ist als die Anzahl Felder. Mit mysql_fetch_field kann man ebenfalls alle Felder des SQL-Resultates durchgehen
Und so könnte dann dein Code aussehen
PHP:
$link = mysql_connect($host, $user, $pass) or die("Can not connect." . mysql_error());
mysql_select_db($db) or die("Can not connect.");

$values = mysql_query("SELECT shipping_firstname, shipping_lastname, shipping_address_1, shipping_address_2, shipping_postcode, shipping_city, shipping_country FROM `{$table}`");
//Titelzeile mit allen Felder der Abfrage
while($field = mysql_fetch_field($result)){
    $fieldNames[] .= $field->name;
}
$csv_output = implode('; ', $fieldNames)."\n";

//Ausgabe der Datenzeilen
while ($rowr = mysql_fetch_row($values)) {
    //Mit implode die Inhalte in eine Zeile ausgeben
    $csv_output .= implode('; ', $rowr)."\n";
}
 
print $csv_output;
exit;
 
Ja du hast recht, das sieht schonmal deutlich eleganter aus.
Und die Ausgabe am Ende ist auch endlich GENAU das was ich haben möchte!

Nur haben sich zusätzlich zu der korrkten Ausgabe am Ende, auch noch zwei Fehlermeldungen eingeschlichen:

Code:
Warning: mysql_fetch_field(): supplied argument is not a valid MySQL result resource in /var/www/web187/html/SALES/sales_db_csv.php on line 24

Warning: implode() [function.implode]: Invalid arguments passed in /var/www/web187/html/SALES/sales_db_csv.php on line 27
 
Das erste ist ein C&P-Fehler. Bei mysql_fetch_field sollte der übergeben Parameter auch $values und ncith $result heissen.
Das Zweite ist ein Folgefehler, da so der array $fieldNames nicht initialisiert wurde und nun nicht durch den implode() geht.
 
Hey, ist schon eine Weile her, aber nun ist mir noch eine Sache aufgefallen.
Das Script gibt immer eine Leerzeile aus am Ende.

Sprich, wenn ich die Daten in meinen Seriendruck in Word importiere, taucht immer am Ende ein leerer Datensatz auf.
Kann ich irgendwie verhindern, dass nach dem letzten Eintrag ein Zeilenumbruch erzeugt wird?

Code:
$csv_output .= implode(';', $rowr)."\n";
Damit geht er alle Felder durch und fügt immer am Ende den Umbruch ein. Nur beim letzten Eintrag muss das \n weg. Aber wie?
 
Zuletzt bearbeitet:
Habe es nun selbst gelöst.
Code:
$rowCount = mysql_num_rows($values);
$i=1;

while ($rowr = mysql_fetch_row($values)) {
   
   //Mit implode die Inhalte in eine Zeile ausgeben
   if($i<$rowCount){
    $csv_output .= implode(';', $rowr)."\n";
   }
   else{
    $csv_output .= implode(';', $rowr);
   }
   $i++;
}
 
Zurück