Avatar billede andreas13_fam Nybegynder
27. februar 2009 - 10:43 Der er 29 kommentarer og
1 løsning

Problemer med at sende POST via HttpRequest

Jeg er ved at prøve at lave noget AJAX (AJA) men jeg har problemer med sende en POST meddelelse til mit PHP script.
Jeg har primært gået efter:
http://www.v4d5.net/artikler/ajaxudenx.php
og
http://www.dengodekode.dk/artikler/ajax/xmlhttprequest_wrapper.php

Ud af det er jeg nået her til.

HTML fil:
<input tabindex="4" maxlength="20" style="width:400px;" type="text" value="Brugernavn" name="opretbrugernavn" id="brugernavn" onBlur="SendSporgBrugernavn()">

java script:
(function(){
    if (window.XMLHttpRequest) return;
    var o = null, s,
    a = ["MSXML2.XMLHTTP.6.0", "MSXML2.XMLHTTP.3.0", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP"];
    for (var i=0,j=a.length; i<j; i++) {
        s=a[i];
        try {
            if (o=new ActiveXObject(s))  break;
        }
        catch(e){};
    }
    window.XMLHttpRequest = o ? function(){return new ActiveXObject(s)} : null;
    o = null;
})();

function SendSporgBrugernavn()
{
var SendBrugernavn = "ajaxbrugernavn="+document.getElementById('brugernavn').value;
askServerBrugernavn(SendBrugernavn);
}


function askServerBrugernavn(sQuery)
{
    _oHttp = new XMLHttpRequest();
    _oHttp.open("post", "AJAX/Opet-Bruger/brugernavn.php", true);
    _oHttp.onreadystatechange = function(){ myCallBackBrugernavn(_oHttp) };
    _oHttp.send(sQuery);
}

function myCallBackBrugernavn(oHttp)
{
    if (oHttp.readyState == 4)
    {
        if (oHttp.status == 200)
        {
            var svar = oHttp.responseText;
            alert(svar);
        }
    }
}

PHP:
if ($_POST['ajaxbrugernavn'] == "")
{
echo 'intet';
}
else
{
echo $_POST['ajaxbrugernavn'];
}



Ud af det for jeg alert boksen: intet
Avatar billede chrisbuchholz Nybegynder
27. februar 2009 - 10:55 #1
Det er god skik at smide en header med når man leger med XMLHttpRequest i Javascript.

_oHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded;");

Jeg ved ikke om dette vil løse problemet, men det er altid godt og prøve, og selvom det måske ikke løser det bør du altid inkluderer det når du bruger post metoden.

Det ville være lidt nemmere at finde fejlen hvis du kunne linke til den side hvor din kode bruges(hvis den ligger på nettet, that is).
Avatar billede andreas13_fam Nybegynder
27. februar 2009 - 11:24 #2
Avatar billede chrisbuchholz Nybegynder
27. februar 2009 - 11:31 #3
Jeg kan fortælle dig at der intet er galt med javascript delen. Jeg kan se at informationen bliver sendt rigtigt afsted, så det er php dokumentet der klydre i det et eller andet sted.

Prøv bare at sætte den til echo $_POST['ajaxbrugernavn']; og se hvad der sker.
Avatar billede majbom Novice
27. februar 2009 - 11:32 #4
jeg ved ikke om det gør en forskel, men jeg bruger altid store bogstaver i ordet "POST"...

det er din "askServerBrugernavn" jeg tænker på, hvor du kalder:

_oHttp.open("post", "AJAX/Opet-Bruger/brugernavn.php", true);
Avatar billede andreas13_fam Nybegynder
27. februar 2009 - 11:34 #5
Intil vidre ser det ud til at virke med:
    _oHttp = new XMLHttpRequest();
    _oHttp.open("post", "AJAX/Opet-Bruger/brugernavn.php", true);
    _oHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
    _oHttp.onreadystatechange = function(){ myCallBackBrugernavn(_oHttp) };
    _oHttp.send(sQuery);
Avatar billede olebole Juniormester
27. februar 2009 - 12:21 #6
<ole>

Headeren, chrisbuchholz omtaler, er ikke blot 'god skik', men en nødvendighed ved POST-requests - så det er fint, I fik den med.

Desuden bør du altid escape, hvor der kan forekomme specialtegn (f.eks. i et brugernavn):

function SendSporgBrugernavn()
{
var SendBrugernavn = "ajaxbrugernavn="+encodeURIComponent(document.getElementById('brugernavn').value);
askServerBrugernavn(SendBrugernavn);
}

Derudover vil jeg gerne se din serverkode, for det må være dér, fejlen ligger  =)

/mvh
</bole>
Avatar billede andreas13_fam Nybegynder
27. februar 2009 - 13:11 #7
niks det virker nu.
Bortset fra at jeg har en del problemer med at få insat data via DOM og ikke innerHTML.
Avatar billede olebole Juniormester
27. februar 2009 - 13:20 #8
Det er svært at hjælpe med, når man ikke ved, hvad du gør og ikke gør  =)
Avatar billede andreas13_fam Nybegynder
27. februar 2009 - 13:33 #9
Jaja jeg skulle lige forsøge prøve noget først.
Desuden er jeg ikke så skab til JavaScript, så jeg skal lige have slået nogle ting op.

function myCallBackBrugernavn(oHttp)
{
    if (oHttp.readyState == 4)
    {
        if (oHttp.status == 200)
        {
        var Respons = oHttp.responseText;
        var GetEl = document.getElementById('BrugernavnStatus');
            if (GetEl.childNodes.length == 0)
            {
                    Inset = document.createElement("span");

                    Inset.setAttribute("style","color:#419E00;");

                    Inset.appendChild(document.createTextNode(Respons));

                    GetEl.appendChild(Inset);
            }
            else
            {
                    GetEl.firstChild.nodeValue = Respons;
            }
        }
    }
}
Avatar billede olebole Juniormester
27. februar 2009 - 14:11 #10
Er det kun ét element, du skal bruge - eller er det en større 'cloud' af elementer?
Avatar billede andreas13_fam Nybegynder
27. februar 2009 - 14:26 #11
Ok nu er jeg så langt at jeg gide forklare hvad jeg ikke kan få til at virke.

Ud fra en tilbagemelding som denne "<span style="color:#FF9911;">- Mangler input</span>"

laver jeg 2 varabler via RegExp
var FindColor = "color:#FF9911;";
var FindIndhold = "- Mangler input";
Dette virker fint

Herefter vil jeg gerne slette det som er inde i <span id="BrugernavnStatus"> </span>
Noget som jeg ikke kan finde ud af.

fx:
<span id="BrugernavnStatus">
  <span style="color:#FF9911;">- Mangler input</span>
</span>
Dette er udskrives med PHP!!

Når det er gjort vil jeg gerne oprette et element: fx:
<span style="color:#FF0000;">- Fejl</span>
Dette gør jeg ud fra variablerne jeg oprettede tidligere

Inset = document.createElement("span");
Inset.setAttribute("style",FindColor[1]);
Inset.appendChild(document.createTextNode(Respons));
GetEl.appendChild(FindIndhold[1]);

Dette virker lidt, den udskriver tekst men ikke <span> der kommer nemlig ingen farver.

for at udgå at den bliver ved med at oprette et <span> har jeg indsat if (GetEl.childNodes.length == 0)


----------KODE--------------------


function myCallBackBrugernavn(oHttp)
{
    if (oHttp.readyState == 4)
    {
        if (oHttp.status == 200)
        {
        //--
        var Respons = oHttp.responseText;
        var GetEl = document.getElementById('BrugernavnStatus');
       
        // opretter variabler ud fra fx <span style="color:#FF9911;">- Mangler input</span>
        var RegExpColor = new RegExp("<span style=\"(..............)\">[^<]+</span>");
        var RegExpIndhold = new RegExp("<span style=\"..............\">([^<]+)</span>");
       
        var FindColor = RegExpColor.exec(Respons);
        var FindIndhold = RegExpIndhold.exec(Respons);
       
            if (GetEl.childNodes.length == 0)
            {
                    Inset = document.createElement("span");

                    Inset.setAttribute("style",FindColor[1]);

                    Inset.appendChild(document.createTextNode(Respons));

                    GetEl.appendChild(FindIndhold[1]);
            }
            else
            {
                    GetEl.firstChild.nodeValue = FindIndhold[1];
            }
        }
    }
}

Hvis der er nogen der vil have et svar er de velkommende til at ligge et, også selvom dette ikke bliver besvaret. Jeg har fået svar på det spørgsmål jeg stille til at starte med. Jeg skriver kun dette ekstra spørgsmål her fordi at OleBole så geren hvil hjælpe mig (tilsyneladende), det er nok fordi at jeg ikke bruger innerHTML :D
Avatar billede olebole Juniormester
27. februar 2009 - 14:36 #12
style er ikke en alm. attribut, men et objekt på elementet:
    inset.style = FindColor[1]
Avatar billede olebole Juniormester
27. februar 2009 - 14:37 #13
Ups - nej! Den er ikke god  =)
    inset.style.color = "#FF9911";
Avatar billede olebole Juniormester
27. februar 2009 - 14:38 #14
"Ud fra en tilbagemelding som denne" >> Ehhh ... skriver du HTML ud på serveren, når du svarer request'en?
Avatar billede olebole Juniormester
27. februar 2009 - 14:40 #15
- og der for pokker ikke snart én eller anden, der retter den JS-fejl, der konstant generer i trådene på Eksperten ...?!??!!!
Avatar billede andreas13_fam Nybegynder
27. februar 2009 - 15:13 #16
hmm jeg er ikke helt med på hvor
inset.style.color = "#FF9911"; skal indsættes.

--Kode--
Inset = document.createElement("span");
Inset.setAttribute("style",FindColor[1]);//Denne er forkert
Inset.appendChild(document.createTextNode(Respons));
GetEl.appendChild(FindIndhold[1]);
Avatar billede andreas13_fam Nybegynder
27. februar 2009 - 18:47 #17
OK så fik jeg det til at virke uden innerHTML :D
Jeg har bare lige et spørgsmål,
i følge dine "Lidt 'langhårede' indianer-tricks" kan man bruge en variabel til at kalde en funktion. Det betyder at jeg skulle kunne gøre sådan..

function askServer(sQuery,sDomain,sOpgave)
{
    _oHttp = new XMLHttpRequest();
    _oHttp.open("post", sDomain, true);
    _oHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
    _oHttp.onreadystatechange = function(){ sOpgave(_oHttp) };
    _oHttp.send(sQuery);
}

function SendSporgBrugernavn()
{
var SendBrugernavn = "ajaxbrugernavn="+encodeURIComponent(document.getElementById('brugernavn').value);
askServer(SendBrugernavn,"AJAX/Opet-Bruger/brugernavn.php","myCallBackBrugernavn")
}

function myCallBackBrugernavn(oHttp)
{
alert(oHttp.readyState);
    if (oHttp.readyState == 4)
    {
        if (oHttp.status == 200)
        {
        //--
        var Respons = oHttp.responseText;
        var GetEl = document.getElementById('BrugernavnStatus');

        // opretter variabler ud fra fx <span style="color:#FF9911;">- Mangler input</span>
        var RegExpColor = new RegExp("<span style=\"color:(.......);\">[^<]+</span>");
        var RegExpIndhold = new RegExp("<span style=\"color:.......;\">([^<]+)</span>");
       
        var FindColor = RegExpColor.exec(Respons);
        var FindIndhold = RegExpIndhold.exec(Respons);

        GetEl.style.color = FindColor[1];
            if (GetEl.childNodes.length == 0)
            {
                var Inset = document.createTextNode(FindIndhold[1]);
                GetEl.appendChild(Inset);
            }
            else
            {
                GetEl.style.color = FindColor[1];
                GetEl.firstChild.nodeValue = FindIndhold[1];
            }
        }
    }
}

---------------forklaring----------
hvis jeg kalder funktionen
SendSporgBrugernavn()
Skulle den kalde
askServer(sQuery,sDomain,sOpgave)
hvilket den også gør.

men efter det burde askServer(sQuery,sDomain,sOpgave) kalde
myCallBackBrugernavn(oHttp)
hvilket den ikke gør.

Det er altså det med at kalde en funktion via en variabel der giver problemer.
hvis jeg fx skriver.
_oHttp.onreadystatechange = function(){ sOpgave(_oHttp) };
i askServer(sQuery,sDomain,sOpgave)
udskriver den nemlig alert("1") TIL alert("4")

Jeg håber du forstår hvad jeg mener
Avatar billede chrisbuchholz Nybegynder
27. februar 2009 - 19:03 #18
askServer(..., "myCallBackBrugernavn");

Det du gør der er at sende en streng til askServer. Det du skal gøre er at sende en reference hvilket kan gøres på følgende møde:

var mCBB_ref = myCallBackBrugernavn();
askServer(..., mCBB_ref);

Husk selvfølgelig at sætte det rigtige ind istedet for de tre prikker;)
Avatar billede andreas13_fam Nybegynder
27. februar 2009 - 20:08 #19
hmm ja det er da en start.
i myCallBackBrugernavn(oHttp) er oHttp = intet
den bliver altså ikke sendt

function askServer(sQuery,sDomain,sOpgave)
{
    _oHttp = new XMLHttpRequest();
    _oHttp.open("post", sDomain, true);
    _oHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
    _oHttp.onreadystatechange = function(){ sOpgave(_oHttp) };
    _oHttp.send(sQuery);
}

function SendSporgBrugernavn()
{
var Opgave = myCallBackBrugernavn();
var SendBrugernavn = "ajaxbrugernavn="+encodeURIComponent(document.getElementById('brugernavn').value);
askServer(SendBrugernavn,"AJAX/Opet-Bruger/brugernavn.php",Opgave)
}


function myCallBackBrugernavn(oHttp)
{
alert(oHttp.readyState);
    if (oHttp.readyState == 4)
    {
        if (oHttp.status == 200)
        {
        //--
        var Respons = oHttp.responseText;
        var GetEl = document.getElementById('BrugernavnStatus');

        // opretter variabler ud fra fx <span style="color:#FF9911;">- Mangler input</span>
        var RegExpColor = new RegExp("<span style=\"color:(.......);\">[^<]+</span>");
        var RegExpIndhold = new RegExp("<span style=\"color:.......;\">([^<]+)</span>");
       
        var FindColor = RegExpColor.exec(Respons);
        var FindIndhold = RegExpIndhold.exec(Respons);

        GetEl.style.color = FindColor[1];
            if (GetEl.childNodes.length == 0)
            {
                var Inset = document.createTextNode(FindIndhold[1]);
                GetEl.appendChild(Inset);
            }
            else
            {
                GetEl.style.color = FindColor[1];
                GetEl.firstChild.nodeValue = FindIndhold[1];
            }
        }
    }
}
Avatar billede andreas13_fam Nybegynder
27. februar 2009 - 20:09 #20
arr fjerner jeg () fra var Opgave = myCallBackBrugernavn(); virker det :D
Avatar billede andreas13_fam Nybegynder
27. februar 2009 - 20:12 #21
Er der nogen der vil have point må de ligge et svar :)
Avatar billede olebole Juniormester
27. februar 2009 - 23:25 #22
Når du skriver:
    var Opgave = myCallBackBrugernavn();

- indeholder variablen Opgave resultatet af et kald til funktionen myCallBackBrugernavn. Returnerer funktionen strengen Blabla, vil Opgave indeholde denne streng.

Skriver du derimod:
    var Opgave = myCallBackBrugernavn;

- indeholder Opgave en reference til funktionen. Det betyder, du på et senere tidspunkt kan kalde funktionen med Opgave() - og få returneret, hvad funktionen måtte returnere i dette splitsekund.
Avatar billede andreas13_fam Nybegynder
28. februar 2009 - 12:53 #23
hmm jeg har faktisk opdaget et problem, i IE 7 (måske også andre) er man nød til at geninlæse siden ved hjælp af F5 før det virker.
http://www.kogebogen.a-mweb.dk/NyHTML/index.php?profil=opret
Avatar billede olebole Juniormester
28. februar 2009 - 16:46 #24
- og hvad skal jeg foretage mig for at få det at se?
Avatar billede andreas13_fam Nybegynder
28. februar 2009 - 20:45 #25
tjaa hvis jeg vidste præcis hvad man skal fortage sig for at få det til at virke vil mit problem ikke være så stor.
Men jeg er ved at teste JavaScripet men jeg har efter 1½ stadig ikke fundet noget :(
Men du er da velkommen til at se i kildekoden.
Avatar billede olebole Juniormester
28. februar 2009 - 22:27 #26
Hvad skal jeg gøre på siden for at køre scriptet?
Avatar billede andreas13_fam Nybegynder
01. marts 2009 - 10:07 #27
Du kan skrive noget i brugernavn og trykke tab - for at provokere den til en rød farve kan du fx skrive #
i troppen af kildekoden finder du link til JavaScript'ene.
Ellers kommer jeg med nogle links når jeg kommer i nærheden af en computer.
Avatar billede olebole Juniormester
01. marts 2009 - 13:40 #28
Jeg får en 'Permission denied' fejl. Hvorfor har vi ikke hørt om den før?  ;o)

Det kunne tyde på, du prøver at lave noget X-Domain Ajax - og det kan man ikke. Filen, der kaldes med XMLHttpRequest objektet, skal ligge under samme domæne, som filen der kalder.
Da din side ligger under et subdomæne, er det formodentlig dér, fejlen opstår.
Avatar billede andreas13_fam Nybegynder
01. marts 2009 - 17:02 #29
Det gør ingen forskæl at skrive http://www.kogebogen.a-mweb.dk/NyHTML/ først.

Guide til at blive tosset:
- Gå ind på denne side via IE (Jeg har testet med IE7):
http://www.kogebogen.a-mweb.dk/NyHTML/index.php?profil=opret
- Skriv noget i feltet "brugernavn", fjern fokus (fx tab).
- Lig mærke til at der kommer en fejl (ligesom på ekspterten.dk)
- Genindlæs side, ikke ved at skrive URL igen men, ved at trykke på F5 knappen.
- Skriv noget i feltet "brugernavn", fjern fokus (fx tab).
- Lig mærke til at det nu virker.

Links til at blive klogere (måske):
http://www.kogebogen.a-mweb.dk/NyHTML/AJAX/XMLHttpRequest.js
http://www.kogebogen.a-mweb.dk/NyHTML/AJAX/Opet-Bruger/JavaScript.js
http://www.kogebogen.a-mweb.dk/NyHTML/AJAX/Opet-Bruger/

Mit problem:
Mit problem er at fejlen kun opstår i IE når man skriver URL eller går ind på siden. Ligeså snart at man genindlæser (F5) siden virker det perfekt.
Avatar billede andreas13_fam Nybegynder
01. marts 2009 - 17:24 #30
Og en at php filerne: brugernavn.php
<?php
if ($_POST['ajaxbrugernavn'] == "Brugernavn")
{
echo '<span style="color:#FF9911;">- Mangler input</span>';
}
elseif ($_POST['ajaxbrugernavn'] == "")
{
echo '<span style="color:#FF9911;">- Mangler input</span>';
}
elseif (preg_match("/\s+/", $_POST['ajaxbrugernavn']))
{
echo '<span style="color:#FF0000;"> - Du må ikke bruge mellemrum! </span>';   
}
elseif (preg_match("/-+/", $_POST['ajaxbrugernavn']))
{
echo '<span style="color:#FF0000;"> - Du må ikke bruge bindestreg! </span>';
}
elseif (preg_match("/\w+/", $_POST['ajaxbrugernavn']))
{
    $anti_sql_infiktion_input = $_POST['ajaxbrugernavn'];
    include "/home/amwebdk/public_html/Portal/WWW_Kogebogen/MySQL/Anti-SQL-infiktion/A-SQL-i.php"; //Anti-SQL-infiktion
    $tjek = $anti_sql_infiktion_output;
   
    include "/home/amwebdk/public_html/mappe/opret-forbindelse.php"; //opretter forbindelse
    $query = "SELECT * FROM `kogebogen-bruger` WHERE brugernavn='".$tjek."'";
    $result = mysql_query("$query") OR DIE(mysql_error());
    $num_rows = mysql_num_rows($result); //$num_rows = antal rækker i MySQL database
   
    if ($num_rows == 1)
    {
    echo '<span style="color:#FF0000;"> - Brugernavnet findes allerede, velg et andet! </span>';
    }
    elseif ($num_rows == 0)
    {
    echo '<span style="color:#419E00;"> - Korekt!</span>';
    }
}
else
{
echo '<span style="color:#FF0000;"> - Ukendt fejl - Prøv igen! </span>';
}
?>
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