insert or delete
Ik heb 2 tabellen, producten en aanbiedingen.
In aanbiedingen zit het id van de productentabel.
Nu krijg ik via een formulier verschillende productid's binnen om ofwel toe te voegen als aanbieding, ofwel indien het id reeds bestaat, te verwijderen van de aanbiedingen tabel.
Mijn vraag is nu, hoe doe ik dit... (het is niet zo eenvoudig als ik dacht)
Even een voorbeeld:
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
PRODUCTEN
---------------
id | productnaam|
1 | banaan |
2 | appel |
3 | brood |
4 | suiker |
5 | kersen |
AANBIEDINGEN
id | productId |
1 | 2 |
2 | 4 |
---------------
id | productnaam|
1 | banaan |
2 | appel |
3 | brood |
4 | suiker |
5 | kersen |
AANBIEDINGEN
id | productId |
1 | 2 |
2 | 4 |
Nu krijg ik via een formulier de volgende productID's binnen: 1, 2, 5
Dus moet 1 en 5 worden toegevoegd in de aanbiedingentabel en 2 moet worden verwijderd.
Dit alles had ik graag zo optimaal mogelijk en het liefste dus in 1 query. Zelf heb ik hier ook al lang over nagedacht.
LET OP: restrictie op AANBIEDINGEN TABEL: foreign key van productId verwijst naar producten id!
Groeten Michele
stored procedure. Zorg er wel voor dat je per waarde kunt controleren of er nu een INERT of een DELETE heeft plaatsgevonden, anders ben ik bang dat je t.z.t. in de problemen gaat komen.
Met PostgreSQL zou ik hier een functie voor schrijven waar je alle gegevens als input opgeeft, de boel gaat verwerken en per gegeven gaat retourneren of het een INSERT of een DELETE is geweest. Met PL/pgSQL (of 1 van de andere PL-talen) kun je dit soort zaken redelijk eenvoudig programeren in de database. Vanuit PHP is het dan kinderspel om deze functie aan te roepen.
Wanneer je de beschikking hebt over MySQL 5.0 over hoger, zou je eens kunnen kijken naar een Met PostgreSQL zou ik hier een functie voor schrijven waar je alle gegevens als input opgeeft, de boel gaat verwerken en per gegeven gaat retourneren of het een INSERT of een DELETE is geweest. Met PL/pgSQL (of 1 van de andere PL-talen) kun je dit soort zaken redelijk eenvoudig programeren in de database. Vanuit PHP is het dan kinderspel om deze functie aan te roepen.
Andere oplossingen meer dan welkom!!!
Oracle??
Of is de databasestructuur niet goed dat het niet gaat ... ?
Andere suggesties ook welkom :)
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
// Eerst een select query uitvoeren. Resultaatset is $result:
$ids = array();
while($row = mysql_fetch_assoc($result))
{
$ids[] = $row['id'];
}
// ids uit het formulier staan in de array $producten
foreach($producten as $productid)
{
if(in_array($productid, $ids))
{
$sql = "DELETE...."
}
else
{
$sql = "INSERT...."
}
}
?>
// Eerst een select query uitvoeren. Resultaatset is $result:
$ids = array();
while($row = mysql_fetch_assoc($result))
{
$ids[] = $row['id'];
}
// ids uit het formulier staan in de array $producten
foreach($producten as $productid)
{
if(in_array($productid, $ids))
{
$sql = "DELETE...."
}
else
{
$sql = "INSERT...."
}
}
?>
-
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
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
<?
$aValues = array(1,2,5); // komen uit je formulier
$query = "SELECT productId FROM aanbiedingen WHERE productId IN(".implode(', ', $aValues).")";
$result = mysql_query($query) or trigger_error(mysql_error());
if(mysql_num_rows($result) > 0){
$aDelete = array();
while($row = mysql_fetch_assoc($result){
$aDelete[] = $row['productId']; // array met resulaten die straks worden verwijderd.
}
}
// INSERT query met $aValues en zorg er voor dat de kolom productId UNIQUE is:
foreach($aValues AS $productId
$query = "INSERT INTO aanbiedingen(productId) VALUES(".$productId.")";
$result = mysql_query($query);
if(!$result && mysql_errno() == 1062){
echo 'Dit productId staat al in de tabel en wordt zometeen verwijderd!';
}
elseif(!$result){
trigger_error(mysql_error()); // er is een andere fout opgetreden.
}
}
// Nu de te verwijderen records uit de tabel gooien:
if(isset($aDelete)){
$query = "DELETE aanbiedingen WHERE productId IN(".implode(', ',$aDelete).")";
$result = mysql_query($query) or trigger_error(mysql_error());
echo 'Er zijn '.mysql_affected_rows().' rij(-en) verwijderd.';
}
?>
$aValues = array(1,2,5); // komen uit je formulier
$query = "SELECT productId FROM aanbiedingen WHERE productId IN(".implode(', ', $aValues).")";
$result = mysql_query($query) or trigger_error(mysql_error());
if(mysql_num_rows($result) > 0){
$aDelete = array();
while($row = mysql_fetch_assoc($result){
$aDelete[] = $row['productId']; // array met resulaten die straks worden verwijderd.
}
}
// INSERT query met $aValues en zorg er voor dat de kolom productId UNIQUE is:
foreach($aValues AS $productId
$query = "INSERT INTO aanbiedingen(productId) VALUES(".$productId.")";
$result = mysql_query($query);
if(!$result && mysql_errno() == 1062){
echo 'Dit productId staat al in de tabel en wordt zometeen verwijderd!';
}
elseif(!$result){
trigger_error(mysql_error()); // er is een andere fout opgetreden.
}
}
// Nu de te verwijderen records uit de tabel gooien:
if(isset($aDelete)){
$query = "DELETE aanbiedingen WHERE productId IN(".implode(', ',$aDelete).")";
$result = mysql_query($query) or trigger_error(mysql_error());
echo 'Er zijn '.mysql_affected_rows().' rij(-en) verwijderd.';
}
?>
Zo iets zal het mogen worden. Uiteraard aanpassen naar eigen inzicht en goed testen. Het is overigens nog te optimaliseren door bij $aValues eerst de $aDelele-waardes uit de array te gooien. Dat kan een paar zinloze queries schelen.
Succes!
Ps. Let op die UNQUE!
Groetjes Michele