auto's verkopen d.m.v checkbox array in query
Ik zit met een kwestie waar ik niet uitkom. Ik heb een stukje code waarin ik d.m.v checkboxes en een array meerdere waardes uit een database wil verwijderen. Dit lukt, alleen wil ik het wat uitbreiden. In dit geval gaat het om auto's die je kunt verkopen mits je in de zelfde stad bent als de auto. Ik kan dit oplossen via mijn query.
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php $sql =
"DELETE
FROM garage
WHERE auto_id IN
(".implode(",", $_POST['autoid']).")
AND '".$row['stad']."' = '".$row['auto_stad']."'
";
?>
"DELETE
FROM garage
WHERE auto_id IN
(".implode(",", $_POST['autoid']).")
AND '".$row['stad']."' = '".$row['auto_stad']."'
";
?>
Maar stel, ik heb meerdere auto's in mijn garage, in verschillende steden. Hoe kan er dan voor zorgen dat wanneer ik alles aanvink de auto's die wel in de stad staan waar ik op dat moment ben kan verkopen? Dus dat hij aangeeft:
Code (php)
1
2
3
4
2
3
4
`Auto met id 2049 is verkocht.`
`Auto met id 3440 is verkocht.`
`Auto met id 4201 is niet verkocht omdat je niet in de juiste stad bent.`
`Auto met id 9149 is verkocht.`
`Auto met id 3440 is verkocht.`
`Auto met id 4201 is niet verkocht omdat je niet in de juiste stad bent.`
`Auto met id 9149 is verkocht.`
Mijn excuses voor de matige titel, ik heb geen idee hoe ik het kan formuleren.
Gewijzigd op 04/12/2012 17:22:43 door Richard Hansma
Nu ja...
de gebruiker heeft dus een eigen stad. Waar haal je die informatie? Duidelijk van $row['stad'], maar waar komt dat van?
Dan zou je in principe dit moeten doen:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$stad = $row['stad']; // of waar je dit ook haalt
$sql = "
SELECT ... FROM garage
WHERE stad = '" . mysql_real_escape_string($stad) . "'
"; /// de ... vervangen door de velden die je nodig hebt.
?>
$stad = $row['stad']; // of waar je dit ook haalt
$sql = "
SELECT ... FROM garage
WHERE stad = '" . mysql_real_escape_string($stad) . "'
"; /// de ... vervangen door de velden die je nodig hebt.
?>
Verder nog opmerken dat implode(",", $_POST['autoid']) je open stelt voor injection (tenzij je elders maatregelen hebt genomen).
Ik wil nu dus gewoon alles aan kunnen vinken en wanneer ik op 'verkoop' druk, dat hij alles verkoopt (verwijdert) uit de database, waar de stad van de auto gelijk is aan de stad waar ik me op dat moment in bevind. De rest moet in de garage blijven. Is dit mogelijk met één query of moet ik ook gebruik maken van bijvoorbeeld een if/else-constructie?
Je kunt dan jouw implode versie gebruiken, alleen moet je dan, zoals Kris aangeeft, wel beveiligen tegen SQL-injectie, voor je de implode toepast:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
foreach ($_POST['auto_id'] as $key => $value) {
$_POST['auto_id'][$key] = (int) $value;
}
?>
foreach ($_POST['auto_id'] as $key => $value) {
$_POST['auto_id'][$key] = (int) $value;
}
?>
Gewijzigd op 04/12/2012 19:31:16 door Ger van Steenderen
Let er wel op dat je ook moet controleren of de auto's wel van de gebruiker zijn. Doe je dat niet dan kun je de auto's van anderen verwijderen / verkopen.
Voorbeeld: 2 auto's in mijn garage, beide in dezelfde stad. Auto id 3 heeft een waarde van 1000, terwijl auto id 17 een waarde heeft van 1500. Ik wil nu graag auto id 17 verkopen. Wanneer ik die checkbox aanvink pakt hij de waarde van auto id 3, terwijl hij wel auto id 17 verwijderd uit de database.
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
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
<?php
$sql =
"SELECT gebruikers.id, gebruikers.username, gebruikers.stad, garage.auto_id, garage.username, garage.auto, garage.schade, garage.waarde, garage.auto_stad, kwantiteit.geld_zak
FROM gebruikers
LEFT JOIN garage
ON gebruikers.username=garage.username
LEFT JOIN kwantiteit
ON gebruikers.username=kwantiteit.username
WHERE garage.username = '".$_SESSION['user']."'
";
$query = mysql_query($sql);
$row = mysql_fetch_assoc($query);
$sql =
"DELETE
FROM garage
WHERE auto_id IN
(".implode(",", $_POST['autoid']).")
";
$query = mysql_query($sql);
$nieuw_geld = $row['waarde'] + $row['geld_zak'];
$sql =
"UPDATE kwantiteit
SET kwantiteit.geld_zak =
'".$nieuw_geld."'
WHERE kwantiteit.username =
'".$_SESSION['user']."'
";
$query = mysql_query($sql);
echo "De auto met ID ".$row['autoid']." is verkocht voor $ ".$row['waarde']."."; // Hier geeft hij de verkeerde ID en waarde aan.
?>
$sql =
"SELECT gebruikers.id, gebruikers.username, gebruikers.stad, garage.auto_id, garage.username, garage.auto, garage.schade, garage.waarde, garage.auto_stad, kwantiteit.geld_zak
FROM gebruikers
LEFT JOIN garage
ON gebruikers.username=garage.username
LEFT JOIN kwantiteit
ON gebruikers.username=kwantiteit.username
WHERE garage.username = '".$_SESSION['user']."'
";
$query = mysql_query($sql);
$row = mysql_fetch_assoc($query);
$sql =
"DELETE
FROM garage
WHERE auto_id IN
(".implode(",", $_POST['autoid']).")
";
$query = mysql_query($sql);
$nieuw_geld = $row['waarde'] + $row['geld_zak'];
$sql =
"UPDATE kwantiteit
SET kwantiteit.geld_zak =
'".$nieuw_geld."'
WHERE kwantiteit.username =
'".$_SESSION['user']."'
";
$query = mysql_query($sql);
echo "De auto met ID ".$row['autoid']." is verkocht voor $ ".$row['waarde']."."; // Hier geeft hij de verkeerde ID en waarde aan.
?>
Gewijzigd op 05/12/2012 20:44:14 door Richard Hansma
Maar wat je moet doen heeft Ger van Steenderen al gezegd (foreach loop), dan ga je alle aangevinkte checkboxen af.
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
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
<form method="post">
<input type="checkbox" name="autoid[3]" value="1000">
<input type="checkbox" name="autoid[17]" value="1500">
</form>
<?php
// Oude geld uit db halen
$geld = $row['geld_zak'];
foreach ($_POST['autoid'] as $key => $value) {
// $key = autoid
// $value = autowaarde
$sql = "DELETE FROM garage WHERE auto_id=".(int)$key;
$query = mysql_query($sql);
if ($query) {
// Autowaarde optellen bij geld
$geld += $value;
echo 'De auto met ID '.$key.' is verkocht voor $ '.$value.'.<br>';
} else {
echo 'De auto met ID '.$key.' is NIET verkocht.<br>';
}
}
// Update het geld
$sql1 = "UPDATE kwantiteit SET kwantiteit.geld_zak='".(int)$geld."' WHERE kwantiteit.username='".$_SESSION['user']."'";
$query1 = mysql_query($sql1);
if (! $query1) {
echo 'Geld niet bijgewerkt!';
}
?>
<input type="checkbox" name="autoid[3]" value="1000">
<input type="checkbox" name="autoid[17]" value="1500">
</form>
<?php
// Oude geld uit db halen
$geld = $row['geld_zak'];
foreach ($_POST['autoid'] as $key => $value) {
// $key = autoid
// $value = autowaarde
$sql = "DELETE FROM garage WHERE auto_id=".(int)$key;
$query = mysql_query($sql);
if ($query) {
// Autowaarde optellen bij geld
$geld += $value;
echo 'De auto met ID '.$key.' is verkocht voor $ '.$value.'.<br>';
} else {
echo 'De auto met ID '.$key.' is NIET verkocht.<br>';
}
}
// Update het geld
$sql1 = "UPDATE kwantiteit SET kwantiteit.geld_zak='".(int)$geld."' WHERE kwantiteit.username='".$_SESSION['user']."'";
$query1 = mysql_query($sql1);
if (! $query1) {
echo 'Geld niet bijgewerkt!';
}
?>
Ik weet niet of dit de goede manier is, maar zou wel moeten werken.
Gewijzigd op 05/12/2012 23:13:30 door Nick Dijkstra
Bedankt, het is gelukt.
Het zal best zo zijn dat het werkt maar echt optimaal is het niet en het is alles behalve veilig. Je kunt de auto's voor zoveel verkopen als je wilt. Een gebruiker hoeft de waarde van de checkbox maar te vervangen en klaar is kees. En zoals ik al eerder zei, je controleerd niet of de gekozen auto wel van de gebruiker is. Je kunt nu de auto's van andere mensen verkopen.