Alleen eerste row uit tabel wordt geselecteerd
Ik heb al eerder gepost dat ik bezig ben met een automatisch factuurscript voor een webshop, maar ik zit met een probleem.
Het script maakt een .doc aan en de layout wordt netjes doorgestuurd. Uit de tabel cart worden de waarden netjes verstuurd. Nu heb ik voor de cart query een while loop, en in die while loop een query voor mijn product tabel.
Vervelende is dat voor de product tabel alleen de eerste row wordt geselecteerd, zelfs als ik fysiek een ander rijnummer ingeef. Heeft er iemand een idee hoe ik dit oplos. Mijn php skills laten behoorlijk te wensen over en ik weet dan ook niet hoe ik mijn query precies moet behandelen.
Ik weet dat er met een SQL JOIN misschien wat gedaan kan worden, maar ik zou echt niet weten hoe ik dat moet aanpakken. (begrijp de syntax van de JOIN niet helemaal).
Dit is het stuk code waar het fout gaat in mijn script:
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
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
<?php $cartquery = mysql_query("SELECT order_number, productid, COUNT(productid) FROM cart WHERE order_number='".$order_number."' GROUP BY productid");
while ($row = mysql_fetch_array($cartquery, MYSQL_ASSOC))
{
$id = $row['productid'];
$qty = $row["COUNT(productid)"];
$productquery = mysql_query("SELECT * FROM product WHERE id='$id'");
$product = mysql_fetch_array($productquery);
$productid = $product['productid'];
$price = $product['price'];
$subtotal = $price * $qty;
echo '<tr>
<td width=271 valign=top style="width:270.9pt;border:none;mso-border-top-alt:
solid windowtext .5pt;padding:2.9pt .1in 2.9pt .1in">
<p class=MsoNormal><span style="font-size:8.0pt;font-family:Helvetica">'.$productid.'<o:p></o:p></span></p>
</td>
<td width=50 valign=top style="width:49.5pt;border:none;mso-border-top-alt:
solid windowtext .5pt;padding:2.9pt .1in 2.9pt .1in">
<p class=MsoNormal><span style="font-size:8.0pt;font-family:Helvetica">€ '.number_format($price, 2).'<o:p></o:p></span></p>
</td>
<td width=54 valign=top style="width:.75in;border:none;mso-border-top-alt:
solid windowtext .5pt;padding:2.9pt .1in 2.9pt .1in">
<p class=MsoNormal><span style="font-size:8.0pt;font-family:Helvetica">'.$qty.'<o:p></o:p></span></p>
</td>
<td width=51 valign=top style="width:51.4pt;border:none;mso-border-top-alt:
solid windowtext .5pt;padding:2.9pt .1in 2.9pt .1in">
<p class=MsoNormal><span style="font-size:8.0pt;font-family:Helvetica">€ '.number_format($subtotal, 2).'<o:p></o:p></span></p>
</td>
</tr>';
$total += $price * $qty;
}
?>
while ($row = mysql_fetch_array($cartquery, MYSQL_ASSOC))
{
$id = $row['productid'];
$qty = $row["COUNT(productid)"];
$productquery = mysql_query("SELECT * FROM product WHERE id='$id'");
$product = mysql_fetch_array($productquery);
$productid = $product['productid'];
$price = $product['price'];
$subtotal = $price * $qty;
echo '<tr>
<td width=271 valign=top style="width:270.9pt;border:none;mso-border-top-alt:
solid windowtext .5pt;padding:2.9pt .1in 2.9pt .1in">
<p class=MsoNormal><span style="font-size:8.0pt;font-family:Helvetica">'.$productid.'<o:p></o:p></span></p>
</td>
<td width=50 valign=top style="width:49.5pt;border:none;mso-border-top-alt:
solid windowtext .5pt;padding:2.9pt .1in 2.9pt .1in">
<p class=MsoNormal><span style="font-size:8.0pt;font-family:Helvetica">€ '.number_format($price, 2).'<o:p></o:p></span></p>
</td>
<td width=54 valign=top style="width:.75in;border:none;mso-border-top-alt:
solid windowtext .5pt;padding:2.9pt .1in 2.9pt .1in">
<p class=MsoNormal><span style="font-size:8.0pt;font-family:Helvetica">'.$qty.'<o:p></o:p></span></p>
</td>
<td width=51 valign=top style="width:51.4pt;border:none;mso-border-top-alt:
solid windowtext .5pt;padding:2.9pt .1in 2.9pt .1in">
<p class=MsoNormal><span style="font-size:8.0pt;font-family:Helvetica">€ '.number_format($subtotal, 2).'<o:p></o:p></span></p>
</td>
</tr>';
$total += $price * $qty;
}
?>
Ik hoop dat iemand me kan helpen.
Bedankt alvast!
Gewijzigd op 21/05/2011 21:43:46 door Henk Achterban
MySQL Limit
Ik volg het niet helemaal. Hoe moet ik een LIMIT gebruiken om dit probleem op te lossen?
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
<?php
$query= 'SELECT c.order_number, p.productid, COUNT(productid) AS hoeveelheid FROM cart AS c INNER JOIN product AS p ON c.productid=p.id GROUP BY c.order_number, p.product_id';
if ($products = (mysql_query($query)) != false) {
if (mysql_num_rows($products) == 0) {
echo 'Geen resultaten';
} else {
while($product = mysql_fetch_assoc($products)) {
/*
Toon je gegevens, hier heb je gelijk alle gegevens
van het product omdat er een join is naar de tabel product.
*/
}
}
} else {
echo 'Het uitvoeren van de query is mislukt';
}
?>
$query= 'SELECT c.order_number, p.productid, COUNT(productid) AS hoeveelheid FROM cart AS c INNER JOIN product AS p ON c.productid=p.id GROUP BY c.order_number, p.product_id';
if ($products = (mysql_query($query)) != false) {
if (mysql_num_rows($products) == 0) {
echo 'Geen resultaten';
} else {
while($product = mysql_fetch_assoc($products)) {
/*
Toon je gegevens, hier heb je gelijk alle gegevens
van het product omdat er een join is naar de tabel product.
*/
}
}
} else {
echo 'Het uitvoeren van de query is mislukt';
}
?>
Kan fouten bevatten hoor, ik kan de code hier niet testen!
Gewijzigd op 21/05/2011 22:32:44 door Erik van de Locht
Als ik hem implementeer zoals je hem beschreven hebt geeft hij aan dat de query is mislukt.
Ik kan ook niet helemaal interpreteren hoe hij precies in elkaar zit.
Sorry dat ik misschien voor de hand liggende vragen stel, maar ik kom er gewoon echt niet uit.
Zou iemand me misschien ook kunnen uitleggen waarom in mijn eigen script alleen de eerste rij van de product tabel kan worden geraadpleegd en de rest van de rijen niet?
Excuses voor de vele vragen, maar dit is allemaal nog net even te complex voor me.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
c.order_number,
p.productid,
COUNT(productid) AS hoeveelheid
FROM
cart AS c
INNER JOIN
product AS p
ON
c.productid = p.id
GROUP BY
c.order_number,
p.product_id
c.order_number,
p.productid,
COUNT(productid) AS hoeveelheid
FROM
cart AS c
INNER JOIN
product AS p
ON
c.productid = p.id
GROUP BY
c.order_number,
p.product_id
Allereerst is het gewoon een SELECT query:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
SELECT
c.order_number,
p.productid,
COUNT(p.productid) AS hoeveelheid
FROM
cart AS c
c.order_number,
p.productid,
COUNT(p.productid) AS hoeveelheid
FROM
cart AS c
Allereerst selecteren we iets van cart, deze gegeven we in de query weer als c (door midden van AS). Wat selecteren we van c? We selecteren het order_number, de productid wordt geselecteerd van p, deze is nog niet gemaakt in deze query.
Verder tellen we het aantal records van productid en die geven we weer als hoeveeldheid.
Nu gaan we naar het 2e deel van de query, dit is een join. Meer over joins hier. Een join is simpel gezegd iets selecteren in 1 query uit 2 tabellen, waarbij een waarde uit tabel1 gelijk moet zijn aan de waarde van tabel 2.
We beginnen een join met INNER JOIN (kan ook OUTER, LEFT en RIGHT zijn). Vervolgens gegeven we aan wat de 2e tabel is, product en deze geven we weer als p. Wanneer moeten we deze gegeven uit tabel p halen? Wanner c.productid gelijk is aan p.id. Kortom: Als we kijken naar de tabel carts en we nemen daarvan productid moet deze gelijk zijn aan het id die in de tabel products staan. Uit de SELECT query te zien willen we p.productid hebben zodra deze gelijk is aan het id van carts.
En als laatst nog een group by.
Oh wellicht zit de fout van mijn voorbeeld 'm in het feit dat ik bij de group by 'product_id' heb getypt in plaats van 'productid'. Daarom dus ook mijn reactie; er kunnen fouten inzitten, ik kan 'm niet testen :p
@erik, ook je COUNT functie is verkeerd. Je hebt hier namelijk gewoon productid en geen p.productid
Klopt inderdaad. De TS zou mysql_error() kunnen printen bij het blok waat hij aangeeft dat de query mislukt is, dat brengt meer duidelijkheid :p
Bedankt voor de reacties in ieder geval, eens kijken of ik van hieruit verder kom!
Misschien moet ik m'n tabellenstructuur maar aanpassen...