Hoe $GET je een column uit een andere tabel met dezelfde naam?
Dit is de query:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?
$page = "SELECT con.title, con.alias, con.images, con.introtext
FROM db_content con
LEFT JOIN db_categories cat ON con.catid = cat.id
WHERE cat.alias = '".$_GET['alias']."' AND con.state = 1 ORDER BY `ordering` DESC";
?>
$page = "SELECT con.title, con.alias, con.images, con.introtext
FROM db_content con
LEFT JOIN db_categories cat ON con.catid = cat.id
WHERE cat.alias = '".$_GET['alias']."' AND con.state = 1 ORDER BY `ordering` DESC";
?>
Ik moet dus de alias ophalen uit db_categories, maar er is ook een column die alias heet in db_content. Nu heb ik het idee dat hij altijd die van db_content pakt, aangezien de query niks laat zien, tenzij ik er hardcoded een alias naam uit db_categories in zet.
Hoe los ik dit op?
Thx
De code die je hebt gepost werkt niet helaas.
Snelle Jaap op 02/02/2016 12:49:39:
Dit is de query:
Ik moet dus de alias ophalen uit db_categories, maar er is ook een column die alias heet in db_content.
Nu heb ik het idee dat hij altijd die van db_content pakt
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?
$page = "SELECT con.title, con.alias, con.images, con.introtext
FROM db_content con
LEFT JOIN db_categories cat ON con.catid = cat.id
WHERE cat.alias = '".$_GET['alias']."' AND con.state = 1 ORDER BY `ordering` DESC";
?>
$page = "SELECT con.title, con.alias, con.images, con.introtext
FROM db_content con
LEFT JOIN db_categories cat ON con.catid = cat.id
WHERE cat.alias = '".$_GET['alias']."' AND con.state = 1 ORDER BY `ordering` DESC";
?>
Ik moet dus de alias ophalen uit db_categories, maar er is ook een column die alias heet in db_content.
Nu heb ik het idee dat hij altijd die van db_content pakt
--> con.alias roep je ook aan in de query. roep dan ook cat.alias aan.
Quote:
Ja dat klopt , is gewoon een tabel met cijfers dus dit klopt gewoon.
moet dit niet con.ordering zijn of cat.ordering?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
$page = "SELECT con.title,
con.alias conalias,
con.images,
con.introtext,
cat.alias catalias
FROM db_content con
LEFT JOIN db_categories cat ON con.catid = cat.id
WHERE cat.alias = '".$_GET['alias']."'
AND con.state = 1
ORDER BY ordering DESC";
?>
$page = "SELECT con.title,
con.alias conalias,
con.images,
con.introtext,
cat.alias catalias
FROM db_content con
LEFT JOIN db_categories cat ON con.catid = cat.id
WHERE cat.alias = '".$_GET['alias']."'
AND con.state = 1
ORDER BY ordering DESC";
?>
Toevoeging op 02/02/2016 14:22:26:
als ordering in beide tabellen voorkomt, zul je ook bij het noemen van die kolom de tabel erbij moeten zetten.
Dat er geen foutmelding is, geeft aan dat dat dus niet het geval is.
Wel vallen sommige typen database erover dat je sorteert op een kolom die niet in het SELECT-deel staat.
Mysql echter niet.
Ivo P op 02/02/2016 14:20:40:
Toevoeging op 02/02/2016 14:22:26:
als ordering in beide tabellen voorkomt, zul je ook bij het noemen van die kolom de tabel erbij moeten zetten.
Dat er geen foutmelding is, geeft aan dat dat dus niet het geval is.
Wel vallen sommige typen database erover dat je sorteert op een kolom die niet in het SELECT-deel staat.
Mysql echter niet.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
$page = "SELECT con.title,
con.alias conalias,
con.images,
con.introtext,
cat.alias catalias
FROM db_content con
LEFT JOIN db_categories cat ON con.catid = cat.id
WHERE cat.alias = '".$_GET['alias']."'
AND con.state = 1
ORDER BY ordering DESC";
?>
$page = "SELECT con.title,
con.alias conalias,
con.images,
con.introtext,
cat.alias catalias
FROM db_content con
LEFT JOIN db_categories cat ON con.catid = cat.id
WHERE cat.alias = '".$_GET['alias']."'
AND con.state = 1
ORDER BY ordering DESC";
?>
Toevoeging op 02/02/2016 14:22:26:
als ordering in beide tabellen voorkomt, zul je ook bij het noemen van die kolom de tabel erbij moeten zetten.
Dat er geen foutmelding is, geeft aan dat dat dus niet het geval is.
Wel vallen sommige typen database erover dat je sorteert op een kolom die niet in het SELECT-deel staat.
Mysql echter niet.
Oke, en hoe zet ik het resultaat netjes in een foreachje? Ik heb al het een en ander geprobeerd, zonder resultaat.
Je haalt nu iets uit de url, zonder maar te controleren of er gevaarlijke tekens in staan.
http://wiki.pfz.nl/sqlinjectie
daarna kun je door de resultaten loopen.
of foreach daarin handig is? ik zou eerder een while of desnoods een if gebruiken
Ik bedoel meer hoe ik alle resultaten netjes weergeef op de site. Escape is zo toegevoegd.
"Ik heb al het een en ander geprobeerd, zonder resultaat"
Wat heb je al geprobeerd want een foreach opzetten lijkt me niet zo moeilijk...?
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?
foreach($pagecr as $page){
$landingnospace = str_replace(' ', '_', $page['alias']);
$title = $page['title'];
$contentje .= '<li><a href="http://www.website.nl/_extern/website1/'.$landingnospace.'.html">'.$title.'</a></li>';
}
?>
foreach($pagecr as $page){
$landingnospace = str_replace(' ', '_', $page['alias']);
$title = $page['title'];
$contentje .= '<li><a href="http://www.website.nl/_extern/website1/'.$landingnospace.'.html">'.$title.'</a></li>';
}
?>
Dit bijvoorbeeld, maar ik krijg alleen resultaat wanneer ik "hardcoded" een categorie naam erin zet, bijvoorbeeld 'info' ipv '".$_GET['alias']."'
echo je query ($page) is met de $_GET erin.
Code (php)
1
2
3
2
3
<?
SELECT con.title, con.alias, con.images, con.introtext FROM db_content con LEFT JOIN db_categories cat ON con.catid = cat.id AND cat.alias = 'info' WHERE con.state = 1 ORDER BY `ordering` DESC
?>
SELECT con.title, con.alias, con.images, con.introtext FROM db_content con LEFT JOIN db_categories cat ON con.catid = cat.id AND cat.alias = 'info' WHERE con.state = 1 ORDER BY `ordering` DESC
?>
Dus dat is prima. Alleen als ik op een artikel klik ipv een categorie (artikelen zijn submenus, categorien zijn top level menus) krijg ik die alias te zien. Stel een artikel alias is product-10 dan krijg ik dit te zien:
Code (php)
1
2
3
2
3
<?
SELECT con.title, con.alias, con.images, con.introtext FROM db_content con LEFT JOIN db_categories cat ON con.catid = cat.id AND cat.alias = 'product-10' WHERE con.state = 1 ORDER BY `ordering` DESC
?>
SELECT con.title, con.alias, con.images, con.introtext FROM db_content con LEFT JOIN db_categories cat ON con.catid = cat.id AND cat.alias = 'product-10' WHERE con.state = 1 ORDER BY `ordering` DESC
?>
Terwijl hij de categorie moet pakken waar product-10 onder valt.
Gewijzigd op 03/02/2016 14:19:52 door Snelle Jaap
En als je de (alias van de) categorie wilt hebben dan zou je toch de cat.alias moeten pakken, en niet de con.alias? Je hebt dan wel een naamconflict zoals je in je oorspronkelijke vraagstuk stelt, dit kun je oplossen door het introduceren van aliassen.
Gebruik in plaats van:
zoiets als:
Code (php)
1
SELECT con.title, con.alias AS content_alias, cat.alias AS category_alias, con.images, con.introtext ...
Dit is ook al voorgesteld door Ivo P, dus waar zit precies het probleem? Ik kan het vraagstuk ook niet helemaal volgen eerlijk gezegd. Wat dat betreft doe je je naam (inderdaad) eer aan :).
Orden je gedachten eens, kijk eens welke resultaten je allemaal terugkrijgt door deze af te drukken en bestudeer eens goed welke (relevante) data er precies in je database zit. Volgens mij kom je dan al een heel eind. Ik denk dat als je een voorbeeld geeft van de dataset(s) waarmee je werkt dat dan al heel snel duidelijk wordt waar het euvel zit.
eerste query zou dus moeten doen wat jij wilt.
tweede query moet dus een andere query krijgen?
"Ik denk dat als je een voorbeeld geeft van de dataset(s) waarmee je werkt dat dan al heel snel duidelijk wordt waar het euvel zit."
Dit is ook een optie inderdaad ;-)
Gewijzigd op 03/02/2016 14:56:21 door E vH
Elmar vH op 03/02/2016 14:54:02:dus als ik het goed begrijp:
eerste query zou dus moeten doen wat jij wilt.
tweede query moet dus een andere query krijgen?
"Ik denk dat als je een voorbeeld geeft van de dataset(s) waarmee je werkt dat dan al heel snel duidelijk wordt waar het euvel zit."
Dit is ook een optie inderdaad ;-)
eerste query zou dus moeten doen wat jij wilt.
tweede query moet dus een andere query krijgen?
"Ik denk dat als je een voorbeeld geeft van de dataset(s) waarmee je werkt dat dan al heel snel duidelijk wordt waar het euvel zit."
Dit is ook een optie inderdaad ;-)
De 1e is idd zoals de query zou moeten zijn.
Ik heb nu twee tables
db_categories (hierin zitten categorien)
db_content (hierin zitten artikelen, die bij een categorie horen)
Beide hebben een column genaamd alias.
Als ik dus op mijn contentpage kom, wil ik dat alle artikelen geladen worden die horen bij die categorie (maar alleen als er op een categorie is geklikt), in een sidemenu, dat wou ik dus doormiddel van die foreach doen.
Stel ik heb een menu item met een drop down. De toplevel menu naam is info (dat is een categorie) en de submenu naam is informatie (dat is een artikel) als ik dus klik op info, wil ik dat hij links (alsin links/rechts) 'informatie' laat zien. En als ik klik op informatie moet hij niks laten zien.
Bump
maar ik denk dat LEFT in je query overbodig is:
je stelt een eis aan cat.alias.
Dus de join MOET een matchend record hebben gevonden in je cat tabel.
dus daarmee is een goedkopere INNER JOIN dus genoeg.
--
Waarom beginnen je tabelnamen trouwens met db_?