Archief - MYSQL: Fout in query

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Featherfoot

Legacy Member
Hi all,

Ik weet het, weer een thread van mij. Maar ik ben nu volop bezig met mijn eindwerk. Doordat wij ook een examen krijgen van PHP en MySQL zou ik natuurlijk wel de fouten willen verbeteren die in mijn site zitten om op het examen ook fouten te voorkomen.

Ik krijg volgende fout bij deze query:
Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in c:\domains\codesnip.be\wwwroot\pages\addsnippet.php on line 15

De query zelf:

PHP:
$sql = "INSERT INTO tblsnippets (snippet_Title, snippet_Content, snippet_Poster, snippet_Description, snippet_Approved, snippet_Categorie) VALUES ('".$titel."','".$code."', '".$posterid."', '".$description"', '".$approved."', .'".$categorie.")";

Dit zijn mijn variabelen:

$titel = $_POST['sniptitle'];
$code = $_POST['snipcode'];
$description = $_POST['description'];
$categorie = $_POST['selCategorie'];
$posterid = $_SESSION['user_id'];
$approved = 0;

zou iemand mij ook eens de juiste werkwijze willen uitleggen om variabelen in een query te gebruiken. ( string of geen string ). Ik zit altijd te foefelen met dat verschil.

Greets, en vanaf nu is dit mijn problemen thread!

Featherfoot

Legacy Member
frenzal zei:
punt vergeten achter description, lees uw code

is nu aangepast, maar maakt jammer genoeg geen verschil.

edit: achter de laatste variabele een ' vergeten. Het formulier wordt nu wel weergegeven maar er wordt niks toegevoegd aan mijn database. mysql_error() leert mij dat ik een fout in mijn query heb, maar ik begrijp er jammer genoeg geen * van.

edit 2: ondertussen de query veranderd naar onderstaande:

PHP:
$sql = "INSERT INTO tblsnippets (snippet_Title, snippet_Content, snippet_Poster, snippet_Description, snippet_Approved, snippet_Categorie) VALUES ('".$titel."','".$code."', $posterid , '".$description."', $approved, $categorie)";

en die doet het wel!

EyeBallz

Legacy Member
als ik een variabele in een query moet steken, doe ik het zo:

PHP:
mysql_query("INSERT INTO Lessen VALUES (null,\"W$i\",1,1,$groep_1,$lokaal_1,$vak_1,$docid)") or die(mysql_error());
dus niks geconcatineerd, is veel gemakkelijker imo
mss de moeite om het eens te proberen?

Featherfoot

Legacy Member
EyeBallz zei:
als ik een variabele in een query moet steken, doe ik het zo:

PHP:
mysql_query("INSERT INTO Lessen VALUES (null,\"W$i\",1,1,$groep_1,$lokaal_1,$vak_1,$docid)") or die(mysql_error());
dus niks geconcatineerd, is veel gemakkelijker imo
mss de moeite om het eens te proberen?

Eens bekijken. Mij hebben ze in school geleerd dat je best elke variabele tussen quotes zet.

orez

Legacy Member
Featherfoot zei:
Eens bekijken. Mij hebben ze in school geleerd dat je best elke variabele tussen quotes zet.

en dat is idd de correcte manier, en veel eenvoudiger ;)

killgore

Legacy Member
Featherfoot zei:
Eens bekijken. Mij hebben ze in school geleerd dat je best elke variabele tussen quotes zet.

neen, dat is fout.

Een tekst-variabele zet je tussen '
een integer-variabele zet je niet tussen '

daar zit de fout in uw code.

Featherfoot

Legacy Member
killgore zei:
neen, dat is fout.

Een tekst-variabele zet je tussen '
een integer-variabele zet je niet tussen '

daar zit de fout in uw code.

Nu ik deze manier heb toegepast werkt het inderdaad wel.

edit: Ik heb eigenlijk ook nooit begrepen waarom die puntjes rond variabelen moeten staan. Soms zetten we er maar 1 en soms 2. Mijn leerkracht legt dit jammer genoeg niet meer uit.

Featherfoot

Legacy Member
Nieuwe vraag jammer genoeg:

Ik heb een systeempje gemaakt met highlighting. Nu moet ik via een if/else structuurtje controleren op categorie.

PHP:
	if 
	($categorie == 1){
		$code = 'css';
	}
	else{
		if($categorie == 2){
			$code = 'php';
		}
	else{
			$code = 'javascript';
		}
	}

Dit is het. Nu die variabele $code moet daarna gebruikt worden in een functie:

PHP:
$highlightcode = geshi_highlight($content, $code, $path, true);

Ik weet dat het werkt, want als ik volgende methode toepas wordt de highlighting perfect toegepast.

PHP:
$highlightcode = geshi_highlight($content, 'php', $path, true);

Dan krijg ik mooie php highlighting. Hoe kan ik nu die variabele $code zo in die functie stoppen?

killgore

Legacy Member
eerste stuk herschrijf je om te beginnnen naar dit:

PHP:
switch($categorie)
{
    case 1:
        $code = "css";
        break;
    case 2:
        $code = "php";
        break;
    default:
        $code = "javascript";
        break;
}

Vermoord me niet moesten er typos instaan. Switch is speciaal ontworpen om lange if/else constructies te omzeilen. Achter de schermen is het nog steeds een if/else of course, maar dit is duidelijker te lezen, vooral als je nog dingen wilt toevoegen.

Normaal zou die $code die jij gebruikt moeten werken. De kans is vrij groot dat je variabele categorie niet in orde is.
Een andere mogelijkheid is dat $code al weggegooid is op het moment dat je die daar gebruikt, maar de lokaliteit van php is iirc totaal niet zo beperkend. (als je deze zin niet snapt: just ignore).

killgore

Legacy Member
Featherfoot zei:
Nu ik deze manier heb toegepast werkt het inderdaad wel.

edit: Ik heb eigenlijk ook nooit begrepen waarom die puntjes rond variabelen moeten staan. Soms zetten we er maar 1 en soms 2. Mijn leerkracht legt dit jammer genoeg niet meer uit.

allow me to demonstrate:

$query = "INSERT INTO mytabel (tekstje) VALUES ('$var')";

is volledig hetzelfde als:


$query = "INSERT INTO mytabel (tekstje) VALUES ('".$var."')";

De " worden hier gebruikt om je php-string aan te duiden. Bij php kan je in een string gedeclareerd door " een variabele rechtstreeks anaroepen, dus in het eerste geval zal php zien: ah, hier zit de variabele $var, ik moet die vervangen met de waarde uit mijn geheugen. Als je in php strings met ' declareert kan dit NIET.
De ' binnenin wordt enkel gebruikt voor een mysql-tekst veld en heeft niets met de php-interpretatie te makten voor alle duidelijkheid, dat is hier gewoon een karakter als alle andere (in principe moet je het escapen, maar soit).
In de 2e maken we gebruik van de string concatenating operator, namelijk .

We hebben dus een string 1:
"INSERT INTO mytabel (tekstje) VALUES ('"
een variabele die daarin moet:
$var
en string 2:
"')"

Die plak je dan aan elkaar met die . operator :).
Dit laatste is op zich correctere & snellere code (een ""-string met variabelen in parset veel trager als een ' string). Maar, sql-queries zijn zowat de enige strings waarin ik veel (goede) php-coders de variabelen voor de leesbaarheid binnen de " zie zetten, het snelheidsverschil is op die minimale stukjes tekst toch zo goed als verwaarloosbaar op de meeste sites.

Maar hou het voor je examen/eindwerk toch maar op het gebruik van de . operator.

Hopelijk is het wat duidelijk ;).

Featherfoot

Legacy Member
thanks killgore voor de uitleg! Heeft mij weer heel wat bijgeleerd!

Featherfoot

Legacy Member
killgore zei:
Tis gaarne gedaan, werkt uw functieaanroep nu?

jup die doet het. Enkel nog wel een paar bugs, maar ik denk dat dat aan die highlight class zelf ligt. Enkele tekens ( zoals dubbele quotes en deze <> haakjes worden niet weergegeven maar in termen van &quot; enz. Heel jammer. Ik denk dat die verkeerd geparsed worden.

Hoewel de rest het natuurlijk wel fantastisch doet.

2de probleem. Ik heb nu een sorteermogelijk aangemaakt op mijn snippetpagina. Maar telkens ik op de pijltjes klik gebeurt er niets van sorteren zelf. Hieronder de code:

PHP:
	// Sorteermethode controleren.
	if(isset($_GET['sort'])){
		switch($_GET['sort']){
			case "date":
				$sort = "snippet_Date";
				break;
			case "member":
				$sort = "snippet_Poster";
				break;
			case "categorie":
				$sort = "snippet_Categorie";
				break;
		}
	}else{
		$sort = "snippet_Title";
	}
	// Aflopend of oplopend controleren
	if(isset($_GET['direction']) && $_GET['direction'] == "desc"){
		$direction = "asc";
	}else{
		$direction = "desc";
	}

Dit is de query waarin die 2 variabelen gebruikt worden:

PHP:
	$query = mysql_query("SELECT * FROM tblsnippets ORDER BY '".$sort."', '".$direction."'");

Nog maar eens!

[BAT] Hydra

Legacy Member
De juiste syntax is:

ORDER BY <column name> [<order>]

Als je nadat je gesorteerd hebt een niveau dieper wilt sorteren:

ORDER BY <column name> [<order>], <column2 name> [<order2>]


Toegepast op jouw geval (je wenst maar op 1 attribuut te sorteren):

PHP:
$query = mysql_query("SELECT * FROM tblsnippets ORDER BY '".$sort."' ".$direction);

Featherfoot

Legacy Member
[BAT] Hydra;8719981 zei:
De juiste syntax is:

ORDER BY <column name> [<order>]

Als je nadat je gesorteerd hebt een niveau dieper wilt sorteren:

ORDER BY <column name> [<order>], <column2 name> [<order2>]

Dat doe ik toch? Ik sorteer eerst op kolomnaam ( zoals je in het bovenste stukje code kan zien en daarna pas oplopend of aflopend.
Correct me if i'm wrong! :)

[BAT] Hydra

Legacy Member
Jij schrijft:

ORDER BY <column name>, <order>

De juiste syntax is:

ORDER BY <column name> [<order>]

Dus zonder de komma tussen <column name> en <order>. <order> staat tussen [ ] en dit geeft aan dat dit een deel van de query is dat er niet hoeft te staan maar er wel mag staan. M.a.w

ORDER BY <column name>

zal ook gesorteerde resultaten teruggegeven. Door een order te specificieren geef je expliciet aan welk order je wenst (aflopend of oplopend).

killgore

Legacy Member
Nog iets: schrijf je sql-statements liefst in hoofdletters, ook als delen in andere variabelen gedeclareerd worden. Het is consistenter en dus automatisch duidelijker.

Voor de rest: what hydra said :).

Featherfoot

Legacy Member
[BAT] Hydra;8720046 zei:
Jij schrijft:

ORDER BY <column name>, <order>

De juiste syntax is:

ORDER BY <column name> [<order>]

Dus zonder de komma tussen <column name> en <order>. <order> staat tussen [ ] en dit geeft aan dat dit een deel van de query is dat er niet hoeft te staan maar er wel mag staan. M.a.w

ORDER BY <column name>

zal ook gesorteerde resultaten teruggegeven. Door een order te specificieren geef je expliciet aan welk order je wenst (aflopend of oplopend).

Ok, nu begrijp ik het. Bedankt hiervoor.

Jammer genoeg krijg ik nu een nieuwe foutmelding dat mijn query foutief is.

Query ziet er nu zo uit:

PHP:
	$query = mysql_query("SELECT * FROM tblsnippets ORDER BY '".$sort."' ['".$direction."']");

servi

Legacy Member
die [ ] moet je dan ook niet letterlijk overnemen. BIj programmeren/scripten stelt alles tussen [] optionele parameters voor. Maar de [] vermeld je zelf niet

je query moet dus als volgt zijn :

$query = mysql_query("SELECT * FROM tblsnippets ORDER BY $sort $direction");

Hier moet noch sort noch $direction tussen aanhalingstekens staan vermits, $sort verwijst naar een kolom en niet naar een stukje tekst(=string). $direction kan maar 2 waardes hebben : ASC of DESC.

een geldige query is dus bijvoorbeeld ( op voorwaarde dat je een kolom id hebt in je tabel )
$direction='DESC';
$sort='id';
$query = mysql_query('SELECT * FROM tblsnippets ORDER BY $sort $direction");

IK stel trouwens wel voor dat je je eerst toch wat meer verdiept in sql zodat je beter begrijpt hoe sql werkt. Je kan mysql ook gebruiken zonder php-variabelen en dan kan je zo testen wat bepaalde queries doen en hoe je ze moet opbouwen.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan