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

PHP - Svetainėje prisijungę svečiai (Duomenų bazė: MYSQL).


Vetex

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 2469 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

Sveiki,

 

Sukursiu dar vieną pamoką, kuri manyčiau pravers kiekvienam puslapiui. Kiek iš pavadinimo supratote, bus kuriamas skriptas, kuris atvaizduoja kiek šiuo metu yra svetainėje lankytojų.

 

Taigi, pradedame:

 

Jums reikės duomenų bazės MYSQL, kuri saugos serverio duomenis.

 

Jei neturite MYSQL duomenų bazės vartotojo:

Susikuriame naują MYSQL duomenų bazės vartotoją (naudosime kaip pavyzdį hostinger.lt hostinga).

1. Įrašome duomenis, kurie bus reikalingi prisijungiant prie MYSQL duomenų bazės - http://prntscr.com/61trfe.

2. Spaudžiame sukurti mygtuką, kai sėkmingai bus sukurta, Jus apie tai informuos - http://prntscr.com/61ts1u.

3. Atsidarome MYSQL su PHPMYADMIN valdymu - http://prntscr.com/61tsn7.

4. Įveskite savo MYSQL vartotojo duomenis, kadangi aš naudoju hostinger.lt, man Jų sistema prijungia automatiškai.

5. Pradedame kurti 2 lenteles:

5.1. Pirmoji lentelė bus pavadinimu visitors_online - stulpelių skaičius 2 - http://prntscr.com/61tuzi

5.2. Stulpeliai tokie - http://prntscr.com/629jp4.

6. Antroji lentelė bus pavadinimu visitors_ip - stulpelių skaičius 3 -http://prntscr.com/61txbp

6.1. Stulpeliai tokie - http://prntscr.com/629iya.

 

Pabaigta su MYSQL.

 

Jei jau esate susikūrę - pereikite prie šio veiksmo:

 

Skripto atnaujinimai:

1. įdėtas papildomas kodas, kuris gauna Lietuvos laiko zona.

2. Lentelių stulpeliai.

3. Pataisytas rezultatas (pakeista nuotrauka, dėl MAX - kiti suprato, kad tai uždėtas kažkoks limitas, dabar parašiau ,,Daugiausiai buvo").

<!-- Su TAGS (<?php ?>) pranešame serveriui, kad naudosime PHP kalbą -->

<?php

# Gauname Lietuvos laiko zona. - ATNAUJINIMAS (2015-02-07)
date_default_timezone_set("Europe/Vilnius");

# Prisijungiame prie MYSQL duomenų bazės. Naudosime MYSQLi prisijungimą.

$mysqli = new mysqli("localhost","db","password","db");

# Jei prisijungti nepavyko, sustabdome visą procesą su exit komandą.
if ($mysqli->connect_errno)
{
	echo "<strong>Mysqli can't connect to database for this reason:</strong> " . $mysqli->connect_error;
	exit();
}

# Gauname lankytojo IP adresą.
if (isset($_SERVER['REMOTE_ADDR']) AND preg_match('|^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$|', $_SERVER['REMOTE_ADDR'])) { $ip = $_SERVER['REMOTE_ADDR']; }

/* Galima naudoti ir šį kodą, kad gautumėte lankytojo IP adresą, bet gausite tik 50%. Su viršutiniu kodu, gaunate 100% lankytojų IP adresus, todėl būsite saugūs nuo 0.0.0.0... Yra ir kitų būdu gauti lankytojo IP adresą, bet rekomenduoju viršutinį.
*/
# $ip = $_SERVER['REMOTE_ADDR'];

# Gauname Timestamp reikšme.
$time = time();

/*
Tikriname IP adresą, jei lankytojo IP nėra įrašytas į duomenų bazę ,,Visitors_ip", tada įrašome. Jei lankytojo IP adresas jau yra įrašytas, tada atnaujiname vartotojo laiką.
*/

$mysqli_select = $mysqli->query("SELECT * FROM `visitors_ip` WHERE ip = '$ip'");

if (mysqli_num_rows($mysqli_select) > 0)
{
	$mysqli_result = $mysqli->query("UPDATE `visitors_ip` SET time = '$time' WHERE ip = '$ip'");
}
else
{
	$mysqli_result = $mysqli->query("INSERT INTO `visitors_ip` (ip, time) VALUES ('$ip', '$time')");
}

/*
Tikriname IP adresą, jei lankytojo IP nėra įrašytas į duomenų bazę ,,Visitors_online", tada įrašome. Jei lankytojo IP adresas jau yra įrašytas, tada atnaujiname vartotojo laiką.
*/

$mysqli_select = $mysqli->query("SELECT * FROM `visitors_online` WHERE ip = '$ip'");

if (mysqli_num_rows($mysqli_select) > 0)
{
	$mysqli_result = $mysqli->query("UPDATE `visitors_online` SET time = '$time' WHERE ip = '$ip'");
}
else
{
	$mysqli_result = $mysqli->query("INSERT INTO `visitors_online` (ip, time) VALUES ('$ip', '$time')");
}

# Jei lankytojas nepadaro jokio veiksmo puslapyje per 5 minutes (300 s), vartotojo IP adresas yra ištrinamas iš prisijungusių lankytojų sąrašo.
$mysqli_result = $mysqli->query("DELETE FROM `visitors_online` WHERE time < $time-300");

Suskaičiuojame visus IP adresus iš ,,Visitors_online" ir ,,Visitors_ip":

if ($mysqli_result = $mysqli->query("SELECT * FROM `visitors_ip`"))
{
    $mysqli_count = $mysqli_result->num_rows;

    $mysqli_count_visitors = $mysqli_count;

    $mysqli_result->close();
}

if ($mysqli_result = $mysqli->query("SELECT * FROM `visitors_online`"))
{
    $mysqli_count = $mysqli_result->num_rows;

    $mysqli_count_online_visitors = $mysqli_count;

    $mysqli_result->close();
}

define("VISITORS", "$mysqli_count_visitors");
define("ONLINE", "$mysqli_count_online_visitors");

# Atvaizduojame:
echo "Svetainėje naršo:  ".ONLINE."  Daugiausiai buvo: ".VISITORS."";
# Baigiame prisijungimą prie MYSQL duomenų bazės ir nutraukiame visus procesus.
$mysqli->close();

?>

Be komentarų:

<?php

date_default_timezone_set("Europe/Vilnius");

$mysqli = new mysqli("localhost","db","password","db");

if ($mysqli->connect_errno)
{
	echo "<strong>Mysqli can't connect to database for this reason:</strong> " . $mysqli->connect_error;
	exit();
}

if (isset($_SERVER['REMOTE_ADDR']) AND preg_match('|^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$|', $_SERVER['REMOTE_ADDR'])) { $ip = $_SERVER['REMOTE_ADDR']; }

# $ip = $_SERVER['REMOTE_ADDR'];

$time = time();

$mysqli_select = $mysqli->query("SELECT * FROM `visitors_ip` WHERE ip = '$ip'");

if (mysqli_num_rows($mysqli_select) > 0)
{
	$mysqli_result = $mysqli->query("UPDATE `visitors_ip` SET time = '$time' WHERE ip = '$ip'");
}
else
{
	$mysqli_result = $mysqli->query("INSERT INTO `visitors_ip` (ip, time) VALUES ('$ip', '$time')");
}

$mysqli_select = $mysqli->query("SELECT * FROM `visitors_online` WHERE ip = '$ip'");

if (mysqli_num_rows($mysqli_select) > 0)
{
	$mysqli_result = $mysqli->query("UPDATE `visitors_online` SET time = '$time' WHERE ip = '$ip'");
}
else
{
	$mysqli_result = $mysqli->query("INSERT INTO `visitors_online` (ip, time) VALUES ('$ip', '$time')");
}

$mysqli_result = $mysqli->query("DELETE FROM `visitors_online` WHERE time < $time-300");

if ($mysqli_result = $mysqli->query("SELECT * FROM `visitors_ip`"))
{
    $mysqli_count = $mysqli_result->num_rows;

    $mysqli_count_visitors = $mysqli_count;

    $mysqli_result->close();
}

if ($mysqli_result = $mysqli->query("SELECT * FROM `visitors_online`"))
{
    $mysqli_count = $mysqli_result->num_rows;

    $mysqli_count_online_visitors = $mysqli_count;

    $mysqli_result->close();
}

define("VISITORS", "$mysqli_count_visitors");
define("ONLINE", "$mysqli_count_online_visitors");

echo "Svetainėje naršo:  ".ONLINE."  Daugiausiai buvo: ".VISITORS."";

$mysqli->close();

?>

Rezultatas:

---> http://prntscr.com/62bgfw

 

Sėkmės!

 

Pagarbiai, Vetex.

Redaguota , nario Vetex
  • Teigiamai 8
  • Neigiamai 2
Nuoroda į komentarą
Dalintis per kitą puslapį

if (isset($_SERVER['REMOTE_ADDR']) AND preg_match('|^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$|', $_SERVER['REMOTE_ADDR'])) { $ip = $_SERVER['REMOTE_ADDR']; }

GhQVBgm.png

 

is sito kodo matosi, kad kituose tavo koduose turi but kaip prisikta SQLi, siulau pasidometi prepared statmentais, taip pat siulau pasidometi UNIX_TIMESTAMP SQL'e

  • Teigiamai 1
  • Neigiamai 1
Nuoroda į komentarą
Dalintis per kitą puslapį

(redaguota)

Pamoka atnaujinta - 2015-02-07.


hh įdomiai :D per foto rašo max 10 tai čia ribojimus net įdėjai ? :D

 

Ne. Max reiškia kiek buvo puslapyje. Surenkami visi IP adresai iš ,,Visitors_ip". Galima taip pasidaryti svetainės statistiką. Pataisiau ,,MAX" į ,,Daugiausiai buvo". Dėkoju visiems už pastabas, padariau kelis mažus skripto atnaujinimus.

Jei turėsite daugiau pastabų, praneškite - bus patobulinta.

 

---------------------------------------------

Kita pamoka bus puslapiavimas su MYSQLi - pavyzdys bus pateiktas su nuotrauka, tik be jokio  CSS stiliaus.

Redaguota , nario Vetex
  • Teigiamai 1
Nuoroda į komentarą
Dalintis per kitą puslapį

  • Parašė po 4 mėnesių...

Visiškai nesąmoninga ir bevertė pamoka. Kodėl?

Daug kartų patikimesnis ir jokių MySQL prisijungimų nereikalaujantis yra kitas kelias.

 

Daug kur ( IPB, Xenforo, wordpress ) naudojamas lankytojų skaičiavimas yra SESIJŲ būdu. Kadangi kai kiekvienas žmogus lankosi svetainėje jeigu yra vykdoma sesija ( session_start() ) lankytojo duomenys automatiškai saugojami tam tikroje direktorijoje. 

<?php
	// Pradiniai nustatymai
	session_start(); 
	define("DELSIMO_LAIKAS", 3); // laikas minutėmis,

	// Funkcija kuri išgauna prisijungusius
	function getOnlineUsers(){ 

		if ( $directory_handle = opendir( session_save_path() ) ) { 
			$count = 0; 
			while ( false !== ( $file = readdir( $directory_handle ) ) ) { 
				if($file != '.' && $file != '..'){ 
					if(time()- fileatime(session_save_path() . '\\' . $file) < DELSIMO_LAIKAS * 60) { 
						$count++; 
					} 
				} 
			}
			closedir($directory_handle); 

			return $count; 

		} else { 
			return false; 
		} 

	} 

	echo 'Šiuo metu naršo: ' . getOnlineUsers() . 'narių(-iai)<br />';

?>

Kodas pasiremtas iš: http://www.devarticles.com/c/a/PHP/The-Quickest-Way-To-Count-Users-Online-With-PHP/1/

 

Testai:

 

Session metodas užtrunka: 0.7ms

MySQL metodas užtrunka: 14.3 ms

 

Taigi sesijų metodas yra beveik 20 kartų greitesnis negu MySQL ir nereikalauja tokios apkrovos kaip MySQL.

  • Teigiamai 3
Nuoroda į komentarą
Dalintis per kitą puslapį

  • Parašė po 2 metų...

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 2469 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!

Svečias
Ši tema yra užrakinta.
  • Šiame puslapyje naršo:   0 nariai

    • Nėra registruotų narių peržiūrinčių šį forumą.

Skelbimai


×
×
  • Sukurti naują...