[GXMAIN-3819] Fehler in "includes\classes\banktransfer_validation.php"

Thema wurde von Avenger, 28. Juni 2014 erstellt.

  1. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Bei der Ermittlung der Prüfdaten aus der CSV-Version der BLZ-Daten wird die falsche Prüfziffern-Routinen-Kennung ermittelt.

    Es wird das 3. Feld das Datensatzes als Kennung zurück gegeben. (" 'prz' => $data[2])")

    PHP:
      function csv_query($blz) {
        
    $cdata = -1;
        
    $fp fopen(DIR_WS_INCLUDES 'data/blz.csv''r');
        while (
    $data fgetcsv($fp1024";")) {
          if (
    $data[0] == $blz){
            
    $cdata = array ('blz' => $data[0],
                            
    'bankname' => $data[1],
                            
    'prz' => $data[2]);
          }
        }
        return 
    $cdata;
      }
    Die BLZ-Datei enthält jetzt die BIC als drittes Feld!

    PHP:
    10010010;Postbank;PBNKDEFFXXX;24
    Die Kennung wäre also jetzt " 'prz' => $data[3])".
    PHP:
      function csv_query($blz) {
        
    $cdata = -1;
        
    $fp fopen(DIR_WS_INCLUDES 'data/blz.csv''r');
        while (
    $data fgetcsv($fp1024";")) {
          if (
    $data[0] == $blz){
            
    $cdata = array ('blz' => $data[0],
                            
    'bankname' => $data[1],
                            
    'prz' => $data[3]);
          }
        }
        return 
    $cdata;
      }
     
  2. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Man sollte der Routine auch noch ein "break;" spendieren, damit sie, nachdem die Daten gefunden wurden, nicht auch noch den Rest untersucht...

    PHP:
      function csv_query($blz) {
        
    $cdata = -1;
        
    $fp fopen(DIR_WS_INCLUDES 'data/blz.csv''r');
        while (
    $data fgetcsv($fp1024";")) {
          if (
    $data[0] == $blz){
            
    $cdata = array ('blz' => $data[0],
                            
    'bankname' => $data[1],
                            
    'prz' => $data[3]);
            break;
          }
        }
        return 
    $cdata;
      }
     
  3. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Überhaupt ist diese "Looperei" für das Einlesen von ca. 4.000 Datensätzen unnötig aufwändig...

    Deshalb hier eine Version, die mit nur einem Plattenzugriff auskommt, und den Rest im Arbeitsspeicher macht.

    PHP:
      function csv_query($blz) {
        
    $cdata = -1;
        
    $file=DIR_WS_INCLUDES 'data/blz.csv';
        if (
    file_exists($file))
        {
          
    $blz_data=file_get_contents($file);
          if (
    strlen(trim($blz_data)))
          {
            
    $poss=strpos($blz_data,$blz);
            if (
    $poss!==false)
            {
              
    $pose=strpos($blz_data,"\n",$poss);
              if (
    $pose!==false)
              {
                
    $data=trim(substr($blz_data,$poss,$pose-$poss));
                
    $data=explode(';',$data);
                
    $cdata = array (
                  
    'blz' => $data[0],
                  
    'bankname' => $data[1],
                  
    'prz' => $data[3]);
              }
            }
          }
        }
        else
        {
          
    $cdata=$this->db_query($blz);
        }
        return 
    $cdata;
      }