Autor Zpráva
john
Profil *
Dobrý den mám takový problém s live chatem.

mám script který v intervalu kontroluje počet dat v db. a pokud se zvýší tak ajax loadne potrebne okno s chatem. ale pokud například jsem v chatu a označím si nějaký text a někdo napíše tak se mi okno neloadne.

Vůbec nevím včem může být problém. JAVASCRIPT //

      setInterval(
      function(){
      $.post("overpocet.php",{udelej: "reg"},
        function(){
        $.post("overpocet.php",{udelej: "overeni"},
          function(vystup){
          $("#okno").append(vystup);
          }
        );
        }
      )
      }
      ,1);


a zde je kód PHP //

session_start();

if($_POST['udelej']=="reg"){

$dotaz="SELECT * FROM msg ORDER BY id";
$result=mysql_query($dotaz);
$pocet=mysql_num_rows($result);

session_register("pocet");
$_SESSION['pocet']=$pocet;
}

else if($_POST['udelej']=="overeni"){

$dotaz="SELECT * FROM msg ORDER BY id";
$result=mysql_query($dotaz);
$pocet=mysql_num_rows($result);

if($pocet>$_SESSION['pocet']){
echo '
<script>
$("#okno").load("chat.php");
</script>
';
}
}

všechno funguje pokud nic v chatu nedělám ale pokud třeba píšu v textaree tak se mi okno taky neloadne, Nevím čím to může být.

a dále bych se chtěl zeptat jak se dá udělat podmínka při dvojkliku enter
mám odesílání nastaveno na enter ale chtěl bych ho nastavit na double enter.

Předem děkuji všem.
john
Profil *
Pardon za kód

a zde je kód PHP //

session_start(); 

if($_POST['udelej']=="reg"){ 

$dotaz="SELECT * FROM msg ORDER BY id"; 
$result=mysql_query($dotaz); 
$pocet=mysql_num_rows($result); 

session_register("pocet"); 
$_SESSION['pocet']=$pocet; 
} 

else if($_POST['udelej']=="overeni"){ 

$dotaz="SELECT * FROM msg ORDER BY id"; 
$result=mysql_query($dotaz); 
$pocet=mysql_num_rows($result); 

if($pocet>$_SESSION['pocet']){ 
echo ' 
<script> 
$("#okno").load("chat.php"); 
</script> 
'; 
} 
} 
Chamurappi
Profil
Reaguji na johna:
Bombardovat server každou milisekundu dvěma až třemi HTTP požadavky je šílené.
Elementy <script> vpisované do innerHTML se nevykonávají.
john
Profil *
Tak jak bych to mohl udělat. Koukal jsem že ty se hodně vyznáš v javascriptu a doufal jsem že mi odepíšeš ty.

Nevím jak mohu vyřešit problematiku aktualizaci serveru při připsání nového řádku do db.

Javascript jako takový ani moc neovládám pouze se mi líbilo animovat a používat různé efekty u různých prvků a tak jsem se začal učit jquery.. a najednou jsem přišel na ajax a začlo se mi to víc než nejvíc líbit. ale bohužel nemůžu přijít na to jak to udělat..

Četl jsem tu někde že fb používá nějké long-poiling ajax hledal jsem to na googlu ale moc mi to neřeklo tak jsem zkusil nějakou metodu z toho co znám a vyšlo najevo toto. Vím že to neni nejkorektnější způsob a bojím se toho že to bude server při hodně lidech velmi zpomalovat a proto se zoufale ptám poradil by si mi nějaký způsob nebo alespoň návod v češtině.. Budu moc vděčný. Děkuju
Medvídek
Profil
john:
1) Jak psal Chamurappi, interval provádíš každou milisekundu, dej tam aspoň 3000.
2) Když už takhle bombarduješ server, tak si trošku optimalizuj ty dotazy do db.

Místo
$dotaz="SELECT * FROM msg ORDER BY id"; 
$result=mysql_query($dotaz); 
$pocet=mysql_num_rows($result); 

postačí
$pocet=mysql_result(mysql_query("SELECT COUNT(id) FROM msg"),0);


A asi bych si v intervalu prováděl funkci ajaxu, kde bych si jako globální proměnnou v js držel poslední počet příspěvků a pokud se nebude shodovat s počtem z db, tak bych aktualizoval výpis a updatnul tu globální proměnnou na aktuální počet.

function pocetZprav(pocet){
 $.ajax({
    url: "ajax/pocetZprav.php",
    type: 'POST',
    dataType: "json", 
    cache: false,
    success: function(msgReturn) { 
     if(msgReturn.pocetZprav != pocet){
      $("#okno").load("chat.php"); 
      pocet = msgReturn.pocetZprav;
     }
     setTimeout(function() { pocetZprav(pocet) },3000); 
    }
   });
}


Je to psaný tak nějak horkou jehlou a jako nástřel.
john
Profil *
Jaký je rozdíl mezi tímto :

$dotaz="SELECT * FROM msg ORDER BY id"; 
$result=mysql_query($dotaz); 
$pocet=mysql_num_rows($result); 


a tímto:

$pocet=mysql_result(mysql_query("SELECT COUNT(id) FROM msg"),0);
Medvídek
Profil
john:
První způsob je neefektivní proto, že se všechna data přenesou z databázového serveru a PHP je uloží do paměti. Druhý způsob je naproti tomu velice rychlý, protože MySQL jenom vezme počet řádků tabulky, který si vede jako statistický údaj, a vrátí ho. Funkci mysql_num_rows je vhodné použít pouze v případě, kdy data z tabulky budeme tak jako tak potřebovat.

Viz: http://php.vrana.cz/ziskani-poctu-radek.php
john
Profil *
Děkuji, zatím jste mi docela pomohl.

Ale poslední dobou mi hodně vrtají hlavou js funkce které mají v závorce nějaký parametr
function(parametr)


Začínal jsem na PHP takze pro me funkce funguje nasledovne..

function neco($parametr){
echo $parametr;
}


a potom v kodu uvedu
neco("Ahoj");


Tak mi vypíše Ahoj.

ale v js tomu vůbec nemůžu přijít na kloub. proč se třeba píše potom v tý funkci
parametr.necoxxxx


vubec nevím co to má dělat proto jak si mi psal že bys použil v intervali funkci ajaxu.
Jsem takový že když něco neznám pořád si to čtu dokola a zkouším.. než přijdu na to co to vlastně dělá a když ne tak poté jdu teprve googlovat ikdyz nemam rad anglicke tutorialy.. ale zkoušel jsem hledat tutorial jak funguji ty funkce a nikde nic..

Jinak opravdu moc děkuji za vaše rady. Málo kdo se najde aby se snažil pomoc jinému uživateli a tady na jakpsatweb je jich stále čim dál tim míň.
john
Profil *
Dobře takže už jsem z toho asi pochopil to, že function(msgReturn) mi vrátí script ze souboru pocetZprav.php

potom ji přenášíš dál ale nevim proc se tam spojuje msgReturn.pocetZprav nevim co dela ta tecka ale uz vim ze se tomu rika globalni promena takze zkusim jeste googlovat ale za názor budu rád :)
Medvídek
Profil
john:

Předpokládal sem návrat hodnot z php skriptu ve formátu JSON, proto tedy i k výsledeku (msgReturn.pocetZprav) přistupuju jako k JSON.

ve skriptu pocetZprav.php si zjistim pocet prispevku.
header('Content-type: application/json');
//pripojeni k db
$json["pocetZprav"]=mysql_result(mysql_query("SELECT COUNT(id) FROM msg"),0);
echo json_encode($json);
//vysledkem bude JSON objekt v tomto tvaru {"pocetZprav":66}


v JS
//Funkce, kde si v parametru předávám poslední zjištěný počet příspevků.
function pocetZprav(pocet){
 $.ajax({
    url: "ajax/pocetZprav.php", //url se skriptem 
    type: 'POST', //metoda posílání dat (kdyby si chtěl tomu skriptu i posílat nějaké data, třeba id uživatele, nebo chatu
    dataType: "json", //typ vrácených dat
    cache: false, //ochrana proti cachování výsledku
    success: function(msgReturn) { //pokud vse dopadne v poradku, vysledek skriptu najdeme v promenne msgReturn
     if(msgReturn.pocetZprav != pocet){ //pokud se nerovna pocet zprav ze skriptu s poctem v parametru funkce nacteme chat
      $("#okno").load("chat.php"); 
      pocet = msgReturn.pocetZprav;//do promenne nastavime aktualni pocet vracenych zprav
     }
    setTimeout(function() { pocetZprav(pocet) },3000);  //zavolame znova tu samou funkci po 3 sekundách
    }
   });
}



Tady sem ti hodil ukázku: http://meda.party-akce.cz/djpw/
john
Profil *
Děkuji moc. Sice jsem to přesně zkopíroval od tebe a vložil ke mě a nejde to.. ještě to musim doladit :) ale chci se zeptat na poslední dvě otázky..

co znamená ta nula za výpisem dat z db

a co znamena např tento řádek.
msgReturn.pocetZprav


to přeci musí nějak spojit dvě hodnoty nebo proč tam je ta tečka..?

omliuvám se za svou ******** .D
john
Profil *
a jeste co je to JSON..?

něco jako SESSION nebo POST nebo GET a tak..? jen abych veděl k čemu si to srovnat :)
1Pupik1989
Profil
Javascriptovy objektovy zapis nezavisly na platforme (wiki).

Jinak dodám, že při větším chatu je dobré ukládat si id posledního vytaženého záznamu. Pak jen stačí kontrolovat, zda-li počet záznamů není větší než 0 a případně vypsat. U chatu je (alespoν pro mě) prioritní snížit zátěž serveru na minimum.
john
Profil *
Takže místo ověřování počtu řádků mám ověřovate je-li poslední zápis ten poslední
Medvídek
Profil
john:
co znamená ta nula za výpisem dat z db
Odpověď nalezneš v dokumentaci zde: http://php.net/manual/en/function.mysql-result.php
[string mysql_result ( resource $result , int $row [, mixed $field = 0 ] )]
john
Profil *
Dobře. děkuji.

A k tomu spojování tou tečkou. Jest-li dedukuji správně znamená to že msgReturn je hodnota kterou získám z php kódu a to .pocetZprav je ta JSON hodnota kterou chci vzít z toho msgReturn..? :)
Medvídek
Profil
john:
Opět dokumentace jQuery ajax:

success(data, textStatus, jqXHR) [Function, Array]

A function to be called if the request succeeds. The function gets passed three arguments: The data returned from the server, formatted according to the dataType parameter; a string describing the status; and the jqXHR (in jQuery 1.4.x, XMLHttpRequest) object. As of jQuery 1.5, the success setting can accept an array of functions. Each function will be called in turn. This is an Ajax Event.
john
Profil *
dobře. ale proč je ten datatype JSON..?

šlo by to třeba udělat že v php kódu bude

$pocet=.....

a pri funkci ajaxu bych vrátil pouze hodnotu msgReturn a s tou bych dále pracoval nebo to jde pouze přes ten JSON který připojuji za hodnotu msgReturn.?(msgReturn.pocetZprav)

snažím se to nějak řešit protože neím proč mi to na serveru nefunguje.

v php kódu mam připojení a výpis z db

a potom mám echo json_encode($json)
přesně podle tvého příkladu ale nefunguje to proto bych rád přišel na nějakou definici toho JSON

Myslíš že by si mi mohl dát nějaký kontakt na tebe.? např icq nebo fb nebo tak něco.
byl bych rád protože z mého okolí se tomuto nikdo nevěnuje jsem samouk a jsem rád za každého člověka který mi poradí. Díky
Medvídek
Profil
john:
Myslíš že by si mi mohl dát nějaký kontakt na tebe.
Je lepší to vyřešit zde na diskusi, kdyby někdo potřeboval něco pdoobného :)


dobře. ale proč je ten datatype JSON
Protože ho rád používám, přijde mi to jako takové čisté řešení. Samozřejmě si můžeš nechat zasílat třeba dataType: html, což ti vráti plaintext. Jako dataType můžeš použít:
xml, JSON, JSONP, html, text, script (opět v manuálu jQuery ajaxu)

Tady je zdrojový kód mého PHP, který mám v té ukázce (místo dat z db si generuju číslo)

header('Content-type: application/json');
$json["pocetZprav"]=rand(1,20);
echo json_encode($json);



Každopádně nejlepší bude, když pošleš živou ukázku, co máš již hotové.
Chamurappi
Profil
Reaguji na johna:
Připadá mi hloupé posílat na server požadavek, kterým zjistíš počet zpráv, a pak případně posílat ještě jeden, kterým nové zprávý stáhneš. Proč neuděláš obojí najednou?

proto bych rád přišel na nějakou definici toho JSON
Co ti brání nějakou najít? To tu máme opisovat půlku internetu? Doporučuji trochu samostudia.
john
Profil *
Ano hledám. Ale jistě ale asi všichni víte že internetová vysvětlení vypadají složitě přitom se pod nimi skrývá většinou jednoduchost jde pouze o pochopení. A proto mám nejradši definici již od někoho z praxe. Ale už jsem se koukal na ten json a částečně chápu datatypy ale chamurappi tvrdíš že medvídkovo příklad je hloupý.??
john
Profil *
Medvídku pošlu ti ukázku jak to teď mám a nefunguje to ;-)

// JAVASCRIPT
function pocetZprav(pocet){
 $.ajax({
    url: "overpocet.php", //url se skriptem 
    type: 'POST', //metoda posílání dat (kdyby si chtěl tomu skriptu i posílat nějaké data, třeba id uživatele, nebo chatu
    dataType: "json", //typ vrácených dat
    cache: false, //ochrana proti cachování výsledku
    success: function(msgReturn) { //pokud vse dopadne v poradku, vysledek skriptu najdeme v promenne msgReturn
     if(msgReturn.pocetZprav != pocet){ //pokud se nerovna pocet zprav ze skriptu s poctem v parametru funkce nacteme chat
      $("#okno").load("chat.php"); 
      pocet = msgReturn.pocetZprav;//do promenne nastavime aktualni pocet vracenych zprav
     }
    setTimeout(function() { pocetZprav(pocet) },3000);  //zavolame znova tu samou funkci po 3 sekundách
    }
   });
}


// PHP KÓD
header('Content-type: application/json');

// Zde se připojuji k db

$json['pocetZprav']=mysql_result(mysql_query("SELECT COUNT(id) FROM msg"),0);
echo json_encode($json);
john
Profil *
// PHP KÓD
header('Content-type: application/json'); 

// Zde se připojuji k db 

$json['pocetZprav']=mysql_result(mysql_query("SELECT COUNT(id) FROM msg"),0); 
echo json_encode($json);
Medvídek
Profil
john:
A můžeš dodat živou kázku?

Kde voláš poprve funkci pocetZprav?
Co ti vrací php skript? Používáš Firebug? Co javascriptová Konzole?

Zkus dodat to tvoje řešení, kde se na něj budeme moct podívat živě a vyzkoušet, takhle toho moc neuděláme.
john
Profil *
Jo takhle. No živou ukázku dodám k večeru protože to mám zatím na localhostu.

jinak funkci volam v
$(document).ready(function(){
pocetZprav(10);
})
john
Profil *
Živá ukázka je ZDE

té reklamy si nevšímejte ale zkuste tam něco napsat dejte odeslat nebo SHIF+ENTER a nic se nezobrazí ale po aktualizování stránky to tam je ;-)
john
Profil *
Našel jsem chybu pomocí FIREQUERY :) díky Vám všem chybu jsem měl na své straně v php kódu se mi na konci záhadně objevila složena závorka a ta tam neměla co dělat :D

omlouvám se vám. :) Děkuji především MEDVÍDKOVI za to co pro mě udělal díky :)
john
Profil *
Medvídku prosimtě jaký je rozdíl mezi JSON a JSONP..?

Chci si koupit knihu o jquery a ajaxu. Našel jsem tuto knihu
ZDE

a zdá se mi celkem dobrá ale chtěl bych se pořádně naučit podobné příklady jako je právě ten chat co jsi mi radil. Tak nevím co si nejlépe koupit. :)
Medvídek
Profil
john:
JSONP dovoluje pracovat i s daty mimo doménu skriptu. Knihu neznám, většinou si vystačím s dokumentací jQuery, jQuery UI a sem tam google.
Každopádně nevypadá špatně tato kniha: http://www.zive.cz/bleskovky/nova-kniha-jquery-kucharka-programatora/sc-4-a-155684/default.aspx

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0