Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [mysql] Jeśli rekord nie istnieje to INSERT..., a jeżeli istnieje to "nic"
kukix
post 7.03.2007, 16:59:43
Post #1





Grupa: Zarejestrowani
Postów: 600
Pomógł: 2
Dołączył: 1.09.2002
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Witam.
Natrafiłem ostatnio na stronie php5_pl , na skrypt który pokazuje liczbe osób online...

Przerobiłem odrobine skrypt...(dodalem moją funkcje sql() zamiast mysql_query() )...

  1. <?php
  2. sql('DELETE FROM tabela WHERE DATE_ADD(`time`, INTERVAL 1 MINUTE) < NOW()');
  3. sql('INSERT INTO tabela VALUES("'.$_SERVER['REMOTE_ADDR'].'", NOW())');
  4. sql('UPDATE tabela SET `time` = NOW() WHERE `ip` = '.$_SERVER['REMOTE_ADDR']);
  5. $mysql_result = sql('SELECT COUNT(*) FROM tabela;');
  6. $osoby_online =mysql_result($mysql_result, 0, 0);
  7. ?>

Problem w tym, że funkcja pokazuje komunikat "Duplicate entry"...
Jest mozliwośc zlożenia zapytania w ten sposób, aby w przypadku, gdy rekord z takim kluczem istnieje, żeby polecenie "INSERT" ne bylo realizowane?
Czy pozostaje tylko zastosowac zapytanie "SELECT" sprawdzające czy klucz nie istnieje?


P.S. W takim razie po co ten kawalek kodu: "if (!mysql_affected_rows()) "...?

Ten post edytował kukix 7.03.2007, 17:00:44
Go to the top of the page
+Quote Post
SongoQ
post 7.03.2007, 20:12:12
Post #2





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


Cytat
Pierwszym zapytaniem usuwamy wszystkie rekordy, ktre są starsze niż 1 minuta, a następnie próbujemy dodać nowy rekord zawierający adres IP klienta i aktualną datę. W przypadku, gdy rekord nie został dodany (co jednoznacznie mówi nam o tym, że rekord o podanym adresie IP już istnieje w bazie), dokonujemy modyfikacji istniejącego rekordu zmieniając pole 'time' na aktualną datę i czas.


No jest ok bo w przypadku niedodania rekordu bo wymuszenie integralnosci przez PK na ip powoduje blad i warunek if (!mysql_affected_rows()) jest spelniony wiec logicznie aktualizuje rekord. Juz pomijajac ze moze byc blad podczas dodawania.

Zapis z DELETE, SELECT a potem INSERT lub UPDATE jest dluzszy i moze byc mniej optymalny chociasz to jest tabela userow on line gdzie tak naprawde trudno zeby jakis serwis osiagnal wielka ilosc.

Jedni to takich rzeczy uzywaja select a potem insert update albo insert i lapanie bledu lub sprawdzanie ile rekordow zmodyfikowal.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 17.06.2025 - 06:17