Autor Zpráva
mattyZEM
Profil
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
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
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
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
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">&nbsp;</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
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
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
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
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
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
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
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
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
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">&nbsp;</p></div></div>'."\n";;
      }
      $echo[]=$puvodni;
      for($i=0;$i<count($echo);$i++){
        //echo $echo[$i];
      }
    }
  }  
}
?>
Witiko
Profil
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
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
Zjisti pomocí ajax_obj[obj].getAllResponseHeaders() veškeré hlavičky a podívej se, zda hlavičku php script vůbec nastavil
mattyZEM
Profil
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
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
Ok, založím nové téma, ale děkuji mnohokrát :)

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:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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

0