login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Objecten laden met mysql_fetch_object (Opgelost)

Offline pbongers - 29/04/2009 17:30
Avatar van pbongersNieuw lid Hallo

Ik las vandaag op php.net informatie over de functie mysql_fetch_object(...)

Ik kan dit natuurlijk fout hebben, maar ik begreep uit de beschrijving dat ik direct objecten/classes kan laden.

Dit is een samenvatting van de klasse die ik probeer te laden
  1. <?
  2. Class Nieuwsitem{
  3. const configpath = "config.php";
  4.  
  5. private $itemID;
  6. private $titel, $bericht;
  7. private $datum;
  8.  
  9. function __construct($titel, $bericht, $datum = date("Y-m-d"), $itemID = -1){
  10. $this->titel = $titel;
  11. $this->bericht = $bericht;
  12. $this->datum = $datum;
  13. $this->itemID = $itemID;
  14. }
  15.  
  16. static function LoadItem($nr){
  17. // $host, $username, $password en $dbname staan in de config-file
  18. require_once(Nieuwsitem::configpath);
  19. $link_identifier = @mysql_connect($host, $username, $password);
  20. @mysql_select_db($dbname, $link_identifier);
  21.  
  22. $querystring = "SELECT titel, bericht, datum, itemID FROM nieuws ORDER BY datum DESC LIMIT " . $nr . ", " . ($nr + 1);
  23. $query = @mysql_query($querystring, $link_identifier);
  24.  
  25. $item = mysql_fetch_object($query, "Nieuwsitem");
  26.  
  27. @mysql_close($link_identifier);
  28.  
  29. return $item;
  30. }
  31.  
  32. function ToString(){ ... }
  33.  
  34. function PrintItem(){ ... }
  35.  
  36. function Delete(){ ... }
  37. }
  38. ?>


Ik ga er van uit dat de functie LoadItem($nr) nu een Nieuwsitem terug geeft.
Echter krijg ik een error op de regel:
$item = mysql_fetch_object($query, "Nieuwsitem");

Kan iemand me uitleggen wat ik fout doe?

7 antwoorden

Gesponsorde links
Offline Rik - 29/04/2009 17:52
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Wat voor fout geeft hij dan? Misschien geeft private op die variabelen problemen. Probeer dat eens te veranderen naar protected en anders public?
Offline pbongers - 30/04/2009 11:15 (laatste wijziging 30/04/2009 11:15)
Avatar van pbongers Nieuw lid Zat blijkbaar nog een ander klein foutje in mijn geposte code. Blijkbaar is het niet mogelijk om
__construct(..., $datum = date("Y-m-d"), ...); te doen (er mogen geen haken gebruikt worden binnen de constructor).

Dit was makkelijk te omzeilen, maar ik heb wel nog steeds de error die ik bedoelde, namelijk:
Warning: Missing argument 1 for Nieuwsitem::__construct() in C:\xampp\htdocs\files\PHP\Nieuwsitem.class.php on line 9

Die warning krijg ik twee keer (voor $titel en $bericht), iedere keer dat ik een bericht laad.
Offline Rik - 30/04/2009 21:37
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Volgens mij worden er door mysql_fetch_object geen argumenten aan de constructor mee gegeven. Het enige dat het doet is een nieuwe instance maken en daar dan van buitenaf de variabelen in zetten.
Offline NataschaV - 30/04/2009 21:52 (laatste wijziging 06/05/2009 16:15)
Avatar van NataschaV PHP interesse In deze tutorial wordt mysql_fetch_object uitgelegd.
http://www.site...L/SELECT#5
Hopelijk heb je er wat aan.
Offline pbongers - 06/05/2009 12:32 (laatste wijziging 06/05/2009 12:33)
Avatar van pbongers Nieuw lid
Boukefalos schreef:
Volgens mij worden er door mysql_fetch_object geen argumenten aan de constructor mee gegeven. Het enige dat het doet is een nieuwe instance maken en daar dan van buitenaf de variabelen in zetten.

Dit vermoeden kreeg ik inderdaad ook al. Het zou wel jammer zijn als dit zo is want dan moet ik dus een andere fetch gebruiken en voor iedere record zelf de klasse instantieren.

NataschaV schreef:
In deze tutorial word mysql_fetch_object uitgelegt.
http://www.site...L/SELECT#5
Hopelijk heb je er wat aan.

Dit had ik al begrepen. Volgens php.net was het ook mogelijk om zelf op te geven wat voor object je wil (wat voor klasse je wilt hebben).
Het is mij echter niet duidelijk wat het nut is van mysql_fetch_object 
Het lijkt namelijk wel zo dat, indien ik dit wil gebruiken, ik al mijn variabelen public moet gaan maken (waarvan ik ook nog niet eens zeker weet of het werkt). Daarbij verlies ik dan de beperkingen die ik nu wil opleggen
Offline Joost - 06/05/2009 12:40 (laatste wijziging 06/05/2009 16:37)
Avatar van Joost PHP expert Wanneer je het nu zo doet?
  1. $item = mysql_fetch_object($query, "Nieuwitem", array('', ''));

Bij de 3e parameter, staat op PHP.net:
php.net schreef:
params
An optional array of parameters to pass to the constructor for class_name objects.

Nu ontvangt je constructor ook de benodigde parameters, en zal de error van missing arguments weg zijn denk ik 

---

Ooh, even verkeerd gelezen wat er precies moest gebeuren..

---
EDIT
Ik heb er even mee getest. Wat PHP doet is de geselecteerde kolommen invullen als membervariabelen, en daarna de constructor aanroepen (met eventuele parameters die jij kan meegeven). Wat er dus gebeurd is, PHP vult de membervariabelen in, en roept de constructer aan (met de parameters uit het 3e argument). Omdat je dan nog niet weet welke waardes je selectie heeft, kan je dus alleen lege waardes meegegeven en dergelijke. De ingevulde membervariabelen worden dus weer overschreven door de contructor. Ik heb het uiteindelijk opgelost (eigen code, moet je maar even kijken) met een setter.
  1. <?php
  2.  
  3. class Nieuwsitem {
  4. private $id = 0;
  5. private $titel = '';
  6. private $bericht = '';
  7. private $datum = '00-00-00 00-00-0000';
  8.  
  9. public function __construct(){}
  10.  
  11. public function __set($property, $value){
  12. $aValidProperties = array(
  13. 'datum',
  14. 'titel',
  15. 'bericht',
  16. 'id'
  17. );
  18. if(in_array($property, $aValidProperties)){
  19. $this->$property = $value;
  20. }
  21. }
  22.  
  23. public function view(){
  24. echo $this->titel." | ".$this->datum." | ". $this->bericht ." | ".$this->id;
  25. }
  26. }
  27.  
  28. $news = new Nieuwsitem;
  29. $news->id = 1;
  30. $news->titel = 'Dit is een titel';
  31. $news->bericht = 'Dit is een bericht';
  32. $news->datum = date('d-m-Y H:i:s');
  33. $news->view();
  34.  
  35. echo "<br><br><b>MySQL</b><br>";
  36.  
  37. $sql = mysql_query("SELECT titel, bericht, datum, id FROM nieuws WHERE id=1") or die(mysql_error());
  38. $obj = mysql_fetch_object($sql, 'Nieuwsitem');
  39. $obj->view();

Dit heeft dezelfde uitkomst.

Beetje vervelend dat het niet anders kan. Iemand heeft het al aangemerkt als bug, zie http://bugs.php.net/bug.php?id=46105 .

Je kan het, bedenk ik me nu, ook oplossen, door een check in je contructor in te bouwen die kijkt of de default waarde is ingevoerd, en zoja, dat hij hem niet verandert..
Offline pbongers - 07/05/2009 12:04
Avatar van pbongers Nieuw lid Bedankt voor de hulp
Dit is hoe ik het nu heb opgelost:

  1. <?
  2. Class Nieuwsitem{
  3. const configpath = "config.php";
  4.  
  5. private $itemID;
  6. private $titel, $bericht;
  7. private $datum;
  8.  
  9. function __construct($titel = null, $bericht = null, $datum = date("Y-m-d"), $itemID = -1){
  10. if($titel == null || $bericht == null) return;
  11.  
  12. if($datum == null){
  13. $datum = date("Y-m-d");
  14. }
  15. $this->titel = $titel;
  16. $this->bericht = $bericht;
  17. $this->datum = $datum;
  18. $this->itemID = $itemID;
  19. }
  20.  
  21.  
  22. public function __set($property, $value){
  23. $aValidProperties = array('datum', 'titel', 'bericht', 'id');
  24. if(in_array($property, $aValidProperties)){
  25. $this->$property = $value;
  26. }
  27. }
  28.  
  29. static function LoadItems($start, $range){
  30. // $host, $username, $password en $dbname staan in de config-file
  31. require_once(Nieuwsitem::configpath);
  32. $link_identifier = @mysql_connect($host, $username, $password);
  33. @mysql_select_db($dbname, $link_identifier);
  34.  
  35. $querystring = "SELECT titel, bericht, datum, itemID FROM nieuws ORDER BY datum DESC LIMIT " . $nr . ", " . ($nr + 1);
  36. $query = @mysql_query($querystring, $link_identifier);
  37.  
  38. $item = mysql_fetch_object($query, "Nieuwsitem");
  39.  
  40. @mysql_close($link_identifier);
  41.  
  42. return $item;
  43. }
  44.  
  45. function ToString(){ ... }
  46.  
  47. function PrintItem(){ ... }
  48.  
  49. function Delete(){ ... }
  50. }
  51. ?>
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.267s