Posiadam procedurę w SQLu który po odpaleniu przez polecenie
CODE
CALL f_statystyki_inc()
zwiększa licznik IDX w danym dniu miesiąca.
Teraz takie polecenie chciałbym zastosować w skrypcie PHP jako licznik odwiedzin strony w danym dniu oraz dynamiczne generowanie wykresu z historią odwiedzin w dniach poprzednich na dole stronki - jako obrazek.
Ot mniej więcej coś takiego:
1) wywołanie mysqli_query() z procedurą
2) <BODY>stronka WWW
3) statystyka generowana dynamicznie w dniach od 01 dnia miesiąca do aktualnego dnia miesiąca w postaci wykresu słupkowego pokazująca liczbę odwiedzin strony razem z AKTUALNYM wejściem</BODY>
Teraz sedno - jak taki skrypt zachowa się przy sytuacjach wyścigu (tzn. gdy stronkę jednocześnie odwiedza np. 16 osób jednocześnie), oraz co będzie działo się gdy użytkownik (lub użytkownicy) wywoła skrypt np między 23:59:59 a 00:00:01 (lub 00:00:00), oraz gdy wywoła (wywołają) skrypt równo o 00:00:00. Czyli czy coś się nie popsuje ... w bazie danych (chodzi o prawidłowe wyniki) ;-]
A i czy takie rozwiązanie jest w miarę wydajne (oczywiście nie spodziewam się jakichś masakrycznie liczebnych odwiedzin) ;-)
Może i jestem jakimś NIELECZONYM PARANOIKIEM; również zżera mnie ciekawość :-)
Widziałem rozwiązania z jakimiś plikami, ale wydaje mi się to - raczej - nieoptymalne...
Oto kod (prostej) procedury wraz z tabelą:
CODE
CREATE TABLE enter(
data DATE NOT NULL,
idx INT UNSIGNED NOT NULL
);
delimiter ////
DROP PROCEDURE IF EXISTS f_statystyki_inc////
CREATE PROCEDURE f_statystyki_inc ()
BEGIN
START TRANSACTION;
SET @d = CURDATE();
SET @a = NULL;
SET @b = NULL;
SET @idx = NULL;
SELECT data INTO @a FROM enter WHERE data=@d;
SELECT idx INTO @b FROM enter WHERE data=@d;
IF NOT(STRCMP(@a,@d)) THEN
UPDATE enter SET idx=@b+1 WHERE data=@d;
ELSE
INSERT INTO enter(data,idx) VALUES (CURDATE(),0);
END IF;
SELECT YEAR(data) AS Y,MONTH(data) AS M,DAY(data) AS D,idx AS ENTER FROM enter;
COMMIT;
END;
////
delimiter ;
data DATE NOT NULL,
idx INT UNSIGNED NOT NULL
);
delimiter ////
DROP PROCEDURE IF EXISTS f_statystyki_inc////
CREATE PROCEDURE f_statystyki_inc ()
BEGIN
START TRANSACTION;
SET @d = CURDATE();
SET @a = NULL;
SET @b = NULL;
SET @idx = NULL;
SELECT data INTO @a FROM enter WHERE data=@d;
SELECT idx INTO @b FROM enter WHERE data=@d;
IF NOT(STRCMP(@a,@d)) THEN
UPDATE enter SET idx=@b+1 WHERE data=@d;
ELSE
INSERT INTO enter(data,idx) VALUES (CURDATE(),0);
END IF;
SELECT YEAR(data) AS Y,MONTH(data) AS M,DAY(data) AS D,idx AS ENTER FROM enter;
COMMIT;
END;
////
delimiter ;
Pozdrawiam,
Konrad.