[php] query wordt 2 keer uitgevoerd?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 21-09 18:37

Saven

Administrator

Topicstarter
Hallo tweakers,

Ik ben een tijdje bezig met mijn nieuwe website, en maak daarvoor een groot systeem. Alles gaat opzich prima, maar ik ben nu bij iets aangekomen waar ik werkelijk niet uit kom.
Ik heb namelijk voor mijn sessions class een functie Update, om de huidige (database) sessie te updaten:
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
    public function update($sessid)
    {
        $query = $this->core->db->prepare
        ('
            UPDATE
                sessions
            SET
                last_time = UNIX_TIMESTAMP(),
                last_page = :last_page,
                hits = hits + 1
            WHERE
                id = :sessid
            LIMIT
                1
        ');
        
        $query->bindParam(':last_page', $_SERVER['REQUEST_URI'], PDO::PARAM_STR);
        $query->bindParam(':sessid',    $sessid, PDO::PARAM_STR);

        $query->execute();
        
        // debug voor deze rare query/functie
        $GLOBALS['uitgevoerd'] .= $GLOBALS['uitgevoerd'].'aaa__';
    }


Deze functie roep ik aan in de (eigen) constructor van mijn user class:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
    public function init()
    {
        // wat code die niet van toepassing is //
        
        //-----------------------------------------
        // Update current session
        //-----------------------------------------
        if( $this->logged_in === true )
        {
            $this->core->sess->update($this->sessid);
        }
    }


Zoals je ziet wil ik het aantal pageviews tellen van een bezoeker. Bij elke refresh wordt deze met één erbij opgeteld. Althans, dat is de bedoeling.
Om een of andere reden komen er steeds 2 hits bij!

Met die debug $GLOBALS heb ik getest of de functie niet 2 keer wordt uitgevoerd, en dat is niet het geval. Ik heb in elke file gezocht of ik perongeluk nog ergens anders hits optelde, maar ook dit is niet zo.

Het lijkt er dus op dat de query 2x wordt uitgevoerd... Iets wat ik absoluut niet kan begrijpen.

Nu vroeg ik mij af of jullie mij misschien kunnen helpen met dit probleem. Want ik word hier echt gek van :P

Eigenlijk wil ik deze post niet te lang maken ;) maar ik ben tot de conclusie gekomen dat als ik mijn view niet weergeef:
PHP:
1
$core->tpl->display('index.php');

op de index, dat hij dan wel gewoon maar ÉÉN erbij telt.

Terwijl er in de tpl class niks bijzonder gebeurd. Op verzoek wil ik deze wel posten, want ik weet dat jullie alles graag zo duidelijk mogelijk willen in de OP en aan gezien de (zelfgemaakte) TPL class opzich niet bijzonder is:P

Thnx

Acties:
  • 0 Henk 'm!

Verwijderd

Ofwel je hebt in index.php een aanroep naar die functie, ofwel je hebt een verwijzing in het document in de geest van <img src=""> of <script src=""> of <link href=""> naar een PHP script.

Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 21-09 18:37

Saven

Administrator

Topicstarter
Verwijderd schreef op dinsdag 20 januari 2009 @ 22:16:
Ofwel je hebt in index.php een aanroep naar die functie, ofwel je hebt een verwijzing in het document in de geest van <img src=""> of <script src=""> of <link href=""> naar een PHP script.
In mijn index template (tpl/index.php) heb ik onder andere dit stukje staan:
PHP:
1
2
3
            <div id="right">
            <?php include_once($method); ?>
            </div>

Als ik dat stukje weghaal is er weer niks aan de hand.

op mijn site index (/index.php) heb ik:
PHP:
1
$core->tpl->display('index.php');


zoals ik boven ook aangaf. maar het ligt dus aan dat tpl/index.php stukje code blijkbaar? maar ook daar is niks speciaals mee :P

[ Voor 3% gewijzigd door Saven op 20-01-2009 22:18 ]


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Wordt er in je view niet stiekem een tweede instantie aangemaakt van je klasse, waardoor dus ook de constructor twee keer wordt aangeroepen?

Acties:
  • 0 Henk 'm!

Verwijderd

Saven schreef op dinsdag 20 januari 2009 @ 22:18:
maar ook daar is niks speciaals mee :P
Dan zijn het kaboutertjes.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
PHP:
1
2
3
<div id="right"> 
  <?php include_once($method); ?> 
</div>


Wat include je daar? Oftewel: wat is de waarde van $method?

Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 21-09 18:37

Saven

Administrator

Topicstarter
HuHu schreef op dinsdag 20 januari 2009 @ 22:19:
Wordt er in je view niet stiekem een tweede instantie aangemaakt van je klasse, waardoor dus ook de constructor twee keer wordt aangeroepen?
Nope, ik heb elke file nageken. Ik kwam er achter dat er een bestand ajax.php nog was die ik had staan. die maakte wel nog een tweede instantie. Máár die werd niet aangeroepen of wat.
Ik heb die bestanden verwijderd, maar nu krijg ik ineens elke keer 3 hits erbij ipv 2 of 1 :')...
HuHu schreef op dinsdag 20 januari 2009 @ 22:20:
PHP:
1
2
3
<div id="right"> 
  <?php include_once($method); ?> 
</div>


Wat include je daar? Oftewel: wat is de waarde van $method?
Het volgende (het daat dan dus om regel 29 en regel 38):
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
40
41
42
43
44
45
46
    private function load_controller($name)
    {
        //--------------------------------
        // Load the associated model
        //--------------------------------
        if( $this->model_exists($name) )
        {
            $this->model($name);
        }
        
        require_once(controllers.$name.'.php');
        
        //--------------------------------
        // Load the controller
        //--------------------------------
        if( class_exists($name) )
        {
            $controller = new $name();
            $controller->core =& $this->core;
            
            $method = url(2);
            
            if( method_exists($name, $method) )
            {
                $controller->$method();
                
                if( $this->core->tpl->auto_assign_method === true )
                {
                    $this->core->tpl->assign('method', $name.'/'.$method.'.php');
                }
            }
            else
            {
                $controller->index();
                
                if( $this->core->tpl->auto_assign_method === true )
                {
                    $this->core->tpl->assign('method', $name.'/index.php');
                }
            }
        }
        else
        {
            throw new Exception('The controller class ('.$name.') does not exist.');
        }
    }

[ Voor 3% gewijzigd door Saven op 20-01-2009 22:29 ]


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
huhu HuHu!

Kijk eens welke bestanden er allemaal aangeroepen worden wanneer je de website opvraagt. Makkelijk te zien in de access log, met een sniffer, of met een firefox plugin als livehttpheaders.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Het lijkt er toch echt op dat op één of andere manier je klasse meerdere keren wordt aangemaakt, waardoor de init() functie meerdere malen wordt uitgevoerd.

Wellicht kun je de signature van de echte constructor van die klasse (__construct()) aanpassen een extra parameter toevoegen. Op plaatsen waar dan die klasse wordt aangemaakt moet die parameter worden meegegeven, maar dat doe je niet en dat levert dus een Exception op. Dan kun je zien waar er eventueel extra instanties worden aangemaakt. Dit kan misschien handiger, maar dat weet ik zo even niet.

Ook zou je van de klasse een Singleton kunnen maken, dan maakt het niet uit hoe vaak deze wordt aangemaakt: er zal altijd maar één instantie zijn.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
GlowMouse schreef op dinsdag 20 januari 2009 @ 22:32:
huhu HuHu!

Kijk eens welke bestanden er allemaal aangeroepen worden wanneer je de website opvraagt. Makkelijk te zien in de access log, met een sniffer, of met een firefox plugin als livehttpheaders.
Hoi GlowMouse!

Ik dacht nog even aan get_included_files(), maar die laat elk bestand maar één keer zien.

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
HuHu schreef op dinsdag 20 januari 2009 @ 22:35:
[...]

Hoi GlowMouse!

Ik dacht nog even aan get_included_files(), maar die laat elk bestand maar één keer zien.
Oh, ik dacht net dat een debug_backtrace samen met met $_SERVER['REQUEST_URI'] in een tekstbestandje opslaan juist waar de query wordt uitgevoerd wel een goed idee was.

Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Require_once gebruiken misschien?

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 21-09 18:37

Saven

Administrator

Topicstarter
Snake schreef op dinsdag 20 januari 2009 @ 22:36:
Require_once gebruiken misschien?
Dat gebruik ik ook? :P

@ de rest ik zal even gaan kijken :)

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
GlowMouse schreef op dinsdag 20 januari 2009 @ 22:36:
[...]

Oh, ik dacht net dat een debug_backtrace samen met met $_SERVER['REQUEST_URI'] in een tekstbestandje opslaan juist waar de query wordt uitgevoerd wel een goed idee was.
Ik zeg: klinkt als een goed plan. Dan kun je inderdaad zien waar het verzoek precies vandaan kwam en welk pad het in je code heeft doorlopen _/-\o_.

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Hoor ik niet naar jou te buigen? :?

Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 21-09 18:37

Saven

Administrator

Topicstarter
Hey mensen! Ik heb waarschijnljik de oorzaak :P In de css zitten nog wat images die niet bestaan :P en als iets niet bestaat redirect ie naar de index.

Ik ben geen htaccess held, maar ik denk dat een van jullie misschien een oplossing weet? die via htaccess is op te lossen, zonder dat alle images per se moeten werken :P :$

.htaccess:
code:
1
2
3
4
5
6
7
8
9
10
#RewriteEngine on
#RewriteCond $1 !^(index.php|template|fonts)
#RewriteRule ^(.*)$ index.php/$1 [L]

#set magic_quotes_gpc off
php_value magic_quotes_gpc off

#make nice url's
RewriteEngine on 
RewriteRule !\.(js|ico|gif|jpg|jpeg|png|bmp|css|ttf|otf|fon|zip|rar|exe|php|html)$ index.php

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ik zou allereerst maar eens beginnen met tóch maar eens zorgen dat al je images echt bestaan. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 21-09 14:53

MueR

Admin Tweakers Discord

is niet lief

En redirecten naar de index moet je nooit doen. Altijd netjes een 404 (met bijbehorende headers) serveren, dat snappen zoekmachines tenminste ook.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 21-09 18:37

Saven

Administrator

Topicstarter
Hm dat wil ik nu dus ook. Maar ik wil niet hardcoden in de htaccess bij welke file hij gewoon /controller/method/extra kan doen ipv index.php/controller/method/extra

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
GlowMouse schreef op dinsdag 20 januari 2009 @ 22:43:
[...]

Hoor ik niet naar jou te buigen? :?
Het mag wel als je wilt :D.
MueR schreef op woensdag 21 januari 2009 @ 00:00:
En redirecten naar de index moet je nooit doen. Altijd netjes een 404 (met bijbehorende headers) serveren, dat snappen zoekmachines tenminste ook.
In zo'n MVC omgeving redirect je juist altijd naar de index toe. Je doet een request en op basis van de .htaccess wordt een bestand terug gegeven (afbeelding, stylesheet, download, enz...) of het MVC framework wordt opgestart via de index.php.

Als je eenmaal in het MVC framework zit moet je vervolgens een controle doen of de controller en action die je wilt uitvoeren wel bestaan. Zo niet, dan gooit je framework een 404 terug. Maar in je .htaccess ga je altijd naar je index.php toe, tenzij je direct een bestand kunt aanbieden.

Ik gebruik daarvoor altijd deze .htaccess:
code:
1
2
3
4
5
6
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Dat mag ook, is toch niet zichtbaar voor client. Bottomline is gewoon dat er een 404 terug moet komen.

{signature}


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Als je de juiste controller/action niet kunt vinden dan moet je applicatie inderdaad gewoon n 404 error teruggeven.

Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Even offtopic: Ik zie dit staan:
PHP:
1
$GLOBALS['uitgevoerd'] .= $GLOBALS['uitgevoerd'].'aaa__';

Is dat niet een pleonasme? :P Dubbelop?

var = "hoi";
var .= var + "test";

var is dan "hoihoitest" ipv "hoitest"

Weet niet of dit nuttig is :P

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 21-09 18:37

Saven

Administrator

Topicstarter
Cartman! schreef op woensdag 21 januari 2009 @ 09:13:
Als je de juiste controller/action niet kunt vinden dan moet je applicatie inderdaad gewoon n 404 error teruggeven.
Is het dan voldoende om deze code te gebruiken in een functie die mijn controllers aanroept?
PHP:
1
header("HTTP/1.0 404 Not Found");
Guillome schreef op woensdag 21 januari 2009 @ 11:02:
Even offtopic: Ik zie dit staan:
PHP:
1
$GLOBALS['uitgevoerd'] .= $GLOBALS['uitgevoerd'].'aaa__';

Is dat niet een pleonasme? :P Dubbelop?

var = "hoi";
var .= var + "test";

var is dan "hoihoitest" ipv "hoitest"

Weet niet of dit nuttig is :P
Oja lol idd :P Nja twas laat gister he :$

[ Voor 35% gewijzigd door Saven op 21-01-2009 11:33 ]


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Saven schreef op woensdag 21 januari 2009 @ 11:27:
[...]

Is het dan voldoende om deze code te gebruiken in een functie die mijn controllers aanroept?
PHP:
1
header("HTTP/1.0 404 Not Found");
Je kunt beter bijv. intern dan een errorcontroller aanspreken die zowel de 404 header geeft alsmede een nette pagina voor je gebruiker met de melding dat het opgevraagde item niet (meer) bestaat.

Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 21-09 18:37

Saven

Administrator

Topicstarter
Cartman! schreef op woensdag 21 januari 2009 @ 11:36:
[...]

Je kunt beter bijv. intern dan een errorcontroller aanspreken die zowel de 404 header geeft alsmede een nette pagina voor je gebruiker met de melding dat het opgevraagde item niet (meer) bestaat.
Ik zal dat even proberen thnx :)
HuHu schreef op woensdag 21 januari 2009 @ 08:50:
[...]
Het mag wel als je wilt :D.
[...]
In zo'n MVC omgeving redirect je juist altijd naar de index toe. Je doet een request en op basis van de .htaccess wordt een bestand terug gegeven (afbeelding, stylesheet, download, enz...) of het MVC framework wordt opgestart via de index.php.

Als je eenmaal in het MVC framework zit moet je vervolgens een controle doen of de controller en action die je wilt uitvoeren wel bestaan. Zo niet, dan gooit je framework een 404 terug. Maar in je .htaccess ga je altijd naar je index.php toe, tenzij je direct een bestand kunt aanbieden.

Ik gebruik daarvoor altijd deze .htaccess:
code:
1
2
3
4
5
6
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
Bedankt voor je htaccess code :) maar zou je misschien een beetje kunnen uitleggen per regel wat die doet? Dan snap ik dat ook tenminste ipv dat ik hem blindelings gebruik :P d:)b

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Kun je zelf ook opzoeken eh, google eens op 'mod_rewrite cheatsheet' :)

Ik gebruik zelf (icm. Zend Framework) altijd:
code:
1
2
3
4
RewriteEngine On
RewriteCond     %{REQUEST_FILENAME}     !-f             
RewriteCond     %{REQUEST_FILENAME}     !-d
RewriteRule     ^(.*)$                  index.php       [L]

[ Voor 4% gewijzigd door Cartman! op 21-01-2009 11:45 ]


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Saven schreef op woensdag 21 januari 2009 @ 11:39:
[...]

Ik zal dat even proberen thnx :)


[...]

Bedankt voor je htaccess code :) maar zou je misschien een beetje kunnen uitleggen per regel wat die doet? Dan snap ik dat ook tenminste ipv dat ik hem blindelings gebruik :P d:)b
code:
1
2
3
4
5
6
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR] // is het een bestaand bestand ?
RewriteCond %{REQUEST_FILENAME} -l [OR] // is het een symlink ?
RewriteCond %{REQUEST_FILENAME} -d // is het een bestaande map ?
RewriteRule ^.*$ - [NC,L] // dan laten we dat zien en stoppen we hier
RewriteRule ^.*$ index.php [NC,L] // anders door naar index.php en stoppen
De vlag NC betekend 'no case', dus ongevoelig voor GROTE of kleine letters.

Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 21-09 18:37

Saven

Administrator

Topicstarter
HuHu schreef op woensdag 21 januari 2009 @ 11:56:
[...]

code:
1
2
3
4
5
6
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR] // is het een bestaand bestand ?
RewriteCond %{REQUEST_FILENAME} -l [OR] // is het een symlink ?
RewriteCond %{REQUEST_FILENAME} -d // is het een bestaande map ?
RewriteRule ^.*$ - [NC,L] // dan laten we dat zien en stoppen we hier
RewriteRule ^.*$ index.php [NC,L] // anders door naar index.php en stoppen
De vlag NC betekend 'no case', dus ongevoelig voor GROTE of kleine letters.
_O_ Alleen heb ik nu een klein probleempje.
Ik kan nu bijvoorbeeld template/tpl/ (waar index.php zich bevind voor de main layout) en template/tpl/members/login.php opvragen. Met als gevolg dat het er niet uit ziet :P.
ook opent hij dus automatisch een index.php/.html/.iets automatisch. Dat moet ook voorkomen worden :P

Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Dit heeft alleen niets meer met je vraag te maken :)

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 21-09 18:37

Saven

Administrator

Topicstarter
Iknow O-) maar om nou een heel nieuw topic daarvoor te starten vind ik ook weer zoiets :P

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 21-09 14:53

MueR

Admin Tweakers Discord

is niet lief

in /template (en andere mappen waar users niks in te zoeken hebben, kan je ook gewoon een .htaccess zetten met een Deny from All.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Je moet dergelijke bestanden ook _buiten_ je webroot zetten, dan kan verder niemand er bij ;)

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Cartman! schreef op woensdag 21 januari 2009 @ 13:30:
Je moet dergelijke bestanden ook _buiten_ je webroot zetten, dan kan verder niemand er bij ;)
Wat hij zegt dus.

Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 21-09 18:37

Saven

Administrator

Topicstarter
Idd :7 thnx iig iedereen voor de hulp ;)
Pagina: 1