Toon posts:

[Ajax/PHP] XMLHttpRequest verwijderen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een site waar ik gebruik wil maken van Ajax icm PHP.

Er is een pagina dat bestaat uit een tabel met radiobuttons, die elke een event triggeren die iets invoert in de database (MySQL).

Het probleem is dat het maar 1x lukt, daarna wordt er niks meer toegevoegd, tenzij de cache van IE wordt leeggemaakt. Daarna lukt het weer wel om 1x iets toe te voegen.

Volgens mij zit het probleem in het feit dat de status na de eerste keer op 4 blijft hangen (4 = complete) en het daarna niet meer mogelijk is om nog iets toe te voegen.

Ik zat te denken om de XMLHttpRequest weg te gooien bij readyState == 4, maar dit kan blijkbaar niet (is mij niet gelukt in ieder geval). Ik heb het internet afgezocht, maar heb helaas geen oplossing gevonden.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
var http;

function createRequestObject()
{
    var request_;
    var browser = navigator.appName;
    
    if(browser == "Microsoft Internet Explorer")
    {
        request_ = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else
    {
        request_ = new XMLHttpRequest();
    }
    return request_;
}

function sendInfo()
{
    http = createRequestObject();

    http.open('get', 'sendDataAccountCostCat.php');

    http.onreadystatechange = handleInfo;

    http.send(null);
}

function handleInfo()
{
    if(http.readyState == 1)
    {
    }
    if(http.readyState == 4)
    {
        //http.onreadystatechange = null; // Dit kan dus niet
    }
}


In sendDataAccountCostCat.php staat niet veel, alleen een simpele db insert om het te testen.

PHP:
1
2
3
$db = new Db();
$query = "INSERT INTO `tabel` (`a1`, `a2`, `a3`) VALUES (4051, 8, 1)";
$result = $db->runQuery($query);


Volgens mij kan mijn probleem opgelost worden door de XMLHttpRequest te verwijderen na gebruik (correct me if I'm wrong), maar dit is mij dus niet gelukt.
Ik hoop dat ik het probleem duidelijk genoeg heb gemaakt en dat iemand mij op weg kan helpen

btw. Ik ben pas sinds gisteren bezig met Ajax.

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Volgens mij zou
JavaScript:
1
http = null;

het al moeten doen.

Stuur je wel no-caching headers vanuit sendDataAccountCostCat.php ?

offtopic:
browsersniffing... :/

[ Voor 11% gewijzigd door crisp op 26-11-2005 18:10 ]

Intentionally left blank


Verwijderd

Topicstarter
crisp schreef op zaterdag 26 november 2005 @ 18:09:
Volgens mij zou
JavaScript:
1
http = null;

het al moeten doen.

Stuur je wel no-caching headers vanuit sendDataAccountCostCat.php ?

offtopic:
browsersniffing... :/
Wat bedoel je met no-caching headers?

in sendDataAccountCostCat.php staat alleen:

PHP:
1
2
3
4
5
6
7
<?php
include_once($_SERVER['DOCUMENT_ROOT'] . "/db.inc.php");

$db = new Db();
$query = "INSERT INTO `tabel` (`a1`, `a2`, `a3`) VALUES (4070, 8, 1)";
$result = $db->runQuery($query);
?>

  • Victor
  • Registratie: November 2003
  • Niet online
Verwijderd schreef op zaterdag 26 november 2005 @ 18:05:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function createRequestObject()
{
    var request_;
    var browser = navigator.appName;
    
    if(browser == "Microsoft Internet Explorer")
    {
        request_ = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else
    {
        request_ = new XMLHttpRequest();
    }
    return request_;
}
Beetje offtopic, maar wel relevant: je bovenstaande code werkt wel, maar is niet bijzonder efficiënt. Je kunt i.p.v. te checken welke browser iemand gebruikt, beter kijken of het te gebruiken object beschikbaar is, zoals bijvoorbeeld hier:
JavaScript:
1
XMLRequest = (window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest());

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

zet daar dan eens zoiets boven:
PHP:
1
2
3
4
5
header('Expires: Mon, 26 Jul 1995 05:00:00 GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', time()) . ' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: pre-check=0, post-check=0, max-age=0', false);
header('Pragma: no-cache');

Intentionally left blank


Verwijderd

Topicstarter
crisp schreef op zaterdag 26 november 2005 @ 18:27:
zet daar dan eens zoiets boven:
PHP:
1
2
3
4
5
header('Expires: Mon, 26 Jul 1995 05:00:00 GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', time()) . ' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: pre-check=0, post-check=0, max-age=0', false);
header('Pragma: no-cache');
Perfect joh, dit is de oplossing.
Zou je het erg vinden om uit te leggen wat het doet? Of anders een link te geven waar dit wordt uitgelegd? Want nu doet ie t wel, maar ik weet niet waarom :?

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

King_Louie schreef op zaterdag 26 november 2005 @ 18:26:
[...]

Beetje offtopic, maar wel relevant: je bovenstaande code werkt wel, maar is niet bijzonder efficiënt. Je kunt i.p.v. te checken welke browser iemand gebruikt, beter kijken of het te gebruiken object beschikbaar is, zoals bijvoorbeeld hier:
JavaScript:
1
XMLRequest = (window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest());
Of zoiets (eleganter):
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
if (!window.XMLHttpRequest)
{
    window.XMLHttpRequest = function()
    {
        var types = [   'Microsoft.XMLHTTP',
                'MSXML2.XMLHTTP.5.0',
                'MSXML2.XMLHTTP.4.0',
                'MSXML2.XMLHTTP.3.0',
                'MSXML2.XMLHTTP'    ];

        for (var i = 0; i < types.length; i++)
        {
            try
            {
                return new ActiveXObject(types[i]);
            }
            catch(e) {}
        }

        return undefined;
    }
} 

en dan gewoon:
JavaScript:
1
http = new XMLHttpRequest();

Intentionally left blank


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Verwijderd schreef op zaterdag 26 november 2005 @ 18:32:
[...]


Perfect joh, dit is de oplossing.
Zou je het erg vinden om uit te leggen wat het doet? Of anders een link te geven waar dit wordt uitgelegd? Want nu doet ie t wel, maar ik weet niet waarom :?
De browser weet nu dat hij het resultaat van de GET niet moet cachen, dus bij een volgende aanroep zal hij dan niet eerst naar z'n cache kijken maar direct weer een request naar de server doen.

Voor meer uitleg zie o.a. php.net over de header() functie en de HTTP/1.1 specificatie

[ Voor 17% gewijzigd door crisp op 26-11-2005 18:35 ]

Intentionally left blank


Verwijderd

Topicstarter
crisp schreef op zaterdag 26 november 2005 @ 18:34:
[...]

De browser weet nu dat hij het resultaat van de GET niet moet cachen, dus bij een volgende aanroep zal hij dan niet eerst naar z'n cache kijken maar direct weer een request naar de server doen.

Voor meer uitleg zie o.a. php.net over de header() functie en de HTTP/1.1 specificatie
Oke, dan weet ik dat ook weer :*)
Pagina: 1