AJAX, JavaScript, PHP, EXEMPLE cu un contor!!
Daca ne-am propune sa implementam pe un site un contor, care sa fie in stare sa
poate sa retina un utilizator, sa stie de cate ori a vizitat acesta site-ul, si
sa poata sa retina si informatii despre numarul total de vizite, despre numarul
de vizitatori unic ai site-ului, atunci, am putea oferi o interfata evoluate, si
am putea sa ne dam seama si de succesul site-ului, precum si care este cel mai
numeros public, si mai als putem sa oferim peronalizari useri-lor, in functie
de preferintele lor : putem sa alegem sa afisam doar articole despre un anumit
subiect, sau sa schimbam anumite culori, sa aoprim volumul daca avem muzica, etc...
Aceasta este ceea ce ne propunem, si, este si pretextul pentru a folosi php,
javascript si ajax intr-o incercare de a obtine o interfata mai evoluata, dar si de
a prezenta posibila greseala pe care cei care sunt la inceputul programrii web
s-ar putea sa o faca, si anume folosirea neinspirata a limbajelor, de asa natura ca
o anumita parte din cod nu se executa.
Pentru ca JavaScript este un limbaj client-side, el nu poate executa in anumite
situatii ceea ce noi ne-am dori... aceste situatii sunt cele in care are nevoie de
date, altele decat ceva pe care le are furnizate de la ultima icarcare a paginii.
Deci, atunci cand de proiecteaza o solutie, un algoritm pentru o astfel de problema,
trebuie ales si limbajul, pentru ca s-ar putea sa fie cazuri cand cele client-side nu
au acces la toate datele necesare. Insa, acum AJAX aduce posibilitatea de a cere
asincron datele serverului, prin intermediul cererilor de tip XMLHttpRequest.
Am sa prezint, pentru mai multa claritate o varinata gresita, si apoi una corecta:
Varianta gresita :
session_start();
if(isset($_SESSION['views'])) $_SESSION['views']=$_SESSION['views']+1;
else $_SESSION['views']=1;
//Acest cod are ca scop determinarea unei incrementari unice pe sesiune
//(per accesare a site-ului) a variabilelor din baza de date care retin
//numarul de accesari totale si numarul de vizitatori unici.
//Apoi are loc conectarea la baza de date:
$con = mysql_connect("localhost","nume_site","parola");
if (!$con)
{
die('Could not connect:'.mysql_error());
}
mysql_select_db("nume_BD", $con);
//Apoi iata functiile pe care le folosesc:
var nav = navigator;
var username=getCookie('username');
function browser_infor ()
{
document.write("Browser:"+nav.appName");
document.write("Browser version:"+nav.appVersion");
document.write("Code:"+ nav.appCodeName");
document.write("Platform:"+nav.platform");
document.write("Cookies enabled:"+nav.cookieEnabled");
document.write("Your ip address is " + ip .");
}
//Aceasta este pentru afisarea datelor despre browserul
//user-ului, a IP-ului acestuia, etc.
function setCookie(c_name,value,expiredays)
{
var exdate=new Date();
exdate.setDate(exdate.getDate()+expiredays);
document.cookie=c_name+"="+escape(value)+
((expiredays==null)?"":";expires="+exdate.toGMTString());
}
//Aceasta seteaza valorile unui cookie. In acest, valoarea pe care un cookie
//o pastreaza este un cod unic pentru acel calculaor, care i-a fost atribuit
//la prima vizita pe site (in care nu a avut cookie). Acea valoare are o
//intrare in baza de date, careia ii poate fi asociata un nume, ii este
//asociata o valoare "uVisits", care reprezinta numarul de vizite de pana la
//momentul respectiv al acelui user, si un IP.
function getCookie(c_name)
{
if (document.cookie.length>0)
{
c_start=document.cookie.indexOf(c_name + "=");
if (c_start!=-1)
{
c_start=c_start + c_name.length+1;
c_end=document.cookie.indexOf(";",c_start);
if (c_end==-1) c_end=document.cookie.length;
return unescape(document.cookie.substring(c_start,c_end));
}
}
return "";
}
//Aceasta functie este cea care extrage valoarea pe
//care o pastreaza cookie-ul.
//Aici are loc o greseala de ...logica!!
//Daca PHP, fiind limbak server-side se executa inainte, si deci va
//avea rezultatele pe care o functie sau un script PHP le furnizeaza,
//sa fie incluse in ceea ce se va da mai departe browser-ului, care poate
//sa reprezinte si cod JavaScript, atunci inseamna ca nu poti introdude
//cod PHP in functiile JavaScript, pentru ca acest cod nu se va
//executa niciodata fara AJAX. SI iata exemplul functiei de mai jos:
//Se insereaza in pagina care va fi livrata serverului functia updatare()
//care este in JavaScript, insa codul PHP nu apuca sa mai fie rulat
//atunci cand dorim noi...pentru ca se afla in mijlocul
//functiei JavaScript, iar JavaScript ruleaza doar pe client.
function updatare()
{
var da = Number('<?php $r =$_SESSION['views']; echo $r; ?>');
if (da == 1)
if (username != null && username != "") // daca are cookie
{
//incrementez numarul de vizite ale acestui unic vizitator
mysql_query("UPDATE User SET uVisits = uVisits+1 WHERE UserId = 'username'",$con);
}
else // daca nu are cookie
{
aici determin ce uID ii aloc....
var ID_atribuire = Number('<?php $result = mysql_query("SELECT varValue FROM Variable WHERE varName =
'Visitators'",$con);$row = mysql_fetch_array($result); echo $row[varValue]; ?>');
ID_atribuire= ID_atribuire + 1;
setCookie('username',ID_atribuire,3);
//incrementarea nr de vizitatori unici din BD si inserarea in BD a userului cu uID-ul sau unic
<?php
mysql_query("INSERT INTO User (UserID, uVisits) VALUES ('ID_atribuire', 1)",$con);
mysql_query("UPDATE Variable SET varValue=varValue+1 WHERE varName='Visitators'",$con);
?>
}
//incrementarea de page requests din BD si incrementarea de vizite ale userului (dupa uID)
<?php
mysql_query("UPDATE Variable SET varValue=varValue+1 WHERE varName='PageRequests'",$con);
?>
}
}
//Aceasta functie are rolul de a incrementa o data pe sesiune numarul de
//"PageRequests" (numarul total de accesari) si numarul de vizite al
//userului respectiv pe site, iar daca userul este nou (nu are cookie - fie
//pt ca nu a mai fost pe site, fie pentru ca a sters cookie-ul) atunci ii
//trimite un cookie si insereaza o intrare in baza de date
//cu numarul "uID", care identifica unic acel user, si seteaza
//valoarea "uVisits" pentru acel user la 1.
function checkCookie()
{
if (username!=null && username!="")//userul a mai fost - are cookie
{
//determinam numele
var numele = ('<?php $rez = mysql_query("SELECT uName FROM User WHERE UserID = 'username'", $con); $row = mysql_fetch_array($rez); echo $row[uName]; ?>');
//determinam nr vizitei
var nr_viz = Number('<?php $rez = mysql_query("SELECT uVisits FROM User WHERE UserID = 'username'", $con); $row =
mysql_fetch_array($rez); echo $row[uVisits]; ?>');
if (numele != null)
document.write("Bine ati venit,"+username+"!");
else
document.write("Bine ati venit!");
document.write("Sunteti la a "+nr_viz+" vizita!");
}
else //userul nu a mai fost pe aici pt ca nu are cookie
{
aici determin ce uID ii aloc....
document.write("Bine ati venit!");
}
}
//Aceasta functie face afisarea numarului de vizite pe care
//userul respectiv l-a avut pana la momentul respectiv, pe
//langa un mesaj de bunvenit.
function functie_cookie (nume_utilizator)
{
aici sterg primul cookie facut cu nume generic
<?php
mysql_query("UPDATE User SET uName = 'nume_utilizator' WHERE UserId = 'username'",$con);
?>
}
//Aceasta functie asociaza in baza de date un nume, in cazul in care
//utilizatorul vrea sa furnizeze unul cu uID-ul userului.
function ajaxFunction(){
var ajaxRequest;
try{
// Opera 8.0+, Firefox, Safari
ajaxRequest = new XMLHttpRequest();
} catch (e){
// Internet Explorer Browsers
try{
ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try{
ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e){
// Something went wrong
alert("Your browser broke!");
return false;
}
}
}
//Create a function that will receive data sent from the server
ajaxRequest.onreadystatechange = function(){
if(ajaxRequest.readyState == 4){
var afisare = ajaxRequest.responseText;
return afisare;
}
}
ajaxRequest.open("GET", scriptul.php, true);
ajaxRequest.send(null);
//Aceasta este functia ajax care are rolul de a prelua numarul de page
//requests(numarul total de vizite al site-ului). Functia aceasta este
apelata din interiorul unui timer, pentru ca updatatea valorii afisate
pe site sa se faca periodic, la 30 de secunde.
In concluzie, desi aici erau cateva idei bune, cum ar fi cea care permite
identificarea userului dupa cookie si care determina daca userul respectiv
a mai fost pe pagina sau aceea este prima lui incaracare, folosind sesiuni,
implemnatarea nu este buna din punctul de vedere al combinarii intre functiei
JavaScript in care se alfa si cod PHP. DOAR invers are sens(functii JavaScript
inauntrul celor PHP), asa insa nu are!
Iata acum si ideea corecta:
si:
< ?php
session_start();
$con = mysql_connect("localhost","nume_site","parola");
$db = mysql_select_db("numebd", $con) or die("Could not connect to the database: $sqlDatabase!");
// nu are cookie, deci pp ca nu a mai fost niciodata pe site //Alocam un nou id pentru acest utiliator in baza de date if (!isset($_COOKIE["userId"])){
$sql = "SELECT MAX(UserID)+1 as UserID FROM user";
$query = mysql_query($sql) or die($sql);
$row = mysql_fetch_object($query);
$newUserID = $row->UserID;
//Il inregistram in baza de date
$sql = " INSERT INTO user(`UserID`, `uName`, `uVisits`, `uIP`) VALUES ('".$newUserID."','unknown','1','".$_SERVER["REMOTE_ADDR"]."')";
$query = mysql_query($sql) or die($sql);
//Setam cookiurile
setcookie( "interweb_userId", $newUserID, time()+60*60*24*7);
setcookie( "interweb_visitsNo", 1, time()+60*60*24*7);
//Incrementam numarul de vizite totale
$sql = " UPDATE variable SET varValue = varValue + 1 WHERE varName='PageRequests' ";
$query = mysql_query($sql) or die($sql);
//Marcam in sesiune faptul ca acest utilizator a trecut pe aici (macar 1 pagina)
$_SESSION["userId"] = $newUserID;
//Incrementam numarul de user unici
$sql = " UPDATE variable SET varValue = varValue + 1 WHERE varName='Visitators' ";
$query = mysql_query($sql) or die($sql);
//Afisam ceva pentru utilizator
echo "Bine ati venit pe siteul InterWeb !
Sunteti la prima vizita.";
}
// are cookie, deci a mai fost pe siteelse {
if ( !isset($_SESSION["userId"]) ){ // nu are sesiune, deci e prima accesare din vizita aceasta
//Setam sesiunea
$_SESSION["userId"] = $_COOKIE["userId"];
//Actualizam numarul de vizite din cookie
setcookie( "visitsNo", $_COOKIE["visitsNo"] + 1, time()+60*60*24*7 );
//Actualizam numarul total de vizite din baza de date
$sql = "UPDATE variable SET varValue = varValue + 1 WHERE varName = 'PageRequests' ";
$query = mysql_query($sql) or die($sql);
//Actualizez numarul de vizite ale acestui user
$sql = "UPDATE User SET uVisits = uVisits + 1 WHERE UserID = '".$_COOKIE["userId"]."' ";
$query = mysql_query($sql) or die($sql);
}
?>
In timp ce o functie AJAX se va ocupa doar sa afiseze intr-un div dorit, ceea ce retuneaza codul PHP de mai sus.