DB cell met imagelinks, hoe de explode functie to passen
Door
Wim Kasius
op 11-12-2013 15:50
gewijzigd op 11-12-2013 15:51
3.025 views
Hallo, het is voor mij een tijd geleden dat ik PHP gebruikt heb, en ik moet even gerefreshed worden.
Het is als volgt: Er is een db tabel met de naam voertuigen. Deze heeft diverse kolommen, waaronder 'merk','model','type','afbeeldingen','accessoires'.
Nu bevat de kolom 'afbeeldingen' en de kolom 'accessoires' meerdere waarden, gescheiden door een ",".
Hoe kan ik nu voor elke waarde in 'afbeeldingen', deze bevat meerdere urls naar afbeeldingen, de url als volgt echo-en?
<img src="$afbeeldingen">
Mijn script is nu als volgt:
<?php
function toonvoertuigen()
{
include ('dbconn.php');
$voertuig = "SELECT * FROM voertuigen";
$results = mysqli_query($con,$voertuig) or die ("Couldn’t execute query.");
while($row = mysqli_fetch_assoc($results))
{
extract ($row);
$merkmodel = $row['merk']." ".$row['model'];
print "<div class=voertuig><span class='merkmodel'>" ."$merkmodel". "</span><br /><span class='type'>" .$type. "</span></div>\n";
}
}
?>
De makkelijkste manier zou zijn om je database te normaliseren.
Dit houd in dat je meerdere tabellen hebt en met elkaar koppelt.
Een tabel met 'afbeeldingen', een tabel met 'accessoires' en in je huidige tabel heb je een uniek id die je hieraan meegeeft. Dan kun je herleiden welke afbeeldingen en accessoires bij een id hoort.
Scheiden op komma kan met explode()
<?php
$afbeeldingen = explode(",", $afbeeldingen);
foreach($afbeeldingen AS $afbeelding){
echo $afbeelding;
}
?>
(EDIT: ik merk dat ik het zelfde zeg als de post hier boven)
Als je de naam van de functie kent, is het gemakkelijk.
Dan ga je naar php.net tik de functienaam in search <input>
----
Maar toch even vermelden: die waarden horen niet in 1 cel te zitten.
De bedoeling is dat je daarvoor een nieuwe tabel maakt.
tabel 'afbeeldingen'
met velden 'id' (= id van de afbeelding, met auto increment), voertuig (komt overeen met de id van het voertuig), afbeelding.
Maar toch even vermelden: die waarden horen niet in 1 cel te zitten.
De bedoeling is dat je daarvoor een nieuwe tabel maakt.
tabel 'afbeeldingen'
met velden 'id' (= id van de afbeelding, met auto increment), voertuig (komt overeen met de id van het voertuig), afbeelding.
Dit concept heet normaliseren
edit: Ah dat is wel een goeie opzich, deze manier van normaliseren had ik nog niet aan gedacht, dus gewoon een tabel maken, met daarin drie kolommen: afbeelding_id,voertuignummer,url
Dat snap ik, hierop wil ik toch even iets verduidelijken. Het aantal fotos per voertuig varieert, en er is geen maximaal aantal. Hoe wil je dat normaliseren?
Ik kan het ook als volgt doen, wanneer de record word ingediend via http:$_post :
Het aantal fotos per voertuig varieert, en er is geen maximaal aantal.
Ja, dat is net het punt.
Normaliseren doe je precies omwille van deze reden.
In de SELECT query heb je dan met JOIN te maken.
bv. iets als
SELECT voertuigen.id AS id, ..., afbeeldingen.afbeelding AS afbeelding
FROM voertuigen
LEFT JOIN afbeeldingen ON afbeeldingen.voertuig = voertuigen.id
Waarbij je die ... vervangt door de velden van voertuigen die je nodig hebt.
Merk op: die AS ... is niet overal en altijd nodig. Maar als er twee velden van de twee tabellen een gemeenschappelijke naam hebben, zal SQL zeggen dat er ambiguiteit is (dubbelzinnigheid).
Geeft geen ambiguïteit. Alleen als je dit met fetch_assoc in PHP oproept, heb je maar één waarde.
Ambiguïteit krijg je als in twee tabellen kolommen met dezelfde naam hebt, en deze niet met de tabelnaam/alias ervoor aanspreekt.
Daarnaast is het volstrekt zinloos om een kolom te aliassen met de naam van die kolom.