php 5 objektumok

Helló!

Egy kisebb PHP-s oldalt írok, és szertenék néhány objektumot csinálni de nem működik úgy ahogy szeretném. Ezt a kódot írtam:


class Newspaper{
function __construct($np,$is){
$this->newspaper = $np;
$this->isSelected = $is;
}
public $newspaper;
public $isSelected;
}

class CardRegForm {

//User adatai
private $image;
private $name;
private $news;
private $email;

//objektum adatai
private $sqlPc;

function __contstruct(){
//sql kapcsolat
$sqlPc = mysql_pconnect($SQL_SERVER_NAME,$SQL_USER,$SQL_PASSWD);
mysql_select_db($SQL_DATABASE,$sqlPc);
mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'", $sqlPc);

//newspaper
$r = mysql_query("SELECT `newspaper_name` FROM `newspapers`;",$sqlPc);
for($i=0;$row=mysql_fetch_array($r);$i++){
$this->news[$i] = new Newspaper($row['newspaper_name'],0);

}
}

public function getNewspapers(){
return $this->news;
}
...
}

Amikor ezt az objektumot próbálom használni egy html egy html oldalba ágyazott php szkriptből így:

<?php $options = $_SESSION['reg']->getNewspapers();
foreach($options as $o){?>
option <?php if($o->isSelected == 1){?>selected<?php }?>" ><?php echo $o->newspaper; ?>

<?php }?>

Akkor ezt írja:

Invalid argument supplied for foreach() in /var/www/musajt/index.php on line 32

Mi lehet a hiba? előre is köszi a segítséget.

Üdv
Szati

Hozzászólások

Szia!

Debugolj, valószínű nem tömbbel tér vissza a getNewspapers, nézd meg a CardRegForm osztály konstruktorának végén mit tartalmaz a $this->news, esetleg az $options változó mit tartalmaz. Egy jótanács, mielőtt egy tömböt elkezdesz feltölteni stílszerű elősző tömbként deklarálni (asszem megy anélkül is, de nem túl elegáns).

Talan azert mert a session-ba nem kellene objektumot igy belehajitani :)

Ez segithet: http://www.php.net/var_export

igy menthetsz ki egy objektumot


$_SESSION['myclass-dump'] = var_export(myclass,true);

igy allithatod vissza


eval('$myclass=' .  $_SESSION['myclass-dump']);

visszaolvasasnal arra kell vigyaznod, hogy az osztayt leiro alomany legyen include-olva

var_export-nal arra kell vigyazni, hogy az objektumon beluli objektumokat nem menti. Ha hasznalsz iet akor letre kell hoznod egy __set_state statikus figvenyt amiben elvegzed ezt.

_______________________________________________________
UBUNTU 8.10 Rock's!
Type cat /vmlinuz > /dev/audio to hear the Voice of God.

Ez akkoris nem kulturalt hozzaallas. Jobb helyeken csak az ojjektum azonositojat helyezik a session-ba, maga az ojjektum a szerveren realizalodik csak. Altalaba az id es az azt tartalmazo valtozo neve indexelik meg az illeto objektumot az adatbazisban (nwpid=8525)
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Oke, es en hol irtam azt, hogy lemennek a kliensre?

A szerver ramjaban biztosan nem maradnak, mert egy webszerver sem garantalja azt, hogy ugyanaz a worker process/thread szolgalja ki ugyanazon kliens minden kereset. A session store altalaban egy csomo fajl valahol a webszerver /var/cache mappajanak kornyeken (valtozhat); bar vannak memoria adatbazis alapu session store-k, de ritkan hasznaltak. De teljesen felesleges, sot egyenesen karos dolog objektumokat, foleg adatbazis alapu objektumokat session-ben tarolni - hiszen ez nem frissul hozza az adatbazis valtozasokhoz, ugyanugy elo kell szedni az adatot megint - csak a session store-ban is foglaljuk a helyet neki.
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Ez mar nagyon feladatspecifikus.
Pl, ha van egy toblepeses form, akor jo megoldas lehet. Tegyuk fel, hogy az osztaly tartalmaz minden lepesre egy metodust es a konstruktor mindig betolti es a destruktor mindig kimenti az objektum allapotat a session-be. Igy sokkal kezelhetobb es atlathatob lesz a kod.

A sebesseg miatt inkab nem hasznalnak adatbazis oldali sessiont.

Jobb helyeken csak az ojjektum azonositojat helyezik a session-ba, maga az ojjektum a szerveren realizalodik

Ha nem szolalsz meg, me'g okosabnak nezlek:)
Ki mondta, hogy a session cookie-ba mentem ki az osztalyt? Surgosen olvass utanna a php session mukodesenek es annak, hogy hogyan hasznald!

_______________________________________________________
UBUNTU 8.10 Rock's!
Type cat /vmlinuz > /dev/audio to hear the Voice of God.


class Newspaper
{
    function __construct($np,$is)
    {
        $this->newspaper = $np;
        $this->isSelected = $is;
    }
    
    public $newspaper;
    public $isSelected;
}

Ha már konstruktorból állítod be a tagokat, akkor (szigorúan SZVSZ!):
1.

private $newspaper;

, illetve

private $isSelected;

//~OO information hiding
2. ha 1., akkor privát tagokat függvényekkel állítsd be/értéküket azzal olvasd ki (ha konstruktoron kívül máshol
is kaphat értéket/kiolvasásra kerül.
Pl.:

public function setNewspaper($newspaper) {$this->newspaper = $newspaper;}

, ill.

public function getNewspaper() { return $this->newspaper; }

//~OO information hiding + interface (ill. hasonlóan isSelected-re is...)

Szerk.: Hogy másról is írjak:


$r = mysql_query("SELECT `newspaper_name` FROM `newspapers`;", $sqlPc);
for($i=0;$row=mysql_fetch_array($r);$i++)
{
    $this->news[$i] = new Newspaper($row['newspaper_name'], 0);
}

helyett próbáld így:


$r = mysql_query("SELECT `newspaper_name` FROM `newspapers`;", $sqlPc);
while($row = mysql_fetch_assoc($r))
{
    $this->news[] = new Newspaper($row['newspaper_name'], 0);
}

Mert a fetch_array egy 0-tól oszlopok száma?-1? indexszel látja el a tömbelemeket,
az assoc pedig oszlopnév=oszlop_értéke formában adja vissza a dolgokat (asszociatív tömb).
Remélem nem beszéltem nagy baromságokat... ha igen, akkor bocs, még új vagyok :P

--
A gyors gondolat többet ér, mint a gyors mozdulat.

nem kellene egy unserialize($_SESSION['reg']); ?