Graag zou ik van jullie kennis gebruik maken. Ik probeer een image gallery op te zetten en ben al behoorlijk ver gekomen (al zeg ik hetzelf :-)). Gelukkig is er een hoop te vinden op het internet omtrent dit onderwerp.
Maargoed, toch loop ik helaas vast en mijn hoop is dat iemand van het forum mij kan helpen. Ik probeer in een tabel 3 plaatjes per rij weer te geven en dat lukt ook. Het probleem is dat het dezelfde plaatjes zijn :-(. De rij die hieronder ontstaat, laat wel een nieuw plaatje zien, maar spuugt deze ook weer drie keer uit. En zo gaat het door, totdat het zoekresultaat volledig is uitgespuugt. Mijn vraag: hoe zorg ik er in onderstaande code voor dat er drie unieke plaatjes per rij worden weergegeven?
<?php
if(isset($_POST['submit-search'])){
$morph1=$_POST['morph1'];
$sql1 = "SELECT * FROM dataset2 WHERE morph LIKE '$morph1'ORDER BY full_name ASC ";
$result1 = mysqli_query($conn, $sql1);
$queryResult1 = mysqli_num_rows($result1);
Beste Johan,
Nummer 1 is dat jou script vatbaar is voor injection.
Nummer 2 is dat je $row['photo_id'] er ook 3x in zet wat door het gebruik van je While dan ook vermenigvuldigd wordt tot deze op het einde is gekomen.
Bij je query kan je limit gebruiken waardoor je het resultaat begrenst op 3.
$sql1 = "SELECT * FROM dataset2 WHERE morph LIKE '$morph1'ORDER BY full_name ASC LIMIT 3 ";
Dan krijg je
<?php
if(isset($_POST['submit-search'])){
// Eerst user input controleren anders injection
$morph1=$_POST['morph1'];
$sql1 = "SELECT * FROM dataset2 WHERE morph LIKE '$morph1'ORDER BY full_name ASC LIMIT 3 ";
$result1 = mysqli_query($conn, $sql1);
$queryResult1 = mysqli_num_rows($result1);
if($queryResult1 > 0){
while($row = mysqli_fetch_assoc($result1)){
echo"
<div>
<tr>
<td>
<img src='images/".$row['photo_id'].".jpg'>
<b>".$row['common_name']."</b> \r\n
<i>(".$row['full_name'].")</i> \r\n
</td>
</tr>
</div>
";
}
}
}
?>
En indien je de gegevens niet telkens in een nieuwe div wil tonen kan het ook zo
<?php
if(isset($_POST['submit-search'])){
// Eerst user input controleren anders injection
$morph1=$_POST['morph1'];
$sql1 = "SELECT * FROM dataset2 WHERE morph LIKE '$morph1'ORDER BY full_name ASC LIMIT 3 ";
$result1 = mysqli_query($conn, $sql1);
$queryResult1 = mysqli_num_rows($result1);
if($queryResult1 > 0){
while($row = mysqli_fetch_assoc($result1)){
$MijndatabaseGegevens[]=$row;
}
echo'<div>';
foreach($MijndatabaseGegevens as $item){
echo"
<tr>
<td>
<img src='images/".$item['photo_id'].".jpg'>
<b>".$item['common_name']."</b> \r\n
<i>(".$item['full_name'].")</i> \r\n
</td>
</tr>
";
}
echo'</div>';
}
}
?>
Logisch, want zit in een iteratie waar je een dezelfde item gebruikt.
Pas je HTML in de loop aan om een enkel item te tonen. Met de modulo-operator kan je kijken of het aantal deelbaar is door drie, zodat je dan een nieuwe rij kan starten.
Overigens hoef je geen tabellen te gebruiken. CSS is krachtig genoeg om te bereiken wat je wilt. Voornamelijk is 'flexbox' het magische woord.
@Bart, scherp je opmerking over injection, thanks! Het limieteren van de query werkt, echter aangezien de resultaten variabel zijn en veelal meer dan 3, niet toepasbaar in dit geval.
[size=xsmall]Toevoeging op 29/04/2020 22:33:01:[/size]
Nog even terugkomend op bovenstaande code, weet iemand misschien waarom de HTML code in de <div> niet goed werkt? De <br> werkt wel, maar alles is vet? Een class attribute in het <div> element maken werkt helaas ook niet (wat wel handig zou zijn voor de image gallery). Wat doe ik verkeerd?
Dank voor je reactie! Inmiddels heb ik bovenstaand zelf uitgevogeld, het probleem zat hem in de haakjes ' ipv ". Echt zo`n beginners dingetje, zal niet nogmaals gebeuren :-)
Wat betreft de injectie, dank voor de tip. Ik wil eerst de code werkend hebben en ga daarna met de veiligheid aan de slag.
Ik heb nog wel een andere vraag, maar om een hele lange draad met verschillende topics te voorkomen, zal ik een nieuwe openen.