[PHP] Automatischer MYSQL to CSV Export

Dieses Thema im Forum "Webentwicklung" wurde erstellt von Romka, 19. Juli 2013 .

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

    ?>
     
  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.
  3. 19. Juli 2013
    AW: Automatischer MYSQL to CSV Export

    Was steht in deiner Artikel.txt drin?
     
    1 Person gefällt das.
  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.
     
  5. 19. Juli 2013
    AW: Automatischer MYSQL to CSV Export

    Ungetestet:

    PHP:
    <? PHP
    define
    '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 ) ===  ) {
            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  );
     
  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?
     
  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.
     
  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.
     
  9. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.