![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 3.06.2003 Ostrzeżenie: (0%) ![]() ![]() |
Witam forumowiczów.
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:
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 Ten post edytował mummle 16.03.2009, 10:56:14 |
|
|
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Rób przez pętle z fgets" title="Zobacz w manualu PHP" target="_manual. Poza tym:
Masz możliwość sprawdzenia bez użycia like? |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 3.06.2003 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki za podpowiedź z fgets - skorzystam.
Zamieniłem like na = (nie wiem czemu uparłem się na ten sposób porównania), ale nadal po 300 sekundach wywala błąd. Skrypt wciąż bez problemu insertuje dane, gorzej z update. Pozdrawiam mummle Ten post edytował mummle 15.03.2009, 08:57:14 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 182 Pomógł: 115 Dołączył: 4.03.2009 Skąd: Myszków Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 3.06.2003 Ostrzeżenie: (0%) ![]() ![]() |
Korzystasz z PDO! Czemu nie używasz bindowania? Zaoszczędzisz czasu - wtedy tylko raz wyślesz zapytanie, a cały czas będziesz aktualizował dane i wykonywał zapytanie. Poczytaj bindValue i bindParam. A możesz mi podpowiedzieć w jaki sposób mogę to zrobić? Kodem? O bindowaniu wiem, ale nie wiem jak z niego korzystać. Niestety polskie manuale o PDO są dość ubogie (to co znalazłem na wiki mówi, ale nie wyjaśnia, inglisz - chętnie poczytam, przejrzę prototypy obiektów), a poza tym brak im jak i tym z php.net solucji 100% rozwiązań. Opis takiej klasy jest po prostu zbyt ubogi bo jest poglądowy. Chodzi o prezentację a nie o rozwiązania. Jakbym wiedział jak korzystać z bindowania, co ze sobą niesie to bym nie pytał. Chętnie poznam Twoje źródła wiedzy o PDO. Nie pytam o rybę (choć może w tym przypadku chodzi o nią i jest niezbędna bo czas mnie goni) lecz zapytuję o wędkę, źródła, wiedzę na przyszłość. Czytałem o bindowaniu parametrów ale nie wiem jak to działa. Pomożesz? Help, need help (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) pzdr mummle Ten post edytował mummle 15.03.2009, 13:01:11 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 1 182 Pomógł: 115 Dołączył: 4.03.2009 Skąd: Myszków Ostrzeżenie: (0%) ![]() ![]() |
Moje źródła? Wikibooks (PHP), manual (wbrew pozorom jest tam całkiem sporo opisane), i spory opis na WebCity - tutaj.
Bindowanie/podpinanie to operacja na poziomie bazy, więc jest całkowicie odporna na SQL Injection, i czasami szybsza od łączenia parametrów w PHP. Robi się to tak:
Aaa, zapomniałbym - przy tym możesz zapytanie przygotować przed pętlą, a jeśli podpinasz referencyjnie to też możesz zostawić, a wykonujesz w pętli. PDO już sobie wyśle odpowiednią wartość przy referencji. No i zamiast pobierać dane możesz nałożyć choćby unique na jakąś kolumnę, i wykonywać INSERT (...) ON DUPLICATE (...) (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) . Ten post edytował Mephistofeles 15.03.2009, 17:51:46 |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 3.06.2003 Ostrzeżenie: (0%) ![]() ![]() |
Poczytałem, zmodyfikowałem kod zgodnie z sugestiami i nadal wywala się po 300 sekundach... O co kaman? Może jest jakiś inny sposób na UPDATE? Pozdrawiam mummle Ten post edytował mummle 16.03.2009, 15:17:44 |
|
|
![]()
Post
#8
|
|
Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
Dzizez
1. fopen + fgetcsv - tym sie czyta CSV'y 2. ile masz linii w tym pliku? 3. zapisuj sobie do innego pliku liczbe przetworzonych rekordow - to bedziesz wiedzial co jest nie tak i w ktorym miejscu pada 4. Nigdzie nie definiujesz zmiennej $dane przed jej uzyciem |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 1 182 Pomógł: 115 Dołączył: 4.03.2009 Skąd: Myszków Ostrzeżenie: (0%) ![]() ![]() |
Napisałem jeszcze, żebyś skorzystał z INSERT ON DUPLICATE KEY, poczytaj o tym, ominiesz SELECTa.
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 3.06.2003 Ostrzeżenie: (0%) ![]() ![]() |
Dzizez 1. fopen + fgetcsv - tym sie czyta CSV'y 2. ile masz linii w tym pliku? 3. zapisuj sobie do innego pliku liczbe przetworzonych rekordow - to bedziesz wiedzial co jest nie tak i w ktorym miejscu pada 4. Nigdzie nie definiujesz zmiennej $dane przed jej uzyciem 2. Do 12 tysięcy. 3. Przetwarza ok 600-800 wierszy. 4. Zmienną zdefiniowałem, mój błąd. Napisałem jeszcze, żebyś skorzystał z INSERT ON DUPLICATE KEY, poczytaj o tym, ominiesz SELECTa. Problem w tym, że jednoznaczna i unikalna jest tylko para danych oddział+id. Niestety ID w oddziałach się powtarzają. Ostatecznie, korzystając ze wszystkich rad mam coś takiego, co nadal update'uje najwyżej... 600 rekordów:
Pozdrawiam mummle Ten post edytował mummle 16.03.2009, 16:47:37 |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 1 182 Pomógł: 115 Dołączył: 4.03.2009 Skąd: Myszków Ostrzeżenie: (0%) ![]() ![]() |
Ale ON DUPLICATE KEY przecież sprawdza tylko unikalne klucze, więc czemu miałby nie przyjmować zwykłych pól?
|
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 3.06.2003 Ostrzeżenie: (0%) ![]() ![]() |
Ale ON DUPLICATE KEY przecież sprawdza tylko unikalne klucze, więc czemu miałby nie przyjmować zwykłych pól? Z tego co zrozumiałem potrzebuję zdefiniować kolumnę jako UNIQUE. Problem w tym, iż nie mam takiej możliwości.
Unikatowe może być tylko połączenie pól oddzial i id_psd. Oddział pojawia się wielokrotnie i jest powtarzalny. Id_psd może być takie samo w przypadku różnych oddziałów. Fajnie i prosto byłoby gdyby tak nie było (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Wiem. Jedyna opcja by skorzystać z ON DUPLICATE KEY to stworzenie "sumy" tych dwóch pól jako dodatkowe, automatycznie generowane pole w bazie, nadanie mu UNIQUE, które chyba nie przejdzie dla pola tekstowego i potem zmiana zapytania, wprowadzenie zmiennej łączącej wartości z pliku CSV i podstawienie jej za KEY. Mylę się? Tylko jak to zrobić? I czy to jest możliwe? pzdr mummle |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 1 182 Pomógł: 115 Dołączył: 4.03.2009 Skąd: Myszków Ostrzeżenie: (0%) ![]() ![]() |
A nie możesz dodać pola id generowanego z np. md5(oddzial.id_psd)? Albo nawet samo oddzial.id_psd.
Ten post edytował Mephistofeles 16.03.2009, 19:56:17 |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 3.06.2003 Ostrzeżenie: (0%) ![]() ![]() |
A nie możesz dodać pola id generowanego z np. md5(oddzial.id_psd)? Albo nawet samo oddzial.id_psd. I to jest myśl, stworzyć coś jakby pole z serialem rekordu. Tylko dodałbym do tego jeszcze .nr. W ten sposób będę mógł utworzyć UNIQUE (tylko czy da się go stworzyć dla pól text lub blob?) i skorzystać z ww rozwiązania. A może przekształcić to na jakiś ciąg binarny? MD5 generuje ciągi alfanumeryczne jak dobrze pamiętam i tu może być problem z zastosowaniem indeksacji. Potestuję, dam znać. pzdr mummle Ten post edytował mummle 16.03.2009, 21:10:03 |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 1 182 Pomógł: 115 Dołączył: 4.03.2009 Skąd: Myszków Ostrzeżenie: (0%) ![]() ![]() |
Na varchary też przecież wchodzi indeks - wiele skryptów ma unique na loginie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) .
|
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 3.06.2003 Ostrzeżenie: (0%) ![]() ![]() |
Na varchary też przecież wchodzi indeks - wiele skryptów ma unique na loginie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) . Stanęło na tym:
Śmiga aż miło. Zastanawiam się komu podziękować (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Pozdrawiam mummle Ten post edytował mummle 17.03.2009, 16:54:41 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 25.08.2025 - 04:08 |