Code verbessern ...

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Code verbessern ...

    Moin!

    Ich lasse via PHP aus einer CSV Datei, Daten in eine MySQL Datenbank schreiben. Leider dauert das ganze elendig lang, ich hoffe mir koennte jemand eventuell helfen diesen Code zu verbessern:

    PHP-Code:
    function csvToMySQL($file) {
            
    $delim=',';
            
    $f fopen ($file"r");
            
    $size filesize($file)+1;
            print 
    'Filename: '.$file.'; Filesize: '.$size.' Bytes <br><br><br>';

            
    $data fgetcsv($f$size$delim);
            while(
    $data fgetcsv($f$size$delim)) {
                
    srand ((double)microtime()*1000);
                
    $rand rand(1,100000);
                
    mysql_query("INSERT INTO dublette (ID, sid, ida, Name1, Name2, Strasse, Land, PLZ, Ort, 
    Tel, Fax, ITAbteilung, Kontakt)
    VALUES ('', '"
    .$rand."', '', '', '', '', '', '', '', '', '', '', '')") or die (mysql_error());
                foreach(
    $data as $xy => $value) {
                    if(
    $value!=""){
                        if(
    $xy==0){$xy="ida";}
                        elseif(
    $xy==1){$xy='Name1';}
                        elseif(
    $xy==2){$xy='Name2';}
                        elseif(
    $xy==3){$xy='Strasse';}
                        elseif(
    $xy==4){$xy='Land';}
                        elseif(
    $xy==5){$xy='PLZ';}
                        elseif(
    $xy==6){$xy='Ort';}
                        elseif(
    $xy==7){$xy='Tel';}
                        elseif(
    $xy==8){$xy='Fax';}
                        elseif(
    $xy==9){$xy='ITAbteilung';}
                        elseif(
    $xy==10){$xy='Kontakt';}
                        
    mysql_query("UPDATE dublette SET ".$xy."='".$value."' WHERE sid='".$rand."'"
    or die (
    "Update: ".mysql_error());
                    }
                }
            }
            print 
    'Wrote data from CSV-File into MySQL-DB';
            
    fclose ($f);
        } 
    Weitere Infos: Zunaechst wird ein leerer Eintrag, einzig alleine mit einer Zufallszahl versehen in die Datenbank geschrieben, danach wird durch das Script via der Zufallszahl die passenden Zellen gefunden, die im nachinein noch eingetragen werden müssen.
    Zuletzt geändert von niroxx; 14.02.2007, 16:10.

  • #2
    1. ersetze deine elseif-Konstruktion durch ein switch.
    2. Warum legst du einen fast leeren Datensatz an und machst darauf ein Update? Lege ihn doch gleich mit den benötigten Daten an, so sparst du MySQL-Zugriffe.
    it's not a bug,
    it's a feature!

    Kommentar


    • #3
      Hierfür ist ein Array wie geschaffen...
      PHP-Code:
      if($xy==0){$xy="ida";}
                          elseif(
      $xy==1){$xy='Name1';}
                          elseif(
      $xy==2){$xy='Name2';}
                          elseif(
      $xy==3){$xy='Strasse';}
                          elseif(
      $xy==4){$xy='Land';}
                          elseif(
      $xy==5){$xy='PLZ';}
                          elseif(
      $xy==6){$xy='Ort';}
                          elseif(
      $xy==7){$xy='Tel';}
                          elseif(
      $xy==8){$xy='Fax';}
                          elseif(
      $xy==9){$xy='ITAbteilung';}
                          elseif(
      $xy==10){$xy='Kontakt';}



      $arr_replace = array();
      $arr_replace[0] = 'ida';
      $arr_replace[1] = 'Name1';
      //etc.

      $xy $arr_replace[$xy]; 

      Da es sich hier um CSV handelt, kann man sich den Array am besten auch noch aus der ersten Zeile des CSV generieren - dann ist man wenigstens flexibel...

      Kommentar


      • #4
        Autsch, ausserdem machst du pro feld einer Zeile ein Update - aua aua - das ganze kann man mit $anzahl_zeile_des_csv Queries lösen.

        Du hast $anzahl_zeilen_des_csv*$anzahl_felder_je_zeile+$anzahl_zeilen_des_csv_für_die_unnoetige_insert_query

        Bei zehn Zeilen in der CSV machst du 110 queries - das ganze kann man in zehn machen...

        AUA!



        btw: in deinem ersten $data (das du machst um mit deiner While-Schleife in der zweiten Zeile der CSV anzufangen) steht der Inhalt des übersetzungsarray's...

        Achso, und brich bitte deinen Code gemäß den Forenregeln um...

        Kommentar


        • #5
          2) Dafuer scheine ich leider zu bloede zu sein.

          ID Name1 Name2 ...
          1 horst jiddig
          2
          ...

          Wie soll ich das anstellen?

          Kommentar


          • #6
            PHP-Code:
            //Beispielimplementation:

            function csvToMySQL($file$delim ',', ){

              if(
            file_exists($file)){ //Datei da?
                
            if($f fopen($filer)){ //Datei öffnen
                  
            $first_row $fgetcsv($f); //erste Zeile lesen
                  
            $arr_fields explode(","$first_row); //erste Zeile bei "," trennen und in Array
                    
                  
            while($row fgetcsv($f)){ //restliches CSV durchlaufen
                        
                    
            $sql "INSERT INTO tab1 SET "//query Anfang
                        
                    
            $set = array(); //Array für SET Felder vorbereiten
                    
            foreach($row AS $key => $value){ //Felder der Zeile durchlaufen
                        //Beim hinzufügen sollte noch geprüft werden ob es sich um einen
                        //String, oder Integer, oder etc handelt.
                        
            $set[] = $arr_fields[$key]" = '".$value."'";  //Feld in SET-Array hängen
                    
            }
                    
            $sql.= implode(","$set); //alle felder aus SET kommagetrennt an die Query hängen
                    
            echo $sql."<br/>"//query ausgabe zur Kontrolle
                    
                    
            if(!mysql_query($sql)){ //query ausführen
                        
            die(mysql_error());
                    }
                  }
                }
              } else {
                die(
            "Datei nicht gefunden!");
              }




            PS: Brich deine Code im ersten Beitrag um - das scrollen nervt langsam

            Kommentar

            Lädt...
            X