PHP: Object is leeg?

Status
Niet open voor verdere reacties.

Woutertjuh88

Terugkerende gebruiker
Lid geworden
20 nov 2005
Berichten
3.532
Ik ben bezig met een inlog systeempje maar loop tegen een probleempje aan.
Ik heb een functie waar ik de gegevens ophaal uit de database en sla deze op in een object. Deze functie lees ik uit in een andere functie die wordt geopend. Maar als ik de gegevens weer uit het object wil halen blijkt deze leeg te zijn (alles wat in $item komt te staan is dus weg.)

Wat doe ik verkeerd?
live voorbeeld: http://213.17.98.20/forum/ -> alles is al ingevuld je hoeft alleen maar op inloggen te drukken.

PHP:
class Login{
  public $id = '';
  public $gebruikersnaam = '';
  public $wachtwoord = '';
  
  public function getId(){
    return $this->id;
  }
  public function setId($id){
    $this->id = $id;
  }
  
  public function getGebruikersnaam(){
    return $this->gebruikersnaam;
  }
  public function setGebruikersnaam($gebruikernsnaam){
    $this->gebruikersnaam = $gebruikernsnaam;
  }
    
  public function getWachwtoord(){
    return $this->wachtwoord;
  }
  public function setWachtwoord($wachtwoord){
    $this->wachtwoord = $wachtwoord;
  }  
}
 
function checkGebruiker(){
    $sqlQuery = "SELECT * FROM `forum__gebruikers` WHERE gebruikersnaam = '".$_POST['gebruikersnaam']."' AND wachtwoord = '".$_POST['wachtwoord']."'; ";
    $resultaat = mysql_query($sqlQuery);
    $row = mysql_fetch_assoc($resultaat);
    
    $item = new Login();
    $item->setId($row['id']);
    $item->setGebruikersnaam($row['gebruikersnaam']);
    $item->setWachtwoord($row['wachtwoord']);

    var_dump($item); //-> pakt tie
}

function gebruiker(){
  if(isset($_POST['gebruikersnaam'])){
    checkGebruiker();
    var_dump($item); //-> is leeg
  }
}
 
Scope probleempje. Je maakt je $item object aan in een functie; dat betekend dat je object ophoudt met bestaan als die functie is afgelopen. Als je wil dat ie beschikbaar blijft moet je hem dus niet in die functie aanmaken, of meegeven aan de volgende.
 
Je bent in mijn ogen verkeerd bezig je maakt een nieuw object met een user dus dat object moet zichzelf vullen met de gegevens

vervolgens mag er enkel een vraag gesteld worden aan het object islogin of login(paswoord) het seten brengt rotzooiers altijd op ideen . als je enkel returnt true kan je ook je object nadien in sessie zetten hij heeft echter geen data weer als iemand gaat rommelen omdat het gewoon niet kan.
 
Laatst bewerkt:
$item is inderdaad alleen binnen de functie bekend. Gebruik de volgende regel om $item buiten de functie ook te kunnen gebruiken:
global $item;​

Waarom gebruik je eigenlijk getXXX en setXXX functies om de properties een waarde te geven? Het is net zo makkelijk om ze direct een waarde te geven.

Je gebruikt nu de functie mysql_fetch_assoc. Je kan ook de functie mysql_fetch_object gebruiken, zodat de waarden uit de database direct in de betreffende properties van het object worden gezet. Regel 33 t/m 36 zijn dan niet nodig.
 
Als je globals gaat gebruiken kun je net zo goed gelijk stoppen met OO gebruiken, dan is je code niet meer te redden meestal :P
 
Object binnen Object

Hey,
De fout die maakt is dat je een ander Object (Laten we hem B noemen) in Object A gaat aanmaken die je nergens bewaart. De oplossing hiervoor zou een global zijn, maar waarom zou je 2 objecten aanmaken als het ook heel mooi met eentje kan?

Laten we je code eens iets gaan aanpassen:

PHP:
function checkGebruiker(){
    $sqlQuery = "SELECT * FROM `forum__gebruikers` WHERE gebruikersnaam = '".$_POST['gebruikersnaam']."' AND wachtwoord = '".$_POST['wachtwoord']."'; ";
    $resultaat = mysql_query($sqlQuery);
    $row = mysql_fetch_assoc($resultaat);
    
    $this->setId($row['id']);
    $this->setGebruikersnaam($row['gebruikersnaam']);
    $this->setWachtwoord($row['wachtwoord']);
 
    var_dump($this); //-> pakt tie
}
 
function gebruiker(){
  if(isset($_POST['gebruikersnaam'])){
    checkGebruiker();
    var_dump($this); //-> is leeg (Paktie nu waarschijnlijk ook)
  }
}

Op de pagina die de login uitvoert (login.php oid) maak je een new Login(); aan. Vervolgens doe je login->checkGebruiker(); en dan zou het moeten werken. Return in de functie wel een true of false, om aan te geven of de login wel of niet gelukt is. Ook zou je met mysql_num_rows kunnen kijken of het resultaat 0 of 1 rij bevat. Als er 0 rijen uit je query komen, weet je dat je login dus niet gelukt is. Dit zou er zo uit kunnen zien:

PHP:
function checkGebruiker(){
    $sqlQuery = "SELECT * FROM `forum__gebruikers` WHERE gebruikersnaam = '".$_POST['gebruikersnaam']."' AND wachtwoord = '".$_POST['wachtwoord']."'; ";
    $resultaat = mysql_query($sqlQuery);
    if ( mysql_num_rows($resultaat) > 0 )
    {
       $row = mysql_fetch_assoc($resultaat);
    
       [COLOR="Red"]$item = new Login();[/COLOR]
       $this->setId($row['id']);
       $this->setGebruikersnaam($row['gebruikersnaam']);
       $this->setWachtwoord($row['wachtwoord']);
 
        var_dump($this); //-> pakt tie
        return true;
      }
      return false;
}

Succes ermee!
 
dat is toch niet het enige !?! alle properties zoals wachtwoord worden zeker private en niet public je gaat toch uw veiligheid onmiddelijk ondermijnen.en als je dan ook nog eens iest wil verbeteren zou je ook je set wachtwoord kunnen private maken.
een class verbinding maken waar je wachtwoord in de constructor voorziet en Login er van laten extenden maakt dat je aan je database kan maar tegelijk maak je dat je class niet de kennis heeft een connectie te maken en door de parent te gebruiken kan je dan aan je data maar dat zal je welicht wel weten
 
dat is toch niet het enige !?! alle properties zoals wachtwoord worden zeker private en niet public je gaat toch uw veiligheid onmiddelijk ondermijnen.en als je dan ook nog eens iest wil verbeteren zou je ook je set wachtwoord kunnen private maken.
een class verbinding maken waar je wachtwoord in de constructor voorziet en Login er van laten extenden maakt dat je aan je database kan maar tegelijk maak je dat je class niet de kennis heeft een connectie te maken en door de parent te gebruiken kan je dan aan je data maar dat zal je welicht wel weten

Natuurlijk is het niet veilig ;). Ik verhelp alleen het probleem. Beveiliging is een hele andere stap.
 
Het is helemaal niet handig om het wachtwoord in de constructor mee te geven, dan kun je het object niet meer aanmaken zonder het wachtwoord (waar je geen toegang toe hebt vanuit de code) en dus kun je nergens meer account info opvragen.
 
Het is helemaal niet handig om het wachtwoord in de constructor mee te geven, dan kun je het object niet meer aanmaken zonder het wachtwoord (waar je geen toegang toe hebt vanuit de code) en dus kun je nergens meer account info opvragen.

Natuurlijk wel, het wachtwoord dat de gebruiker in het input-veld ingevuld heeft, kan je rustig meegeven in de constructor. Dit wordt opgeslagen als (private)wachtwoord. Als de login() functie daarna wordt uitgevoerd kan het dit wachtwoord gebruiken om te checken of de login correct is en vervolgens true of false teruggeven.
 
Het is helemaal niet handig om het wachtwoord in de constructor mee te geven, dan kun je het object niet meer aanmaken zonder het wachtwoord (waar je geen toegang toe hebt vanuit de code) en dus kun je nergens meer account info opvragen.

ja maar je database verbinding gegevens kan je toch niet op voorhand kennen

in het object

__construct($mysqllogin,$mysqlwachtwoord){
}

Ilogin($password){
}
 
ja maar je database verbinding gegevens kan je toch niet op voorhand kennen

in het object

__construct($mysqllogin,$mysqlwachtwoord){
}

Ilogin($password){
}

Waarom niet? Deze zou je desnoods gewoon in private-attributen kunnen stoppen. Het is natuurlijk netter om een DB-class te maken die een config includet en gewoon binnen het login-object een database-object aan te maken.
 
Als het gaat om een User object is het meegeven van het wachtwoord als constructor element niet handig (tenzij het optioneel is, en dan is het nog steeds niet bijzonder handig) omdat je het niet weet als je een andere user aanmaakt dan degene die in wil loggen (bijv. om zijn username op te vragen die bij een post hoort of weet ik veel)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan