Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Aktualizacja bazy danych cennika ... ??
Forum PHP.pl > Forum > PHP
djseba
Witam wszystkich.
Jestem poczatkujacym "programista" php...
Mam problem ze zrobieniem skryptu:

1 - Skrypt musi pobierac dane z pliku cennik.csv, w ktorym sa 2 kolumny z danymi (w pierwszej kolumnie znajduje sie nazwa towaru, a w drugiej jego cena) oddzielone znakiem ";".
Wygląda on tak:
produkt;cena
produkt;71.2
produkt;74.6
Dodam, ze w cenniku jest ponad 1700 pozycji (linii) i ta wartosc sie zmienia.
2 - Musi sprawdzac baze danych i jak znajdzie produkt o tej samej nazwie co w cenniku, to musi uaktualnic jego cene, cena z cennika.
3 - Byloby dobrze gdyby wyswietlal tez dane ktore zostaly zaktualizowane oraz ktore pozostaly bez zmian.

Struktura tabeli podz_podzespoly:
pid = ID produktu
cid = ID kategorii produktu
name = nazwa produktu
cena = cena produktu
opis = opis produktu

Oto moj skrypt:
<?php
require ("config.php");

mysql_connect ($dbhost, $dbuname, $dbpass) or
die ("Nie można poł&plusmn;czyć się z MySQL");
mysql_select_db ($dbname) or
die ("Nie można poł&plusmn;czyć się z baz&plusmn; '$dbname'.");

$row = 1;
$fp = fopen ("cennik.csv","r");
while ($data = fgetcsv ($fp, 1000, ";")) {
$num = count ($data);
$row++;
for ($c=0; $c<$num; $c++) {
$data[$c];
$query = "UPDATE podz_podzespoly SET cena='$data[$c]' WHERE name like '$row++'";
$wynik = mysql_query ($query);
}
}
fclose ($fp);
?>

Po 30sek dzialania mojego skryptu, wyskakuje blad:
"Fatal error: Maximum execution time of 30 seconds exceeded in c:foxservwwwadminupdate1.php on line 19"
Oczywiscie nie zmienia on cen w bazie danych ...

Prosze pomozcie mi ...

Kontakt ze mna:
seba_wp@wp.pl
gg: 2332
dragossani
Rozumiem, że cennik zmienia się co jakiś czas i stary plik CSV zastępowany jest nowym plikiem CSV zawierającym aktualne dane?

Napiszę ci jak jak ja bym to rozwiązał. Co prawda pracujesz pod Windows'em i ten sposób Ci się nie sprawdzi (wymaga Linuxa) - ale byćmoże masz możliwość zmiany systemu lub skorzysta na tym opisie ktoś prócz Ciebie.

Pierwsza sprawa: kiedy pojawia się nowy plik CSV nie nadpisujemy nim poprzedniego, tylko wykonujemy kopię aktualnego pod inną nazwą i dopiero wtedy wrzucamy nowy. Chodzi o to, by zawsze w katalogu były 2 pliki - cennik w wersji aktualnej i jego poprzednia wersja.

Wykonujemy diff'a i wyjście przekierowujemy do osobnego pliku.
Kod
diff nowy_cennik.csv stary_cennik.csv > roznice.txt


Jaki będzie tego efekt? Przyjmijmy, że cenniki wyglądają tak:

stary_cennik.csv:
Kod
towar_1;100.00

towar_2;200.00

towar_3;300.00

towar_4;400.00

towar_5;500.00

towar_6;600.00

towar_7;700.00

towar_8;800.00


nowy_cennik.csv:
Kod
towar_1;100.00

towar_2;200.00

towar_2_1;900.00

towar_3;300.00

towar_4;400.00

towar_5;950.00

towar_6;600.00

towar_8;800.00


Czyli w nowym cenniku zaszły 3 zmiany:
1. dodano nowy 'towar_2_1;900.00'
2. zmieniono cenę 'towar_5' z 500.00 na 950.00
3. usunięto 'towar_7'

Co więc znajdziemy w pliku wynikowym?

roznice.txt:
Kod
2a3

> towar_2_1;900.00

5c6

< towar_5;500.00

---

> towar_5;950.00

7d7

< towar_7;700.00


Interpretacja tego pliku nie nastręcza chyba trudności. Kwestię użycia pliku roznice.txt do sporządzenia z poziomu php odpowiednich modyfikacji w bazie pominę - parę ifów i po sprawie. Jakie są zalety tego rozwiązania? Diff wykonuje operację porównania 2 plików w piorunującym tempie - możecie mi wierzyć, a my nie obciążamy niepotrzebnie bazy danych - na pewno taka modyfikacja nie przekroczy 30 sekund... Wsjo. :wink:
djseba
A nie da sie tego zrobic inaczej questionmark.gif
Kurcze, raczej nie mam mozliwosci przejscia na Linuxa sad.gif
Prosze o pomoc ...
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.