Beste guru's,

Mijn vraag gaat over het volgende. Ik heb een soortpagina waarin de soortcode in de url staat.
Bijv. http://www.website.nl/soortpagina.php?code=1002 (niet bestaande website!)

Alle info uit de db wordt opgehaald door de GET functie.

Vanuit de soortcode roept hij uit tabel "verwantesoort" de soorten op die er op lijken.
Dus op de soortpagina van 1002 (koolmees) toont hij een foto van 1092.jpg (pimpelmees).
Echter wil ik bij deze echo ook de soortnaam onder de foto vermelden, die uit de "naamlijst" wordt opgehaald. Door simpelweg te kijken: welke soortnaam hoort er bij 1092? Aha: 1092.jpg + Pimpelmees.

Hoe doe ik dat?

Alvast mijn hartelijke dank!

db_verwantesoort
------------------------------------------------------------------
id code naam verwantesoort1 verwantesoort2
----- ----- ----- ------------- --------------
1 1002 Koolmees 1092 1144
2 1005 Vink
3 1090 Specht
4 1092 Pimpelmees 1002

db_naamlijst
-------------------------
id code naam
----- ----- -----
1 1002 Koolmees
2 1005 Vink
3 1090 Specht
4 1092 Pimpelmees
Bedankt! Daar heb ik wat aan.
Ik heb nu wat gestoeid om zo'n query op te stellen voor elke eventuele verwante soort.
Echter, ik krijg de melding: Column 'code' in where clause is ambiguous
<?
$code = $_GET['code'];
$query1 = mysqli_query("SELECT * FROM db_gelijkend JOIN db_naamlijst ON db_gelijkend.soort1 = db_naamlijst.code WHERE code = '$code'") or die (mysqli_error());
$var1 = mysqli_fetch_object($query1);
$query2 = mysqli_query("SELECT * FROM db_gelijkend JOIN db_naamlijst ON db_gelijkend.soort2 = db_naamlijst.code WHERE code = '$code'") or die (mysqli_error());
$var2 = mysqli_fetch_object($query2);
$query3 = mysqli_query("SELECT * FROM db_gelijkend JOIN db_naamlijst ON db_gelijkend.soort3 = db_naamlijst.code WHERE code = '$code'") or die (mysqli_error());
$var3 = mysqli_fetch_object($query3);
$query4 = mysqli_query("SELECT * FROM db_gelijkend JOIN db_naamlijst ON db_gelijkend.soort4 = db_naamlijst.code WHERE code = '$code'") or die (mysqli_error());
$var4 = mysqli_fetch_object($query4);
$query5 = mysqli_query("SELECT * FROM db_gelijkend JOIN db_naamlijst ON db_gelijkend.soort5 = db_naamlijst.code WHERE code = '$code'") or die (mysqli_error());
$var5 = mysqli_fetch_object($query5);
$query6 = mysqli_query("SELECT * FROM db_gelijkend JOIN db_naamlijst ON db_gelijkend.soort6 = db_naamlijst.code WHERE code = '$code'") or die (mysqli_error());
$var6 = mysqli_fetch_object($query6);
?>


Wat doe ik fout? Vast veel..
Je hebt meerdere velden in het result van je query die 'code' heten. Benoem daarom de velden i.p.v. alles met een * op te halen. Ook moet je de tabelnamen aan je geselecteerde velden meegeven, of een alias gebruiken. En dat gebeurt ook niet in je WHERE.

Ook zijn meerdere queries zwaar overkill. Als je velden gaat nummeren, dan moet je zeker eens naar databasenormalisatie kijken. Je moet je database in de lengte kunnen uitbreiden, en niet 'in de breedtte.'
Bedankt Ariën!

Ik heb me ingelezen op het artikel die je meestuurde en heb een regel die nog niet doet wat hij moet doen.
Maar hoe specifieker ik ook ben, hij levert nog niet het bevredigende resultaat op.

Zie jij waar het hem in zit?

Databasenormalisatie ga ik in de toekomst mee bezig, het is best een heel erg grote database die nog altijd werkt, dus dat doe ik als stap 2.

$code = $_GET['code'];
$query = "SELECT a.code,a.verwantesoort1,b.code,b.naam FROM db_verwantesoort a INNER JOIN db_naamlijst b USING ($code) WHERE a.code=b.code";
Als je nu je database gaat normaliseren heb je straks minder werk met ombouwen van alle queries.
Wat voor resultaat komt er nu dan uit? En wat verwacht je?

PS: Ik zie SQL-injection in je GET.
Het probleempje is dat mijn website beheerder gestopt is met zijn werk en ik als geen-PHP kenner de boel nu moet 'doorscripten'. Normaliseren is dan misschien een best wel grote stap om in één keer te doen. Neemt niet weg dat ik me eens in ga lezen. Er zijn zo'n 5 tabellen die ik begonnen ben te splitten zodat het een enkele tabel wat ontlast. Het zijn bijna 1500 soortpagina's die ik nu met elkaar wil verbinden door "verwante" soorten. Ik zal ook zeker nog wat beveiligingen in moeten bouwen. GET is denk ik ook al wat verouderd.

Maar:

De echo geeft geen resultaat. Ik heb bijv. 3 echo's als test in het vervolg gezet, bijv. "". $var->verwantesoort1 ."", ze geven allen een leeg veld.

Ik verwacht hier dat soort met de code X toch nu wel uit op z'n minst beide tabellen de output geeft.
Op het moment dat je database tabellen heeft met kolomnamen als verwantesoort1, verwantesoort2 en soort1, soort2, soort3 et cetera dan wordt het tijd om eens goed na te gaan denken over het database-ontwerp. Dit schreeuwt namelijk om koppeltabellen om informatie aan elkaar te rijgen.

Hier nog een kolom bijmetselen is niet de oplossing want zoals je in bovenstaande code al ziet levert dit ook draken van queries op - je hebt het jezelf effectief onmogelijk gemaakt om op een makkelijke manier de data weer uit je database te trekken. Dat is niet het idee noch de bedoeling van databases.

Over het laatste fragment:
Column 'code' in where clause is ambiguous

Hier staat precies wat er aan scheelt: de "code" kolom in het "where" gedeelte is dubbelzinnig omdat je niet aangeeft tot welke tabel (db_gelijkend of db_naamlijst) deze zou moeten behoren. Beide tabellen hebben een kolom genaamd "code" en als het systeem zou moeten raden welke dit zou moeten zijn pakt 'ie waarschijnlijk de verkeerde :).

Mijn advies zou zijn: zet een nieuwe database op en probeer de data geautomatiseerd te overhevelen. Als je het op die manier doet maakt het in principe niet uit uit hoeveel records je tabellen bestaan omdat het allemaal op dezelfde manier werkt en dus ook op dezelfde manier kan worden overgezet.

Daarbij doe je er verstandig aan om echt een relationele database op te zetten waarbij de verbanden ook echt hard worden vastgelegd, anders hangen alle tabellen nog steeds als los zand aan elkaar waarbij, zoals dat dan deftig heet, "de onderlinge kloppendheid van de data" (referentiële integriteit) niet kan worden gewaarborgd.
Hoi Thomas,

De datasets maak ik in CSV en importeer ze door ze om te zetten naar SQL. Kan het dan nog wel werken zoals jij beschrijft? Door ze te exporteren en weer te importeren krijg ik veelal afgebroken teksten etc. Ik heb dus slechte ervaringen met 'grote' tabellen. Het is de enige manier van hoe ik...denk ik...kan werken. Juist ook omdat complete data vanuit een grote landelijke database in één tabel moet worden ingevoegd.
Ik heb nu heel wat klusjes te doen merk ik; wat maakt dat ik na inlezen en uitproberen over 10 jaar klaar ben met de website. Haha. Het is niet dat ik het niet wil, maar niet weet hoe het werkt.

Ik heb nu letterlijk alle tabellen met elkaar verbonden door de unieke soortcode. Elke tabel heeft deze. Ook soortfoto's dragen code_1.jpg etc.
Het enige wat hij hoeft te doen, is de code van de verwante soort ophalen uit de naamlijst. Hij toont natuurlijk nu wel gewoon de foto's van de verwante soorten, bijv. 1012_1.jpg, maar ik wil de naam er onder hebben staan.

Door A en B mee te geven dacht ik het juist specifiek te hebben gemaakt. Dus ik zie het niet...
Een voorbeeldscript die wel gewoon werkt is SELECT * FROM db_naamlijst WHERE code LIKE '$code'". Dan zou hij dit toch ook moeten kunnen 'ophalen' zou je denken?

Reageren