pcfixer
Terugkerende gebruiker
- Lid geworden
- 3 jun 2001
- Berichten
- 2.398
Hoi,
Ik weet dat ik hier waarschijnlijk geen antwoord op mijn vraag kan krijgen maar goed, ik probeer het toch maar
. Ik weet ook dat ik degene ben die iedereen aanwijst als PHP-expert en dus hoor ik jullie al denken "waarom lost ie het zelf niet op" maar hier kom ik toch echt ff niet uit. Om ook de helpmij'ers een kans te geven zet ik hem hier ook neer. Ik verwacht dat het niet meer zal zijn dan een spek-en-bonen topic maar misschien is het ook wel een soort van voorbeeld hoe ik met PHP werk enzo.
Goed, mijn probleem. Ik ben sinds een tijdje bezig met een eigen CMS (zoiets als PHPNuke maar dan beter of course) te maken. Daarbij heb ik ook mijn eigen MySQL driver geschreven. Klinkt groter dan het is, het is er voor gemaakt omdat ik compatibiliteit wil waarborgen voor database types. Meeste scripts zijn nu nog gebaseerd op MySQL omdat 96% dit gebruikt, maar PostgreSQL is in opmars en dus wil ik niet het risico lopen over een paar jaar m'n hele script om te hoeven gooien. De driver zorgt er gewoon voor dat de query's (dit moet dus WEL op basis van de SQL taal zijn, anders kan het niet. De queries kun je niet zomaar ff veranderen) door de goede functies gehaald worden en de data ook op een goede manier weer worden teruggegeven. Aan de hand van de gebruike database zoek je de driver erbij.
Goed, inleidend stukje daarover is klaar. Wat doet zich voor? Met de MySQL driver kun je dingen uitvoeren in de database. De SQL driver is een class die functies bevat voor het uitvoeren van queries. Bijv. de functie dbquery:
Wat deze functie nou in feite doet is gewoon de query aannemen, hem onderzoeken (leeg? ongeldig?), uitvoeren (mysql_query()) en als dat aangegeven is ook nog fetchen met mysql_fetch_row(). Daarna natuurlijk teruggeven.
Dit werkt prima in een vb als dit:
(Let vooral niet op $API of de popi benamingen, het gaat om de functie dbquery())
De resultaten (indien argument 2 "true" is) worden netjes geladen in $moduleQueryResult. Maar als ik dit nu wil gaan gebruiken in een loop voor database resultaten (while()) krijg ik problemen:
Dit geeft niet het gewenste resultaat. Tot mijn stomme verbazing zie ik nu echter wel (zat wat pauze tussen het voorbeeld en deze paar zinnen
) dat de while wordt uitgevoerd en de dingen ook worden ge-echo'ed maar daarna krijg ik toch nog een database fout dat de query niet gefetched kon worden. Ikzelf heb zo'n vermoeden dat dit komt omdat de while loop 1 keer meer draait dan dat er resultaten zijn. De laatste is er echter niet dus resulteerd dat in een fout.
Dit is het script wat ik gebruikt heb:
En dit is de uitkomst ervan (De DB driver heeft inderdaad een eigen error report systeem ingebouwd
)
Lijn 6 correspondeert met de lijn van de while loop...
Mijn vraag is dus nu ook: hoe los ik dit op. Wat ik wil moge duidelijk zijn: de laatste lus van de while() moet niet gedaan worden wanneer deze niets bevat/niet bestaat. Dit schijnt hij nu wel te doen, aangezien hij de while loop keurig netjes uitvoerd alleen toch een error geeft na afloop..
Ik weet dat ik hier waarschijnlijk geen antwoord op mijn vraag kan krijgen maar goed, ik probeer het toch maar

Goed, mijn probleem. Ik ben sinds een tijdje bezig met een eigen CMS (zoiets als PHPNuke maar dan beter of course) te maken. Daarbij heb ik ook mijn eigen MySQL driver geschreven. Klinkt groter dan het is, het is er voor gemaakt omdat ik compatibiliteit wil waarborgen voor database types. Meeste scripts zijn nu nog gebaseerd op MySQL omdat 96% dit gebruikt, maar PostgreSQL is in opmars en dus wil ik niet het risico lopen over een paar jaar m'n hele script om te hoeven gooien. De driver zorgt er gewoon voor dat de query's (dit moet dus WEL op basis van de SQL taal zijn, anders kan het niet. De queries kun je niet zomaar ff veranderen) door de goede functies gehaald worden en de data ook op een goede manier weer worden teruggegeven. Aan de hand van de gebruike database zoek je de driver erbij.
Goed, inleidend stukje daarover is klaar. Wat doet zich voor? Met de MySQL driver kun je dingen uitvoeren in de database. De SQL driver is een class die functies bevat voor het uitvoeren van queries. Bijv. de functie dbquery:
PHP:
<?php
[...]
function dbquery($query, $do_fetch = 1, $linenumber = 0, $file = _DB_QUERY_FILE_NA)
{
if(!isset($query))
die($this->dbFatalError(_DB_QUERY_NO_QUERY, '', $linenumber, $file));
$the_query = @mysql_query($query)
or die($this->dbFatalError(_DB_QUERY_FAILED, $query, $linenumber, $file));
if($do_fetch == 1)
{
$result = @mysql_fetch_row($the_query)
or die($this->dbFatalError(_DB_QUERY_FETCH_FAILED, $query, $linenumber, $file));
}
else
{
$result = $the_query;
}
return $result;
}
?>
[...]
Wat deze functie nou in feite doet is gewoon de query aannemen, hem onderzoeken (leeg? ongeldig?), uitvoeren (mysql_query()) en als dat aangegeven is ook nog fetchen met mysql_fetch_row(). Daarna natuurlijk teruggeven.
Dit werkt prima in een vb als dit:
PHP:
<?php
[..]
$moduleQueryResult = $API->database->dbquery($moduleQuery, 0, __LINE__, __FILE__);
[..]
?>
(Let vooral niet op $API of de popi benamingen, het gaat om de functie dbquery())
De resultaten (indien argument 2 "true" is) worden netjes geladen in $moduleQueryResult. Maar als ik dit nu wil gaan gebruiken in een loop voor database resultaten (while()) krijg ik problemen:
PHP:
<?php
[...]
while($moduleQueryResult = $API->database->dbFetchQuery($moduleQuery, __LINE__, __FILE__))
{
}
[...]
?>
Dit geeft niet het gewenste resultaat. Tot mijn stomme verbazing zie ik nu echter wel (zat wat pauze tussen het voorbeeld en deze paar zinnen

Dit is het script wat ik gebruikt heb:
PHP:
<?php
[..]
include_once("../source/api.php");
$API = new API;
$query = $API->database->dbquery("SELECT * FROM atl_mainsettings", 0);
while($queryfetched = $API->database->dbFetchQuery($query, __LINE__, __FILE__))
{
echo $queryfetched[0]." => ".$queryfetched[1]."<br />\n";
}
[..]
?>
En dit is de uitkomst ervan (De DB driver heeft inderdaad een eigen error report systeem ingebouwd

Code:
curr_language => nld
acp_mods_row => 4
logo_url => [url]http://www.jongerenweb.com/admin/style/images/logo.png[/url]
logo_align => center
stats_level => 3
locale => nl_NL
site_address => [url]http://www.jongerenweb.com/[/url]
Ernstige fout opgetreden tijdens database operaties...
Gedetailleerde informatie over de foutmelding
SQL Foutnummer: 0
Gedetailleerde foutmelding:
De query die verkeerd ging:
Overige informatie:
_DB_ERROR_MSG: Er is (zijn) fout(en) opgetreden tijdens het ophalen van de resultaten van de query. Meer details volgen.
Line number where it went wrong: 6
File in where it went wrong: d:\phpdev\www\atlantis\admin\tryout.php
Lijn 6 correspondeert met de lijn van de while loop...
Mijn vraag is dus nu ook: hoe los ik dit op. Wat ik wil moge duidelijk zijn: de laatste lus van de while() moet niet gedaan worden wanneer deze niets bevat/niet bestaat. Dit schijnt hij nu wel te doen, aangezien hij de while loop keurig netjes uitvoerd alleen toch een error geeft na afloop..