connectie in OOP mislukt?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mark moes

mark moes

18/03/2009 13:36:00
Quote Anchor link
Ik probeer een menu te creeren uit mijn database, met de volgende class:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
47
48
<?php
class Menu
{
     
    function
buildMenu($parentId)
    {

         $connector = new DbConnect('mark moes'); //Select the db..
        $connector->DbConnector();
        
        // prepare special array with parent-child relations
        $menuData = array(
            'items' => array(),
            'parents' => array()
        );

        
        while ($menuItem = $connector->fetchArray($connector->query('SELECT
            id, parentId, name
        FROM
            menu
        ORDER BY
            parentId, name'
)))
        {

            $menuData['items'][$menuItem['id']] = $menuItem;
            $menuData['parents'][$menuItem['parentId']][] = $menuItem['id'];
        }

        
            $html = "";
        
            if (isset($menuData['parents'][$parentId]))
            {

                $html = "<ul>\n";
                foreach ($menuData['parents'][$parentId] as $itemId)
                {

                    $html .= "<li>" . $menuData['items'][$itemId]['name'];
        
                    // find childitems recursively
                    $html .= $this->buildMenu($itemId, $menuData);
        
                    $html .= "</li>\n";
                }

                $html .= "</ul>\n";
                    print_r ($html);
            }

        //    print_r ($html);
            return $html;
    }
}

?>

De connectie komt uit deze class:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
47
48
49
50
51
52
53
54
55
56
57
58
59
<?php
class DbConnect
{
    public $link;
    public $db;
    public $result;
    
    function
__construct($db)
    {

        $this->db = $db;
    }

    
    //*** Function: DbConnector, Purpose: Connect to the database ***
    function DbConnector()
    {

        // Load settings from parent class
        $settings = SystemComponent::getSettings();
        
        // Get the main settings from the array we just loaded
        $host = $settings['dbhost'];
        $user = $settings['dbusername'];
        $pass = $settings['dbpassword'];
        
        // Connect to the database
        if ( ! $this->link = mysql_connect($host, $user, $pass))
        {

            trigger_error('Een error m.b.t. de MySQL Connectie: ' .mysql_error(),E_USER_ERROR);
        }

        mysql_select_db($this->db);
        //register_shutdown_function(array(@$this, 'close'));
    }
    
    //*** Function: query, Purpose: Execute a database query ***
    function query($query)
    {

         if ( ! $query = mysql_query($query, $this->link) )
        {

            trigger_error('Een error m.b.t. de MySQL Query: ' .mysql_error(), E_USER_ERROR);
        }

        return $query;
    }

    
    //*** Function: fetchArray, Purpose: Get array of query results ***
    function fetchArray($result)
    {
    
         if ( ! $result = mysql_fetch_array($result) )
         {

              trigger_error('Een error m.b.t. het <i>fetchen</i> van het MySQL resultaat: ' .mysql_error(), E_USER_ERROR);
        }

        return $result;
    }

    
    //*** Function: close, Purpose: Close the connection ***
    function close()
    {

        mysql_close($this->link);
    }
}

?>


Ik krijg elke keer de foutmelding
Fatal error: Maximum execution time of 30 seconds exceeded in C:\xampp\htdocs\website\Class\Class.php on line 54,

Betekend dus dat het fout gaat in de functie query.
Wie kan mij helpen? Ik ben al een week aan het zoeken waar de fout zit, ik denk dat er iets fout gaat met mijn OOP-techniek...
 
PHP hulp

PHP hulp

09/05/2021 21:43:40
 
Jelmer -

Jelmer -

18/03/2009 13:50:00
Quote Anchor link
Je voert de query zelf uit in de while-lus, m.a.w. iedere iteratie van de while-lus voer je de query opnieuw uit. En tada: een oneindige lus (of een eindige wanneer de query zou mislukken :P )
 
Wesley Overdijk

wesley Overdijk

18/03/2009 14:00:00
Quote Anchor link
de while snap ik niet helemaal... haal het 1 malig op maak dan een fetch array, object, whatever :P
 
Jelmer -

Jelmer -

18/03/2009 14:59:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
while ($menuItem = $connector->fetchArray($connector->query(...')))
?>

Ieder rondje haal je hier opnieuw dezelfde resultaten uit de database, en fetch je het eerste resultaat, en geef je dat aan $menuItem. $menuItem is niet false, dus de inhoud van de while-lus wordt uitgevoerd.

Nu, het volgende rondje. Weer haal je alle resultaten uit de database op, en fetch je het eerste resultaat. Weer is $menuItem niet false, en weer wordt de inhoud van je while-lus uitgevoerd.

En nog een keer, en nog een keer, en nog een keer totdat de 30 seconden om zijn. Er verandert ieder rondje namelijk niets in de voorwaarde van de while-lus, en dus is hij altijd waar of altijd onwaar.

Heel simpel opgelost:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$db_result
= $connect->query('...');

while($menuItme = $connector->fetch($db_result)) {
...
}

?>

Zie, iedere keer dat je mysql_fetch aanroept, verandert de staat van dat waar $db_result naar verwijst. (namelijk de positie van de pointer in de resultaten-set, die schuift iedere keer een stukje op) En op een gegeven moment zal je fetch-method 'false' teruggeven, en stopt de lus.
 
Mark moes

mark moes

18/03/2009 15:13:00
Quote Anchor link
Aha. Dus dan pas ik het aan.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$result
= $connector->fetchArray($connector->query('SELECT id, parentId, name FROM menu ORDER BY parentId, name'));
?>


En dan maak ik van van de while:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
while ($menuItem = $result)
{

    $menuData['items'][$menuItem['id']] = $menuItem;
    $menuData['parents'][$menuItem['parentId']][] = $menuItem['id'];
}

?>


Ik krijg nu de error
Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 35 bytes) in C:\xampp\htdocs\website\Class\Class.php on line 97
Gewijzigd op 01/01/1970 01:00:00 door mark moes
 
Jelmer -

Jelmer -

18/03/2009 15:16:00
Quote Anchor link
Nu verandert er weer niets in de conditie van je while-lus. $menuItem is en blijft de waarde die in $result staat, en $result verandert niet.
 
Mark moes

mark moes

18/03/2009 15:17:00
Quote Anchor link
Juist. Kun je me een voorbeeldje geven hoe het wel moet? Ik begin het te snappen... :D
 
Jelmer -

Jelmer -

18/03/2009 15:21:00
Quote Anchor link
2 posts terug, en je ziet een stukje code in mijn post staan. Net onder "heel simpel opgelost:".

Zie je hoe ik daar (indirect) mysql_fetch_* binnen de conditie van de while-lus heb staan? Daardoor verandert iedere keer dat de lus wordt uitgevoerd de staat van je query-result een beetje, totdat hij op is, je fetch-functie false teruggeeft en je lus stopt.
 
Mark moes

mark moes

18/03/2009 15:27:00
Quote Anchor link
Oeps sorry, wil te vlug, had er overheen gelezen.

Heb het aangepast, dit is het nu:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
$db_result
= $connector->query('SELECT id, parentId, name FROM menu ORDER BY parentId, name');
        
while ($menuItem = $connector->fetchArray($db_result))
{

$menuData['items'][$menuItem['id']] = $menuItem;
$menuData['parents'][$menuItem['parentId']][] = $menuItem['id'];
}

?>


Krijg nu een foutmelding:
Fatal error: Een error m.b.t. het fetchen van het MySQL resultaat: in C:\xampp\htdocs\website\Class\Class.php on line 66

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
function fetchArray($result)
{
    
if ( ! $result = mysql_fetch_array($result) )
{

trigger_error('Een error m.b.t. het <i>fetchen</i> van het MySQL resultaat: ' .mysql_error(), E_USER_ERROR);
}

return $result;
}

?>
 
Jelmer -

Jelmer -

18/03/2009 15:38:00
Quote Anchor link
Geen wonder. mysql_fetch_array zal een waarde die evalueert naar false teruggeven zodra hij aan het eind van de result-set is terecht gekomen.

Het is dan ook niet echt nuttig om te controleren of mysql_fetch_array is "gelukt". Het moet wel een keer mislukken, want zo is het ontworpen :)

Je kan beter controleren op het resultaat van je query-method. Als deze false is, betekent dat dat je query is mislukt. Als het een resource is, dan mag je ervan uitgaan dat het goed is gegaan, en dat wanneer je deze resource aan mysql_fetch_array geeft, dit ook zonder meer goed zal gaan. Ja, mysql_fetch_array zou direct false terug kunnen geven omdat er 0 resultaten gevonden zijn maar dat is normaal gedrag, en geen fout :)
 
Mark moes

mark moes

18/03/2009 15:50:00
Quote Anchor link
:D Ik blijf me soms verbazen over de mens... Wat een vreemde fouten kan die toch maken.

Heb er nu dus maar dit van gemaakt:
$result = mysql_fetch_array($result);

en zoals jij weet werkt dat weer...

Blijft er nog een ding over...

HEEL ERG BEDANKT...

Ik begon hier al aardig geirriteerd over te raken, t wou maar niet lukken. Eindelijk weer verder met het volgende, en vooral weer wat geleerd.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.