Peršokti į turinį
  • ŽAIDIMAI
  • , ŽAIDIMAI
  • ŽAIDIMAI

PHP - PDO - vartotojų lankomumo statistikos rinkimas


NTQ

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 2213 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Recommended Posts

Aprašymas:

Parašiau šios temos alternatyvą tiems, kurie nenori naudoti „MySQLi“ ir verčiau rinktųsi „PDO“.

Šis nedidelis papildinys suteikia galimybę rinkti įvairius vartotojų duomenis, sudaryti lankomumo statistiką ar integruoti į naudotojų sistemą. Visa informacija bus saugoma duomenų bazėje.

Tipas: tik unikalūs įrašai išsaugomi, siekiant neapkrauti duomenų bazės, tačiau galite redaguoti ir pasidaryti pagal save.

Pakeitimai:

  • Pakeistas „MySQLi“ į „PDO“, automatiškai kodo struktūra.

Papildoma informacija:

  • Pagal numatytus nustatymus, didžiausias vartotojų skaičius yra 2,147,483,647 (įskaitant paspaudimų, tai taikoma individualiai). Jeigu Jūsų tai netenkina, galite bet kada pasikeisti;
  • $setting_1“ - nurodo, kiek sekundžių turi praeiti, kai vartotojas bus pažymėtas kaip neaktyvus (atsijungęs). Numatytasis parametras yra 300 sekundžių, t. y. 5 minutės;
  • kada sėkmingai paleisite skriptą, rekomenduoju uždėti komentarą ant tos kodos dalies, kuri atsakinga už lentelės egzistavimo tikrinimą ir sukūrimą (pažymėta specialiu komentaru: „- Patikrinimas prasideda -“);
  • galite sujungti šią lentelę su naudotojų lentele (po pirminio rakto pridėti: „visitor_id“).

 

Ekrano užfiksavimai:

1. Vaizdas, paleidus pirmąjį kartą skriptą: lentelė nebuvo rasta, todėl automatiškai sukuriama.

sg0.png

2. Vaizdas duomenų bazėje: vartotojas apsilanko pirmąjį kartą.

sg1.png

3. Vaizdas duomenų bazėje: vartotojas apsilanko antrąjį kartą.

sg2.png

4. Vaizdas duomenų bazėje: praeina daugiau nei 300 sekundžių, vartotojas atžymimas.

sg3.png

 

Kodas:

*ištraukimas iš duomenų bazės yra integruotas, tačiau pateiksiu dar „SQL“ kodą (po skripto).

<?php

# Duomenų bazės prisijungimo informacija.
define('DATABASE', 'mysql');
define('DATABASE_SERVER', '127.0.0.1');
define('DATABASE_USER', 'root');
define('DATABASE_PASSWORD', '');
define('DATABASE_NAME', 'database');

try {
	# Prisijungimas prie duomenų bazės.
	$pdo_connect = new PDO(DATABASE.':host='.DATABASE_SERVER.';dbname='.DATABASE_NAME.';charset=latin1', DATABASE_USER, DATABASE_PASSWORD, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_NUM, PDO::ATTR_EMULATE_PREPARES => 1));
} catch (PDOException $e) {
	# Prisijungimas nepavyko, atvaizduojame klaidą.
	echo 'Script cannot connect to the database server.<br>'.$e->getMessage();
	exit;
}

# - Patikrinimas prasideda -

# Patikriname, ar reikiama („visitors“) lentelė egzistuoja.
$pdo_select = $pdo_connect->query("SELECT `table_name` FROM `information_schema`.`tables` WHERE `table_schema` = '".DATABASE_NAME."' && `table_name` = 'visitors';");

# Jeigu ne, galime tęsti.
if ($pdo_select->rowCount() === 0) {

# Nurodome „SQL“ kodą, kurį reikės įvykdyti.
$pdo_code = '
CREATE TABLE IF NOT EXISTS `visitors` (
`id` int(75) PRIMARY KEY AUTO_INCREMENT,
`referer` varchar(250) NOT NULL,
`first_page` varchar(250) NOT NULL,
`last_page` varchar(250) NOT NULL,
`clicks` int(75) NOT NULL,
`online` tinyint(1) NOT NULL,
`language` varchar(150) NOT NULL,
`ip` varchar(150) NOT NULL,
`first_browser` varchar(250) NOT NULL,
`last_browser` varchar(250) NOT NULL,
`browser_language` varchar(250) NOT NULL,
`track_user` tinyint(1) NOT NULL,
`first_visit_time` int(75) NOT NULL,
`last_visit_time` int(75) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
';

try {
	# Mėginame įvykdyti užklausą. Galima įvykdyti daugiau „SQL“ užklausų negu vieną.
	$pdo_connect->exec($pdo_code);

	# Reikia pauzės, jog spėtų sukurti lentelę(-es), jeigu perkrautumėte anksčiau laiko, lentelė nebūtų pabaigta ir skriptas parodytų klaidą. Gali taip ir nenutikti dėl vienos.
	sleep(5);

	echo 'Required database table was successfully created.';
	exit;
} catch (PDOException $e) {
	# Nepavyko įvykdytos nurodytos užklausos, nurodome atitinkamą pavadinimą.
	echo 'Critical error. Script failed to create a required table.';
	exit;
}

# Atlaisviname atmintį.
unset($pdo_code);

}

# Uždarome užklausą.
$pdo_select = null;

# - Patikrinimas baigiasi -

# Įvairūs tikrinimai, siekiant gauti tikslų protokolą adresą.
if (isset($_SERVER['HTTP_CLIENT_IP']) && !empty($_SERVER['HTTP_CLIENT_IP'])) {
	$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
	$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
	$ip = (isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '0.0.0.0');
}

# Patikriname, ar gautas protokolo adresas yra teisingas, priešingu atveju - atvaizduojame savo rezultatą. 
$ip = (filter_var($ip, FILTER_VALIDATE_IP) ? '0.0.0.0' : $ip);

# Žemiau ištraukiame, ar vartotojas buvo nukreiptas iš kito puslapio (jeigu ne, rezultatas bus „null“), naršykles informaciją, nurodytą kalbą (ilgesnio ir trumpesnio tipo), apsaugome gautą informaciją.
$referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : 'null');

$referer = htmlspecialchars($referer, ENT_QUOTES, 'UTF-8');
$referer = strip_tags($referer);
$referer = trim($referer);

$browser = htmlspecialchars($_SERVER['HTTP_USER_AGENT'], ENT_QUOTES, 'UTF-8');
$browser = strip_tags($browser);

$browser_language_1 = htmlspecialchars($_SERVER['HTTP_ACCEPT_LANGUAGE'], ENT_QUOTES, 'UTF-8');
$browser_language_1 = strip_tags($browser_language_1);
$browser_language_2 = substr($browser_language_1, 0, 2);

# Patikriname, ar varotojas su naršymo srautu siunčia prašymo nesekti. Galite atsižvelgti į šį prašymą.
if (isset($_SERVER['HTTP_DNT']) && $_SERVER['HTTP_DNT'] == 1) {
	$track_user = 0;
} else {
	$track_user = 1;
}

# Kiek laiko turi praeiti, kada vartotojo būsena pasikeis į neprisijungusį. Laikas yra nurodomas sekundėmis.
$setting_1 = 300;

# Failo kelias (pilnasis), apsaugome.
$file_path_1 = htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES, 'UTF-8');
$file_path_1 = stripslashes($file_path_1);
$file_path_1 = strip_tags($file_path_1);
$file_path_1 = trim($file_path_1);

# Gauname tik failo pavadinimą.
$filename_1 = pathinfo($file_path_1)['basename'];

try {
	# Pasirenkame vartotoją pagal interneto protokolo adresą.
	$pdo_select = $pdo_connect->query("SELECT COUNT(`id`) FROM `visitors` WHERE `ip` = '$ip';");

	# Jeigu užklausa pavyko, galima tęsti. Vėliau ištraukiame rezultatą ir jeigu jis yra lygus vienui, informaciją atnaujiname, jei ne - įterpiame vartotojo duomenis.
	if ($pdo_select->fetch()[0] == 1) {
		$pdo_query = $pdo_connect->prepare("UPDATE `visitors` SET `last_page` = '$filename_1', `clicks` = `clicks` + 1, `online` = 1, `language` = '$browser_language_2', `last_browser` = '$browser', `browser_language` = '$browser_language_1', `track_user` = '$track_user', `last_visit_time` = UNIX_TIMESTAMP() WHERE `ip` = '$ip';");

		$pdo_query->execute();
	} else {
		$pdo_query = $pdo_connect->prepare("INSERT INTO `visitors` (`referer`, `first_page`, `last_page`, `clicks`, `online`, `language`, `ip`, `first_browser`, `last_browser`, `browser_language`, `track_user`, `first_visit_time`, `last_visit_time`) VALUES ('$referer', '$filename_1', 'null', 1, 1, '$browser_language_2', '$ip', '$browser', 'null', '$browser_language_1', '$track_user', UNIX_TIMESTAMP(), UNIX_TIMESTAMP());");

		$pdo_query->execute();
	}

	# Uždarome užklausą.
	$pdo_select = null;
} catch (PDOException $e) {
	echo 'Critical error.';
	exit;
}

# Atliekame būsenos atnaujinimą, jeigu praėjo 300 arba daugiau sekundžių.
$pdo_connect->exec("UPDATE `visitors` SET `online` = 0 WHERE `online` = 1 && `last_visit_time` <= UNIX_TIMESTAMP() - $setting_1;");

# Uždarome prisijungimą prie „MySQL“ duomenų bazės.
$pdo_connect = null;

?>

 

„SQL“ kodas:

Metodas (visų prisijungusių vartotojų suskaičiavimas):

SELECT COUNT(`id`) FROM `visitors` WHERE `online` = 1;

Metodas (vartotojo duomenų ištraukimas):

Nenaudoti * (žvaigždutės), net jeigu ir norite pasirinkti visus laukelius, priešingu atveju - sumažės našumas.

Laiko pateikimas su įskaitomu formatu:

SELECT FROM_UNIXTIME(`last_visit_time`, '%Y-%m-%d'), FROM_UNIXTIME(`last_visit_time`, '%H:%i:%s') FROM `visitors`;

 

Informacijos iš duomenų bazės ištraukimas (pavyzdys):

<?php

$pdo_select = $pdo_connect->prepare("SELECT `id`, `referer`, `first_page`, `last_page`, `clicks`, `online`, `language`, `ip`, `first_browser`, `last_browser`, `browser_language`, `track_user`, FROM_UNIXTIME(`first_visit_time`, '%Y-%m-%d %H:%i:%s'), FROM_UNIXTIME(`last_visit_time`, '%Y-%m-%d %H:%i:%s') FROM `visitors`;");

$pdo_select->execute();

if ($pdo_select->rowCount() > 0) {
	while ($row = $pdo_select->fetch()) {
		echo $row[0].'<br>';
		// $row[1], $row[2] ir t. t.
	}
} else {
	echo 'Rezultatų nėra.';
}

$pdo_select = null;

?>
Nuoroda į komentarą
Dalintis per kitą puslapį

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 2213 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Prisijungti prie diskusijos

Palikti atsakymą galite iš karto, o užsiregistruoti vėliau. Jeigu jau turite paskyrą mūsų forume, Prisijunkite.

Svečias
Atsakyti šioje temoje...

×   Įklijuotas tekstas turi teksto formatavimą.   Pašalinti teksto formatavimą

  Galimi tik 75 veidukai.

×   Nuoroda buvo automatiškai įterpta.   Įterpti nuorodą paprastai

×   Jūsų ankstesnis pranešimas buvo atkurtas.   Išvalyti redaktorių

×   Jūs negalite įkelti nuotraukas tiesiogiai.Įkelkite arba įdėkite nuotraukas iš URL.

Skelbimai


×
×
  • Sukurti naują...