Autor | Zpráva | ||
---|---|---|---|
mattyZEM Profil |
#1 · Zasláno: 17. 5. 2010, 13:42:01 · Upravil/a: mattyZEM
Zdravím,
mám takový problém. Řeším AJAXový výpis nových příspěvků, avšak jsem narazil na problém. Pokud někdo jiný napíše třeba 5 příspěvků, a já je mám "načíst", načtu příspěvky špatně. Neví někdo jak na to? Vím jak najít počet ID podle názvu například "testid", ale takto bohužel ne. Předem moc děkuji. |
||
Joker Profil |
#2 · Zasláno: 17. 5. 2010, 13:49:01
mattyZEM:
„Pokud někdo jiný napíše třeba 5 příspěvků, a já je mám "načíst", načtu příspěvky špatně.“ Jak špatně? Ve špatném pořadí, nebo něco jiného je špatně? |
||
mattyZEM Profil |
#3 · Zasláno: 17. 5. 2010, 15:50:20
Vidím 2 příspěvky, do JS proměnné se uloží 2. Někdo pošle 3, JS promenná zůstane pořád 2 a pak už to blbě vypisuje (jak špatně příspěvky tak i špatném pořadí).
|
||
Chamurappi Profil |
#4 · Zasláno: 17. 5. 2010, 16:14:30
Reaguji na mattyZEMa:
Nechápu, na co ptáš. Ty bys tenhle svůj popis chápal, kdybys ho nechápal? Prosím o odkaz na živou ukázku. |
||
mattyZEM Profil |
#5 · Zasláno: 17. 5. 2010, 16:23:50 · Upravil/a: mattyZEM
Bohužel, odkaz na živou ukázu dát nemohu, jelikož to mám na localhostě a není to dodělané, ale postnu sem kód, z toho to pochopíte :)
clanek.php: <div id="komentare"> <h3>Komentáře</h3> <div id="novy_komentar"></div> ... <script type="text/javascript"> var posledniHodnota = <?php echo $i; ?>; var newkom=window.setInterval('novek(posledniHodnota,<?php echo $_SESSION['uid'].",".$_GET['cid']; ?>)', 30000); </script> Soubor s JS: function ajax_otevrit_req(obj, typ) { if (ajax_obj[obj].readyState==4) { if(ajax_obj[obj].status==200) { misto=document.getElementById(obj); if (typ=='newk') { misto.innerHTML=''; misto.innerHTML=ajax_obj[obj].responseText; $("#novy_komentar").show(2000); goToByScroll("novy_komentar"); } } } } function novek(pock,uid,cid) { var puvodni=document.getElementById("novy_komentar").innerHTML; ajax_otevrit('novy_komentar', '/ajax/newk.php', 'newk', 'pock='+pock+'&rep=1&uid='+uid+'&cid='+cid+'&puvodni='+puvodni, 'newk'); } /ajax/newk.php: $pock=(int)$_POST['pock'];$uid=(int)$_POST['uid'];$cid=(int)$_POST['cid'];$puvodni=stripslashes($_POST['puvodni']); $kom=mysql_fetch_assoc(mysql_query("SELECT count(kid) as exist FROM komentare WHERE kcid=$cid")); $realnypocet=$kom['exist']-$pock; if($realnypocet>0){ $komenty=mysql_query("SELECT kid,ktime,ktext,uid,ujmeno,uavatar,ubarva FROM komentare k LEFT JOIN users u ON(u.uid=k.kuid) WHERE kcid=$cid ORDER BY kid DESC LIMIT $realnypocet"); while($k=mysql_fetch_assoc($komenty)){ if($_SESSION['prava']==1 OR $_SESSION['prava']==2)$smaz='<a class="del" title="Smazat komentář #'.$k['kid'].'" onclick="kdel('.$k['kid'].','.$_SESSION['uid'].');">SMAŽ</a>';else $smaz=''; if($k['ubarva']!="")$jmeno='<span class="'.$k['ubarva'].'">'.$k['ujmeno'].'</span>';else $jmeno=$k['ujmeno']; $echo[]='<div id="k'.$k['kid'].'"><div class="komentar"><div class="avatar"><img src="'.$k['uavatar'].'" alt="Avatar autora komentáře" title="Avatar autora komentáře"></div><div class="info">Autor komentáře: <a href="/Uzivatele/'.$k['uid'].'/">'.$jmeno.'</a>, Přidáno: '.d($k['ktime']).'<span class="napravo">'.$smaz.'</span></div><div class="text">'.bbkod($k['ktext'],0,$_SESSION['smajly']).'</div><p class="both"> </p></div></div>'."\n";; } $echo[]=$puvodni; for($i=0;$i<count($echo);$i++){ echo $echo[$i]; } Nebo pokud by nějaký znalec měl TeamViewer, mohl bych mu poslat údaje, jestli by se mu chtělo na to mrknout... |
||
mattyZEM Profil |
#6 · Zasláno: 17. 5. 2010, 21:08:24
Nakonec, po přemýšlení jsem došel k závěru, že by to šlo daleko lépe. V PHP souboru ajaxu bych jednoduše přidal echo 'nejake.znaky.pro.odliseni'.$pocetnovych;
Jenže bohužel nevím, jak toto udělat (v PHP by na to byl jednoduchý preg_replace, ale zde vážně nevím :(. Ví prosím někdo? Předem moc děkuji :). |
||
Witiko Profil |
#7 · Zasláno: 17. 5. 2010, 21:11:30 · Upravil/a: Witiko
Co brání při načtení komentářů proměnnou posledniHodnota aktualizovat? Nejjednodušší způsob by bylo předání počtu nových komentářů v hlavičce HTTP odpovědi od serveru a k proměnné dané číslo přičíst.
Client-side: httpRequest.getResponseHeader("název"); Server-side: <?php header("název: obsah"); ?> |
||
mattyZEM Profil |
#8 · Zasláno: 17. 5. 2010, 22:10:07
Witiko:
„Co brání při načtení komentářů proměnnou posledniHodnota aktualizovat?“ Moje neznalost AJAXu *sorry* :) Díky mnohokrát, jistě to využiji :) |
||
mattyZEM Profil |
#9 · Zasláno: 18. 5. 2010, 07:41:10
Zkoušel jsem to nějak zakomponovat, a bohužel se nepodařilo. Hláška "httpRequest is not defined"
var zkouska=httpRequest.getResponseHeader("pocnk"); |
||
mattyZEM Profil |
#10 · Zasláno: 19. 5. 2010, 17:37:16
Omlouvám se - vím že se to nesluší, jelikož to děláte z dobré vůle, ale přeci jen to je už den :)
Mohl by mi tedy prosím někdo pomoci s posíláním & přijímáním hlaviček? |
||
Witiko Profil |
#11 · Zasláno: 19. 5. 2010, 18:42:55 · Upravil/a: Witiko
mattyZEM:
„Mohl by mi tedy prosím někdo pomoci s posíláním & přijímáním hlaviček?“ Posílání hlaviček je php záležitost ve kterém vypadá, že se pohybuješ více než v javascriptu. To jak hlavičku v php scriptu definovat jsem ti už psal výš. httpRequest je samozřejmě zástupný název proměnné, který nelze otrocky zkopírovat. V jaké proměnné máš instanci httpRequest uloženou nevím, protože jsi opět zaslal jen část kódu, kterou jsi považoval za vhodnou a věštící koule bohužel ještě nedorazila. Jediné, co je ze zaslaných scriptů vidět je, že odkaz na instanci je uložen v poli / objektu ajax_obj na pozici / v atributu obj, která je funkci ajax_otevrit_req předáván(a) argumentem. V dané funkci by tedy funkční script vypadal takto: ajax_obj[obj].getResponseHeader(); „ale přeci jen to je už den“ Po dni bez odpovědi tě mohlo napadnout, že z krátkých výřezů scriptů, které jsi poslal, lze těžko něco zjistit. Sám o sobě sebekriticky tvrdíš, že javascriptu zatím rozumíš méně. Takže nedůvěřuj svému úsudku ohledně toho co je třeba sem poslat a co ne a pošli sem ten javascriptový kód celý. |
||
mattyZEM Profil |
#12 · Zasláno: 19. 5. 2010, 20:15:23
Nechtěl jsem to tu zahltit, ale ok, příště to klidně pošlu celé. Mimochodem, neměl by jsi na sebe nějaký kontakt? Nejlépe jabber/ICQ/skype
Děkuji mnohokrát, funguje to :) Witiko: „Sám o sobě sebekriticky tvrdíš, že javascriptu zatím rozumíš méně“ Vhodnější výraz by byl myslím "skoro vůbec" :( |
||
Witiko Profil |
#13 · Zasláno: 19. 5. 2010, 20:36:47 · Upravil/a: Witiko
mattyZEM:
„Mimochodem, neměl by jsi na sebe nějaký kontakt?“ Problém je, že jsem málokdy dostupný na jakémkoliv z těchto protokolů a sobecky se připojuji až když něco od někoho potřebuji. Zde na fóru jsem denně, diskuze zde mohou dojít k zajímavým výsledkům a navíc se zvyšuje šance, že uživatel co použije funkci Hledat, bude odměněn výsledkem ve formě již vyřešeného problému. Tohle a pak je tu zdravý rozum velící nepsat tyto údaje na veřejně přístupné fórum a v neposlední řadě pud sebezáchovy. :D |
||
mattyZEM Profil |
#14 · Zasláno: 19. 5. 2010, 21:24:41
Děkuji mnohokrát, funguje to :)
Bohužel jsem se spletl, alert() který jsem si myslel že jde od hlavičky(), byl u něčeho jiného :( Nyní to u: var blbostjakjamesbond=ajax_obj[obj].getResponseHeader("neco"); alert(blbostjakjamesbond); hází null... var ajax_obj=new Array(); function ajax_otevrit(obj,skript,typ,msg,akce) { var mozno=1; if (window.XMLHttpRequest) { ajax_obj[obj]=new XMLHttpRequest(); }else if(window.ActiveXObject) { try { ajax_obj[obj]=new ActiveXObject('Microsoft.XMLHTTP'); }catch(e) { ajax_obj[obj]=new ActiveXObject('Msxml2.XMLHTTP'); } }else mozno=0; if (mozno) { var url=skript+'?'+new Date().getTime(); ajax_obj[obj].open("POST", url, true); ajax_obj[obj].setRequestHeader('x-deb-js-akce', akce); ajax_obj[obj].setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); ajax_obj[obj].onreadystatechange=function() {ajax_otevrit_req(obj, typ);}; ajax_obj[obj].send(msg); } } function goToByScroll(id){ $('html,body').animate({scrollTop: $("#"+id).offset().top},'slow'); } function ajax_otevrit_req(obj, typ) { if (ajax_obj[obj].readyState==4) { if(ajax_obj[obj].status==200) { if (ajax_obj[obj].responseText=='<prava>') { alert('K této akci nemáte dostatečná oprávnění.'); }else if (ajax_obj[obj].responseText=='<exist>') { alert('Volaný cíl neexistuje.'); }else if (ajax_obj[obj].responseText=='<voted>') { alert('V tomto hlasování jste již hlasoval/a.'); }else if (ajax_obj[obj].responseText=='<deleted>') { alert('Příspěvek byl úspěšně smazán.'); }else{ misto=document.getElementById(obj); if (typ=='newk') { var blbostjakjamesbond=ajax_obj[obj].getResponseHeader("neco"); alert(blbostjakjamesbond); misto.innerHTML=''; misto.innerHTML=ajax_obj[obj].responseText; $("#novy_komentar").show(2000); goToByScroll("novy_komentar"); } } } } } function novek(pock,uid,cid) { var puvodni=document.getElementById("novy_komentar").innerHTML; ajax_otevrit('novy_komentar', '/ajax/newk.php', 'newk', 'pock='+pock+'&rep=1&uid='+uid+'&cid='+cid+'&puvodni='+puvodni, 'newk'); } PHP: <?php if($_SERVER['HTTP_X_DEB_JS_AKCE']=='newk'){ $pock=(int)$_POST['pock'];$uid=(int)$_POST['uid'];$cid=(int)$_POST['cid'];$puvodni=stripslashes($_POST['puvodni']); if(isset($_SESSION['prihlasen']) AND $_SESSION['uid']==$uid){ setonline('../'); $kom=mysql_fetch_assoc(mysql_query("SELECT count(kid) as exist FROM komentare WHERE kcid=$cid")); $realnypocet=$kom['exist']-$pock; header("neco:neco"); if($realnypocet>0){ $komenty=mysql_query("SELECT kid,ktime,ktext,uid,ujmeno,uavatar,ubarva FROM komentare k LEFT JOIN users u ON(u.uid=k.kuid) WHERE kcid=$cid ORDER BY kid DESC LIMIT $realnypocet"); while($k=mysql_fetch_assoc($komenty)){ if($_SESSION['prava']==1 OR $_SESSION['prava']==2)$smaz='<a class="del" title="Smazat komentář #'.$k['kid'].'" onclick="kdel('.$k['kid'].','.$_SESSION['uid'].');">SMAŽ</a>';else $smaz=''; if($k['ubarva']!="")$jmeno='<span class="'.$k['ubarva'].'">'.$k['ujmeno'].'</span>';else $jmeno=$k['ujmeno']; $echo[]='<div id="k'.$k['kid'].'"><div class="komentar"><div class="avatar"><img src="'.$k['uavatar'].'" alt="Avatar autora komentáře" title="Avatar autora komentáře"></div><div class="info">Autor komentáře: <a href="/Uzivatele/'.$k['uid'].'/">'.$jmeno.'</a>, Přidáno: '.d($k['ktime']).'<span class="napravo">'.$smaz.'</span></div><div class="text">'.bbkod($k['ktext'],0,$_SESSION['smajly']).'</div><p class="both"> </p></div></div>'."\n";; } $echo[]=$puvodni; for($i=0;$i<count($echo);$i++){ //echo $echo[$i]; } } } } ?> |
||
Witiko Profil |
#15 · Zasláno: 19. 5. 2010, 21:35:39 · Upravil/a: Witiko
Je (více než) možné, že hlavička "neco" od serveru nepřišla, jinak zápis se mi zdá správný. Danou část kódu bych přepsal nějak takto:
if (typ == "newk") { var test = typeof ajax_obj[obj].getResponseHeader=="function"?"Funguje, hlavička: "+ajax_obj[obj].getResponseHeader("neco"):"Nefunguje"; alert(test); misto.innerHTML = ajax_obj[obj].responseText; $("#novy_komentar").show(2000); goToByScroll("novy_komentar"); } Pokud alert vyhodí function, tak to funguje, pouze je nutné zadat správný název kýžené hlavičky. Do php scriptu na který se ajaxová funkce dovolává je nutné dodefinovat hlavičky, které php server odešle v odpovědi na HTTP požadavek. <?php header("neco: funguje"); ?> |
||
mattyZEM Profil |
#16 · Zasláno: 19. 5. 2010, 21:37:45 · Upravil/a: mattyZEM
Vypsal "object".
Edit: U updatovaného scriptu vypsal function. To ale bohužel neřeší můj problém - jakto že server hlavičku neposlal / klient ji nepřijal? |
||
Witiko Profil |
#17 · Zasláno: 19. 5. 2010, 22:10:01
Zjisti pomocí ajax_obj[obj].getAllResponseHeaders() veškeré hlavičky a podívej se, zda hlavičku php script vůbec nastavil
|
||
mattyZEM Profil |
#18 · Zasláno: 19. 5. 2010, 22:11:46
Date: Wed, 19 May 2010 20:11:27 GMT
Server: Apache/2.2.11 (Win32) PHP/5.3.0 X-Powered-By: PHP/5.3.0 Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Content-Length: 0 Keep-Alive: timeout=5, max=91 Connection: Keep-Alive Content-Type: text/html |
||
Witiko Profil |
#19 · Zasláno: 19. 5. 2010, 22:16:06
Možná by nebylo od věci funkci header() umístit v php scriptu výše, začít název hlavičky velkým písmenem, dvojtečku následovat mezerou. Navíc se jedná o problém PHP, čímž se trochu dostáváme i mimo toto oddělení fóra.
|
||
mattyZEM Profil |
#20 · Zasláno: 19. 5. 2010, 22:18:06
Ok, založím nové téma, ale děkuji mnohokrát :)
|
||
Časová prodleva: 14 let
|
0