DB cell met imagelinks, hoe de explode functie to passen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Wim Kasius

Wim Kasius

11/12/2013 15:50:32
Quote Anchor link
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?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<img src="$afbeeldingen">

Mijn script is nu als volgt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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";
  
}
}

?>
Gewijzigd op 11/12/2013 15:51:27 door Wim Kasius
 
PHP hulp

PHP hulp

23/04/2024 13:43:53
 
Michael -

Michael -

11/12/2013 15:53:22
Quote Anchor link
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()
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$afbeeldingen
= explode(",", $afbeeldingen);

foreach($afbeeldingen AS $afbeelding){
    echo $afbeelding;
}

?>
Gewijzigd op 11/12/2013 15:58:14 door Michael -
 
Kris Peeters

Kris Peeters

11/12/2013 15:58:40
Quote Anchor link
(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>

Die leidt je trouwens naar http://php.net/explode

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$afbeeldingen
= explode(',', $row['afbeeldingen']);
?>



----
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
Gewijzigd op 11/12/2013 15:59:40 door Kris Peeters
 
Wim Kasius

Wim Kasius

11/12/2013 16:16:04
Quote Anchor link
Kris Peeters op 11/12/2013 15:58:40:

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 :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
function verwerk_fotos() {
        $fotos = explode(',', $_POST['afbeeldingen']);
        foreach($fotos as $foto_nr => $foto_url) {
            $bestandsnaam = 'fotos/'. $_POST['voertuig_nr'] .'-'. $foto_nr .'.jpg';
            
            $imgdata = file_get_contents($foto_url);
            file_put_contents($bestandsnaam, $imgdata);
        }

Maar hoe selecteer ik dan de alle fotos die horen bij het voertuig_nr weer voor de weergave?
Gewijzigd op 11/12/2013 16:26:01 door Wim Kasius
 
Kris Peeters

Kris Peeters

11/12/2013 16:28:02
Quote Anchor link
Wim Kasius op 11/12/2013 16:16:04:
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
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).
Gewijzigd op 11/12/2013 16:30:15 door Kris Peeters
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

12/12/2013 10:20:13
Quote Anchor link
@Kris,

Toch even een correctie hier.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT a.afbeelding, b.afbeelding FROM .....

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.
Gewijzigd op 12/12/2013 10:20:53 door Ger van Steenderen
 
Kris Peeters

Kris Peeters

12/12/2013 10:26:05
Quote Anchor link
Ja, ik zeg het toch. het is niet overal nodig.

id gaat ambiguiteit geven.
Als namen het zelfde zijn ...
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

12/12/2013 10:38:39
Quote Anchor link
Maar dat heeft niks met de alias te maken .....
 
Wim Kasius

Wim Kasius

12/12/2013 13:27:30
Quote Anchor link
Ik gebruik nu gewoon het volgende:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function toonvoertuigen()
{
include ('dbconn.php');
$voertuig = "SELECT * FROM voertuigen";
$results = mysqli_query($con,$voertuig) or die ("Couldnt 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><br />\n";
        $afbeeldingen = explode(",", $afbeeldingen);
        foreach($afbeeldingen AS $afbeelding)
        {
        echo "<img class=\"voertuigfoto\" src=" .$afbeelding. " >";
        }
echo "</div>";

}
}
Gewijzigd op 12/12/2013 13:51:15 door Wim Kasius
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.