Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Jquery wil PHP functie niet uitvoeren.

Pagina: 1
Acties:

  • Tripwire999
  • Registratie: Januari 2004
  • Laatst online: 11:05
Ik ben nu al een tijdje mijn hoofd aan het breken op iets wat volgens mij heel simpel moet zijn. Ik draai een script die om de Unity3D webplayer is heen gebouwd om afbeeldingen te uploaden naar de webplayer. Er word op het moment van uploaden in PHP een map aangemaakt met de session_id(). Als de gebruiker de pagina verlaat wil ik dat deze folder weer verwijderd word. De PHP file bevind zich in dezelfde map als de HTML waar de Jquery in word uitgevoerd.

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
$(document).ready(function()
{
            $(window).on('beforeunload', function()
            {
                $.ajax({
                    url: "cleaner.php",
                    type: "post",
                    data: {"cleandir": '1'}
                });

                return 'bla';
            });
});


Ik krijg de window te zien met de tekst bla erin dus hij loopt in ieder geval door de functie heen.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function cleandir($clean)
{
    $dir = './uploads/' . session_id();

    if(is_dir($dir))
    {
        $files = glob($dir . '*', GLOB_MARK); //GLOB_MARK adds a slash to directories returned

        foreach($files as $file)
        {
            delete_files($file);
        }

        rmdir($dir);
    }
    else if(is_file($dir))
    {
        error_log("Not a directory!");
        unlink($dir);
    }
}


Bovenstaand PHP script ben ik nog aan het testen. Het maffe is dat ik in het begin alleen rmdir($dir); had staan toen krijg ik in de PHP error log een permisssion denied melding. Vervolgens wilde ik de volgende dag weer verder gaan en toen werd opeens de cleandir() functie niet meer aangeroepen 8)7 . Ik heb geprobeerd om via error_log ook errors te genereren in de cleaner.php maar die verschijnen ook niet.


Voor ik het vergeet, weet ook niet of het iets uitmaakt maar ik test alles via XAMPP.

Iemand enig idee waarom mijn PHP functie niet meer word aangeroepen?

  • BeefHazard
  • Registratie: Augustus 2010
  • Laatst online: 21-11 15:46
Zorg even voor syntax highlighting in je brokjes code. Gebruik [code=php] en [code=javascript]

R6 | 24-70 F2.8 DG OS HSM Art | 18-35 F1.8 DC HSM Art | EF 70-200 F4L IS USM | EF 50mm f/1.8 | Zenbook 14 OLED | T14G4 OLED


  • Tripwire999
  • Registratie: Januari 2004
  • Laatst online: 11:05
BeefHazard schreef op maandag 21 april 2014 @ 23:36:
Zorg even voor syntax highlighting in je brokjes code. Gebruik [code=php] en [code=javascript]
Thx was ik vergeten! Topic aangepast

  • Jeroen
  • Registratie: Juli 2005
  • Laatst online: 20-11 18:26

Jeroen

uǝʌ ǝp uɐʌ

Je kunt de output van het PHP script zien in de browser door dat in je javascript door te geven aan de console (en dan op F12 drukken als je dat nog niet had gedaan):

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$(document).ready(function() 
{ 
            $(window).on('beforeunload', function() 
            { 
                $.ajax({ 
                    url: "cleaner.php", 
                    type: "post", 
                    data: {"cleandir": '1'} 
                }).always(function(response){
                    console.log(response); 
                });

                return 'bla'; 
            }); 
});


Je kunt (in Chrome) ook naar de Network-tab gaan en daar de request- en responsedata bekijken, maar dit is voor kleine dingen een snelle oplossing.

Het valt mij ook op dat je PHP functie niet altijd iets hoeft te doen, dus misschien wil je daar bovenaan
code:
1
echo 'bla';
toevoegen of daar naar kijken. Als het pad namelijk niet bestaat dan gebeurt er niks, misschien is je session-id veranderd en werkt het daardoor nu niet meer.

Bovendien wordt je $clean variabele niet gebruikt.

[ Voor 9% gewijzigd door Jeroen op 21-04-2014 23:50 ]

"I don't always test my code, but when I do, I test on production."


  • Tripwire999
  • Registratie: Januari 2004
  • Laatst online: 11:05
Jeroen schreef op maandag 21 april 2014 @ 23:48:
Je kunt de output van het PHP script zien in de browser door dat in je javascript door te geven aan de console (en dan op F12 drukken als je dat nog niet had gedaan):

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$(document).ready(function() 
{ 
            $(window).on('beforeunload', function() 
            { 
                $.ajax({ 
                    url: "cleaner.php", 
                    type: "post", 
                    data: {"cleandir": '1'} 
                }).always(function(response){
                    console.log(response); 
                });

                return 'bla'; 
            }); 
});


Je kunt (in Chrome) ook naar de Network-tab gaan en daar de request- en responsedata bekijken, maar dit is voor kleine dingen een snelle oplossing.

Het valt mij ook op dat je PHP functie niet altijd iets hoeft te doen, dus misschien wil je daar bovenaan
code:
1
echo 'bla';
toevoegen of daar naar kijken. Als het pad namelijk niet bestaat dan gebeurt er niks, misschien is je session-id veranderd en werkt het daardoor nu niet meer.

Bovendien wordt je $clean variabele niet gebruikt.
Bedankt voor je reactie!

Dat de clean variabele niet gebruikt word klopt. Schijnbaar moet ik een variabele meegeven om een functie aanroep te doen in PHP vanuit JQuery. Als de folder niet meer zou bestaan dan zou ik een error melding moeten krijgen in de PHP error log maar die dumpt ook niks op het moment. Ik zal morgen even kijken naar je andere suggesties.

Edit:
Ik was helemaal vergeten in de OP te zetten dat ik in de cleandir functie een error_log had geplaatst om te kijken of de functie überhaupt word uitgevoerd. Ik heb het script uitgevoerd en daarna in de PHP error log gekeken maar ik zie daar ook niks in. Terwijl als ik in een ander PHP script een error_log zet deze wel gewoon uitgevoerd word.

[ Voor 9% gewijzigd door Tripwire999 op 22-04-2014 00:10 ]


  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

En wat als beide opties uit je if-lus nu false zijn en het bestand of de map, gewoon niet aanwezig is? :)
Dan lijkt het ook niets te doen, iets wat je in debug-fase ook wel wilt weten.

  • Merethil
  • Registratie: December 2008
  • Laatst online: 14:30
Weet je zeker dat je op die manier de functie kan aanroepen? Ik kan het eigenlijk nergens terugvinden en kan me herinneren dat ik zelf dit deed:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
$(document).ready(function() 
{ 
            $(window).on('beforeunload', function() 
            { 
                $.ajax({ 
                    url: "cleaner.php", 
                    type: "post", 
                    data: { varToCheck : '1'} 
                }); 

                return 'bla'; 
            }); 
});


PHP:
1
2
3
4
5
6
7
8
$someVarToTest = $_POST["varToCheck"];
if($someVarToTest != null && !empty($someVarToTest)) {
    myFunction($someVarToTest);
}

function myFunction($testVar) {
    // Do something
}


Voordeel hieraan is dat je ook zonder parameters je functie kan aanroepen, je gebruikt hem toch altijd zonder. zoals ik het nu zie. Dan gebruik je een parameter in je ajax call alleen om te checken of je die specifieke functie aan wilt roepen, bijvoorbeeld door een switch op functionName te doen ofzo (obfuscated want anders maak je het anderen wel heel makkelijk je code te doorgronden natuurlijk ;) )

Edit: Typo's... Ik was nog niet helemaal wakker. Aangepast indien mensen hier later op stuiten, dan weten ze de hoe/wat ipv allerlei fouten te krijgen... :+

[ Voor 7% gewijzigd door Merethil op 22-04-2014 08:56 ]


  • Tripwire999
  • Registratie: Januari 2004
  • Laatst online: 11:05
Merethil schreef op dinsdag 22 april 2014 @ 06:59:
Weet je zeker dat je op die manier de functie kan aanroepen? Ik kan het eigenlijk nergens terugvinden en kan me herinneren dat ik zelf dit deed:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
$(document).ready(function() 
{ 
            $(window).on('beforeunload', function() 
            { 
                $.ajax({ 
                    url: "cleaner.php", 
                    type: "post", 
                    data: {someVarToTest: '1'} 
                }); 

                return 'bla'; 
            }); 
});


PHP:
1
2
3
4
5
6
7
8
$someVarToTest = $_POST["varToCheck"]);
if($someVarToTest != null && !empty(someVarToTest)) {
    myFunction(someVarToTest);
}

function myFunction($testVar) {
    // Do something
}


Voordeel hieraan is dat je ook zonder parameters je functie kan aanroepen, je gebruikt hem toch altijd zonder. zoals ik het nu zie. Dan gebruik je een parameter in je ajax call alleen om te checken of je die specifieke functie aan wilt roepen, bijvoorbeeld door een switch op functionName te doen ofzo (obfuscated want anders maak je het anderen wel heel makkelijk je code te doorgronden natuurlijk ;) )
Thanks! Deze manier werkt perfect :) alles werkt nu zoals het moet werken. Nogmaals bedankt.

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Tripwire999 schreef op dinsdag 22 april 2014 @ 08:49:
[...]


Thanks! Deze manier werkt perfect :) alles werkt nu zoals het moet werken. Nogmaals bedankt.
Wedden van niet?

Een XmlHttpRequest dat gestart is in een beforeunload kan door een browser vroegtijdig stopgezet worden met een abort. Wanneer dat snel genoeg gebeurt, dan zal je server nooit een signaal ontvangen. Dat kan bijvoorbeeld al het geval zijn als de request gequeued moet worden omdat alle beschikbare connecties in de pool al bezet zijn. Maar het kan ook makkelijk halverwege het verzenden gebeuren, zeker als de payload groot genoeg is.

Ik geloof dat Chrome XmlHttpRequests geopend vanuit een window.unload event niets eens meer echt start. Voor window.beforeunload werkt het alleen nog betrouwbaar als je een sychronous request gebruikt.


offtopic:
Je zou het overigens behoorlijk grappig vinden hoe vaak ik al heb aan moeten geven bij mensen dat ze exact deze fout hebben gemaakt met exit tracking via google analytics en ze vervolgens mede kan delen dat al hun over de maanden heen geaggregeerde data compleet waardeloos is, omdat deze random component de data compleet vertekent. Foutje bedankt! :+

[ Voor 3% gewijzigd door R4gnax op 23-04-2014 01:32 ]

Pagina: 1