while loop
Is er iemand die de oplossing weet?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php
include "include/header.php";
if(isset($_GET['id']))
{
$id = $_GET['id'];
}
$querySelect = mysql_query("SELECT tbl_jewelry.j_id,
tbl_jewelry.j_name,
tbl_jewelry.j_price,
tbl_jewelry.j_information,
tbl_jewelryphotos.jp_id,
tbl_jewelryphotos.jp_location,
tbl_jewelryphotos.j_id
FROM tbl_jewelry
JOIN tbl_jewelryphotos ON tbl_jewelryphotos.j_id = tbl_jewelry.j_id
WHERE tbl_jewelry.j_id = '$id'");
$queryFetch = mysql_fetch_array($querySelect);
?>
<div class="Wrapper">
<h1>Sieraad</h1>
<div class="buttons">
<a href="add_photos.php?id=<?php echo $queryFetch['j_id'] ?>" class="greyBtn">Foto's toevoegen</a>
</div>
<table>
<tr>
<th>Naam</th>
<td><?php echo $queryFetch['j_name'];?></td>
</tr>
<tr>
<th>Prijs</th>
<td><?php echo $queryFetch['j_price'];?></td>
</tr>
<tr>
<th>Informatie</th>
<td><?php echo $queryFetch['j_information'];?></td>
</tr>
</table><br />
<?php
$numrows = mysql_num_rows($queryFetch);
echo "<table><tr><th>Foto's</th></tr>";
if ($numrows > 0) {
while ()
{
echo "<tr>";
echo "<td><img src='".$queryFetch['jp_location']."'></td>";
echo "<td><a href='delete_order.php?id=".$queryFetch['jp_id']."' onclick=\"return confirm('Weet je zeker dat je deze afbeelding wilt verwijderen?');\"><img src='UI/images/delete.png'></a></td>";
echo "</tr>";
}
}
else
{
echo "<tr><td colspan='2'>Geen data</td></tr>";
}
echo "</table>";
?>
</div>
<?php
include "include/footer.php";
?>
include "include/header.php";
if(isset($_GET['id']))
{
$id = $_GET['id'];
}
$querySelect = mysql_query("SELECT tbl_jewelry.j_id,
tbl_jewelry.j_name,
tbl_jewelry.j_price,
tbl_jewelry.j_information,
tbl_jewelryphotos.jp_id,
tbl_jewelryphotos.jp_location,
tbl_jewelryphotos.j_id
FROM tbl_jewelry
JOIN tbl_jewelryphotos ON tbl_jewelryphotos.j_id = tbl_jewelry.j_id
WHERE tbl_jewelry.j_id = '$id'");
$queryFetch = mysql_fetch_array($querySelect);
?>
<div class="Wrapper">
<h1>Sieraad</h1>
<div class="buttons">
<a href="add_photos.php?id=<?php echo $queryFetch['j_id'] ?>" class="greyBtn">Foto's toevoegen</a>
</div>
<table>
<tr>
<th>Naam</th>
<td><?php echo $queryFetch['j_name'];?></td>
</tr>
<tr>
<th>Prijs</th>
<td><?php echo $queryFetch['j_price'];?></td>
</tr>
<tr>
<th>Informatie</th>
<td><?php echo $queryFetch['j_information'];?></td>
</tr>
</table><br />
<?php
$numrows = mysql_num_rows($queryFetch);
echo "<table><tr><th>Foto's</th></tr>";
if ($numrows > 0) {
while ()
{
echo "<tr>";
echo "<td><img src='".$queryFetch['jp_location']."'></td>";
echo "<td><a href='delete_order.php?id=".$queryFetch['jp_id']."' onclick=\"return confirm('Weet je zeker dat je deze afbeelding wilt verwijderen?');\"><img src='UI/images/delete.png'></a></td>";
echo "</tr>";
}
}
else
{
echo "<tr><td colspan='2'>Geen data</td></tr>";
}
echo "</table>";
?>
</div>
<?php
include "include/footer.php";
?>
Als je dan de URL klikt is de link die je hem hier geeft dan wel de juiste?
Wat bedoel je daarmee?
Wanneer je de eerste keer mysql_fetch_array() aanroept haal je één resultaat op. Dit zal in de meeste gevallen de jewelry-data + de data van de eerste foto zijn.
Als je vervolgens met een while-loop de rest van de records ophaalt sla je mogelijk de eerste foto over.
Je zit dus met deze ene query een beetje in een vreemde spagaat als je dit vervolgens in je layout wil verwerken. Of je moet ook je tabel met sieraad-data in de while-loop opnemen en deze alleen afdrukken als je het eerste record ophaalt maar dat lijkt mij een beetje suf. Je zou je kunnen afvragen of de performance-winst die het uitvoeren van 1 query opweegt tegen de code-structuur waarin je dit moet vatten.
Ik kan mij zo voorstellen dat alle sieraden foto's hebben, maar is dit ook gegarandeerd? Een veiliger strategie zou misschien een LEFT JOIN zijn, of je zou kunnen overwegen om het ophalen van de sieraad-data en de bijbehorende foto's te splitsen (jaja, dit is een extra query... separation of concerns okay).
Als je de foto's apart ophaalt dan haal je elke stap van je while-loop een query-resultaat op waarbij je tegelijkertijd controleert of je ook nog op-te-halen-query-resultaten hebt op de gebruikelijke manier.
Query voor tonen van sieraad info:
Dit levert 0 of 1 resultaat op.
Query voor tonen van bijbehorende foto's:
Dit levert 0 of meer resultaten op waar je doorheen zult moeten lo(o)pen.
EDIT: geprobeerd, maar hij geeft dan geen data weer
Gewijzigd op 28/05/2015 20:29:53 door racoon smasher
Algemene vorm JOIN query:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$res = mysql_query('... je join query ...');
$first = true; // geeft aan of we met de eerste resultaatrij bezig zijn
// haal de resultaten op
while ($row = mysql_fetch_assoc($res)) {
if ($first) {
// dit is de eerste rij, druk hier sieraad details af (zitten in $row)
// ...
// start hier(na) eventueel ook een tabel of container voor je foto's
// ...
$first = false; // voor volgende resultaatrijen wordt dit blok overgeslagen
}
// druk hier je foto-data af (zitten ook in $row)
// ...
} // while
// geef resultaat vrij
mysql_free_result($res);
?>
$res = mysql_query('... je join query ...');
$first = true; // geeft aan of we met de eerste resultaatrij bezig zijn
// haal de resultaten op
while ($row = mysql_fetch_assoc($res)) {
if ($first) {
// dit is de eerste rij, druk hier sieraad details af (zitten in $row)
// ...
// start hier(na) eventueel ook een tabel of container voor je foto's
// ...
$first = false; // voor volgende resultaatrijen wordt dit blok overgeslagen
}
// druk hier je foto-data af (zitten ook in $row)
// ...
} // while
// geef resultaat vrij
mysql_free_result($res);
?>
Voor een aparte query voor enkel foto's maak je een while-loop zoals hierboven minus het $first-if-blok.
Advies: ga MySQLi of PDO gebruiken in plaats van mysql_-functies als je nieuwe code schrijft.
Verder weet ik dat het belangrijk is te verdiepen in vernieuwde technologie, maar aangezien ik wil overstappen naar het maken van websites met ASPX.NET en C#.NET heb ik hier niet echt behoefte aan.
Heel erg bedankt en ik laat hier nog van me horen of het gelukt is of niet.
Toevoeging op 29/05/2015 14:58:03:
Aangezien alles in 1 query zit zal ik altijd een melding krijgen dat ik 1 row heb en dus kan ik niet aangeven bij de afbeeldingen dat er geen data is met behulp van $numrows > 0
Moet ik dan toch 1 query erbij doen of is hier een andere oplossing voor?
Racoon smasher op 28/05/2015 22:16:46:
Aangezien alles in 1 query zit zal ik altijd een melding krijgen dat ik 1 row heb en dus kan ik niet aangeven bij de afbeeldingen dat er geen data is met behulp van $numrows > 0
Moet ik dan toch 1 query erbij doen of is hier een andere oplossing voor?
Moet ik dan toch 1 query erbij doen of is hier een andere oplossing voor?
Hm? Die JOIN kan er toch voor zorgen dat je meerdere resultaatrijen hebt? Maar -zoals eerder aangegeven- als het niet gegarandeerd is dat elk sieraad een of meer foto's heeft is het misschien verstandiger om er een aparte query van te maken (of een LEFT JOIN te gebruiken). Maar je noemt dus nu alweer een reden waarom het dus handiger zou zijn om het sieraad en (eventueel) bijbehorende foto's apart te behandelen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
if(isset($_GET['id']))
{
$id = $_GET['id'];
}
$res = mysql_query("SELECT tbl_jewelry.j_id,
tbl_jewelry.j_name,
tbl_jewelry.j_price,
tbl_jewelry.j_information,
tbl_jewelry.so_id,
tbl_jewelryphotos.jp_id,
tbl_jewelryphotos.jp_location,
tbl_sort.so_id,
tbl_sort.so_name
FROM tbl_jewelry
JOIN tbl_sort ON tbl_sort.so_id = tbl_jewelry.so_id
LEFT JOIN tbl_jewelryphotos ON tbl_jewelryphotos.j_id = tbl_jewelry.j_id
WHERE tbl_jewelry.j_id = '$id'");
$cw = mysql_query("SELECT tbl_jewelryphotos.jp_id FROM tbl_jewelryphotos WHERE tbl_jewelryphotos.j_id = '$id'");
$ns = mysql_num_rows($cw);
$first = true;
while ($queryFetch = mysql_fetch_assoc($res)) {
if ($first) {
echo "<table>";
echo "<tr><th>Naam</th><td>" .$queryFetch['j_name'] . "</td></tr>";
echo "<tr><th>Naam</th><td>" .$queryFetch['j_price'] . "</td></tr>";
echo "<tr><th>Naam</th><td>" .$queryFetch['j_information'] . "</td></tr>";
echo "<tr><th>Naam</th><td>" .$queryFetch['so_name'] . "</td></tr>";
echo "</table><br />";
echo "<table><tr><th>Foto's</th><th>Verwijderen</th></tr>";
$numrows = mysql_num_rows($res);
$first = false;
}
if ($ns > 0) {
echo "<tr>";
echo "<td><img src='".$queryFetch['jp_location']."'></td>";
echo "<td><a href='delete_photo.php?jpid=".$queryFetch['jp_id']."&id=".$queryFetch['j_id']."' onclick=\"return confirm('Weet je zeker dat je deze afbeelding wilt verwijderen?');\"><img src='UI/images/delete.png'></a></td>";
echo "</tr>";
} else {
echo "<tr><td colspan='2'>Geen data</td></tr>";
}
}
echo "</table>";
mysql_free_result($res);
?>
if(isset($_GET['id']))
{
$id = $_GET['id'];
}
$res = mysql_query("SELECT tbl_jewelry.j_id,
tbl_jewelry.j_name,
tbl_jewelry.j_price,
tbl_jewelry.j_information,
tbl_jewelry.so_id,
tbl_jewelryphotos.jp_id,
tbl_jewelryphotos.jp_location,
tbl_sort.so_id,
tbl_sort.so_name
FROM tbl_jewelry
JOIN tbl_sort ON tbl_sort.so_id = tbl_jewelry.so_id
LEFT JOIN tbl_jewelryphotos ON tbl_jewelryphotos.j_id = tbl_jewelry.j_id
WHERE tbl_jewelry.j_id = '$id'");
$cw = mysql_query("SELECT tbl_jewelryphotos.jp_id FROM tbl_jewelryphotos WHERE tbl_jewelryphotos.j_id = '$id'");
$ns = mysql_num_rows($cw);
$first = true;
while ($queryFetch = mysql_fetch_assoc($res)) {
if ($first) {
echo "<table>";
echo "<tr><th>Naam</th><td>" .$queryFetch['j_name'] . "</td></tr>";
echo "<tr><th>Naam</th><td>" .$queryFetch['j_price'] . "</td></tr>";
echo "<tr><th>Naam</th><td>" .$queryFetch['j_information'] . "</td></tr>";
echo "<tr><th>Naam</th><td>" .$queryFetch['so_name'] . "</td></tr>";
echo "</table><br />";
echo "<table><tr><th>Foto's</th><th>Verwijderen</th></tr>";
$numrows = mysql_num_rows($res);
$first = false;
}
if ($ns > 0) {
echo "<tr>";
echo "<td><img src='".$queryFetch['jp_location']."'></td>";
echo "<td><a href='delete_photo.php?jpid=".$queryFetch['jp_id']."&id=".$queryFetch['j_id']."' onclick=\"return confirm('Weet je zeker dat je deze afbeelding wilt verwijderen?');\"><img src='UI/images/delete.png'></a></td>";
echo "</tr>";
} else {
echo "<tr><td colspan='2'>Geen data</td></tr>";
}
}
echo "</table>";
mysql_free_result($res);
?>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$res = <je query voor het opvragen van sieraad info>; // levert 1 resultaat
if (mysql_num_rows($res) == 1) {
$row = mysql_fetch_assoc($res);
// druk hier sieraad info af mbv $row
// haal fotos op
$res2 = <je query voor het opvragen van foto-data bij sieraad $id>; // levert 0 of meer resultaten
if (mysql_num_rows($res2) > 0) {
while ($row2 = mysql_fetch_assoc($res2)) {
// druk foto data af mbv $row2
}
} else {
// geen foto's beschikbaar mededeling
}
mysql_free_result($res2);
}
mysql_free_result($res);
if (mysql_num_rows($res) == 1) {
$row = mysql_fetch_assoc($res);
// druk hier sieraad info af mbv $row
// haal fotos op
$res2 = <je query voor het opvragen van foto-data bij sieraad $id>; // levert 0 of meer resultaten
if (mysql_num_rows($res2) > 0) {
while ($row2 = mysql_fetch_assoc($res2)) {
// druk foto data af mbv $row2
}
} else {
// geen foto's beschikbaar mededeling
}
mysql_free_result($res2);
}
mysql_free_result($res);
Maar dan met mysqli dus :p.
Heel erg bedankt!