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($fp, 1024, ";")) { 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($fp, 1024, ";")) { if ($data[0] == $blz){ $cdata = array ('blz' => $data[0], 'bankname' => $data[1], 'prz' => $data[3]); } } return $cdata; }
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($fp, 1024, ";")) { if ($data[0] == $blz){ $cdata = array ('blz' => $data[0], 'bankname' => $data[1], 'prz' => $data[3]); break; } } return $cdata; }
Ü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; }