[PHP] Probleem waar ik niet alleen uitkom met debuggen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Sjoerd
  • Registratie: December 2003
  • Niet online
Ik heb een ontzettend raar en vervelend stukje code dat me al een hele tijd dwars zit nl:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public function getRows($p_iFrom, $p_iLimit) {
        //TEST CODE
        $page = new pages();
        $page -> id = 1;
        $page -> getData();
        echo $page -> description;
        //EINDE TEST CODE   
        
        $sSQL = 'SELECT id FROM pages LIMIT '.$p_iLimit.' OFFSET '.$p_iFrom;
        //execute query
        $aRows=registry::get('db')->query($sSQL);
            
            foreach ($aRows as $row) {
                $page = new pages();
                $page -> id = 1;
                $page -> getData();
                echo $page -> description;
                //$this->m_aPages[] = $page;
            }
    }

(ps code is een stukje gestript tot de essentie van het probleem.)

Het is namelijk zo dat wanneer ik deze code uitvoer ik de eerste keer wel output krijg van mijn stukje test code maar vanaf het moment dat ik deze een 2de keer herhaal binnen de foreach (of for loop is al hetzelfde) krijg ik geen output maar een fijne error nl:

"home pagina omschrijving (dit is dus van het eerste stukje code)
(vanaf hier van het 2de stukje code)
SQL: SELECT * FROM pages WHERE id = '1';
Fatal error: Uncaught exception 'modelException' with message 'Error in SELECT' in /var/www/vhosts/url.net/httpdocs/classes/model.class.php:114 Stack trace: #0 /var/www/vhosts/url.net/httpdocs/models/pages.mdl.php(41): model->getData() #1 /var/www/vhosts/url.net/httpdocs/controllers/admin/pages.php(35): pages->getRows(0, 10) #2 /var/www/vhosts/url.net/httpdocs/classes/router.class.php(50): controller_pages->index() #3 /var/www/vhosts/url.net/httpdocs/index.php(38): router->delegate() #4 {main} thrown in /var/www/vhosts/url.net/httpdocs/classes/model.class.php on line 114"


Iemand een idee? ik weet dat het een erg open vraag is op deze manier maar weet echt niet waar ik kan gaan zoeken omdat het de eerste keer buiten de forloop wel goed gaat.

De werking van getData is dat hij kijkt welke properties zijn ingevuld, vervolgens stelt het ding een query op en haalt het resultaat op.
Met dit resultaat worden de rest van de properties gevuld.

Modelbouw - Alles over modelbouw, van RC tot diorama


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Gezien het feit dat er geen relatie is tussen de SQL query in de foutmelding en de SQL query in het gequote stukje code zit je het probleem op de verkeerde plek te zoeken.

Professionele website nodig?


Acties:
  • 0 Henk 'm!

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

Snake

Los Angeles, CA, USA

Er zit toch een Debugger class in Zend?

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


Acties:
  • 0 Henk 'm!

  • Sjoerd
  • Registratie: December 2003
  • Niet online
@curry684 hm oke, dat wordt lastig dan
Snake schreef op zaterdag 23 augustus 2008 @ 16:45:
Er zit toch een Debugger class in Zend?
Geen idee, maar dit is geen Zend is een eigen frameworkje, of is dit niet wat je bedoeld?

[ Voor 5% gewijzigd door Sjoerd op 23-08-2008 16:53 ]

Modelbouw - Alles over modelbouw, van RC tot diorama


Acties:
  • 0 Henk 'm!

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

Snake

Los Angeles, CA, USA

Sjoerd schreef op zaterdag 23 augustus 2008 @ 16:51:
@curry684 hm oke, dat wordt lastig dan


[...]

Geen idee, maar dit is geen Zend is een eigen frameworkje, of is dit niet wat je bedoeld?
Ah oei, idd probleem.

Wat returned die query?

Doe eens wat var_dump's.

Met wat debug je?

Zend Eclipse?

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


Acties:
  • 0 Henk 'm!

  • Sjoerd
  • Registratie: December 2003
  • Niet online
Net even mijn GetData() aangepast en krijg nu het volgende:

"SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute."

Ipv iets aan te zetten zou ik liever kijken waar de oorzaak zit.


(gebruik verder geen debugger eigenlijk)

Modelbouw - Alles over modelbouw, van RC tot diorama


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Sjoerd schreef op zaterdag 23 augustus 2008 @ 16:51:
@curry684 hm oke, dat wordt lastig dan
Lastig? Je ziet toch dat er staat:
SELECT * FROM pages WHERE id = '1';
Je hoeft dan toch alleen op te zoeken waar je die query uitvoert? :?

'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!

  • Sjoerd
  • Registratie: December 2003
  • Niet online
Nee, want ik weet waar die query wordt uitgevoerd... ;)

PHP:
1
2
3
4
5
6
 //TEST CODE 
        $page = new pages(); 
        $page -> id = 1; 
        $page -> getData(); 
        echo $page -> description; 
 //EINDE TEST CODE    


En dan vervolgens nog een keer daaronder binnen de foreach...

Modelbouw - Alles over modelbouw, van RC tot diorama


Acties:
  • 0 Henk 'm!

  • BlackWhizz
  • Registratie: September 2004
  • Laatst online: 08-12-2024
Je gebruikt PDO toch?

Dan moet je waar je connect dit toevoegen:
$oPDO->setAttribute(PDO_MYSQL_ATTR_USE_BUFFERED_QUERY, 1);

Wel ff $oPDO veranderen in jouw instance.

Acties:
  • 0 Henk 'm!

  • Sjoerd
  • Registratie: December 2003
  • Niet online
BlackWhizz schreef op zaterdag 23 augustus 2008 @ 18:27:
Je gebruikt PDO toch?

Dan moet je waar je connect dit toevoegen:
$oPDO->setAttribute(PDO_MYSQL_ATTR_USE_BUFFERED_QUERY, 1);

Wel ff $oPDO veranderen in jouw instance.
Dat was hem! geen idee wat nu de oorzaak was maar toch ;)

Modelbouw - Alles over modelbouw, van RC tot diorama


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Sjoerd schreef op zaterdag 23 augustus 2008 @ 18:20:
Nee, want ik weet waar die query wordt uitgevoerd... ;)

PHP:
1
2
3
4
5
6
 //TEST CODE 
        $page = new pages(); 
        $page -> id = 1; 
        $page -> getData(); 
        echo $page -> description; 
 //EINDE TEST CODE    


En dan vervolgens nog een keer daaronder binnen de foreach...
Nee, die daaronder heeft een LIMIT clause en geen WHERE clause, dat is dus een andere query. En die andere query wordt dus niet in deze code uitgevoerd, maar in code die door deze code wordt aangeroepen. Ergens in die pages::getData functie.

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Simpel: terwijl je de ene resultset aan het verwerken bent (gedurende de foreach loop) ga je andere queries uitvoeren, en dat kan normaliter schijnbaar niet met PDO.

PDO geeft zelf aan dat je op MySQL dit mogelijk kan maken d.m.v. PDO_MYSQL_ATTR_USE_BUFFERED_QUERY, wat in jouw geval het probleem dus ook oplost.

Curry: Hij bedoelt juist dat hij weet waar die query zonder limit wordt uitgevoerd. Het stukje code wat hij quote wordt bij iedere iteratie binnnen de foreach loop uitgevoerd, en runt dus "SELECT * FROM pages WHERE id='1'".

[ Voor 27% gewijzigd door B-Man op 24-08-2008 13:01 ]


Acties:
  • 0 Henk 'm!

  • Sjoerd
  • Registratie: December 2003
  • Niet online
B-Man schreef op zondag 24 augustus 2008 @ 12:59:
Simpel: terwijl je de ene resultset aan het verwerken bent (gedurende de foreach loop) ga je andere queries uitvoeren, en dat kan normaliter schijnbaar niet met PDO.

PDO geeft zelf aan dat je op MySQL dit mogelijk kan maken d.m.v. PDO_MYSQL_ATTR_USE_BUFFERED_QUERY, wat in jouw geval het probleem dus ook oplost.

Curry: Hij bedoelt juist dat hij weet waar die query zonder limit wordt uitgevoerd. Het stukje code wat hij quote wordt bij iedere iteratie binnnen de foreach loop uitgevoerd, en runt dus "SELECT * FROM pages WHERE id='1'".
Bedankt voor de uitleg verder, en idd dat is het stukje waar ik het over heb ;)

Modelbouw - Alles over modelbouw, van RC tot diorama

Pagina: 1