insert or delete

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Michele

Michele

01/11/2006 10:40:00
Quote Anchor link
Hallo,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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              |

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
 
PHP hulp

PHP hulp

17/11/2024 07:24:46
 
Frank -

Frank -

01/11/2006 11:14:00
Quote Anchor link
Wanneer je de beschikking hebt over MySQL 5.0 over hoger, zou je eens kunnen kijken naar een 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.
 
Michele

Michele

01/11/2006 15:50:00
Quote Anchor link
Helaas heb ik noch beschikking over MySQL 5, noch PostgreSQL.
Andere oplossingen meer dan welkom!!!
 
Klaasjan Boven

Klaasjan Boven

01/11/2006 15:53:00
Quote Anchor link
Oracle??
 
Michele

Michele

01/11/2006 15:55:00
Quote Anchor link
enkel en alleen mysql...
Of is de databasestructuur niet goed dat het niet gaat ... ?
Andere suggesties ook welkom :)
 
Joren de Wit

Joren de Wit

01/11/2006 16:05:00
Quote Anchor link
Je kunt natuurlijk eerst met een select query kijken welke ID's er al in die tabel staan. Deze id's even in een array zetten, en controleren of de waarden van het formulier in die array voorkomen. Zo ja: verwijderen, zo nee: toevoegen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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...."
    }
}

?>
 
Frank -

Frank -

01/11/2006 16:15:00
Quote Anchor link
Dan kun je het onmogelijk in 1 query doen, je zult dan eerst met een SELECT moeten bepalen wat er moet gaan gebeuren:
-
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?
$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!
 
Michele

Michele

01/11/2006 19:10:00
Quote Anchor link
Bedankt, ik ga zeker gebruik maken van je voorbeeld Frank!

Groetjes Michele
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.