Dag mensen, ik ben bezig met een PHP scriptje welke uit een textvak input haalt en deze opslaat in de database. Vrij simpel, heb ik al 1000x gedaan, maar nu krijg ik een error en ik kan er maar niet achterkomen wat er nou mis is. Misschien mis ik iets, kijken jullie maar even:
<?php
mysql_query("UPDATE content SET ".$page." = '".$text."' WHERE id = '".$language."'")or die(mysql_error());
?>
Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1 = '<p>test</p>' WHERE id = '3'' at line 1
Als ik de query echo krijg ik netjes dit te zien: UPDATE content SET 1 = '<p>test</p>' WHERE id = '3'
Hier lijkt niets mis mee te zijn, ik heb uit meerdere pagina's dit stuk gekopieerd en internet geraadpleegd maar het is allemaal hetzelfde. Ik snap er echt niets meer van, al die andere scripts werken prima, en deze niet. Ook heb ik alle variabelen veranderd in constanten, maar zelfs dan krijg ik die error. Ook heb ik geƫxperimenteerd met spaties, haakjes, slashes, quotes, doublequotes, punten, komma's en wat nog meer, maar na een uurtje experimenteren was dat niet zo leuk meer.
Het moet gewoon iets kleins stoms zijn, Murphy heeft altijd gelijk, dus ik had gehoopt dat een ander paar ogen hier de fout kon inzien...
(ik heb trouwens op allerlei manieren error reporting gedaan, telkens hetzelfde)
/* Query */
$Query =
"
UPDATE
content
SET
'".$page."' = '".$text."'
WHERE
id = '".$language."'
";
/* Result */
$Result = mysql_query($Query);
/* Kijken of er een result is */
if(!$Result)
{
/* Foutje in je query */
echo 'Er is een fout opgetreden in de query. Query: '.$Query.'';
}
else
{
/* Query succesvol uitgevoerd */
}
?>
Hoe zien je variables eruit die je in je query gebruikt?
Maar je hebt jezelf nu wel geforceerd in het gebruiken van backticks, want er is geen andere manier om zulke vreemde kolomnamen anders te benoemen in MySQL.
Een oplossing zou zijn:
<?php
mysql_query("UPDATE content SET `".$page."` = '".$text."' WHERE id = '".$language."'")or die(mysql_error());
?>
maar een veeeel betere oplossing zou zijn om kolomnamen te nemen die logischer zijn. Maar als ik je kolomnamen zo zie op dit moment is het zelfs nog beter om eens te zoeken op normaliseren. Pas dan kan je de kracht van een database echt goed gebruiken, en kan je later veel beter uitbouwen. En anders is het vast een goeie oefening voor later, want normaliseren moet ieder leren >:)
edit: let op het verschil tussen backticks en enkele quotes. Tabelnamen mogen omringt worden door backticks, strings moeten omringt worden door enkele quotes. Of zou mysql in staat zijn om op basis van de context te kunnen bepalen of iets een kolomnaam of een string is? En zo ja, waarom doet hij dat dan niet in eerste instantie al met die 1?
Bedankt Jelmer, de backticks deden het. Ik had al wel eens gehoord van normaliseren, maar verder niets mee gedaan. De kolommen heb ik gewoon genummerd ivm namen gegeven, omdat ik mogelijk de inhoud anders ga noemen. Bijv. als ik nr. 1 "nieuws" zou noemen en er later iets anders in stop (bijv. contactgegevens), dan moet ik overal "nieuws" vervangen met iets anders... nvm, het werkt nu in ieder geval, en ik ga kijken of ik wat van dat normaliseren begrijp.
backticks zijn niet alleen beroerd ze zijn je ducktape voor een lekke band!
Met, heb je godmode, maar als je t een keer vergeet kan je wellicht je hele database om zeep helpen!
Dat kan je jaren data kosten wellicht en hoeveel dat waard is, is speculatie.
En dat wil je niet!
backticks laten je alles gebruiken als "reserved keyword" bijvoorbeeld.
je kan een kolom `drop` noemen, vergeet het 1 keer een er wordt een DROP querie uitgevoerd... Dat wil niemand.
Dus heb je in bijvoorbeeld mySql nooit []` nodig in welke query dan ook.\
En mag je dus ook nooit gebruiken!
<?php
abstract class Lode_Sql_Mysql{
protected function filterSql($sql){
if(preg_match('[^\[\]`] ', $sql)){
throw new ErrorException('Malformed query!');
}
return $sql;
}
}
?>
Een delete query zonder WHERE voorwaarde kan ook je database om zeep helpen, en die fout maak je sneller dan dat je door backticks te vergeten een drop table weet uit te voeren... Klinkt als een kut-argument dat pgFrank had kunnen geven, maar ik hoopte eigenlijk dat we daar nu eens vanaf waren.
Nee, pgFrank kon iedereen keihard, maar terecht erop wijzen dat ze maar eens moesten beginnen aan normalisatie. En natuurlijk de volledige kracht van databases benutten, want er word nog onnodig in php gek*t met query resultaten, terwijl er heel veel in sql kan.
Enige vervelende was z'n eindeloze reclame voor PostgreSql