connectie in OOP mislukt?
Code (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
47
48
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;
}
}
?>
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)
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
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);
}
}
?>
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...
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 )
de while snap ik niet helemaal... haal het 1 malig op maak dan een fetch array, object, whatever :P
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)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$db_result = $connect->query('...');
while($menuItme = $connector->fetch($db_result)) {
...
}
?>
$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.
Code (php)
1
2
3
2
3
<?php
$result = $connector->fetchArray($connector->query('SELECT id, parentId, name FROM menu ORDER BY parentId, name'));
?>
$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)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
while ($menuItem = $result)
{
$menuData['items'][$menuItem['id']] = $menuItem;
$menuData['parents'][$menuItem['parentId']][] = $menuItem['id'];
}
?>
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
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.
Juist. Kun je me een voorbeeldje geven hoe het wel moet? Ik begin het te snappen... :D
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.
Heb het aangepast, dit is het nu:
Code (php)
1
2
3
4
5
6
7
8
9
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'];
}
?>
$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)
1
2
3
4
5
6
7
8
9
10
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;
}
?>
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;
}
?>
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 :)
Geen wonder. 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 :)
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.