Mam pewien zgrzyt z kodem PHP. Od razu uprzedzam - moja znajomość PHP i SQL są na poziomie ... raczkującego dziecka. Stąd prośba o pomoc.
Mam skrypt który ma za zadanie:
1. Insert nowych danych do tabeli.
2. Update istniejących.
Dane pobierane są z pliku CSV. Plik zawiera dane sprzedażowe z 4 okresów, przesyłany jest z końcem pojedynczego okresu rozliczeniowego. Dane z pliku dublują się z danymi w bazie stąd konieczność ich odświeżenia.
Całość skryptu wygląda tak:
<? $f=$_FILES['r_update']; $file=$f['tmp_name']; $c_fname=$f['name']; $newr=0; $updr=0; // pobranie danych do tablicy $lines z przesłanego pliku CSV z _POST. Ustawienie zmiennych informacyjnych na 0. try { $dbk = new PDO('mysql:host=localhost;dbname=baza', 'root', 'root'); $dbk->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $odd=$szukaj[0]; $issue=$szukaj[4]; $issue_min=$szukaj[4]-5; $issue_max=$szukaj[4]+5; //Połącznie z bazą. Wydobycie danych do stworzenia widoku/perspektywy. $start=$dbk->query('create view pomocnadlon as select * from r_dane where oddzial like ''.$odd.'' and nr between '.$issue_min.' and '.$issue_max.''); // tworzę widok/perspektywę by ograniczyć wyszukiwanie w bazie foreach ($lines as $line) { for ($i=0;$i<=4;$i++) { } //exploduję linie pliku i wycinam spacje na początku i na końcu $x="select * from pomocnadlon where id_psd like '".$dane[1]."' and nr=".$dane[4]; $vstart=$dbk->query($x); $vstart->setFetchMode(PDO::FETCH_ASSOC); //nową instancją istniejącego obiektu PDO pobieram dane o tym czy rekord istnieje $insert="INSERT INTO pr_dane (oddzial, id_psd, dost, zwr, nr) VALUES ('".$dane[0]."','".$dane[1]."',".$dane[2].",".$dane[3].",".$dane[4].")"; $insert_do=$dbk->query($insert); $newr++; } else { $update="update r_dane set oddzial='".$dane[0]."', id_psd='".$dane[1]."', dost=".$dane[2].", zwr=".$dane[3].", nr=".$dane[4]." where oddzial like '".$dane[0]."' and id_psd like '".$dane[1]."' and nr=".$dane[4]; $update_do=$dbk->query($update); $updr++; } } //Istnieje - update, czyli ELSE. Nie istnieje bo jest EMPTY - INSERT. $vstart=$dbk->query('drop view pomocnadlon'); } catch (PDOException $e) { } ?>
Plik csv ma postać:
Oddział;ID;Ilość;Niesprzedane;Nr_dostawy. Max 6000 wierszy.
Skrypt pada mi po 300 sekundach od odpalenia, przestawiłem sobie czas wykonania w php.ini na 300. Mam wrażenie, że to co napisałem albo się zapętla, albo nie wyrabia jeśli codzi o skuteczność zapytań. O co chodzi? Jak przyspieszyć UPDATE?
pzdr
mummle