Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Operacje na 2 plikach danych
Forum PHP.pl > Forum > PHP
sobol6803
Witam. Mam małą zagwozdkę i za bardzo nie wiem jak z tego wyjść. Z programowania jestem początkujący, a w internecie nie znalazłem odpowiedzi na moje pytanie. Mam skrypt, który łączy się z bazą danych mysql, wybiera z niej osoby, które wybrałem (WHERE) i wyświetla ich dane z 2 tablic. Później je sortuje od największej do najmniejszej i umieszcza w pliku txt w takim schemacie:
Kod
Rank1:
1. osoba1
Tablica1: 311670

2. osoba2
Tablica1: 246938

(...)

Rank2:
1. osoba1
Tablica2: 3428

2. osoba2
Tablica2: 2404

(...)


Chcę dodać ten skrypt do crona, żeby co miesiąc go wywoływał i spisywał nowe wartości. Później od nowych wartości dla zapisanych osób odejmował stare i zapisywał te różnice. I tu nasuwa się moje pytanie. Jak to zrobić? Może zapisywać je w innym stylu, do innego formatu? Jak wykonać później tą różnicę?

Jeśli potrzebujecie jakiś kawałek kodu to piszcie śmiało.

Z góry dzięki za pomoc,
Pozdrawiam.
Fixus
aż się porsi o jakiś banalny zapis typu csv. W ten sposób kosmicznie to komplikujesz

12;ktos;ktosiowy
13;inny;pan
14;inna;pani

Teraz wczytujesz linia po linii robisz explode po ; i masz każdy wiesz w tablicy. dużo prościej
sobol6803
Dobra, plik zrobiłem z pomocą "INTO OUTFILE" i zrobił się. Niestety nie chce się nadpisywać i przy każdym generowaniu będę musiał zmieniać nazwę pliku, a stare dalej tam pozostaną. Jak usunąć te zbędne?

W dodatku w pliku co się generuje mam krzaki i zapis "bad handshake". Jak sobie z tym poradzić?
Fixus
w jaki sposób generujesz plik ? możesz wkleić funkcję ?

usunięcie pliku możesz wykonać za pomocą funkcji unlink()

btw odrobina pracy w formie wpisania tego do wyszukiwarki nie boli smile.gif

http://www.google.pl/search?q=php+delete+f...lient=firefox-a
sobol6803
  1. $sql = "SELECT * FROM players WHERE NAME='user1' OR NAME='user2' INTO OUTFILE 'ranking3.csv' FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY ';' LINES TERMINATED BY '\n'";



  1. unlink('sciezka');
nie usuwa pliku ze sql'a tylko próbuje z serwera, na którym jest skrypt. Nie działa nawet po wskazaniu ścieżki wraz z portem do mysql (przez który ściągam wygenerowane pliki).


Sorry, ale nieogar jestem, na poziomie początkującego początkującego tongue.gif
Fixus
ale co ty chcesz z sql`a usuwać ?

pofatygowałeś się chociaż do dokumentacji tej metody ?
sobol6803
Przez tą metodę pliki nie zrobiły mi się na serwerze tylko na sql'u. Mogę je tylko pobrać wklepując adres w przeglądarce.

W necie zobaczyłem taką metodę na zapisywanie .csv więc jej użyłem. Za bardzo się w to nie wczytywałem.
CuteOne
Tworzenie pliku z danymi...

  1. <?php
  2.  
  3. $sql = mysql_query("SELECT * FROM players WHERE NAME='user1' OR NAME='user2'");
  4.  
  5. $toWrite = '';
  6. while($row = mysql_fetch_array($sql)) {
  7.  
  8. $toWrite .= $row['NAME'].','.$row['ID']."\r\n"; // tu sobie zapisuj jakie dane chcesz
  9. }
  10.  
  11. $handler = fopen('plik.txt', "w");
  12. fwrite($toWrite, $handler);
  13. fclose($handler);
  14.  


to odczytu pliku służy funkcja fread
sobol6803
Taki miałem na początku, zapisywał do txt. Tylko nie mówcie, że wystarczyło zmienić rozszerzenie w fopen na csv i metodę printowania wyników sciana.gif
CuteOne
  1. $handler = fopen('plik.txt', "r");
  2. if ($handler) {
  3. while (!feof($handler)) {
  4.  
  5. $lines[] = explode(',', fgets($handler, 4096));
  6. }
  7. fclose($handle);
  8. }
  9.  
  10. echo '<pre>';
  11. print_r($lines);


czytanie pliku linijka po linijce
by_ikar
Masz tablice, tablice serializuj (serialize), zserializowaną zapisz do pliku (file_put_contents). Później odczytaj unserialize i masz tablice. Po co regexy i pętle tutaj zaprzęgać?

BTW, php 5 wyszło 9 lat temu, funkcje typu file_get_contents czy file_put_contents powinny być na porządku dziennym.
sobol6803
Na wstępie przepraszam za mały zastój, ale kilka ważniejszych spraw w tym czasie wynikło. Do rzeczy:

Cytat(CuteOne @ 20.06.2011, 01:04:25 ) *
Tworzenie pliku z danymi...

  1. <?php
  2.  
  3. $sql = mysql_query("SELECT * FROM players WHERE name='user1' OR NAME='user2'");
  4.  
  5. $toWrite = '';
  6. while($row = mysql_fetch_array($sql)) {
  7.  
  8. $toWrite .= $row['NAME'].','.$row['ID']."\r\n"; // tu sobie zapisuj jakie dane chcesz
  9. }
  10.  
  11. $handler = fopen('plik.txt', "w");
  12. fwrite($toWrite, $handler);
  13. fclose($handler);
  14.  


to odczytu pliku służy funkcja fread


To działa. Ładnie zapisuje do pliku.

Cytat( @ 20.06.2011, 10:03:33 )
Masz tablice, tablice serializuj (serialize), zserializowaną zapisz do pliku (file_put_contents). Później odczytaj unserialize i masz tablice. Po co regexy i pętle tutaj zaprzęgać?

BTW, php 5 wyszło 9 lat temu, funkcje typu file_get_contents czy file_put_contents powinny być na porządku dziennym.

Nie do końca wiem na czym polega serialize.

Zrobiłem:
  1. $tabliczka= serialize($tablica['NAME'].','.$tablica['SCORE'].','.$tablica['KILLS'].'\r\n');

I przed NAME są jakieś syfy, w dodatku ja potrzebuję pętle raczej, bo musi mi to układać jak ranking, czyli pozycjami oraz je numerować. Tak jak teraz na to patrzę, to ten zapis jest bez sensu...


Jeszcze raz może napiszę:
Potrzebuję z tych 3 tablic zrobić 2 rankingi. 1 z tablic 'NAME' i 'SCORE' i zapisać. Później 2 ranking z tablic 'NAME' i 'KILLS' i zapisać.
Później te rankingi zapisać (zarchiwizować) przez dodanie do crona, by robił zrzuty każdego 1 dnia miesiąca. <--to sobie zrobię sam, w tym akurat pomocy raczej nie potrzebuję.

Dalej przykładowo:
Dla każdej osoby ('NAME') odjąć same wartości 'SCORE' i 'KILLS' ze zrzutu z 1.06.2011 i 1.07.2011, by otrzymać PRZYROST, czyli wartość, która przez ten miesiąc przybyła w tych tablicach.

Gotowy, ranking (a właściwie 2) dodać do crona, by się wysyłał jako temat na forum phpbb3 (<-- to sobie zrobię sam, w tym akurat pomocy raczej nie potrzebuję.


Sam wygląd (układ) rankingu mogę sobie posortować dopiero w ostatnim pliku generującym temat na forum, więc wcześniej on może mieć jakiekolwiek postacie, tylko żeby łatwo było obliczyć każdemu 'NAME' przyrost.

Myślę, że nie namieszałem za bardzo.

Pozdrawiam.

EDYCJA:
  1. $naglowek = ",name,score,kills \r\n";
  2. while($row = mysql_fetch_array($db_erg)) {
  3.  
  4. $toWrite .= $nr.'.,'.$row['NAME'].','.$row['SCORE'].','.$row['KILLS']."\r\n";
  5. $nr++;
  6. }
  7. $date= date('d-m').'.csv';
  8. $plik= fopen($date, "w");
  9. fclose($plik);
  10. $wszystko = $naglowek.$toWrite;
  11. file_put_contents($date, $wszystko);
  12.  
  13. $row=1;
  14. if (($plik = fopen("$date", "r")) !== FALSE) {
  15. while (($wyswietl= fgetcsv($plik, 1000, ",")) !== FALSE)
  16. {
  17. $num = count($wyswietl);
  18. $row++;
  19. for ($c=0; $c < $num; $c++) {
  20. echo $wyswietl[$c] . "<br />\n";
  21. }
  22. }
  23. }
  24. fclose($plik);


Po tym wszystkim, chyba powinienem mieć stworzone tablice nick[], score[], kills[], nie? Czy zrobiłem coś źle, że tych tablic nie ma?
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.