#1 19. Juli 2013 Automatischer MYSQL to CSV Export Wir haben im Unternehmen eine Datenbank in der für jedes Produkt ein aktueller Einkaufpreis hinterlegt ist. Ich möchte aus dieser Datenbank BESTIMMTE Artikel auslesen, also die Produktnummer, Einkaufspreis und den Normalverkaufspreis. Ich bin leider kein PHP Profi und bin so langsam am verzweifeln. Ich habe mir ein bisschen Code zusammengeklaut bisher. Ziel ist es das die entsprechenden Daten ausgelesen werden und formatiert in eine CSV gespeichert werden sollen. Das ganze möchte ich direkt über die php.exe erledigen, da ich auch mit Batch diese Datei zippe und auf einen FTP hochladen muss. Mit dem Code funktioniert der Export aller Produkte aus der Datenbank, leider weiß ich nicht wie ich nur die Artikel auslese die in meiner artikel.txt stehen. Außerdem muss die Datei am Ende ohne weitere Abfragen im enstprechende Ordner gespeichert werden. Die Lösung mit Header() funktioniert leider wirklichnru im Browser. Ich hoffe jemand von euch kann mir helfen. Hier der Code den ich bisher zusammengeklatscht habe: PHP: <?php define ( "select_table" , "artikel" ); define ( "csv_delimeter" , " " ); define ( "db_user" , "root" ); define ( "db_password" , "" ); define ( "db_server" , "localhost" ); define ( "db_db_name" , "artikel" ); mysql_connect ( db_server , db_user , db_password ) or die( mysql_error ()); mysql_select_db ( db_db_name ) or die( mysql_error ()); $fp = fopen ( 'artikel.txt' , 'r' ); $i = 0 ; while( $line = fgets ( $fp )) { $inhalt [ $i ] = $line ; $i ++; } $max_zeilen = count ( $inhalt ); $sql = "SELECT Artikel, dek, NormalVK " . "FROM " . select_table . " " ; $result = mysql_query ( $sql ) or die( mysql_error ()); $result_row = array(); while ( $array_result = mysql_fetch_assoc ( $result ) ) { if ( empty( $result_row ) ) { $result_row [] = "" ; $row_data = array(); $index = count ( $result_row )- 1 ; foreach ( array_keys ( $array_result ) as $key_name ) { $row_data [] .= "\"" . $key_name . "\"" ; } $result_row [ $index ] = implode ( csv_delimeter , $row_data ); unset( $row_data ); } $result_row [] = "" ; $row_data = array(); $index = count ( $result_row )- 1 ; foreach ( $array_result as $key => $value ) { $row_data [] .= "\"" . $value . "\"" ; } $result_row [ $index ] = implode ( csv_delimeter , $row_data ); unset( $row_data ); } header ( 'Content-Type: text/x-csv' ); header ( 'Expires: ' . gmdate ( 'D, d M Y H:i:s' ) . ' GMT' ); header ( 'Content-Disposition: attachment; filename=prices.csv' ); header ( 'Pragma: no-cache' ); echo implode ( PHP_EOL , $result_row ); ?> + Multi-Zitat Zitieren
#2 19. Juli 2013 AW: Automatischer MYSQL to CSV Export evtl hilft dir folgende funktion weiter: int fputcsv ( resource $handle , array $fields [, string $delimiter = ',' [, string $enclosure = '"' ]] ) PHP: fputcsv - Manual hier vermutlich eine komplett lösung dazu: PHP: $num = 0 ; $sql = "SELECT id, name FROM products" ;while( $p = mysql_fetch_assoc ( $sql )){ $prod [] = $p ;} $output = fopen ( "php://output" , 'w' ) or die( "failed" ); header ( "Content-Type:application/csv" ); header ( "Content-Disposition:attachment;filename=datei.csv" ); fputcsv ( $output , array( 'id' , 'name' ));foreach( $prod as $product ) { fputcsv ( $output , $product );} fclose ( $output ) or die( "close php://output fail" ); 1 Person gefällt das. + Multi-Zitat Zitieren
#3 19. Juli 2013 AW: Automatischer MYSQL to CSV Export Was steht in deiner Artikel.txt drin? 1 Person gefällt das. + Multi-Zitat Zitieren
#4 19. Juli 2013 AW: Automatischer MYSQL to CSV Export Danke raid für deinen Lösungvorschlag ich schau mir das nochmal an. In der Artikel.txt stehenm nur Artikelnummer untereinander drin. 123456 654321 usw. Diese Artikel soll er aus der DB lesen und die anderen ignorieren. Bisher klappt es nur mit allen Artikeln auf einmal. + Multi-Zitat Zitieren
#5 19. Juli 2013 AW: Automatischer MYSQL to CSV Export Ungetestet: PHP: <? PHPdefine ( 'DS' , DIRECTORY_SEPARATOR ); $outputFile = dirname ( __FILE__ ) . DS . 'artikellist.csv' ; $inputFile = dirname ( __FILE__ ) . DS . 'Artikel.txt' ; // Erstes Element sollte die artikelId sein $articleColumns = array( 'artikel' , 'dek' , 'normalvk' ); define ( 'DB_USER' , 'root' ); define ( 'DB_PASSWORD' , '' ); define ( 'DB_HOST' , 'localhost' ); define ( 'DB_NAME' , 'artikel' ); $db = mysql_connect ( DB_HOST , DB_USER , DB_PASSWORD ) or die( mysql_error () ); mysql_select_db ( DB_NAME , $db ) or die( mysql_error () ); // Artikel.txt als Array einlesen $raw = file ( $inputFile ) or die( 'Unable to open ' . $inputFile ); function articleIdFilter ( $var ) { if( intval ( $var ) === 0 ) { return false ; } return true ;} // Filtern damit alles wirklich Artikelnummern sind $articleIds = array_filter ( $raw , 'articleIdFilter' ); $articleIds = array_map ( 'intval' , $articleIds ); // Implode packt alle ArtikelNummern aus dem Array mit komma getrennt hintereinander $query = "SELECT " . implode ( ',' , $articleColumns ) . " FROM " . select_table . " WHERE " . $articleColumns [ 0 ] . " IN (" . implode ( ',' , $articleIds ) . ")" ; $result = mysql_query ( $query , $db ) or die( mysql_error () ); $output = fopen ( $outputFile , 'w' ) or die( 'Unable to open ' . $outputFile ); fputcsv ( $output , $articleColumns );while( false !== ( $row = mysql_fetch_row ( $result ) ) ) { fputcsv ( $output , $row );} fclose ( $output ); + Multi-Zitat Zitieren
#6 19. Juli 2013 AW: Automatischer MYSQL to CSV Export Vielen Dank schonmal für deine Mühe. Mein Problem war gerade eben das ich es NICHT mit EINEM Sql Querie lösen konnte. Den Operator IN kannte ich natürlich nicht. Dieser Operator löst gerade alle Probleme. Ist der IN Operator irgendwie beschränkt auf eine gewisse Anzahl? + Multi-Zitat Zitieren
#7 19. Juli 2013 AW: Automatischer MYSQL to CSV Export Nein die Anzahl für dein IN-Operator ist nicht limitiert, aber wenn es mehr als 5000 sind wird es wohl ineffizient und sollte anders gelöst werden. + Multi-Zitat Zitieren
#8 21. Juli 2013 AW: Automatischer MYSQL to CSV Export Man könnte z.B. einen Algorithmus schreiben, welcher die entsprechenden Artikelnummern zu Blöcken zusammenfasst. + Multi-Zitat Zitieren