Met gevaar voor eigen leven dat Creepy me keihard af gaat schieten, hierbij toch nog eenmaal een oplossing
Ik heb dit topic al een aantal keer door gelezen en het valt me op dat er nogal inconsequent gebruik gemaakt wordt van enkele/dubbele/geen quotes. Als je je netjes (en consequent) aan de regeltjes had gehouden, dan had je deze melding ook niet gehad.
Zoals Douweegbertje
hier al aangaf,
class=foo bar werkt, maar de
officiële wijze is
class="foo bar" of
class="foo" bar="ietsAnders".
Als je jezelf netjes aan de standaarden houdt, dan zou je aan de kleurcodering vaak al moeten kunnen zien dat er iets niet goed gaat:
PHP:
1
2
3
4
5
6
7
8
9
| //Voorbeeld 1:
echo 'Wanneer ik 's avonds wil schrijven gaat het fout'; // Parse error;
' // deze quote is om de boel weer op orde te krijgen
//Voorbeeld 2
echo 'Wanneer ik \'s avonds wil schrijven gaat het hier goed'; // Werkt;
//Voorbeeld 3
echo "Wanneer ik 's avonds zo schrijf gaat het ook goed"; // werkt ook |
Als je even de handleiding voor mysql doorgelezen had, of een willekeurige
google opdracht had geprobeerd, dan was je op
stackoverflow.com uitgekomen waar iemand hetzelfde probleem heeft (Dat bedoelt Creepy dus met
Debuggen: Hoe doe ik dat). Hoewel daar de oplossing wordt voorgekouwd zonder dat wordt uitgelegd waarom dat de oplossing is, zie je wel meteen het verschil tussen het wel en niet gebruiken van quotes bij je queries.
Ik heb hier lokaal even snel een test database aangemaakt met de volgende velden:
code:
1
2
| id => int
text => varchar(255) |
Draai ik de volgende queries, dan krijg ik bijbehorende resultaten/foutmeldingen:
MySQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| SELECT * FROM test WHERE id = 1
# Resultaat:
# id: 1
# text: Dit is tekst 1
SELECT * FROM test WHERE id = '1'
# Resultaat:
# id: 1
# text: Dit is tekst 1
SELECT * FROM test WHERE id = Dit
# Resultaat:
# 1054 - Unknown column 'Dit' in 'where clause'
SELECT * FROM test WHERE id = 'Dit'
# Resultaat:
# Geen resultaten gevonden |
De reden dat je die foutmelding krijgt, hoewel de terugkoppeling "unknown column" je wellicht van de wijs brengt, is omdat
547c97bfe3a2c geen
integer is, en dus tussen quotes moet
Behalve dat je er in deze casus niet onder uit komt om quotes te gebruiken aangezien je een veld wilt doorzoeken met een string i.p.v. een integer, zou ik er voor kiezen om jezelf aan te leren je waarden netjes tussen quotes te zetten, zodat je in ieder geval zeker weet dat je ook de resultaten krijgt die je zoekt, en niet zo maar quotes te laten vallen of toe te voegen omdat het
naar jouw idee geen verschil maakt
True, het werkt bij integer velden ietwat vertragend omdat MySQL je integer moet omzetten naar een karakter (1 is niet hetzelfde als '1'), maar voor de reguliere huis/tuin/keuken gebruiker zonder miljoenen records zou dat verwaarloosbaar moeten zijn. Als je 100% zeker weet dat je alleen maar integers verwacht/krijgt en ook je foutafhandeling daar op instelt dan kun je (of moet je) ze weglaten.
Om bovenstaand punt extra te verduidelijken, zoals je
hier kunt lezen, kun je ook integers gebruiken om door varchar velden te zoeken, waardoor je query in eerste instantie misschien wel werkt, maar zodra je iets verandert in je database of je query, kun je zo maar rare of prestatie vertragende dingen krijgen.
[
Voor 6% gewijzigd door
PsychoMantis_NL op 07-12-2014 09:18
. Reden: Typecasting vertraging toegevoegd ]