Avatar billede farving Nybegynder
05. marts 2007 - 18:42 Der er 30 kommentarer og
1 løsning

poste data til database via XmlHttp

Hej eksperter

Jeg sidder og laver et eksamensprojekt og er stødt på fast grund. Jeg skal have noget user submittet data proppet ind i en database, via xmlHttp requested. alle eksempler på nettet peger den anden vej - hvordan man trækker data ud. Jeg har prøvet at lave et simpelt eksempel for at teste om det virker.
http://carsten.farving.dk/xmlHttp/

Nogen der har en idé til hvordan jeg kan få dataene flytter over via post metoden da 255 tegn ikke er sikkert det er nok.

Mvh Carsten

Source code:
=================================================================
index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>Nyt dokument</title>
<meta name="generator" content="TSW WebCoder">
<script language="Javascript">
function getXmlHttpObject() {
    try
        {
        xmlHttp    = new XMLHttpRequest();
        }
    catch(e)
        {
        try
            {
            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
            }
        catch(e)
            {
            xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
        }
    return xmlHttp;
}
function postData(data) {
    var msg = data;
    alert(msg);
    xmlHttp = getXmlHttpObject();
    if (xmlHttp == null) {
        alert("Your browser doesn\'t support AJAX");
        return false;
    }
    page = "test.php";
    xmlHttp.open("POST",page,true);
    xmlHttp.send("input="+msg);   
    xmlHttp.onreadystatechange = function() {
        if (xmlHttp.readyState == 4) {
            document.getElementById("test").innerHTML = xmlHttp.responseText;
        }
    }
}
</script>
</head>

<body>
<form name="data" onsubmit="return false;">
<input name="input">
<input type="button" value="klik" onclick="postData(data.input.value);">
</form>
<div id="test"></div>
</body>
</html>

======
test.php:
<?
echo "output = ".$_POST['input'];
?>
Avatar billede roenving Novice
06. marts 2007 - 00:38 #1
page = "test.php?msg=" + msg;

-- så kan du aflæse værdien fra $_GET("msg") !-)
Avatar billede farving Nybegynder
06. marts 2007 - 08:58 #2
Er det ikke såkaldt fusk? Og desuden så er der en begrænsning på hvor meget der kan sendes via GET... Jeg tvivler på det maksimum bliver nået, men risikoen er der...

Mener det er 255 tegn der kan sendes med

Mvh Carsten
Avatar billede farving Nybegynder
06. marts 2007 - 13:17 #3
efter lidt søgning på nettet fandt jeg dette http://www.captain.at/howto-ajax-form-post-request.php

Men efter at have prøvet at føre mit script så tæt på ad det uden at bruge det og stadig få ingenting, så hvis nogen kan finde min fejl... har ændret i min kildekode, men den kan findes ved højreklik -> view source...

Mvh Carsten
Avatar billede roenving Novice
06. marts 2007 - 14:44 #4
Maksimum (i IE6 !-) er såvidt jeg husker 2083 tegn, men du skal så huske, at tegn, der skal url-encodes giver 3 tegn i urlen, men op til omkring en forventet længde på omkring 1000 tegn skulle der ikke blive problemer !-)
Avatar billede farving Nybegynder
06. marts 2007 - 19:08 #5
Okay, men ville nu helst om du ikke kunne hjælpe mig med at få post til at virke? Jeg har fundet et eksempel som egentlig virker, jeg kan bare ikke få mit til at virke...

Mvh Carsten
Avatar billede olebole Juniormester
07. marts 2007 - 14:47 #6
<ole>

Nu har din kode jo ikke meget med AJAX at gøre - og for den sags skyld heller ikke med JavaScript  =)

1) I AJAX bruger man ikke innerHTML (og det burde man nu heller ikke i andre sammenhænge)
2) Måden, du kalder dit script på, har ikke meget med noget kendt sprog at gøre (hverken den måde, du viser her - eller den måde, du bruger i eksemplet, du linker til)
3) Du må aldrig bruge navne som 'input', 'submit', el.lign. De bruges i forvejen og vil altid forvirre JavaScript.

Du kan evt. prøve:

<form name="data" onsubmit="return false;">
<input name="myInput">
<input type="button" value="klik" onclick="postData(this.form.myInput.value);">
</form>

- så skulle det gerne virke

/mvh
</bole>
Avatar billede farving Nybegynder
07. marts 2007 - 16:08 #7
1) Hvad skal man så bruge i stedet?
2) Hvordan skal det så gøres i stedet?

Og jeg har prøvet det du har posted, men det virker stadig ikke...

Mvh Carsten
Avatar billede olebole Juniormester
07. marts 2007 - 16:17 #8
Jo, det virker - ellers har du lavet en eller anden fejl  :)

Til det andet spørgsmål: Du skal bruge DOM i stedet for innerHTML
Avatar billede olebole Juniormester
07. marts 2007 - 16:24 #9
Har du prøvet at GET'e i stedet? Prøv at ændre disse to linjer:
    xmlHttp.open("GET","test.php?myInput="+data,true);
    xmlHttp.send();

- husk at bruge $_GET på serveren. Hvad siger den så?
Avatar billede farving Nybegynder
07. marts 2007 - 16:32 #10
Så virker det fint. Jeg ved godt hvordan jeg sender med GET, men pointen er at jeg vil sende det med POST.

Kom egentlig til at tænke på, hvorfor har det her ikke noget med AJAX at gøre?

Mvh Carsten
Avatar billede farving Nybegynder
07. marts 2007 - 16:40 #11
Så i stedet for innerHTML skal bruges nodeValue?

Mvh Carsten
Avatar billede olebole Juniormester
07. marts 2007 - 16:42 #12
Det lyder utroligt, det ikke skulle virke ...!?!!??!!!

Det har ikke meget med AJAX at gøre, hvis man HTML-formaterer data på serveren og indsætter dem med innerHTML på klienten.
Data returneres til klienten i XML- eller JSON-format og indsættes derefter i siden med DOM
Avatar billede olebole Juniormester
07. marts 2007 - 16:43 #13
"Så i stedet for innerHTML skal bruges nodeValue?" ... Ja - og anden, fornøden DOM
Avatar billede farving Nybegynder
07. marts 2007 - 16:54 #14
Med din form struktur og med GET så kan jeg få det til at virke. Med post så viser den kun det teskst som er predefineret i echo'et og får ikke hentet POST værdien.

Ang DOM. hvis i den div jeg referer til indsætter en paragraf, så burde jeg kunne bruge document.getElementById("test").firstChild.nodeValue = ...; right?

Mvh Carsten
Avatar billede olebole Juniormester
07. marts 2007 - 16:58 #15
Jo, det er måden at bruge nodeValue på - hvis der vel at mærke står noget i elementet fra starten.

Det lyder helt utroligt, du ikke kan få POST til at virke. Mon det er noget i din serveropsætning?
Avatar billede farving Nybegynder
07. marts 2007 - 17:02 #16
Okay, det virker bare ikke, selvom det står noget... nodeValue er det som er imellem html'en right?

Tjae men hva skulle det være? Hvis jeg ikke får det til at virke må jeg vel snakke med min hosts support...

Mvh Carsten
Avatar billede farving Nybegynder
07. marts 2007 - 17:40 #17
Tror du har ret i at det kan være min server opsætning. For medmindre at det eksempel jeg har fundet ikke har gemte kilder så virker den kode ikke på mit websted. Får simpelthen en fejl. Så vil lige prøve at forhøre mig hos min udbyder.

Mvh Carsten
Avatar billede farving Nybegynder
07. marts 2007 - 18:47 #18
Har snakket lidt med support fra min udbyder, og de kunne egentlig ikke hjælpe, andet end at jeg sku forhøre mig hos dem som havde lavet det script som faktisk virkede... Så ikke meget hjælp der...

Mvh Carsten
Avatar billede roenving Novice
08. marts 2007 - 13:41 #19
>>farving 07/03-2007 16:54:04

-- ikke helt rigtigt, for nodeValue vil være en textnode, som du også skal hente (og bemærk også, at et evt. linjeskift før p-tagget også vil være en node !-)

document.getElementById("test").firstChild.nodeValue.firstChild.nodeValue ...
Avatar billede farving Nybegynder
08. marts 2007 - 21:59 #20
Okay det er vældigt avanceret...

Men har omskrevet mit projekt til JSON og DOM så den del skulle gerne være i orden, men tilbage til mit post problem... ingen der har en løsning til dette?

Mvh Carsten
Avatar billede olebole Juniormester
09. marts 2007 - 13:02 #21
Check først med din udbyder, om XML-posts overhovedet er en option på dit hotel  ;o)
Avatar billede farving Nybegynder
10. marts 2007 - 18:54 #22
olebole, det var såmænd problemet, at de ikke undstøtter det eller hva man kalder det, så må jeg jo nøjes med GET...

Men så lige et hurtigt spørgsmål mere... Hvorfor får jeg syntax fejl i eval af http.responserText;

og det er vel og mærket JSON som bliver spyttet ud, bare i ren tekst...

Mvh Carsten

P.S. fejlen er i mit projekt script.
Avatar billede roenving Novice
10. marts 2007 - 23:09 #23
Hvis du sætter innerHTML direkte bliver det vel til ren tekst ?-)
Avatar billede farving Nybegynder
11. marts 2007 - 19:09 #24
Jeg sætter

var json = eval("("+xmlHttp.responseText+")");

Men smid et svar anyway, så må jeg lige fordele point'sne...

Mvh Carsten
Avatar billede olebole Juniormester
12. marts 2007 - 13:37 #25
Bruger du GET, kan du ligeså godt bruge JS/DOM uden brug af XMLHttpRequests. Prøv denne kode, der henter en JavaScript-fil: 'response.php'.
Den modtager et antal GET-variabler - indsætter i/henter fra DB - og udskriver JavaScript til klienten:

<html>
<script type="text/JavaScript">
function talk2server() {
    var o, sQ = "", aa = [], a = arguments;
    for (var i=0,j=a.length; i<j; i+=2) {
        aa.push(a[i] + "=" + escape(a[i+1]));
    }
    while (oScrLoader.firstChild) {
        oScrLoader.removeChild(oScrLoader.firstChild);
        o = null;
    }   
    o = oScrTempl.cloneNode(true);
    o.setAttribute("src", "response.php?" + aa.join("&"));
    oScrLoader.appendChild(o);
}

var oScrLoader = oScrTempl = null;
window.onload = function(){
    oScrLoader = document.getElementById("scrLoader");
    oScrTempl = oScrLoader.getElementsByTagName("script")[0].cloneNode(true);
}
</script>
<body>

<button onclick="talk2server('varA','valueA', 'varB','valueB', 'varC','valueC')">Test</button>

<div id="scrLoader" style="display:none">
    <script type="text/JavaScript"></script>
</div>

</body>
</html>

Du kan med dette eksempel sætte response.php til at indeholde noget à la:

alert("<?=$_GET["varA"]?>");
alert("<?=$_GET["varB"]?>");
alert("<?=$_GET["varC"]?>");

- og så se, hvad der sker  =)
Avatar billede farving Nybegynder
13. marts 2007 - 10:05 #26
Det ser umiddelbart ud til at virke som det skal...

Problemet er bare at man kan stå i situationer hvor GET bare ikke er nok, og selvom mit webhotel ikke understøtter XML-POST's, så vil jeg nu stadig gerne lære at bruge xmlHttpRequested, selvom det kan virke som en omvej...

Men vil under alle omstændigheder kigge på eksemplet i ny og næ, da det ser interessandt ud...

Mvh Carsten
Avatar billede olebole Juniormester
13. marts 2007 - 13:36 #27
Metoden har den fordel, at den også understøttes i f.eks. Mozilla- og Opera-browsere fra før, de understøttede XMLHttpRequests. Iøvrigt bør 'oprydningen' nok se sådan ud:
    while (oScrLoader.firstChild) {
        o = oScrLoader.firstChild;
        oScrLoader.removeChild(o);
        o = null;
    }
Avatar billede farving Nybegynder
13. marts 2007 - 23:44 #28
Well, må nok indrømme at jeg ikke gør så meget i bagudkompalitet, da jeg ikke er nået det punkt hvor jeg skal begynde at tjene på det endnu...

Men som tidligere nævnt, drop et svar :)

Mvh Carsten
Avatar billede olebole Juniormester
15. marts 2007 - 15:24 #29
- hermed droppet  ;o)
Avatar billede olebole Juniormester
16. marts 2007 - 12:38 #30
Tak for points  ;o)
Avatar billede farving Nybegynder
19. marts 2007 - 10:30 #31
Tak for hjælpen ;)

Mvh Carsten
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