[PHP4] Array in class

Pagina: 1
Acties:

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 18-02 18:59
Na veel gezocht te hebben en "Pro's" aangesproken te hebben wend ik me toch echt tot hier.

Het probleem:
code:
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
//mainclasses.php (niet compleet. er zit nog een database klasse in maar die werkt gewoon)
<?php
class user
{
    var $userid;
    var $stats;
    
    function user()
    {
        $this->userid = $_SESSION['userid'];
        if (!isset($this->userid))
        {
            include("login.php");
        }
        else
        {
            $query = mysql_query("SELECT * FROM characters WHERE userid = '$this->userid'");
            echo mysql_error();
            if (mysql_num_rows($query) == 1)
            {
                $this->stats = mysql_fetch_array($query);
                include("main.php");
            }
            else
            {
            
            }
        }
    }
}
?>


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
//index.php

<?
session_start();
include("mainclasses.php");

$database = new database();
$database->connect("****", "***");
$database->selectdb("***");

$user = new user();

?>


code:
1
2
3
4
5
6
7
8
9
10
11
12
//main.php
htmljunk


<TABLE ID='containertable' CELLSPACING='0' CELLPADDING='0'>
    <TR>
        <TD VALIGN="TOP" ID='bannerleft'>
                [<? echo $user->stats['location']; ?>]<BR>
                [userinfo]<BR>      
        </TD>
    </TR>
</TABLE>


de array word alleen niet gevuld... heb alle mogelijke manier van aanroepen geprobeerd maar niets werkt.
de bedoeling is dat $this->stats gevuld word met de waardes uit de tabel characters.
Een stuk of 15 waardes.
ik kan natuurlijk in een while loopje variabelen aanmaken in de class. maar dat is niet netjes :Y)

Ziet iemand heel snel wat ik verkeerd doe?

edit:
na overleg gehad te hebben met een modje, blijkt in ieder geval dat er geen typfouten in de code zitten. zodra je de klasse kopieert (dus gebruikt in je eigen code) word de array niet gevuld.

[ Voor 69% gewijzigd door FireDrunk op 07-06-2006 23:01 . Reden: overleg met modje ]

Even niets...


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Je moet niet mysql_affected_rows hebben maar mysql_num_rows. Die eerste is bedoeld voor muterende queries, die laatste voor selects. En dat staat prima na te lezen in de documentatie; vandaar ook dat ik je topic sluit.

Daarnaast word je er nog door Cyphax op gewezen dat het $this->stats is in plaats van $this->$stats. En als het om méér dan een record gaat, dan heb je wel degelijk een loopje nodig.

edit:
En weer open, er blijkt meer aan de hand te zijn. thijs_cramer post zometeen als het goed is wat meer informatie.

[ Voor 44% gewijzigd door NMe op 07-06-2006 22:27 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • WormLord
  • Registratie: September 2003
  • Laatst online: 20-02 12:15

WormLord

Devver

Wat krijg je dan wel?
Heb je al eens een vardump gedaan van $this->stats net nadat je die hebt gevuld?
Heb je al eens een vardump gedaan van $user net nadat je die hebt gevuld?
En zo ja, wat is dan het resultaat?

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 09-12-2025
Dat is toch logisch? $user heeft pas een waarde als de constructor is uitgevoerd. En omdat je de hoofd actie uit user in de constructor uitvoert (wat sowieso al fout is imo), heeft $user nog geen waarde als je main.php include.

Noushka's Magnificent Dream | Unity


  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 18-02 18:59
dus ik moet buiten de klasse main.php pas includen?

Even niets...


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Dat zou sowieso netter (generieker) zijn. Maar je lost je probleem al op door het simpelweg niet in je constructor te doen, maar ergens anders in je klasse. Echter neemt jouw opzet het hele voordeel van OOP voor PHP weg, aangezien je op deze manier nog steeds ononderhoudbare code maakt.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 18-02 18:59
ik ben ook nieuw in het hele concept van OOP programmeren van php
dit is eigenlijk de eerste keer dat ik echt OOP probeer te programmeren.
maar wat is dan het voorstel om te veranderen aan de klasse cq includes?

Even niets...


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Opzetje, pseudocode:
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
class User {
   var $id;
   var $stats = null;

   function User($id = null) {
      $this->id = $id;
      $this->fetchStats(); // is ook anders op te lossen, zeker i.v.m. de andere methods hieronder
   }

   function fetchStats() {
      if ($this->stats === null) {
         //stats ophalen als dat nog niet gebeurd is
      }
   }

   function checkLogin($username, $pass) {
      //kijken of username en password bij het opgegeven id passen
      //true of false returnen bij resp. succes/mislukt
   }

   function exists() {
      //true of false returnen als user bestaat resp. niet bestaat
   }
}

PHP:
1
2
3
4
5
6
7
8
9
10
$user = new User((int)$_SESSION['userid']); // maar eerst checken of $_SESSION['userid'] geset is!
if ($user->exists()) {
   if ($user->checkLogin($_POST['loginnaam'], $_POST['wachtwoord'])) {
      // legale user die ingelogd is; includen kan hier
   } else {
      // foute gebruikersnaam/wachtwoord combinatie
   }
} else {
   //melding dat user niet bestaat, inclusief evt. bijbehorende includes
}

Lijkt me een veel generiekere opzet?

[ Voor 5% gewijzigd door NMe op 08-06-2006 15:07 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 18-02 18:59
maar een hoop extra includes...
want als de gebruiker eenmaal ingelogd is is de login class dus altijd geladen.
en dat wilde ik juist voorkomen. anders krijg ik (omdat het een flinke website word) nogal wat loze php code in het geheugen. (en dat vertraagd...)

Even niets...


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Je kan natuurlijk meer doen dan alleen inloggen; denk ook aan rechtenkwesties die je in principe met dezelfde klasse kan regelen. Daarnaast is het natuurlijk geen enkel probleem om je objecten op te ruimen als je ermee klaar bent. En verder: zoveel ruimte in het geheugen kost zo'n klasse je niet, en in ruil daarvoor kun je de klasse later in een andere applicatie hergebruiken.

En het aantal includes lijkt me verder gelijk?

[ Voor 6% gewijzigd door NMe op 08-06-2006 15:19 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05-2025

GX

Nee.

En dan nog, als je je stoort aan het aantal includes moet je eens kijken naar __autoload (sinds PHP 5).

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 18-02 18:59
het probleem zit hem juist in PHP4, pas in php5 zijn een hoop OOP dingen verbeterd...

Even niets...


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Daarom was mijn opzet hierboven kwa structuur ook PHP4-compatible. ;) Kun je daar nou wat mee of niet?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Misschien ligt het aan mij..( ligt aan mij :P ) maar ik zie nergens de mysql_query ($query); Aanroep staan, die de resultset terug geeft, die gebruikt moet worden in num_rows en fetch_array...

Dus iets van:

code:
1
2
3
4
5
6
7
$result = mysql_query ($query);

if ( mysql_num_rows ($result) ){

        $this->stats = mysql_fetch_array($result);

}


Edit:
Zou wel even ipv $query -> $result gebruiken... leest wat duidelijker

[ Voor 25% gewijzigd door Verwijderd op 08-06-2006 21:52 ]


  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 18-02 18:59
ik doe
$query = mysql_query("query"); // dus direct query uitvoeren (ja ik weet wat sql injections zijn)
en dan $result = mysql_fetch_object($query);

@nme

ik denk het wel, heb nu even het moment niet om het te proberen,
ik zal posten als het gelukt is.
iig bedankt

Even niets...

Pagina: 1