konto usunięte

Temat: Dodawanie a aktualizacja

Kolejny problem do rozwiązania.

Tworzę aplikację w połączeniu z FB. Po zalogowaniu pobierane są informację na temat szkół do jakich uczęszczał user.

Są one w postaci tablicy
[0]
-name
-id
itd.

W momencie logowania chcę pobrać dane o jego szkołach i umieścić w tabeli. Trudnością jest jednak to, że za każdym razem gdy user zaloguje się do programu musimy sprawdzić czy nie zmienił niczego w profilu na FB. A w przypadku gdy dodał nową szkołę musimy ją dodać.

Jak to zrobić?? Bo gdy użyję INSERT INTO.. to za każdym razem gdy się zaloguje dodawane są duplikaty danych.

konto usunięte

Temat: Dodawanie a aktualizacja

$user->deleteSchools();

foreach ($facebook->schools as $id => $school) {
$user->addSchool($school->name);
}

// lub żeby nie dawać miliona insertów

$user->addSchools($facebook->schools);


;P

W sumie możesz sprawdzać czy konkretne dane się nie zmieniły, ale raczej mniejszym kosztem będzie powyższe.
Bartosz Ratajczyk

Bartosz Ratajczyk MS SQL Developer

Temat: Dodawanie a aktualizacja

Wojciech Dasiukiewicz:
Jak to zrobić?? Bo gdy użyję INSERT INTO.. to za każdym razem gdy się zaloguje dodawane są duplikaty danych.

Jaka baza? W MySQL masz przy insercie konstrukcję ON DUPLICATE KEY, która nie będzie tworzyć dubli

konto usunięte

Temat: Dodawanie a aktualizacja

@Bartosz Ratajczyk, wszystko fajnie tylko autorowi zapewne chodzi o to że dane szkoły mogą się zmienić. ID pozostanie to samo ale np nazwa albo coś innego zostanie zmienione.

Osobiście poszedł bym w kierunku jaki zaproponował @Kamil Brenk, tylko nie wiem czy to zbyt uciążliwe nie będzie. Głównie chodzi o to że alternatywą jest właściwie wyszukiwanie różnic pomiędzy szkołami, gdzie przecież i tak pobierzesz dane o wszystkich. Tylko zamiast je usuwać, jak zaproponował @Kamil Brenk, aktualizował bym je, traktując jako klucze główne np miejscowość i numer szkoły. Albo coś w tym stylu.

Unikniesz sytuacji gdy ktoś wpadnie na niefortunny pomysł wejścia na Twoją stronę między usunięciem szkół a dodaniem nowych i nie zobaczy nic a nic. Nie mówiąc o tym że jeżeli FB odrzuci Ci połączenie i w tym momencie te szkoły tracisz (na co lekarstwem są transakcje).

konto usunięte

Temat: Dodawanie a aktualizacja

Hmm... Czyli mogę to zrobić tak??

INSERT + ON DUPLICATE KEY
Doda to tylko nowe szkoły
A później UPDATE, który wprowadzi zmiany w starych rekordach

Czy to będzie za duże obciążenie?Wojciech Dasiukiewicz edytował(a) ten post dnia 05.05.11 o godzinie 12:49
Bartosz Ratajczyk

Bartosz Ratajczyk MS SQL Developer

Temat: Dodawanie a aktualizacja

Dariusz Półtorak:
@Bartosz Ratajczyk, wszystko fajnie tylko autorowi zapewne chodzi o to że dane szkoły mogą się zmienić. ID pozostanie to samo ale np nazwa albo coś innego zostanie zmienione.

Zgadza się. Ale ON DUPLICATE KEY występuje dla danego klucza. Jeśli przyjdą dane zduplikowane, to załatwiasz aktualizację konkretnych danych. Jak nie, to idzie INSERT. Np. (założenie, że tabela szkoly ma klucz unikalny na kolumnie id):

INSERT INTO szkoly (id, nazwa, adres) VALUES (10, 'szkola1', 'adres1')
ON DUPLICATE KEY UPDATE nazwa = 'szkola1'


Jeśli istnieje już w tabeli szkoła o id = 10, to zaktualizuje nazwę. Jeśli nie ma, to doda nowy rekord

konto usunięte

Temat: Dodawanie a aktualizacja

Problem jest taki, że np. 100 osób mogło uczęszczać do tej samej szkoły, więc nie mogę sprawdzać id z facebooka. A jak sprawdze id (autoincrement) to zawsze będą inne.

konto usunięte

Temat: Dodawanie a aktualizacja

Bartosz Ratajczyk:
Dariusz Półtorak:
@Bartosz Ratajczyk, wszystko fajnie tylko autorowi zapewne chodzi o to że dane szkoły mogą się zmienić. ID pozostanie to samo ale np nazwa albo coś innego zostanie zmienione.

Zgadza się. Ale ON DUPLICATE KEY występuje dla danego klucza. Jeśli przyjdą dane zduplikowane, to załatwiasz aktualizację konkretnych danych. Jak nie, to idzie INSERT. Np. (założenie, że tabela szkoly ma klucz unikalny na kolumnie id):

INSERT INTO szkoly (id, nazwa, adres) VALUES (10, 'szkola1', 'adres1')
ON DUPLICATE KEY UPDATE nazwa = 'szkola1'


Jeśli istnieje już w tabeli szkoła o id = 10, to zaktualizuje nazwę. Jeśli nie ma, to doda nowy rekord

Zgadza się. Chodzi mi głównie o to że @autor musiał by mieć jakiś unikalny klucz przy takiej szkole na FB bo inaczej nawet nie powiąże szkoły z wpisem w swojej bazie.

@autor, możesz podać pełny zestaw danych jaki otrzymujesz przy danej szkole ? (na przykładzie 2-3 wpisów) Trzeba się po prostu zastanowić co może zadziałać jako klucz główny (albo kombinacja, np numeru i miejscowości itp). Niestety o ile integrowałem system kont z FB jakiś czas temu o tyle nie wiem jak to jest z innymi wpisami. Dużo nad tym nie siedziałem.
Jeżeli dali byśmy radę wyodrębnić dane które pozwolą na zidentyfikowanie szkoły i które się same raczej nie zmieniają to można zrobić to co zaproponował @Bartosz Ratajczyk.

konto usunięte

Temat: Dodawanie a aktualizacja

Szkoła posiada
-id
-name
-type

I to wszystko.

konto usunięte

Temat: Dodawanie a aktualizacja

To w bazie tak masz czy w FB ? Bo jak ściągasz dane o szkole i masz jej ID z FB to w czym problem ?
Rozwiązanie masz w poście @Bartosz Ratajczyk.

Sugeruję ustawienie sobie np intervala na X dni i raz na jakiś czas aktualizować dane. A jako wywołanie do aktualizacji - użytkownik. Jeżeli wejdzie na stronę a wpis w szkołach które ma przypisane jest starszy niż X dni - aktualizuj.

Dane szkół się nie zmieniają za często.

W innym wypadku to raczej musisz porównać wszystkie dane i sprawdzić co należy aktualizować. Jak mówiłem, raczej nastawiał bym się na to żeby użytkownik miał z automatu np raz na tydzień aktualizowane te dane + mieć gdzieś przycisk "Aktualizuj dane o szkole".

Zwłaszcza że z tego co widzę to tu Ci się najwyżej może nazwa zmienić.Dariusz Półtorak edytował(a) ten post dnia 05.05.11 o godzinie 14:18

konto usunięte

Temat: Dodawanie a aktualizacja

Ja bym to rozwiązał jeszcze inaczej.

pierwsze logowanie:

$hash = md5(serialize($facebook->schools));
$h = fopen('./hash.fb', 'w+');
flock($h, 2);
fwrite($h, $hash, strlen($hash));
flock($h, 3);
fclose($h);

kolejne logowania:

$hash = md5(serialize($facebook->schools));
$hash_file = @file_get_contents('./hash.fb');

if($hash != $hash_file)
{
// kasowanie wszystkiego z bazy
// aktualizacja rekordów
}

// la la la

to chyba najmniejsze obciążenie, aktualizacja bazy nastepuje tylko w momencie gdy user dokona faktycznie zmian.

konto usunięte

Temat: Dodawanie a aktualizacja

Wybrałem rozwiązanie z plikami, ale mam pewien problem.

Dane się nie zgadzają. Wykonałem 5 prób zapisu z samym serialize i tylko raz wystąpiły te same dane.

Pierwsze 3 próby mają ten sam układ danych, jednak w pierwszej próbie zamiast polskich znaków są krzaki

Kolejne dwie próby mają już zupełnie odmienne ułożenie danych.Wojciech Dasiukiewicz edytował(a) ten post dnia 07.05.11 o godzinie 23:28

konto usunięte

Temat: Dodawanie a aktualizacja

no to:

a) albo coś masz spieprzone w kodzie ;p
b) albo kolejność danych zwracanych w przypadku facebooka jest co jakiś czas różna? (w co wątpię) - jeśli tak, to licz jakąś sumę kontrolną z numerów ID i ją zapisuj do plików zamiast hasha z serializacji.

yoł.

konto usunięte

Temat: Dodawanie a aktualizacja

Dane z FB są częściowo wysłane losowo. Wystarczyło napisać funkcje sortującą po kluczach i jest gites już.

Następna dyskusja:

Aktualizacja zmodyfikowanyc...




Wyślij zaproszenie do