Cum sa faci un chat fara refresh ( folosind PHP & Ajax) ?
45Observam 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. 😀
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 ?
Eu am inteles aluzia la matrici – asa sunt privite outputurile cel mai usor al acestora. 🙂
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.
😉
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) 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.
😉
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. 🙂
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.
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. 🙂
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’
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 😛
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.
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. 🙂
De unde apareti fratilor?
@Tutancamon Asa este, cum zici tu 🙂
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 ?
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 .
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?
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.
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.
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.
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. 🙂
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
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().
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 … 😎