Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] ochrona przed atakiem przez CSV
Forum PHP.pl > Forum > PHP
hhg
to jest funkcja ktora update'uje baze z pliku CSV
  1. <?php
  2.  
  3. public function insertCsvFile ($file_path) {
  4.  
  5. $handle = fopen ($file_path,"r");
  6.  
  7. // quantity,description,additional
  8. while (($data = fgetcsv($handle, ",")) !== FALSE) {
  9. $data[0] = $this->db->real_escape_string($data[0]);
  10. $data[1] = $this->db->real_escape_string($data[1]);
  11. $data[2] = $this->db->real_escape_string($data[2]);
  12.  
  13. $this->db->query(
  14. "INSERT INTO request.products " .
  15. "VALUES(NULL," . $_SESSION['requestId'] . "," . $data[0] . ",'" . $data[1] . "','" . $data[2] . "')" 
  16. ) or die(mysql_bug(__FILE__,__LINE__));
  17. }
  18.  
  19. fclose ($handle);
  20.  
  21. }
  22. ?>


a co jesli ktos sie pomyli w CSV i nie postawi gdzies przecinka albo poda tylko dwie wartosci (bez trzeciej) w linii?

jak sie uchronic przed takimi niespodziankami?

z gory dzieki za pomoc
Darti
Brak delimitera bedzie oznaczac dwa wpisy w tablicy $data a brak wartości trzy wpisy ale trzevi będzie pusty. Oczywiście fgetcsv nie wywali sam z siebie błędu.
Można w takim przypadku każdorazowo sprawdzać istnienie wszystkich (tutaj trzech) komórek tablicy $data, które są niepuste (mają wartość inną niż null) pamiętając o jej czyszczeniu przed powtórzeniem pętli.
hhg
dzieki, a w przypadku gdy ostatnia (trzecia) wartosc moze byc NULL to w sumie wystarczy sprawdzic pierwsze dwie..

a propos delimitera: jezeli pierwszy w bazie jest liczbą (int bezznakowa), drugi jest tinytext i trzeci tez to czy jest sens definiowania delitmitera?
Darti
Nie musisz określać delimitera, w takim przypadku domyślny delimiter to przecinek, ale tak czy inaczej pola MUSZĄ być czymś oddzielone (z definicji CSV)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.