Hallo,

Ik zit met een bug in mijn zelf geschreven CMS waar ik geen oplossing voor kan vinden.
Eerst even de foutmelding in de Apache Error Log.

[Sat Nov 19 10:32:37 2011] [error] [client 127.0.0.1] PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'wz_cms.nl_images' doesn't exist' in C:\\xampp\\htdocs\\testsite\\cms\\load_site_V3.php:442\nStack trace:\n#0 C:\\xampp\\htdocs\\testsite\\cms\\load_site_V3.php(442): PDO->query('SELECT * FROM `...')\n#1 C:\\xampp\\htdocs\\testsite\\index.php(7): include('C:\\xampp\\htdocs...')\n#2 {main}\n thrown in C:\\xampp\\htdocs\\testsite\\cms\\load_site_V3.php on line 442, referer: http://www.testsite.nl/css/site.css
[Sat Nov 19 10:32:37 2011] [error] [client 127.0.0.1] PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'wz_cms.nl_css' doesn't exist' in C:\\xampp\\htdocs\\testsite\\cms\\load_site_V3.php:442\nStack trace:\n#0 C:\\xampp\\htdocs\\testsite\\cms\\load_site_V3.php(442): PDO->query('SELECT * FROM `...')\n#1 C:\\xampp\\htdocs\\testsite\\index.php(7): include('C:\\xampp\\htdocs...')\n#2 {main}\n thrown in C:\\xampp\\htdocs\\testsite\\cms\\load_site_V3.php on line 442, referer: http://www.testsite.nl/css/site.css
[Sat Nov 19 10:32:37 2011] [error] [client 127.0.0.1] PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'wz_cms.nl_css' doesn't exist' in C:\\xampp\\htdocs\\testsite\\cms\\load_site_V3.php:442\nStack trace:\n#0 C:\\xampp\\htdocs\\testsite\\cms\\load_site_V3.php(442): PDO->query('SELECT * FROM `...')\n#1 C:\\xampp\\htdocs\\testsite\\index.php(7): include('C:\\xampp\\htdocs...')\n#2 {main}\n thrown in C:\\xampp\\htdocs\\testsite\\cms\\load_site_V3.php on line 442, referer: http://www.testsite.nl/css/site.css

Ok, wat er gebeurt...

Ik doe een query in mijn code, hier maak ik gebruik van PDO.

dit is de query :

$sql = "SELECT * FROM `$itemInDatabase` WHERE active='yes'";
$results = $db->query($sql);

Het ding is, dat ik precies weet wat de variabele $itemInDatabase bevat, maar toch wordt er volgens de error log op deze plaats gezocht naar : nl_images en nl_css

Deze tabellen bestaan niet, en zullen ook nooit bestaan, deze zoekopdracht resulteert er in dat ik de webserver van mijn webhoster plat trek. Dus, ik kan de code daar niet draaien.

Ik weet ook hoe mijn script min of meer aan nl_images en nl_css komt,
Ik gebruik nl_ als prefix voor tabellen die gegevens bevaten, het is een meertalig CMS wat ik gebruik, vandaar nl_

Images en CSS zijn mappen op de webserver, de enige manier hoe mijn script kan weten dat deze mappen bestaan, is, omdat in mijn template een verwijzing zit naar een css bestand in de map /css en in mijn css bestand zit een verwijzing naar de map /images.

Op geen enkel punt in mijn script noem ik deze mappen.

Als mijn script de gegevens uit de database heeft verzameld, assigned het alles met de Smarty Template engine en wordt de pagina opgebouwd op basis van de template.

Nu, als ik IN de template, de verwijzing naar mijn CSS file verwijder, dan heb ik nergens last van, krijg ik geen foutmelding in mijn error log.
Echter, dan heb ik ook geen normale vormgeving.

Als ik de verwijzing in mijn template naar het CSS bestand aanzet, dan komen op de een of andere manier de 2 mappen die ik noemde terecht in de query waar de foutmelding door onstaat.

Het lijkt er dus op dat Smarty de CSS file lekt naar mijn script zodat mijn script de 2 mappen die hij daar uit weet te halen in mijn query stopt.

Het vreemde is ook, als ik de variabele $itemInDatabase check op de waarde, de namen van deze mappen er NOOIT in voorkomen.

Ik wordt onderhand echt helemaal gek, ben nu meer dan 20 uur bezig met deze bug op te lossen, maar ik heb het idee dat mijn script wel goed is maar er een andere bug plaats vind waar ik geen weet van heb en die buiten mijn code zich voortdoet.

Iemand die begrijpt wat er gebeurt of er wat over zeggen kan?

Alvast bedankt!
sorry, ik bedoel het hyphen-teken '-'.

[size=xsmall]Toevoeging op 20/11/2011 13:24:18:[/size]

hmm, ik kan nog steeds geen hyphens gebruiken in tabelnamen wanneer ik geen backticks gebruik.

Irritant.
Sealand man op 20/11/2011 13:01:01

sorry, ik bedoel het hyphen-teken '-'.


En dat is dus not done. Vergeet 1 keer de quotes " of evt. backticks ` en jouw SQL gaat met een beetje pech een berekening uitvoeren en jij zoekt je een ongeluk naar de bug in jouw code. Mocht je de bug toevallig al zien... En die quotes ga je op een dag vergeten, fouten maken is menselijk.

Zorg voor een naming convention en vermijdt tekens en namen die voor ongewenst gedrag kunnen zorgen. De + en - vallen in elk geval in die categorie, mogen nooit voorkomen in de namen van een variabele, kolom, tabel, database, etc. Met een simpel scriptje kun je checken of jouw database wel aan de namingconvention voldoet, het information_schema in MySQL kan hierbij helpen.

Of wil je echt zo graag bugs in je code?
Ok, het is geen probleem om underscores ipv hyphens te gebruiken.
Als ik daarmee van de backticks af kan zijn is dat mooi meegenomen.

Ik moet wel zeggen dat het gebruik van backticks voor mij verder niet echt verwarrend werkt, ik weet dat ik ze moet toepassen bij tabellen waar hyphens in zitten.

En nee, liever heb ik geen bugs in mijn code.
En op zich valt het ook wel mee verder, mijn CMS is nu ca 230Kb groot (aan eigen code) en alles werkt prima, afgezien van dit ene stukje dan. :-)

Reageren