Snelle weet vraag: Pdo delete statement verwijderd ze allemaal?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Francoi gckx

Francoi gckx

24/02/2014 11:14:43
Quote Anchor link
Ik gebruik PDO en mysql,
als je opdracht geeft om een row te verwijderen op basis van een 'prepared smtn' en een id
stel er zijn toch meerdere rows gekoppeld aan diezelfde id verwijderd hij dan al die
rows ook gelijk?
 
PHP hulp

PHP hulp

21/12/2024 13:27:54
 
Dos Moonen

Dos Moonen

24/02/2014 11:28:00
Quote Anchor link
Ja, maar het idee achter een id is dat die uniek is, wat je forceert met een PRIMARY KEY constraint. Dus als je alle posts verwijderd waarvan het post id 42 is hoort dat maximaal een post te verwijderen omdat je database structuur alleen unieke ids toe laat.

Maar als je alle post verwijderd die aan user id 1337 gekoppeld zijn kunner dat duizende posts zijn.

Een prepared statement is een query waarvan de database al een plan kan opstellen zonder alle data nodig te hebben. Uiteindelijk zal deze het zelfde uitgevoerd worden als dezelfde query die wel alle data bevat. Het zal geen extra logica toevoegen.
 
Francoi gckx

Francoi gckx

24/02/2014 11:34:31
Quote Anchor link
Dankjewel

Het is meer een id gebaseerd (als ik jou voorbeeld mag gebruiken) een toevoeging van een ander tabel
zeg maar er is een user waarvan ik al zijn posts en de betreffende user wil verwijderen.

Mijn zorgen was dat hij dan niet maar slechts 1 post verwijderd en al het andere zwevend in de database rond blijft (terwijl de user al niet meer bestaat) dus ik hoef dan geen 'loop' er om heen bouwen dat hij voor het zekere wel alle posts verwijderd? en doet hij deze loopactie dus al standaard?
Gewijzigd op 24/02/2014 11:35:12 door Francoi gckx
 
Erwin H

Erwin H

24/02/2014 11:42:32
Quote Anchor link
Klinkt alsof je een foreign key erop nodig hebt. Als je een foreign key plaatst op de post tabel die verwijst naar de user tabel (met een cascade actie op delete), dan worden alle posts automatisch verwijderd als je de user verwijdert. Hoef je dus niet handmatig user en posts te verwijderen.
 
Francoi gckx

Francoi gckx

24/02/2014 11:51:54
Quote Anchor link
Hmm dat is nieuwe stof voor mij foreign key.

Let me get this straight:
Er een tabel user:

user_id: 4
user_naam: francoi

en een tabel posts:
post_id: 1
user_id: 4
bericht: blabla

nog een post:
post_id: 2
user_id: 4
bericht: blabla2

nog een post:
post_id: 3
user_id: 4
bericht: blabla3

Dus als ik een foreign key zet op user_id (in tabel posts op user_id (waar in tabel user user_id een primary key is)), word als ik een verwijder actie zet op tabel user user_id dan zoekt hij heel de database rond voor foreign key op user_id als hij zo'n tabel heeft gevonden in dit geval tabel posts dan verwijderd hij al die ook?
Gewijzigd op 24/02/2014 11:53:07 door Francoi gckx
 
Erwin H

Erwin H

24/02/2014 12:20:14
Quote Anchor link
Klopt ten dele. Je moet per tabel waarin je user_id gebruikt een foreign key aanmaken, de database gaat zelf niet rondspeuren. Voor de posts tabel bijvoorbeeld als volgt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
ALTER TABLE posts
  ADD FOREIGN KEY fk_user_id(user_id)
  REFERENCES users(user_id)
  ON DELETE CASCADE
  ON UPDATE CASCADE;

Als je nu de user verwijdert, worden ook direct alle records uit de posts tabel verwijdert die linken naar de betreffende user:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
DELETE FROM users
WHERE user_id = 4;


Op het gebruik van foreign keys zitten wel een aantal voorwaardes. Zo moet de database engine het ondersteunen (MyISAM ondersteunt het niet, InnoDB wel) en de types van user_id uit de reference tabel en user_id uit de tabel waarop de de foreign key aanmaakt moeten exact gelijk zijn. Je kan dus niet in users de user_id kolom als INT UNSIGNED aanmaken en in de posts tabel als INT.
 
Francoi gckx

Francoi gckx

24/02/2014 12:48:49
Quote Anchor link
Zeer dank voor jou waardevolle uitleg!

Je heb mij wel een klein gevoel van teleurstelling gegeven haha:P

Als ik dit eerder had geweten.. zucht.

Maar niettemin ben ik heel erg blij met een gebruiker zoals jij hier op het forum!

Ik moet alleen eerlijk toegeven dat ik toch de oude methode (voor nu!) ga gebruiken en met extra code
het ga doen aangezien dat voor mij beter bekend is maar voornamelijk het voor een grote deel zonder deze minder tijd beslagnemende manier heb gedaan:(.

In versie 2 waarin ik jou methode in ga verwerken ga ik zeker hier lol aan hebben!;):D






Toevoeging op 24/02/2014 12:54:20:

Oh toch wat vraagjes

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
ALTER TABLE posts
  ADD FOREIGN KEY fk_user_id(user_id)
  REFERENCES users(user_id)
  ON DELETE CASCADE
  ON UPDATE CASCADE;


wat bedoel je met ADD FOREIGN KEY fk_user_id(user_id)
wat is fk_user_id? is dat de naam(verandering) van de (nieuwe) kolom (die je aanmaakt)
ze moeten toch allebei user_id heten?

Kan in tabel users de user_id slechts primary key blijven?
Kan dit via de interface van phpmyadmin gebeuren (met knoppen ipv een query) een foreign key aanmaken?



Toevoeging op 24/02/2014 12:59:28:

Zijn er gevallen waarin je de foreign key goed heb toegepast en de code
maar toch op een bepaalde post (van de duizende) een update het laat afweten (door een storing ofzo)?
Gewijzigd op 24/02/2014 13:02:11 door Francoi gckx
 
Dos Moonen

Dos Moonen

24/02/2014 13:32:19
Quote Anchor link
ADD FOREIGN KEY fk_user_id voegt een nieuw object toe in je database, het moet namelijk ergens opgeslagen worden. fk_user_id is de naam van dat object, het is een unieke naam, zodat je het kunt aanpassen en verwijderen.

Je kunt via phpmyadmin foreign keys aanmaken.

Zolang er geen foreign keys zijn die niet ON DELETE CASCADE of ON DELETE DEFAULT ingesteld staan hoort alles wat je laat cascaden ook echt verwijderd te worden.

Als je huidige plan is om in PHP een loop te maken om dingen te verwijderen stel ik voor dat je hier een kijkje gaat nemen: http://stackoverflow.com/questions/17083862/mysql-delete-row-where-parent-does-not-exist
Schrijf een query per tabel met een left join en verwijder alles waar de rechter tabel alleen NULL waardes bevat (op velden die niet NULL kunnen zijn)
 
Francoi gckx

Francoi gckx

24/02/2014 13:43:43
Quote Anchor link
Bedankt fk_user_id is niet iets wat echt letterlijk in post tabel word weergegeven in de structuur lijst
het word eigelijk een eigenschap van user_id in de post tabel.

Mij tijdelijk huidige plan is dit.

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
public function delete_user($id_numm)
        {
            $query = $this->db->prepare("DELETE FROM users WHERE user_id = ?");
            $query->bindValue(1, $id_numm);

            try
                {
                
                    $query->execute();
                    
                    $query1 = $this->db->prepare("DELETE FROM posts WHERE user_id = ?");
                        $query1->bindValue(1, $id_numm);
                    try
                        {
                    
                            $query1->execute();
                        }
                    catch (PDOException $e)
                        {
                            die($e->getMessage());
                        }    
resterende deel weglatend..


Toevoeging op 24/02/2014 13:46:16:

Kan er mee door toch?
 



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.