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
- 1600 megtekintés
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).
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
afaik
a session változói nem is mennek le a klienshez. csak a session id, csokiban, rossz esetben gettel.
a sessionváltozók a szerver ramjában maradnak.
- A hozzászóláshoz be kell jelentkezni
A session változókat a szerver tárolja és tudtommal alapesetben állományokban, de lehet adatbázisba is tenni.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
nem kellene egy unserialize($_SESSION['reg']); ?
- A hozzászóláshoz be kell jelentkezni
szerintem magától unserializálódik az $_SESSION tömb
- A hozzászóláshoz be kell jelentkezni