• Acasă
  • Despre noi
  • Autori
  • Mărturii
  • Arhivă
  • Trimite Articol
  • Contact

WORLDIT

Lumea în 1 și 0.

  • Știri
    • Tehnologie
    • Tehnologie mobilă
    • Securitate
    • Developers
    • Știință
    • Benzi desenate
    • Jocuri
    • Intern
  • Tehnic
    • Browser
    • C#
    • C/C++
    • Challenge
    • HTML/CSS
    • Javascript, Ajax, jQuery
    • Open Source
    • PHP
    • Python
    • Securitate IT
    • Socializare
    • WordPress
    • Altele
  • Recenzii
  • Interviuri
  • Evenimente

Cum sa faci un chat fara refresh ( folosind PHP & Ajax) ?

45
  • Publicat de Andrei Avădănei
  • în HTML/CSS · Javascript, Ajax, jQuery
  • — 8 dec., 2009 at 6:44 pm

how-to3[1]Observam crestere si o dezvoltare tot mai mare a proiectelor web incercand sa ajunga toate pe noul „web 2.0”.Aceasta dorinta intalneste una noua si anume cea de a updata anumite portiuni din pagina fara ca utilizatorul sa fie nevoit sa faca acest lucru.Un bun exemplu in acest caz este bine-cunoscutul Twitter.Acesta are posibilitatea de a adauga ciripiturile fara a fi nevoie de un refresh al paginii.De asemenea multe din actiuni sunt similare : cautarea,autentificarea etc etc.Toate aceste lucruri creaza o viteza si experienta de navigare placuta utilizatorului.

Astazi noi vom incerca sa reproducem o actiune simpla asemanatoare cu cele de la Twitter,insa nu vom incerca sa reproducem nici una dintre acestea.

Practic vom avea o mica baza de date si cun formular HTML in care vom simula discutiile avute intr-un chat.Acest chat va face cereri regulate la o baza de date incercand sa extraga noile comentarii ce au aparut in chat.El va modifica un div si adauga noile discutii deasupra celor deja existente.
Este unul din cele mai bune exemple de a aprofundare a acestui principiu dinamic al paginilor web.

Ce tehnologii web folosim?

Prima tehologie web de care vom avea nevoie este batranul HTML.Acesta ne va ajuta la crearea unei interfete suficient de intuitiva si de simpla pentru a nu ridica probleme nici unui incepator ce a studiat HTML-ul 2-3 zile.Vom avea nevoie de o baza date ce va contine un tabel pentru a stoca informatiile ce le primim de la cei ce vor purta discutiile in chat.Vom folosi o baza de date ce o gasim pe orice server decent si anume o baza de date MySQL.Interogaririle ce la care vom supune baza de date sunt bazice si vor include selectii,stergeri,adaugari de „linii” in baza de date.Aceste interogari precum si alte prelucrari le vom face in cateva fisiere PHP.Pana aici , practic am prezentat doar tehnologiile ce sunt clasice intr-un website obisnuit.Pentru a prelua si a reincarca o anumita sectiune cu continut nou provenit din baza de date, va trebui sa introducem o tehnologie noua ce are la bazaJavascript : Ajax.Aceasta tehnologie va face cereri regulate la anumite fisiere PHP si va edita continutul anumitor taguri HTML, actualizand continutul acestora.

Rezultat

Am pregatit doua imagini facute paralel,una din Mozilla Firefox iar cealalta din Chrome pentru a vedea care va fi rezultatul la care se va ajunge in urma acestui articol. 😀
firefox chrome

Formularul HTML

<html>
  <head>
    <title>Chat Box - Tutorial in care invatam cum sa aplicam Ajax si PHP pentru o pagina dinamica</title>
  </head>
  <body text="#66FF33" OnLoad="trimiteCMD('arata');">

    <table align="center" width="50%" border="1" cellspacing="0" cellpadding="0">
      <tr>
        <td>
            <div id="msg"></div>
        </td>
      </tr>
      <tr>
        <td align="center">
            <form name="chatbox" method="post" onSubmit="return false">
              <textarea id="msgtext" name="mesaj" cols="50" rows="3" onFocus="verif_msg(this.value);" onBlur="clr_msg(this.value);">Mesajul tau aici.</textarea><br><br>
              <button id="send" onClick="trimiteCMD('trimite', document.getElementById('msgtext').value);">Trimite</button>
            </form>
        </td>
      </tr>
    </table>
  </body>
</html>

Tabelul MySQL din baza de date MySQL

Acest tabel trebuie pus intr-o baza de date MySQL de care vom avea nevoie la stocarea tuturor mesajelor primite de la cei care chatuiesc. 🙂

CREATE TABLE `mesaje` (
  `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  `nume` CHAR( 255 ) NOT NULL ,
  `mesaj` TEXT NOT NULL ,
  `timp` INT NOT NULL
  ) ENGINE = MYISAM ;

Codul PHP pentru actualizare si adaugare a comentariilor?

Fisierul config.php
In acest fisier vor trebui facute singurele modificari pentru a putea lucra pe serverul dumneavoastra.Trebuie sa configurati accesul la baza de date MySQL creata anterior.De asemenea au loc si deschiderea sesiunile precum si crearea unei variabile ce ne asigura ca suntem unde trebuie! 🙂

<?php
session_start();
if(!defined('INTERN'))
{
	define('INTERN',TRUE);
	mysql_connect('server','user','parola') or die('Nu m-am putut conecta la serverul MySQL.');
	mysql_select_db('baza de date') or die('Nu m-am putut conecta la baza de date MySQL.');
}
?>

Fiserul adauga.php
Acest fisier va adauga un mesaj nou $_GET[‘mesaj’] provenind de la $_GET[‘user’] si va returna ultimile mesaje din baza de date noi.

<?php
include('config.php');
if(!defined('INTERN')) die();

if(isset($_GET['CMD']) && $_GET['CMD'] == 'trimite' && isset($_GET['nume'],$_GET['mesaj']))
{
	header("Expires: Mon, 26 Jul 2999 05:00:00 GMT" );
	header("Last-Modified: " . gmdate( "D, d M Y H:i:s" ) . "GMT" );
	header("Cache-Control: no-cache, must-revalidate" );
	header("Pragma: no-cache" );
	header("Content-Type: text/xml; charset=utf-8");

	$user  = htmlentities($_GET['nume'],ENT_QUOTES);
	$mesaj = htmlentities($_GET['mesaj'],ENT_QUOTES);
	
	$query = mysql_query('INSERT INTO `mesaje` (`nume`,`mesaj`,`timp`) VALUES ("'.$user.'","'.$mesaj.'","'.time().'")');
	
	$result = ($query) ? '1' : '0';
	?>
		<root>
         	<cmd><?php echo $_GET['CMD'];?></cmd>
        	<status><?php echo $result; ?></status>
            <?php include('ultimile.php'); ?>          
        </root>    
    <?php
}

?>

Fiserul last.php
Acesta returneaza ultimile mesaje ale cititorului curent.

 <?php
include('config.php');
if(isset($_GET['CMD']) && $_GET['CMD'] == 'arata')
{
	header("Expires: Mon, 26 Jul 2999 05:00:00 GMT" );
	header("Last-Modified: " . gmdate( "D, d M Y H:i:s" ) . "GMT" );
	header("Cache-Control: no-cache, must-revalidate" );
	header("Pragma: no-cache" );
	header("Content-Type: text/xml; charset=utf-8");
	
	?>
       <root>
           <cmd> <?php echo $_GET['CMD'];?> </cmd>
           <status>1 </status>
           <?php include('ultimile.php'); ?>          
       </root>    
    <?php
}
?>

Fiserul ultimile.php
Fisierul ultimile.php este defapt cel care stabileste care mesaje sa le afiseze.Daca e prima cerere va returna ultimile 10 mesaje, in caz contrar va afisa doar ce a aparut nou de la ultima cerere.Acest ultim moment la care s-a facut verificarea este stocat intr-o variabila globala de tip SESSION.

<?php
if(!defined('INTERN')) die();

$time = time();
$time = isset($_SESSION['lastcheck']) && is_numeric($_SESSION['lastcheck']) ? $_SESSION['lastcheck'] : 0;
 
$_SESSION['lastcheck'] = time();
 
if($time == 0)
{
	$query = "SELECT * FROM `mesaje` ORDER BY `timp` DESC LIMIT 0,10";
}
else
{
	$query = "SELECT * FROM `mesaje` WHERE timp >=".$time." ORDER BY `timp` DESC";
}

$int = @mysql_query($query);

$result = ($query) ? '1' : '0';
?>

<statusMesaje><?php echo $result; ?></statusMesaje>
<mesaje>
<?php 
while($row = @mysql_fetch_array($int))
{
	?>
    <mesaj id="<?php echo $row['id']; ?>">
    	<nume><?php echo $row['nume']; ?></nume>
        <msg><?php echo $row['mesaj']; ?></msg>
        <timp><?php echo gmdate('D, d M Y H:i:s',$row['timp']); ?></timp>
    </mesaj>
    <?php
}
?>
</mesaje>

Codul AJAX pentru a face cererile dinamic?

//verifica daca avem vreun mesaj
function verif_msg(data)
{
	if(data=='Mesajul tau aici.')
	{
	    document.getElementById('msgtext').value='';
	}
}
//curata mesajul
function clr_msg(data)
{
	if(data == '')
	{
	    document.getElementById('msgtext').value='Mesajul tau aici.';
	}
}

//cream un obiect Http(acesta ne va ajuta sa lucram cu cereri Ajax)
//el incearca sa creeze obiectul pentru diverse versiuni de Browser
function creazaObiectHttp() 
{
	if (window.XMLHttpRequest) return new XMLHttpRequest();
	else if(window.ActiveXObject) return new ActiveXObject("Microsoft.XMLHTTP");
	else 
	{
	    document.getElementById('msg').innerHTML='Status: Nu am putut crea obiectul XML Http.' +
	    'Va rugam frumos schimbati browserul.';
	}
}
	
	
var mTimer; //timerul ce face regulat cereri de noi mesaje
var receiveReq = creazaObiectHttp();   //cream obiectul
var randomUser = Math.floor((Math.random() * (2000-1000+1))+1000); //numele utilizatorului

//functia principala ce trimite mesajele catre diverse fisiere php
function trimiteCMD(cmd, data) 
{
	if(cmd=='trimite' && data=='Mesajul tau aici.')
	{
		alert('Te rog scrie un mesaj!')
	} 
	else 
	{
               //daca nu este trimis nici un pachet acum si nu este nici unul in decurs
		if (receiveReq.readyState == 4 || receiveReq.readyState == 0)
		{
			var file,param;
			if(cmd=='trimite') 
			{
				file  = 'adauga.php';  //fisierul ce trebuie prelucrat + parametri
				param = 'CMD=trimite&nume=user' + randomUser + '&mesaj=' + data;	
				clearTimeout(mTimer);//inchidem toate cererile existente
				document.getElementById('msgtext').value='Mesajul tau aici.';
			}
			else if(cmd=='arata')
			{
				file  = 'last.php';
				param = 'CMD=arata'; 
				clearTimeout(mTimer); //deschidem o noua cerere peste 5 secunde sa vedem daca mai exista mesaje noi
				mTimer = setTimeout("trimiteCMD('arata', '');",5000);
			}
			
			receiveReq.open("POST", file, true); //facem cererea 
			receiveReq.setRequestHeader('Content-Type','application/x-www-form-urlencoded');//setam headere
			receiveReq.onreadystatechange = handleCMD;//functia ce va procesa cererile
						
			receiveReq.send(param); //trimitem parametrii
		}
	}
}

//functie ce returneaza true daca pagina curenta a fost descarcata corect si complet
function check_state()
{
	if (receiveReq.readyState == 4) 
		if (receiveReq.status == 200)
			return "True";
}
//procesam mesajele primite de la fisierele PHP
function handleCMD() 
{
   var resultState = check_state();
   if (resultState == "True")
   {                  
	    var chat_div = document.getElementById('msgtext');
	    xmldoc       = receiveReq.responseXML;
		var cmd      = xmldoc.getElementsByTagName('cmd');
		var status   = xmldoc.getElementsByTagName('status');
		
		if(cmd[0].firstChild.nodeValue == 'trimite')
		{
                       //daca s-a adaugat mesajul nou afisam asta utilizatorului
			if(status[0].firstChild.nodeValue == '1')
			{
				document.getElementById('err').innerHTML = 'Mesajul a fost trimis.';
			}
			else
			{
                       //in caz contrar afisam mesajul corespunzator
				document.getElementById('err').innerHTML = 'Nu am putut trimite mesajul.';
			}
                       //repornim cererile regulate o data la 5 secunde
			mTimer = setTimeout("trimiteCMD('arata', '');",5000);
			setTimeout('document.getElementById("err").innerHTML = "";',3000);
		}
		else if(cmd[0].firstChild.nodeValue == 'arata')
		{
			//nimic
		}
		
		var  status   = xmldoc.getElementsByTagName('statusMesaje');
		//daca avem mesajele trimise ok le procesam si le afisam utilizatorului
                if(status[0].firstChild.nodeValue == '1')
		{ 
			var msg        = xmldoc.getElementsByTagName('mesaje');
			var msgs_nodes = msg[0].getElementsByTagName('mesaj');
			for(i = 0; i < msgs_nodes.length; i++)
			{ //mesajul i
				var userNode = msgs_nodes[i].getElementsByTagName('nume');
				var bodyNode = msgs_nodes[i].getElementsByTagName('msg');
				var timeNode = msgs_nodes[i].getElementsByTagName('timp');
				
				var add      = '<small>[ ' + timeNode[0].firstChild.nodeValue + ' ]</small>';
				add         += ' ' + userNode[0].firstChild.nodeValue + ' ';
				add         += ' ' + bodyNode[0].firstChild.nodeValue + '';
				//il adaugam inaintea celor deja existente
				document.getElementById('msg').innerHTML = add + document.getElementById('msg').innerHTML;
				add = '';
			}
		}
		else
		{//in caz contrar afisam o eroare
			document.getElementById('err').innerHTML = 'Nu am putut primi noile mesaje.';
			setTimeout('document.getElementById("err").innerHTML = "";',3000);
		}	   
	}
}

Sa le unim pe toate

Am creat o arhiva in care am unit toate aceste fisiere, pentru a face un sistem complet functionabil.Exista si un fisier sql.sql care are baza de date MySQL in cazul in care nu aveti rabdare sa o luati de aici.Descarcati arhiva,configurati fisierul config.php si adaugati tabelul in baza de date si dupa puteti testa.Fisierele nu sunt comentate,singurele comentarii find puse aici,asa ca veti fi nevoiti sa nu sariti peste pasul de a analiza codul in care doriti sa invatati ce am facut.

Pe scurt am interceptat pachetele sub forma de mesaje XML de la serverul PHP ce le-a generat cu ajutorul fisierelor ultimile.php si adauga.php respectiv last.php. Am tratat obiectul ca unul HTML si am extras din el pe rand noile mesaje,daca acestea erau.Codul pare mare datorita faptului ca am incercat sa tratez si majoritatea erorilor de baza, sperand ca asa nu veti avea probleme.

Concluzii

Desi, acest articol nu se referea neaparat la cum se lucreaza cu Ajax si PHP, acest tutorial este unul din cele mai bune exemple ce pot fi facute de un incepator.Nu trebuie sa te sperii de marele cod, este doar o impresie, in browser acesta pare mai complex decat este.Daca vei dori sa intelegi acest articol , iti sugerez sa-l descarci pe calculator si sa stai cu browserul langa tine pentru a citi explicatiile.

De asemenea, in acest „mic proiect” , am folosit doar cereri bazate pe POST, si le-am omis intentionat din discutie pe celelalte.Daca doriti cateva exemple si folosind cereri Ajax dar bazate pe argumente GET lasati un comentariu si in maxim cateva ore voi veni cu explicatiile si exemplele. 🙂

Intrebari?

😀 … nimic ?

Etichete: ajaxchat fara refreshchat onlineHTMLjavascriptPHPprogramaretutorial

— Andrei Avădănei a scris 1246 articole

Andrei scrie pe worldit.info din vara lui 2011. Este fondatorul Asociatiei Centrul de Cercetare in Securitate Informatica din Romania - CCSIR si coordoneaza DefCamp, cea mai importanta conferinta de securitate informatica & hacking din Europa Centrala si de Est. Andrei ofera in cadrul Bit Sentinel servicii de securitate informatica, penetration testing, security management, recuperarea de pe urma unui atac cibernetic, training-uri si workshop-uri.

  • Articolul anterior DiRT 2 – primul joc dupa moartea lui Colin McRae tribut
  • Articolul următor Salutare!

45 Comentarii

  1. Avadanei Andrei spune:
    aprilie 28, 2010 la 11:19 pm

    Eu am inteles aluzia la matrici – asa sunt privite outputurile cel mai usor al acestora. 🙂

  2. tutancamon spune:
    aprilie 29, 2010 la 1:20 am

    Pentru Cornescu ANDREY:
    1) Mi-a venit rau cand am fost la tine pe sit si am vazut o coloana care se numeste „Ethical Haching”.
    2) SQL este mai mult decat un limbaj de interogare.
    3) Demonstratie ca o baza de date este o matrice de matrici:
    Bazele de date sint bazate pe formulare.
    Formularele sunt tablouri de cuvinte.
    Matricile sunt tablouri.
    Deci bazele de date sunt bazate pe matrici de cuvinte.
    4) O matrice de matrici de matrici de matrici … de matrici,
    O galaxie de planete de continente de tari de orase de cladiri de incaperi de dulapuri de sertare de formulare.
    Se observa posibilitatea de a se pune in evidenta structuri arborescente.

    Sa revin la PHP. Punctul de intrare in acest limbaj este lucrul cu fisierele si lucrul in interiorul fisierelor. Asta este tot o revelatie de a mea.

    😉

    • Avadanei Andrei spune:
      aprilie 29, 2010 la 4:45 pm

      1. Ai scris gresit. Nu inteleg ce e rau in asta. 😕
      2. Nu ai dreptate. Este chiar un limbaj de interogare.
      3. Renunta la aceasta idee, este incorecta. Difera modul cum sunt afisate informatiile fata de ce e o baza de date in realitate.

  3. tutancamon spune:
    aprilie 29, 2010 la 7:33 pm

    3) Barosane, ai auzit de ‘cartoteca’ ? Evident ca da. Asta este o baza de date. Cartotecile contin cartele, puse prin sertare, care sunt puse prin dulapuri, …
    ‘Bien sure’ caca rtelele nu seamana intr-u totul cu un tablou ordonat pe linii si coloane.
    😉
    2) SQL asta si inseamna: Limbaj de interogare. Dar o baza de date nu numai ca este interogata, dar mai este solicitata sa efectueze si alte operatiuni … Deci, cu SQL faci mult mai multe chestii decat sa chestionezi o baza de date …
    1) Este o tampenie sa zici ‘Ethical Haching’ atunci cand efectuezi operatii neautorizate si deci ilegale. Unde este acel ‘Ethical’ ? Poate are alt sens decat cel larg cunoscut de toata lumea. Poate ca este vorba de etica borfasilor. De ce nu, atunci si o estetica a ciordelii.
    Propun o noua disciplina: ‘Estetical Ciordeisan’
    🙂

    Aaaasa. Deocamdata ma documentez despre PHP ca o versiune de BASIC. Apoi voi trece la sistematizarea materialelor; si apoi voi studia sistematic acest limbaj in jurul caruia ma fatai de cativa ani fara sa-l pricep.

    MySQL va fi atacat dupa ce voi avea sentimentul ca pot face niscaiva programe in PHP.

    Sunt in cautare de editoare scrise numai in PHP, fara nicio urma de utilizare a vreunei baze de date.
    Ceva in genul editoarelor cu care scrii comentariile prin forumuri.
    😉

  4. Avadanei Andrei spune:
    aprilie 29, 2010 la 7:41 pm

    E ultimul comentariu care il voi scrie despre acest subiect.

    1. Prin definitie, SQL este un limbaj de interogare (ce presupune, cum ai spus si tu) mai multe chestii : adaugare, stergeri, editari, trunchieri, dropuri etc etc. Nu compari viata reala cu o baza de date si nu faci asemanari. E complet aiurea sa faci asta din punctul de vedere al programatorului care vrea sa inteleaga cu adevarat acest limbaj.
    2. Nu este o tampenie sa zici ethical hacking deoarece hacking-ul prin definitia lui corecta nu este nimic non-etic, doar ca mass-media a reusit sa dezinformeze o populatie intreaga. Chiar si subiectele tratate pe worldit legate de securitate se incadreaza in acea sectiune.
    3. Daca dumneata nu ai inteles cele doua limbaje (SQL(MySQL) si PHP) de ce vii cu afirmatii ce nu le stapanesti? Eu cu Andrei avem in total (daca nu ma insel) aproape un deceniu de Web Development deci putem face unele afirmatii ceva mai bine. 🙂

  5. tutancamon spune:
    aprilie 29, 2010 la 8:01 pm

    Dom’le eu nu am pregatire de informatician. Ca sa inveti un limbaj, trebuie mai intai sa cunosti tot soiul de alte chestii. Sincer sa fiu, nu imi place teoria si aparatul algebric cu care se prezinta limbajele. Informatica este un pachet de discipline relativ abstracte.

    Nici eu nu prea mai am ce sa scriu, caci deja am scris esentialul.
    Este irelevant faptul ca aveti experienta in domeniul WEB, daca nu puteti sa vulgarizati abstractiunile pe care le cunoasteti si le utilizati in profesia Dv.

    Discutia de aici mi-a fost utila deoarece mi-am schimbat punctul de vedere asupra PHP in relatie cu HTML.

    Iar despre chestia cu chatul fara refresh, voit sau nu, dumneata ai atacat o chestiune extrem de utila pentru aplicatii de comunicare instantanee, adica despre chaturi.

    Spor la treaba.

  6. Avadanei Andrei spune:
    aprilie 29, 2010 la 8:32 pm

    Ce am vrut sa sugerez prin experienta e ca aceste concluzii nu sunt deduse in cateva zile (saptamani), ci multa vreme si ti-am mai spus o data : pregatirea de informatician consta in studiu individual, asa ca tine incercamsa intelege cum functioneaza.

    Ce am incercat eu sa iti explic este ca o data privite gresit niste informatii, in timp vei avea de suferit. Adica, doar timpul de executie (complexitatea) unui cod este la fel de importanta ca toata aplicatia in sine. O data ce nu stii aceste lucruri cum sa le definesti in timpi nu prea e bine ca te vei izbi de probleme. 🙂

  7. tutancamon spune:
    aprilie 29, 2010 la 8:50 pm

    Barosane,
    Fati cont la mine in forumas. Åži mai discutam despre chaturi si alte chestii. Eu nu am interes pentru toate materialele de pe acest sit, deoarece ma depaseste ca sunt cam batranel, 48 ani, mersi.
    O sa creez o categorie noua dedicata lui http://www.worldit.info.

    Eu delirez pe teme de chaturi 3d.

    Hai ca iti fac si un cadou, din domeniul tau, asa ca promotie :
    http://securitate.md/blog/masuri-de-protectie-impotriva-atacurilor-brute-force/2010/03/24/
    http://securitate.md/blog/metode-de-contraatac-la-atacurile-asupra-aplicatiilor-web/2010/04/01/

    Hai in Spatiul Cibernetic si iti voi da Puterea Realitati Virtuale.
    Vino in Lumea Inteligentei Artificiale.
    ‘Multi-User Worlds’

  8. Claudiu spune:
    aprilie 30, 2010 la 2:36 am

    Eu nu mai inteleg nimic din comentariile de aici, de cateva zile tot urmaresc reply-urile si ma chinui sa nu intervin. Asa ca, ma bag si eu, cu un reply foarte lung (poate mai bine scriam articol).

    Bazele de date sunt organizate in mare parte asemenea unui filesystem, deci pot fii reprezentate ca un arbore, cum a zis Andrei si Andrei 😛 Acum, evident ca nu este necesara cunoasterea mecanismului interior al unui motor de baze de date, dar este util, mai ales atunci cand ne dam cu parerea. E ca si cum ai lucra cu jQuery si nu ai stii ca e defapt o librarie Javascript, nu un limbaj de programare.

    Ca sa argumentez structura arborescenta a bazelor de date, putem sa ne gandim putin cum am crea noi un sistem de baze de date la nivel teoretic. Ai folosi matrici? Ok, o matrice de tabele ar fii o baza de date. O tabela, ar fii si ea o matrice, dar una dubioasa, care pe fiecare coloana poate avea alt tip de date. Deci alocam memorie dinamic pentru o matrice de matrici care stocheaza orice tip de date si are tot o dimensiune generata dinamic. Ok, se poate face, dar daca vreau sa extrag date din 2 tabele pe baza unui ID, cate elemente ale matricilor parcurg? Dar daca vreau sa leg 10 tabele de alte 10 query-uri din care extrag date din alte 5 tabele?

    In timp ce intr-o matrice trebuie sa „orbecai” pana gasesti un element, pe un arbore poti sa-l parcurgi pe o cale stiuta si sa ajungi la rezultatul dorit mult mai repede. De asemenea, un arbore nu stocheaza informatie inutila. Astfel, consideram o baza de date nodul parinte, iar celelalte tabele noduri copii. Fiecare tabela (nod) are cate un nod pentru fiecare rand, care are noduri pentru fiecare coloana. Este un exemplu extrem de simplu de layout pe un N-ary tree, care este o structura de date destul de simpla. In proiecte reale se folosesc structuri mult mai complexe, dar eficiente. Pentru detalii, wikipedia: http://en.wikipedia.org/wiki/Database#Storage_structures

    Ca ultima parte pe tema asta, matricile sunt structuri de date de baza, utile in situatiile pentru care au fost concepute, nicidecum implementate in proiecte pentru ca se poate sau pentru ca asa vad eu outputul datelor.

    Ethical hacking e unul dintre cele mai bune lucruri care se intampla pe www. Sunt firme specializate pe asa ceva iar hacking nu e acelasi lucru cu cracking, desi multa lume ar crede asta. Un developer nu va face niciodata o aplicatie cat de cat complexa fara bug-uri, oricat ar testa-o, iar asta se aplica si pe www si in proiecte desktop. Faptul ca niste oameni cu experienta imi iau aplicatia la maruntit si imi arata unde am gresit e de laudat, am primit si eu mail cu parametrii vulnerabili in site si am fost foarte fericit, putea sa profite cineva de treaba asta. Ii doresc omului tot binele din lume si un job super ok pe Q&A 😛

    PHP nu genereaza HTML, genereaza ce vrei tu, ca si developer, de la imagini la pdf-uri. Daca iti pui ambitia iti creeaza si *.avi-uri dar nu cred ca se merita. Asta inseamna ca lucreaza cu niste stream-uri pe server si le trimite inapoi clientului. Dat fiind ca de obicei clientul este un browser trimitem inapoi continut care este parsat ca si html, pentru ca header-ele trimise informeaza browser-ul ca ceea ce primeste e document PHP. Asta nu inseamna ca PHP creeaza HTML, cel mai safe e sa ne rezumam la fisiere. La asta se descurca cel mai bine, e normal, pentru ca asta e targetul, dar asta nu inseamna ca un web-service PHP , un crawler sau alta aplicatie PHP care nu output-eaza HTML nu e de laudat, dimpotriva. Un limbaj construit pentru HTML e Javascript, care a fost dezvoltat de Netscape din cate imi aduc aminte, in orice caz nu de Java cum mai umbla vorba. Foarte bine a zis Andrei, legat de codul PHP care nu are legatura cu output-ul.

    E ideal sa dezvolti aplicatii pe o structura MVC (model view controller), ceea ce permite schimbarea modalitatii de afisare a informatiilor fara modificari (sau fara modificari majore) in back-end-ul aplicatiei, sau mai bine zis, in codul aplicatiei in sine. Nu numai ca se poate schimba layout-ul unui website cu usurinta, se poate schimba chiar si motorul/libraria de randare (in special in cazul aplicatiilor desktop). Asta inseamna ca, fara efort, pot sa afisez blogul ca si document XML daca vreau, sau ca HTML sau chiar *.pdf (cu ceva mai multa munca). Oricum ar fii, esenta codului, core-ul, ramane neschimbat.

    SQL e limbaj de interogare, iar motorul, serverul de baze de date e responsabil cu interpretarea limbajului, prelucrarea datelor si outputul lor in urma unui query. SQL, ca si PHP, este parsat de catre server, printr-un interpretor. Faptul ca SQL este un limbaj puternic, nu inseamna ca putem sa-l ridicam mai sus de cat este; serverul SQL este cel care merita ridicat in slavi pentru lucrul cu datele iar SQL pentru ca ne face viata mai usoara.

    Sper ca nu am suparat pe nimeni, sunt primele ganduri care imi trec la ora asta prin cap si nu o fac cu rautate, discutia mi se pare chiar interesanta 😛

  9. tutancamon spune:
    aprilie 30, 2010 la 10:09 am

    Claudiu a scris : [bla bala bla …]
    BlaxxunRomania raspunde: Prietene drag, nu am ce discuta cu tine. Ciumetii aia de pe http://www.skullbox.info/ m-au banat de idioti ce sunt.
    La fel, sunt banat pe multe forumuri romanesti de catre niste papagali care cica au facut scoala de programatori, stiu sa vehiculeze niste concepte despre limbaje, dar in fond sunt mai prostanaci decat niste amarati de oligofreni.
    Tati, da cautare cu Google dupa ‘BlaxxunRomania’ si ai sa vezi cu ce ‘developeri’ am avut de-a face.
    Singura scuza a acestor ‘genii’ este ca probabil sunt niste utilizatori care nici macar buletin de identitate nu au. Adevarul este ca programatorii adevarati nu pierd vremea cu participarea la discutii pe forumuri.

    Deci cam acestea am avut de scris vis a vis de mesajul tau lipsit de consistenta.

    Il rog pe mesterul Avadanei sa lase aceasta replica. Multumesc anticipat.

    • Avadanei Andrei spune:
      aprilie 30, 2010 la 11:25 am

      Cu parere de rau, dar e ultimul mesaj ce ti-l accept legat de acest subiect. Ti-a fost explicat tot extrem de clar atat de mine, cat si de Claudiu (el facand un rezumat extrem de bun). Ideea e ca te crezi mult prea superior si refuzi sa accepti parerile. Cei de pe skullbox sunt persoane foarte destepte si chiar foarte calme. Din moment ce ai fost banat acolo inseamna ca exista motive intemeiate pentru care au facut asta.

      Daca vei continua cu mesajele pe worldit in care incerci sa-ti exprimi conceptiile gresite si refuzi parerile corecte a celor care se pricep, vei ajunge sa fii banat si aici.

      P.S : Am cautat sugestia ta pe Google si chiar nu am gasit nimic interesant care sa dovedeasca superioritatea ta. Stiu, esti un geniu neinteles. 🙂

  10. Claudiu spune:
    aprilie 30, 2010 la 9:23 pm

    De unde apareti fratilor?

    @Tutancamon Asa este, cum zici tu 🙂

  11. tutancamon spune:
    aprilie 30, 2010 la 9:37 pm

    Evident ca este cum zic eu. Cand o sa iesi din formalismul cu care ai invatat, o sa vezi ca este asa cum zic eu. Interesant este cum de se poate ca un tip care se presupune ca este inteligent, sa scrie un asa comentariu absolut descalificant pentru el. Mie mi se rupe daca incerci sa faci mistou de mine. Mi se falfaie daca sunt banat ca urmare a reactiilor mele la mesajele balamucite care imi sunt adresate.
    Vezi ca am pus blogul acesta la mine in forumel, Daca incerci sa gandesti mai mult cand scrii referitor la persoana mea, s-ar putea ca sa iti observ si partile pozitive pe care le ai …

    Capiscii ?

  12. tutancamon spune:
    mai 2, 2010 la 4:51 am

    Asadar, exemplul tau de chat fara refresh, mai precis tehnica de reinprospatare fara a se folosi explicit refreshul, o voi aplica in chatul expus de mine la http://www.talkmaster.net/showthread.php?270-microChat-without-none-DataBase&p=1755#post1755 . Chatul este luat de la http://www.phptoys.com/e107_plugins/content/content.php?content.84 .
    As sublinia si existenta unei rutine extrem de uile pe care o folosesti cu succes in paginile de web atunci cand prezinti coduri sursa. Am scris despre ea la http://www.web3d-fr.com/foroum/index.php?showtopic=5224 . Evident, sursa originala a codului este la http://alexgorbatchev.com/wiki/SyntaxHighlighter .

    Ca sa fiu inteles, de ce apreciez asa de mult acest articol, puteti vizita un chat 3d care nu a reusit sa scape de dezagreabilul efect de refresh. Chatul se gaseste la
    http://3dchat.3d-check.com/
    http://robotica.3d-check.com/
    http://X-ROBOT.COM/
    http://www.eee-book.com/
    http://www.cyberhenge.ca/

    Tipul nu vrea sa ne dea fisierele active ( cred ca sunt in PERL ) ale acestui chat, dar am gasit ceva semanator cu ce are el, am pus mai sus adresele acestea:
    Serverul dezarhivat este aici: http://www.c3.hu/~szmz/vrml/advancedVRML2/
    Iar serverul arhivat este aici: http://sites.google.com/site/arickserver/advancedVRML2.tar.
    Am comentat despre acest caz la http://www.seamless3d.com/forum/viewtopic.php?f=1&t=461 , si la mine in http://vrmlserver.xooit.com/t390-CYBER-23.htm#p888.

    Cam acestea le-am avut de scris deocamdata referitor la utilitatea pentru mine a acestui articol. Astept eventualele colaborari .

  13. Claudiu spune:
    mai 3, 2010 la 1:41 am

    Primul link e un script de chat facut in pauza mare la scoala sau in pauza de tigara la servici, ~20 min daca vrei sa-l faci dragut, nu vad relevanta lui la articolul de fata fiind cu totul si cu totul altceva. Urmeaza scriptul de syntax highlight care nu are nici in clin nici in maneca cu articolul, dar scriptul e ok, il folosesc si eu pe blogul personal.

    Celelalte 5 site-uri arata foarte 90’s, nu am reusit sa ma loghez pe nici unul din ele (nici macar cu IE, asa cum cereau) si din nou, nicio legatura cu articolul.

    Concluzia e, cum se face ca aduni cele mai proaste resurse de pe net si le trantesti aici? Ce vrei sa demonstrezi defapt?

  14. tutancamon spune:
    mai 3, 2010 la 7:24 am

    Primul link duce la un server-client elementar care poate fi util celor care nu au nevoie de aplicatii mai complexe. Relevanta postarii acestui link aici consta in prezentarea sa ca posibil beneficiar al tehnicii de refresh fara ‘blink’ prezentat aici. Intre timp, adica aseara am gasit un server-client care are refreshul facut numai cu PHP, nu foloseste javascript.
    Am subliniat existenta aplicatiei de colorare a cuvintelor cheie, pentru a fi informati cei care inca nu stiu de unde sa o ia.

    Tehnologia VRML este veche, siturile care o utilizeaza, sunt de moda veche, la fel ca si proprietarii lor. Cine nu reuseste sa se logheze acolo, probabil ca au IP interzise. Situl este accesibil, cel putin de catre mine. Legatura prezentarii acelor chaturi 3d cu subiectul articolului, este ca chaturile alea au ‘blink’, deoarece refreshul este zgomotos; prin folosirea refreshului silentios le-ar spori atractivitatea.

    Am ajuns sa adun cele mai proaste resurse de pe internet, deoarece resursele de calitate, au fost retrase de pe situri ca urmare a actiunilor intreprinse de hackerii romani, rusi si africani. Incet incet retele de internet romanesti vor fi izolate . O sa vizitam adrese de internet care se afla doar in interiorul granitelor tarisoarei noastre dragi .

    Eu tie nu am ce sa iti demonstrez.
    Scuteste-ma de comentarii.

  15. Claudiu spune:
    mai 3, 2010 la 9:45 am

    Succes in continuare atunci, sper ca din ciorba aia sa iasa pana la urma ceva, cu totii am trecut prin asta, mai mult sau mai putin.

  16. tutancamon spune:
    mai 3, 2010 la 10:09 am

    Vad ca Avadanei te lasa sa-ti faci mendrele …

    Il anunt ca nu mai urmaresc acest topic, si nici acest blog.
    De asemenea il anunt ca am sters categoria care o creasem pentru a scrie in ea despretinerii romani cu preocupari in domeniul informatici.

  17. Avadanei Andrei spune:
    mai 3, 2010 la 2:51 pm

    Sincer sa fiu nu vad un motiv pentru care sa intervin in discutia voastra. Faptul ca domnul Claudiu vine cu argumente pertinente nu intra in categoria injuriilor si a altor chestii. Atata timp cat discutia este profesionista toate comentariile vor fi acceptate, cat despre tine, stii cum se cheama ceea ce faci tu? Iti spun eu : pupincurism, te comporti ca un copil de 2 ani care daca vede ca nu are dreptate isi ia jucariile si pleaca sau incearca sa atraga atentia prin nu stiu ce link-uri care nici nu m-am obosit sa le accesez (inclusiv acea sectiune despre ca tot vorbesti tu). Daca doreai doar sa promovezi tinerele talente nu veneai repede la mine sa ma anunti ca a aparut acea sectiune.

    Comentariile tale intra in moderare automat dar nu vor mai fi acceptate de acum. Nu esti suficient de destept incat sa accepti un sfat si acum intelege toata lumea motivele pentru care toate comunitatile din tara nu te accepta. Nici aici nu esti bine primit daca nu incerci sa interactionezi cu noi intr-un mod profesionist si sa accepti ideea ca exista oameni care gandesc ceva din puncte obiective si nu din ce viseaza noaptea. 🙂

  18. Mihai spune:
    iulie 14, 2010 la 1:18 pm

    Este extraordinar tutorialul insa m-ar interesa securitatea scriptului. Este posibil ca cineva sa se folosesca de javascript si httprequest pentru a obtine date din sql?

    Multumesc

  19. Andrei Avadanei spune:
    iulie 14, 2010 la 1:46 pm

    Salut Mihai,

    Fii sigur ca nu. In general ce vei gasi pe blog este verificat cu mare atentie in privinta securitatii. Dupa cum vezi, exista si in aceasta situatie diverse filtre care iti garanteaza faptul ca informatiile nu vor fi publice – un bun exemplu este parsarea informatiilor primite prin htmlentities().

  20. petre spune:
    aprilie 2, 2011 la 6:30 pm

    Foarte interesant articol! Desigur nu atat articolul cat aplicatia in sine pe care am de gand sa o dezvolt – un joc interactiv de yams – pe care demult tot vreau sa-l termin, dar gandul de a folosi refreshuri … 😎

« Comentarii mai vechi
Comentarii mai noi »

  • Facebook

    WorldIT.info
  • Ultimele Atacuri Cibernetice din Romania – RO Hacked

    [wp_rss_retriever url="https://rohacked.bit-sentinel.com/feed/" excerpt="none" items="5" read_more="false" new_window="true" thumbnail="false" cache="0"] RO Hacked este registrul atacurilor cibernetice din România.
  • Caută

  • Articole Recomandate

    • Recent Posts
    • Tags
    • Număr record de participanți la DefCamp 2015, cel mai important eveniment dedicat securității cibernetice din Europe Centrala si de Estdecembrie 2, 2015
    • La DefCamp 2015 vei afla prin ce tehnici pot fi evitate măsurile de securitate ale sistemelor informatice criticeoctombrie 16, 2015
    • Ultima sansa sa rezervi bilete de tip Early Bird la DefCamp 2015septembrie 1, 2015
    • 15 sfaturi despre cum poti deveni un programator bun venite de la specialisti romaniaugust 4, 2015
    • algoritmica Android antivirus Apple Avadanei Andrei benzi desenate BitDefender blog browser C++ Chrome concurs eveniment Facebook Firefox Google google chrome hacking html5 infografic informatica internet Internet Explorer IT javascript linux Microsoft Mozilla Firefox online PHP programare retea sociala review Romania securitate Tehnologie Twitter web Windows Windows 7 Wordpress WorldIT worldit.info Yahoo! YouTube
  • martie 2023
    L Ma Mi J V S D
     12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
    « dec.    
  • Link-uri Sponsorizate

    • laptop second hand

    • Calculatoare Second Hand

    • cod voucher pc garage

  • Home
  • Tehnic
  • HTML/CSS
  • Cum sa faci un chat fara refresh ( folosind PHP & Ajax) ?
  • Important

    • Bit Sentinel
    • Centrul de Cercetare în Securitate Informatică din România
    • DefCamp
  • Prieteni

    • BetiT.ro
    • bijuterii handmade
    • Computerica | Resurse gratuite PC
    • Descopera.org
    • Gadgeturi si IT – Giz.ro
  • Prieteni

    • PC – Config
    • RO Hacked
    • Stiri IT

Copyright © 2009-2014 WORLDIT. Toate drepturile Rezervate.
Termeni și condiții | Contact | Licența Creative Commons