login  Naam:   Wachtwoord: 
Registreer je!
 Forum

[PHP] Data Objects, waarom eerst data inladen voor delete/update?

Offline Joost - 21/03/2010 16:28
Avatar van JoostPHP expert Beste sima's,

Ik heb mij vandaag even wat meer verdiept in PHP data objects, en er is mij iets opgevallen. Wanneer er namelijk een record moet worden verwijderd/veranderd in de database, wordt eerst de data ingelezen in het object. Een voorbeeldje staat hier tussen de scripts, namelijk http://www.site...eeld_class .

In deze tutorial wordt het ook gedaan, op pagina 2 kan je deze code zien:
  1. <?php
  2. include_once('class-DO_User.php');
  3. $user = new DO_User();
  4.  
  5. // Again just using a literal int to get a row.
  6. $user->get(5);
  7.  
  8. // Change the email address
  9. $user->email = 'janedoe@example.com';
  10.  
  11. // Perform the update
  12. $user->update();

en hetzelfde geldt voor deleten.

Nu is mijn vraag; kan iemand mij uitleggen waarom ze eerst de data inladen voordat ze deze verwijderen/updaten? Dit kost namelijk een extra SQL query..

Alvast bedankt.

4 antwoorden

Gesponsorde links
Offline Tuinstoel - 21/03/2010 20:48
Avatar van Tuinstoel PHP expert Ik zit het even door te lezen, maar het is niet nodig om wat op te vragen. Je hebt in principe een object met daarin wat attributen. Deze attributen kun je zelf handmatig een waarde meegeven ($user->userID = 4) of je kunt deze opvragen met in dit geval $user->get(4); Je hoeft dus niet een extra query op te geven.
Offline Joost - 21/03/2010 20:55
Avatar van Joost PHP expert Nee inderdaad maar ik vraag me wel af waarom ik het dan telkens tegen kom, hier op sima en ook op een site van o'reilly, wat toch de reuptatie heeft als kwalitatief goede uitgever..
Offline Raze - 11/07/2010 00:20 (laatste wijziging 11/07/2010 00:22)
Avatar van Raze PHP beginner Ik denk dat het anders om problemen zou geven. Ik baseer mij nu even op de code van hier op sitemasters.

stel: je zou de gegevens niet ophalen
  1. class Klanten {
  2. public $iID;
  3. public $sNaam;
  4. public $sEmail;
  5. public $sAdres;
  6. public $sPostcode;
  7. public $sWoonplaats;


Dit is het begin, en zoals je ziet zijn deze allemaal leeg.

Stel dat je nu dit zou doen:
  1. try {
  2. /**
  3.   * Maak een nieuw object van de class klanten aan
  4.   */
  5.  
  6. $oKlant = new Klanten();
  7.  
  8. $oKlant->sEmail = 'nieuwemailvanmarten@sitemasters.nl';
  9. $oKlant->updateData($rDB);


je hebt nu $oKlant->sEmail wel gevuld, maar de andere attributen blijven leeg.
Even verder in de code zie je dit:
  1. public function updateData($connection) {
  2. $sQuery = "UPDATE klanten SET
  3. naam = '". mysql_real_escape_string($this->sNaam) ."',
  4. email = '". mysql_real_escape_string($this->sEmail) ."',
  5. adres = '". mysql_real_escape_string($this->sAdres) ."',
  6. postcode = '". mysql_real_escape_string($this->sPostcode) ."',
  7. woonplaats = '". mysql_real_escape_string($this->sWoonplaats) ."'
  8. WHERE id = ". intval($this->iID);
  9.  
  10. $rResult = mysql_query($sQuery);
  11.  
  12. if ($rResult === FALSE) {
  13. throw new Exception('Query mislukt: ' . mysql_error(), SQL_QUERY_ERROR);
  14. }
  15. }


aangezien $this->iID leeg is (want die is niet handmatig gevuld, of niet gevuld door een selectquery), kan je ook geen update uitvoeren.

Het kan fout zijn wat ik zeg, maar volgens mij is dit waarom je eerst een selectquery moet doen om de attributen te vullen. Ook al omdat als je een update doet, en je zet handmatig de $oKlant->sEmail en $oKlant->iID, en je doet dan een update terwijl de andere allemaal leeg zijn, zullen ze ook veranderd worden in de database (kijk maar naar die updatequery).

EDIT: het antwoord van tuinstoel komt op hetzelfde neer.
Wat hij zegt klopt wel, maar dan moet je in het geval van het script hier op sima wel telkens àlle attributen terug invullen (handmatig) en je moet ook telkens het ID kennen van de klant in kwestie.
Offline Abbas - 11/07/2010 03:00 (laatste wijziging 11/07/2010 03:01)
Avatar van Abbas Gouden medaille

Crew .NET
Je zou het ook kunnen doen met een updateDate methode die dan een "oude" en "nieuwe" waarde verwacht als parameters en dan met een UPDATE ... WHERE ... zou het natuurlijk in 1x gaan. Maar als je op deze manier gaat werken is het heel dikwijls/bijna altijd zo, in .NET is het bij LinQ of andere DO-manieren ook zo:

  1. UwDataContext db = new UwDataContext();
  2. var dbValue = from k in db.Klanten where Naam.Equals("Joost") select k;
  3. if(dbValue != null)
  4. {
  5. Klant k = (Klant)dbValue;
  6. k.Naam = "Nieuwe naam";
  7. db.SubmitChanges();
  8. }
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.21s