[PHP] Productlijnen met de cats, products erin verwijderen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi mensen!

Hmm.. Ik ben slecht in maken van een beginnende zin :P. Laat ik maar direct zijn.. Ik ben bezig met een webshop te bouwen, het is allemaal bijna af maar de Admin gedeelte moet nog afgemaakt worden.. Maar helaas tevergeefs heb ik 2 dagen gesleuteld aan deze code en tot dusver is het nog niet helemaal gelukt..

Eerst een korte toelichting wat de webshop inhoudt.. Het bevat Product-lines, en daarin Categorieën en daarin Products..

Dus zo als het volgt (voorbeeld):
Productline 1 --> Categorie 1 --> Product 1
Product 2
Categorie 2 --> Product 1
Product 2
Product 3
Categorie 3 --> Geen producten

Dit is gewoon een voorbeeld om een duidelijk beeld te geven.. Nou, nu ter zake.. De script moest naar mijn bedoeling zo als het volgende werken.. Hij zoekt de Productline op die je wilt verwijderen, en verwijdert die dan.. De ID wordt opgeslagen en dan zoekt die de categorieën op.. In dat geval moet de result 3 zijn.. En dan wordt de eerste categorie verwijderd, en dan de ID weer opgeslagen van de betreffende categorie (mbv LIMIT en for()-loop), en daarin weer de producten met de bijbehorende plaatjes die worden ge-unlinked..

Nou.. Ik dacht dat dit script zou moeten werken, maar nee hij verwijdert niet alle categorieen, dus ook niet de producten daarin.. Zelfs de producten raken hun categorie kwijt (die verwijderd is) maar de product zelf blijft in de database staan.. Terwijl ze bij dezelfde productlijnen horen.. Ik dacht dat er iets mis was met de $result, of LIMIT of de for-loop zelf? Maar heb het geprobeerd en kan niks vinden.. Iemand misschien een idee voor een oplossing? De 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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
    $productline = $_POST['productline'];

    $query = mysql_query("DELETE FROM productlines WHERE id = '".$productline."'");

    $query2 = mysql_query("SELECT * FROM categories WHERE productlineid = '".$productline."' ORDER BY id ASC");
    $result2 = mysql_num_rows($query2);

      if($result2){

        for($i=0;$i<$result2;$i++){
        $query3 = mysql_query("SELECT * FROM categories WHERE productlineid = '".$productline."' ORDER BY id ASC LIMIT ".$i.",1");

          while($obj = mysql_fetch_object($query3)){

          $categorienumber = $obj->id;
          $imagecategorie = $obj->photo;

            if(!empty($imagecategorie)){
            unlink("../images/".$imagecategorie);
            }

          $query7 = mysql_query("DELETE FROM categories WHERE id = '".$categorienumber."'");

          $query4 = mysql_query("SELECT * FROM products WHERE productlineid = '".$productline."' AND categorieid = '".$categorienumber."' ORDER BY id ASC");
          $result4 = mysql_num_rows($query4);

            if($result4){

              for($i2=0;$i2<$result4;$i2++){

              $query5 = mysql_query("SELECT * FROM products WHERE productlineid = '".$productline."' AND categorieid = '".$categorienumber."' ORDER BY id ASC LIMIT ".$i2.",1");

                while($obj2 = mysql_fetch_object($query5)){

                $productnumber = $obj2->id;

                $photo1 = $obj2->photo1;
                $photo2 = $obj2->photo2;
                $photo3 = $obj2->photo3;
                $photo4 = $obj2->photo4;
                $photo5 = $obj2->photo5;
                $file1 = $obj2->info1;
                $file2 = $obj2->info2;
                $file3 = $obj2->info3;
                $file4 = $obj2->info4;
                $file5 = $obj2->info5;

                  if(!empty($photo1)){
                  unlink("../images/".$photo1);
                  }

                  if(!empty($photo2)){
                  unlink("../images/".$photo2);
                  }

                  if(!empty($photo3)){
                  unlink("../images/".$photo3);
                  }

                  if(!empty($photo4)){
                  unlink("../images/".$photo4);
                  }

                  if(!empty($photo5)){
                  unlink("../images/".$photo5);
                  }

                  if(!empty($file1)){
                  unlink("../files/".$file1);
                  }

                  if(!empty($file2)){
                  unlink("../files/".$file2);
                  }

                  if(!empty($file3)){
                  unlink("../files/".$file3);
                  }

                  if(!empty($file4)){
                  unlink("../files/".$file4);
                  }

                  if(!empty($file5)){
                  unlink("../files/".$file5);
                  }

                  $query6 = mysql_query("DELETE FROM products WHERE id = '".$productnumber."'");

                }

              }

            }

          }

        }

      }

Dit is dus de bij de else {} na de postformulier.

N.B. Elk product in de tabel heeft een id voor de betreffende productline en categorie, en de product-id zelf.. En categore zelf heeft een eigen id, en de id van de productline, de productline heeft gewoon zelf een eigen id.. Dit heb ik gedaan om zo makkelijk de id's met elkaar te linken (die gelijk zijn).

Alvast bedankt voor jouw moeite!
Björn.

[ Voor 5% gewijzigd door Verwijderd op 06-12-2006 14:32 ]


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 20-09 23:58

TeeDee

CQB 241

Heeft mySQL geen Cascading deletes? Dan kan je afaik al een hele hoop queries wegdoen, en word je code overzichtelijker.

edit:
Bo-oz, nog niet aangedacht inderdaad. 1 Product kan natuurlijk in meerdere Lijnen zitten :) dan is een cascade delete niet handig inderdaad.

[ Voor 38% gewijzigd door TeeDee op 06-12-2006 14:37 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

Verwijderd

Kan 1 product ook maar tot 1 productlijn behoren?

Anders zou ik lekker redundant doen, en de productline opslaan in de producten, dan heb je dus maar 3 query's nodig:

DELETE * FROM product WHERE productlineID = x
DELETE * FROM categorie WHERE productlineID = x
DELETE * FROM productline WHERE productlineID = x

succes.


Sorry ik zit ff te slapen...

Even kijken

1/ er zitten een paar dingen tussen die eenvoudig in een while lusje kunnen, denk aan de unlink (stelregel, als je tijdens code ctrl+c ctrl+v gebruikt ben je verkeerd bezig).

2/ Ik snap sommige van je query's niet, kun je die even kort toelichten bijvoorbeeld query #3, je select de data al in de query ervoor... waarom opnieuw met een limit? De query geeft immers al een array of een object waarin alle waarden zitten.

[ Voor 42% gewijzigd door Verwijderd op 06-12-2006 14:40 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Waarom begin je van binnen naar buiten? Je kan naar mijn mening het best eerst beginnen met de producten.

Alla:
Zoek producten van product line / cat op > Delete
Zoek cat van product line > Delete
Delete product line

En daarbij de images steeds deleten.

Zou toch moeten werken? :?

EDIT:

Of je leest cats uit in een while, vervolgens maak je weer een while voor de producten. In die while delete je de producten en images. Als die while klaar is delete je de gegevens van de cat.

[ Voor 25% gewijzigd door Verwijderd op 06-12-2006 14:44 ]


Acties:
  • 0 Henk 'm!

Verwijderd

En even over normaliseren... zo te zien heb je bij elk product 5 velden voor de foto's... kan je niet beter een extra tabel toevoegen met de afbeeldingen behorende bij een bepaald product, als je het product meerdere keren herbruikt in meerdere productlijnen / categorieeen heb je dus vet veel redundantie, in dat geval heb je dus ook nog een koppel tabel nodig vanwege n:m

ps. die extra tabel zorgt dat het unlinken ook eenvoudig gaat

pseudo php:
PHP:
1
2
3
4
5
6
$photo_query = mysql_query("SELECT * FROM photos WHERE productID = x");
while (mysql_fetch_assoc($photo_query)) {
                    if(file_exists("../images/" .$photo_query['foto'])){
                    unlink("../images/".$photo_query['foto']);
                    } 
}


edit: beter file_exists gebruiken

[ Voor 36% gewijzigd door Verwijderd op 06-12-2006 14:48 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Ohja, kan de delete query trouwens niet in 1??

DELETE FROM product, categorie, productline WHERE productlineID = x

ff zomaar een ideetje hoor, weet t niet zeker nl... iemand?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja maar de persoon voor wie ik maak wilde er gewoon max 5, dus deed ik gewoon zo simpel mogelijk :).. Anders had ik dat tabel wel gedaan..

De limits zijn ervoor om te zorgen dat ze een voor een worden bekeken, ivm de data daarin die eruitgehaald moeten worden om de plaatjes te unlinken..

Het grappige is.. Nadat ik deze berichten las wist ik opeens wat er fout ging..

Ik DELETE de dingen nadat t wordt geselecteerd, wat t gevolg is dat de $result eigenlijk wordt veranderd (-1 dus, omdat 1 is gedelete), en dus niet meer klopt in de for-lus (omdat t wordt herhaald).. -> Gevolg, LIMITS geven niet goed weer (nou ja worden niet goed gevonden in de database, omdat er nu dus minder rijen zijn dan er eerder werd geselecteerd) en deleten dus niet alles.. Vrij domme fout van mij..

Ik heb de volgende gedaan.. de DELETE commandos verplaatst naar helemaal onderin en een beetje gewijzigd.. de id van desbetreffende productline ALLES verwijderen in cats+products zoals Bo-oz net heeft gezegd inderdaad..

Maar bedankt mensen!
Het is eindelijk gelukt.

Björn.

[ Voor 8% gewijzigd door Verwijderd op 06-12-2006 14:54 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Die limits zijn dus totaal onzinnig... de SELECT doet t al goed, die geeft een object of array met alles wat je nodig hebt, je leest dus het resultaat van een SELECT * uit om voor elke record die hij terug geeft opnieuw een hele wazige SELECT * te doen met een Limit om alleen die waarde terug te geven... begrijp jij t begrijp ik t, als je dan nog WHERE ID=$result['ID'] deed... dan begreep ik t nog :S


edit: advies van mij.... herstructureer je database om die plaatjes in een aparte tabel te zetten... dit is dus echt een "smerige" oplossing, als je klant er straks toch 6 wil ben je echt de sjaak! Stap 2, gooi al deze code weg en begin opnieuw en schrijf eerst uit wat er moet gebeuren

1/ (doe je niet als je categorie verwijderd) selecteer alle categorieen in productline
2/ selecteer voor elke categorie alle producten
3/ gooi alle plaatjes weg uit die producten
4/ verwijder de producten
5/ verwijder de categorieen
6/ (doe je niet als je categorie verwijderd) verwijder de productline

(maak hier een slimme functie van, dan kan je hem hetzelfde houden voor het verwijderen van een categorie en zelfs een product opzich ;))

[ Voor 48% gewijzigd door Verwijderd op 06-12-2006 15:00 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Binnen no-time dus opgelost.. Voortaan dan even een half uurtje langer kijken lijkt mij :>

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 06 december 2006 @ 15:00:
Binnen no-time dus opgelost.. Voortaan dan even een half uurtje langer kijken lijkt mij :>
lieverd heb 2 dagen ermee geprusts :D

ja Bo-oz ur right, zie het nu ook in.. zal doen later ;)

nu ff relaxen

ty!

Acties:
  • 0 Henk 'm!

Verwijderd

@elektro... je hebt groot gelijk, alles op zn gemak, maar bedenk altijd dat klanten net zo veranderlijk zijn als t weer... zijn t vandaag x plaatjes dan zijn het er morgen 2x, en ben jij de L*L, want dat is toch niet zo moeilijk?? Hoeft het ook niet te zijn, als je vanaf dag 1 goed nadenkt over dit soort dingen, normalisatie is echt geen rocketscience ;)
Pagina: 1