Avatar billede majbom Novice
18. maj 2008 - 13:21 Der er 47 kommentarer og
1 løsning

returnere responseText fra ajax-request

hej experter

jeg er stadig rimelig ny på AJAX-området, men jeg synes da jeg er ved at være godt med.

indtil videre skriver jeg en del kode, hver gang jeg skal lave en ajax-request:

function addUser(){
  //addUser
  statusMsg("Tilføjer bruger...", "tilføjer...");
  var xmlHttp;
  var url = "ajax.php";
  var params = "func=addUser";

  params += "&name="+document.getElementById('name').value;
  params += "&email="+document.getElementById('email').value;
  params += "&pass="+document.getElementById('pass1').value;
  if(document.etElementById('order_mail').checked == true){
      params += "&order_mail=1";
  }
  xmlHttp = new xmlHttpObject();
  xmlHttp.onreadystatechange=function(){
      if(xmlHttp.readyState==4){
        if(xmlHttp.responseText != "success"){
            statusMsg("Der er sket en fejl"+xmlHttp.responseText, "");
        }else{
            statusMsg("Brugeren blev tilføjet", "");
            document.getElementById('add_user').reset();
            document.getElementById('name').focus();
        }
      }
  }

  xmlHttp.open("POST",url,true);
  xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  xmlHttp.setRequestHeader("Content-length", params.length);
  xmlHttp.setRequestHeader("Connection", "close");
  xmlHttp.send(params);
}

det eneste jeg har fået lavet en lidt mindre er istancieringen af xmlHttp objektet. jeg kunne også godt tænke på at hele requesten lå i en funktion som jeg bare kunne kalde også få returneret svaret (responseText), f.eks.:

var response = ajaqReq(sUrl, sParams);

det har jeg egentlig også:

function ajaxReq(sUrl, sParams){
  var url = sUrl;
  var params = sParams;
  var xmlHttp = new xmlHttpObject();

  xmlHttp.open("POST",url,false);
  xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  xmlHttp.setRequestHeader("Content-length", params.length);
  xmlHttp.setRequestHeader("Connection", "close");
  xmlHttp.send(params);
  return xmlHttp.responseText;
}

men denne funktion er ikke særlig asynkron, og så vidt jeg har forstået det, der hvor jeg fandt dette eksempel (kan selvfølgelig ikke huske hvor), skulle det være sådan for at det kunne virke.
funktionen er egentlig fin nok, men da jeg gerne vil sætte indholdet i en div i starten af requesten (en gif der viser der sker noget) inden requesten starter og ændre indholdt igen efter requesten skal det være asynkron ellers virker det ikke (og der er vel heller ikke meget ajax over det hvis det ikke er asynkron?)

jeg håber mit ævleri giver mening :)

på forhånd mange tak
Avatar billede w13 Novice
18. maj 2008 - 13:55 #1
Du mangler vel bare:

  xmlHttp.onreadystatechange=function(){
      if(xmlHttp.readyState==4){

delen?
Avatar billede w13 Novice
18. maj 2008 - 14:00 #2
Jeg har selv gjort det, at jeg har lavet en funktion, som bygger xmlHTTP-objektet. Den kalder jeg f.eks. med AjaxConn();
Så laver jeg manuelt onreadystatechange-funktionen.
Og så kører jeg en funktion kaldet AjaxSend("urladresse.asp"); som sørger for at hente siden - dvs. ligesom din ajaxReq()-funktion, bare uden return'en.

På den måde har jeg fuld kontrol over, hvad der skal ske, når den finder eller ikke finder de ønskede data.

I øvrigt bør du ikke hente i ren HTML-form, men derimod i XML eller JSON, da det vil gå meget hurtigere. Og på den måde vil du også kunne slippe for at bruge innerHTML.
Avatar billede majbom Novice
18. maj 2008 - 16:25 #3
-> w13 - hvis jeg bruger:

xmlHttp.onreadystatechange=function(){
      if(xmlHttp.readyState==4){

delen, kan jeg ikke returnere den, det er derfor jeg skriver return xmlHttp.responseText; til sidst.

jeg forstår ikke lige hvordan din funktion virker, kan du komme med et eksempel?

jeg er klar over det med xml/json og innerHTML - planen er også at rette det når jeg lige har tid til at lære lidt mere om DOM :) (er begyndt så småt)
Avatar billede w13 Novice
18. maj 2008 - 16:45 #4
Jeg gør f.eks. således:

document.getElementsByTagName("body")[0].style.cursor="progress";
AjaxConn();
req.onreadystatechange=function(){
    if(req.readyState==4){
        if(req.status==200){
            var json=eval("("+req.responseText+")");
            alert(json.items)
        }else{
            alert("Data kunne ikke hentes!\n\nDer opstod en fejl "+req.status+"!")
        }
        req=null;
        document.getElementsByTagName("body")[0].style.cursor="default"
    }
}
AjaxSend("json/showitems.asp","")

Så har jeg mit Ajax-objekt (her kaldet req i stedet for xmlHttp) i funktionen AjaxConn() og i funktionen AjaxSend() bliver URL'en kaldt og der sættes hvad der nu skal sættes af mime-type og parametre.

Onreadystatechange-funktionen har jeg så ikke skrevet ind i nogen funktion, for at have meget bedre kontrol over, hvad der gøres.
Avatar billede majbom Novice
18. maj 2008 - 20:02 #5
tak, det prøver jeg lige at kigge på i løbet af ugen :)
Avatar billede w13 Novice
19. maj 2008 - 09:35 #6
Her modtager jeg så mine data som JSON, dvs. f.eks.:

{
  "items" : ["hest","gris","får"],
  "andet" : "bla"
}
Avatar billede majbom Novice
19. maj 2008 - 09:59 #7
ja okay, men nu tænker jeg så, at for at returnere det i xml, så skal jeg echo'e det som xml i min php-fil ikke?

f.eks.

echo "<?xml version=\"1.0\" ?>\n";?>
echo "<root>\n";
while($data = mysql_fetch_array($res)){
  echo "<bruger><name>$data[name]</name><email>$data[email]</email></bruger>";
}
echo "</root>";

eller tager jeg fejl?

og så bruge responseXML i stedet for responseText...
Avatar billede w13 Novice
19. maj 2008 - 10:02 #8
Jep. Det er korrekt.
Avatar billede w13 Novice
19. maj 2008 - 10:03 #9
Det gør det også meget lettere at undgå innerHTML. F.eks. hvis du skal indsætte 3 div'er på din side, så i stedet for at overføre hele HTML-koden, så overfører man kun det tekstindhold, som skal smides i div'erne. Det vil også gøre, at det bliver meget hurtigere udført.

Og hvis du skal overføre tekster med f.eks. æ,ø,å eller andre specialtegn, skal du lige pakke det ind i en CDATA-node.
Avatar billede w13 Novice
19. maj 2008 - 10:09 #10
Men hvis du kun skal overføre f.eks. navn og email som i dit ovenstående eksempel, ville jeg gøre det med JSON, som vil performe hurtigere:

echo "{";
echo "\"users\":[";
$i=0;
while($data=mysql_fetch_array($res)){
  if(!$i){echo ",";}
  echo "[\"$data[name]\",\"$data[email]\"]";
  $i++;
}
echo "]";
echo "}";

Som vil generere:

{
  "users":
    [
      ["navn1","email1"],["navn2","email2"],["navn3","email3"]
    ]
}
Avatar billede w13 Novice
19. maj 2008 - 10:11 #11
Det kan så hentes med:

var json=eval("("+req.responseText+")");
alert(json.users[0][0]) \\Returnerer "navn1"
alert(json.users[0][1]) \\Returnerer "email1"
alert(json.users[1][0]) \\Returnerer "navn2"
Avatar billede majbom Novice
21. maj 2008 - 15:42 #12
så fik jeg det til at spille med kna så meget kode hver gang jeg laver en request :)

nu har jeg så bare problemer med at få mit indhold tilbage som xml, men det opretter jeg lige et nyt spørgsmål til, da det egentlig ikke er det, dette spørgsmål handler om.

smid et svar w13, det var dejligt du ville hjælpe :)
Avatar billede w13 Novice
21. maj 2008 - 15:58 #13
;)
Avatar billede majbom Novice
21. maj 2008 - 20:34 #14
nå jeg prøvede lige din json-løsning osse da jeg synes xml virkede meget omfattende i forhold til, når, som du osse sagde, kun er et par værdier pr "række".

jeg var dog nødt til at rette

if(!$i){echo ",";}

til:

if($i!=0){echo ",";}

ellers skrev den et komma første gang den kørte wile-løkken, hvilket også giver mening da $i jo bliver sat før løkken.

men det virker, og jeg tror at json bliver løsningen for dette projekt.

endnu en gang mange tak :)
Avatar billede w13 Novice
21. maj 2008 - 20:58 #15
Nå ja, den skulle ikke være:
if(!$i){echo ",";}
men:
if($i){echo ",";}
Dvs. uden "!" - så fungerer den også. :)
Og selv tak!
Avatar billede majbom Novice
22. maj 2008 - 08:38 #16
nååh ja selvfølgelig... DOH :)
Avatar billede groyk Novice
18. marts 2009 - 11:20 #17
Hej w13

Faldt lige over denne tråd.

Du skriver følgende
Og hvis du skal overføre tekster med f.eks. æ,ø,å eller andre specialtegn, skal du lige pakke det ind i en CDATA-node.

Kan du evt give et eksempel på dette?

og er det JS eller JSON delen der fukker det op?
Avatar billede w13 Novice
18. marts 2009 - 11:37 #18
En CDATA-node ser således ud: http://en.wikipedia.org/wiki/CDATA

Hvis man skriver sin tekst i sådan en, er der ikke problemer med specialtegn.
Avatar billede groyk Novice
18. marts 2009 - 11:51 #19
Takker.

Har fået det til at spille den ene vej med følgende server side

$query = utf8_decode(urldecode($_REQUEST["query"]));

Dog har jeg stadig problemer med JSON på serveren, den fucker æ ø og å totalt op når jeg returnere data igen!!
Avatar billede w13 Novice
18. marts 2009 - 11:59 #20
Hm. Det lyder stadig mest som om du blander tegnsæt.
Avatar billede olebole Juniormester
18. marts 2009 - 13:09 #21
<ole>

Det lyder ikke, som om du har tegnsætproblemer ... du har tegnsætproblemer!  =)

Du skal sørge for, at:

*) alle dine filer er gemt som utf-8 (check evt i Notepad's 'Gem Som' dialog
*) du bruger en utf-8 meta i alle dine HTML-dokumenter
*) du med PHP sætter en utf-8 Content-Type header i alle dokumenter

/mvh
</bole>
Avatar billede olebole Juniormester
18. marts 2009 - 13:15 #22
Husk også, at feltnavne i en HTTP-header er case-sensitive (stort 'T') - og husk tegnsættet:
    xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
Avatar billede groyk Novice
18. marts 2009 - 14:51 #23
Tror mere det er JSON klasen der driller.

kører p.t. PHP4 og bruger en JSON klasse til at generere JSON formatet. Mit array ser fint ud inden det kommer igennem JSON.

Dog er jeg i gang med at flytte projektet over på PHP5/MySQL5 så jeg selv kan styre "Collation" på mine tabeller. Så er jeg da sikker på det ikke er der problemet opstår.

Er lidt i tvivl med
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");

Da det hele er bygget op i JsExt (www.jsext.com)
Avatar billede olebole Juniormester
18. marts 2009 - 14:58 #24
Jeg forstår ikke, hvad du mener med:

"Er lidt i tvivl med
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");

Da det hele er bygget op i JsExt (www.jsext.com)"
Avatar billede groyk Novice
18. marts 2009 - 15:10 #25
I ExtJs laver man ikke selv Http requesten, det gør deres "datastore" enten ud fra JSON eller fra XML.

Men du har ret i at problemet er tegnsætproblemer!

Har prøvet at smide følgende i min php fil


Derefter outputtet et search direkte til browseren. Nu fucker mit normale array også op.

Er meget sikker på at problemet ligger i MySQL "Collation" da jeg p.t. ikke kan se om tabellen er UTF-8 Latin ect.

Når jeg har det oppe at køre på PHP5 MySQL5 smider jeg lige en note.
Avatar billede groyk Novice
18. marts 2009 - 15:13 #26
Glemte lige den indsatte header
header("Content-Type: text/html; charset='utf-8'");
Avatar billede olebole Juniormester
18. marts 2009 - 15:24 #27
Tjek lige selv det link, du lagde ovenfor - så måske, du forstår min undren  ;o)

Du har vist for mange gåseøjne i din header - sådan:
    header("Content-Type: text/html; charset=utf-8");

Prøv at lægge et link til et forsøg, for jeg kan ikke lige umiddelbart se en demo af jsext
Avatar billede groyk Novice
18. marts 2009 - 15:26 #28
OK Mit domæne er lige blevet flyttet NU. Så der går lige 30min. inden jeg har alle filerne på plads.
Avatar billede groyk Novice
18. marts 2009 - 16:01 #29
Siden er desværre ikke online igen før i morgen p.g.a. dns skift.

Jeg smider linket i morgen når det er oppe at køre igen.
Avatar billede olebole Juniormester
18. marts 2009 - 16:31 #30
K  ;o)
Avatar billede groyk Novice
18. marts 2009 - 21:47 #31
Hej Ole

Så kom siden op igen, har dog ikke fået luset problemet helt væk endnu.

Selve layoutet og funktionen kan ses her
www.groyk.dk

En isoleret request til databasen kan ses her.
http://www.groyk.dk/ext/erp/stock/test.php

Linket viser out puttet i henholdsvis print_r() og JSON.

MySQL tabellen er sat til utf-8_danish_ci

php filen har følgende header: header("Content-Type: text/html; charset=utf-8");

Er ved at løbe tør for ideer!!
Avatar billede olebole Juniormester
18. marts 2009 - 22:20 #32
Dén JSON-streng holder ikke som utf-8. Der står f.eks:
    {"varenr":"11","navn":"K\u0072006500740069mer-udg\u00650074" ... }

- men der burde stå:
    {"varenr":"11","navn":"K\u00f8retimer-udg\u00e5et" ... }

Hvis du kører PHP5, skal du ikke bruge en JSON-klasse, men PHP's egen funktion json_encode. Du må heller ikke bruge nogen former for anden encoding af teksterne
Avatar billede groyk Novice
19. marts 2009 - 07:48 #33
Har ændret koden til json_encode, men nu klipper den bare tekststrengen hvis der kommer et tegn den ikke forstår.

Der er en ting jeg ikke fatter. Det er at outputtet fra mit php array i http://www.groyk.dk/ext/erp/stock/test.php ikke skriver de rigtige tegn!!

Det er nok der problemet ligger. Hvis jeg ikke sender de rigtige data ind i JSON, får jeg naturligvis heller ikke noget fornuftigt ud!!
Avatar billede groyk Novice
19. marts 2009 - 08:44 #34
Så fik jeg endelig det til at spille, men forstår dog stadig ikke sammen hængen!!

Mit SQL udtræk er nu således


if($rs=mysql_query($sql))
{
  $payload["total"]=mysql_num_rows($rs);
  while($data=mysql_fetch_assoc($rs))
  {
    foreach($data as $key=>$string) {
      $data[$key] = utf8_encode($string);
    }
  $payload["results"][] = $data;               
}


Hvorfor er jeg nød til at loope data igennem og lave utf8_encode($string);?

SQL tabellen er jo i UTF-8

SKAL data gemmes i SQL som æøåLÆà i stedet for æøåÆØÅ??

Eller hvad er det jeg ikke fatter??

Det ville jo være rarest hvis data i databasen var læsbar.
Avatar billede olebole Juniormester
19. marts 2009 - 09:19 #35
'Han' skrev: "Du må heller ikke bruge nogen former for anden encoding af teksterne"  ;o)

Lav:
    $data[$key] = utf8_encode($string);

- om til:
    $data[$key] = $string;

Men du kan skrive det hele om til:

if($rs=mysql_query($sql))
{
  $payload["total"]=mysql_num_rows($rs);
  while($data=mysql_fetch_assoc($rs)) {
    $payload["results"][] = $data;               
  }
}
Avatar billede olebole Juniormester
19. marts 2009 - 09:21 #36
- dine fejl skyldes, at indholdet i databasen ikke er utf-8
Avatar billede groyk Novice
19. marts 2009 - 10:06 #37
Det forslag du skriver


if($rs=mysql_query($sql))
{
  $payload["total"]=mysql_num_rows($rs);
  while($data=mysql_fetch_assoc($rs)) {
    $payload["results"][] = $data;             
  }
}


Er nøjagtig den måde kaldet var lavet på inden jeg loopede arrayet igennem med utf8_encode()

Kan bare ikke forstå følgende.

Tabellen og kolonnerne er sat til: utf8_danish_ci
har prøvet at slette alle data i tabellen og indsætte nye via PhpMyAdmin

Men det spiller ikke.

skal alle data i en utf8 tabel encodes før de indsættes eller hvad? utf8_encode();

Hvis man gør det, bliver alt jo u-læseligt via PhpMyAdmin!!
Avatar billede groyk Novice
19. marts 2009 - 10:18 #38
Kan det være min php.ini fil der ikke er sat rigtigt op eller?

Måske sender php latin_1 til MySQL??
Avatar billede groyk Novice
19. marts 2009 - 10:20 #39
Her er et link til phpinfo()
http://www.groyk.dk/info.php

Kan se at der er ikke noget default charset
Avatar billede olebole Juniormester
19. marts 2009 - 12:22 #40
Det indhold, der ligger i databasen er sikkert ANSI, indsat af et dokument, der ikke er gemt som utf-8 - og/eller hvor der ikke bruges en utf-8 meta - og/eller som serveren ikke sender som utf-8 (kan som bekendt ordnes med en Content-Type header).

Det samme tegnsæt skel bruges i alle led  ;o)
Avatar billede groyk Novice
19. marts 2009 - 15:10 #41
OK, Takker mange gange

Prøver lige at smide noget info i databasen fra en af mine php filer MED Content-Type

Synes bare det er mærkeligt at PhpMyAdmin ikke gør det automatisk, når databasen, tabellen og kolonnerne er sat til UTF-8

Såfremt jeg bruger Content-Type headeren i alle filer der komunikere med databasen, er det så ligegyldigt hvilket format filerne er gemt i?
Avatar billede olebole Juniormester
19. marts 2009 - 16:02 #42
Nej, det er nu ikke så mærkeligt. Det er input dokumentet, der bestemmer indholdet af databasen.

Nej, intet er ligegyldigt i denne sammenhæng. Alle led i kæden skal 'tale samme sprog' -> have samme kodning
Avatar billede groyk Novice
19. marts 2009 - 19:46 #43
OK.

Jeg bruger Webcoder 2005 som editor. udmidlbart kan jeg ikke vælge hvilket format mine filer skal gemmes i!
Avatar billede olebole Juniormester
20. marts 2009 - 00:31 #44
Den er ikke god til det med tegnsæt. Noget af det mindste, der er rigtig god til det er Notepad++:
  http://notepad-plus.sourceforge.net/uk/site.htm
Avatar billede groyk Novice
20. marts 2009 - 08:28 #45
Har lige installeret Notepad++ tror der overtager Webcoders plads :-)
Avatar billede olebole Juniormester
20. marts 2009 - 09:19 #46
Så er jeg spændt på at høre, om det hjælper på dit Ajax/tegnsæt problem  =)
Avatar billede groyk Novice
20. marts 2009 - 09:56 #47
Tager til Spanien i aften, men skal nok vende til bage når jeg har fået afprøvet "opskriften"
Avatar billede groyk Novice
20. marts 2009 - 11:40 #48
Nåede lige at få tid til at gøre forsøget.

Nu spiller det bare MAX

Dog er data ikke læsbare i PhpMyAdmin. Er nok min udbyder der ikke har helt styr på setuppet :-)

Takker MANGE GANGE for hjælpen. Så kan jeg endelig komme i gang med projektet.

_________________________________________________

Kunne godt bruge noget hjælp til udviklingen hvis det skulle have interesse :-)

Projektet går ud på at overføre min "gamle" "shop admin" til extjs og samtidigt udvikle et MINI erp system til små og mellemstore virksomheder.

Da jeg selv er autodidakt er der en del områder jeg ikke er så skarp i. Men selve basen af applikationen er faktisk lavet. Det hele skal dog omskrives til noget fornuftigt kode.

Jeg ved ikke helt hvilken licens softwaren skal udgives som. Muligvis OpenSource GPL?
Men hvis der kommer andre interesser ind over projektet, er det noget der naturligvis skal fastligges fra start.

Eneste krav jeg har til projektet er at det bygges op i JS,PHP, MySQL (InnoDB).

Kunne da være sjovt at få en / flere dygtige folk med fra start.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester