Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] Jeśli rekord nie istnieje to INSERT...
Forum PHP.pl > Forum > Bazy danych
kukix
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()) "...?
SongoQ
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.
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.