• 28-11-2010, 05:31:38
    #1
    Üyeliği durduruldu
    Selam arkadaslar,

    su anda yazdigim bir scriptte get ve post ile nesne gönderiyorum. Siz uygulamalarinizda bu islemi nasil yapiyorsunuz, örnek kod verebilir misiniz?

    <?php
    
    	class Site {
    		protected $link;
    
    		public function __construct($link) {
    			$this->link = $link;
    		}
    
    		public function getLink() {
    			return $this->link;
    		}
    		public function setLink($link) {
    			$this->link = $link;
    		}
    	}
    
    
    	$link = 'http://www.r10.com';
    	$site = new Site($link);
    	$serialized = base64_encode(serialize($site));
    
    	if($_POST){
    		$objekt = unserialize(base64_decode($_POST['nesne']));
    		echo $objekt->getLink();
    	}
    
    	echo '<form action="" method="POST">
    	<input type="text" name="nesne" value="'.$serialized.'" />
    	<input type="submit" value="Gönder" />
    	</form>';
    
    ?>
    Ben bu sekilde kullaniyorum, yukarida kod hakkinda yorumlarinizi/yardimlarinizi bekliyorum.

    Simdide asagidaki hatayi aliyorum. Nesnelerin iceriginin büyüklügünden dolayi olabilir mi acaba? Yoksa bu islemi Sessionlarlami yapmam gerekiyor? Bilgisi olan arkadaslar yardimci olabilirlerse sevinirim.

    Alıntı
    Fatal error: Call to a member function getLink() on a non-object in ...
    yaptigim flood oluyor sanirim.. ama yokmu bi fikri olan, yardimci olabilecek bi arkadas?
  • 30-11-2010, 22:59:06
    #2
    Üyeliği durduruldu
    tam olarak ne yapmak istiyorsunuz.
  • 30-11-2010, 23:02:41
    #3
    Hataların:
    1.
     if($_POST)
    yerine
     if(isset($_POST['indis']))
    şeklinde kullanman gerekiyor.
    2.
      echo $objekt->getLink();
    objektde herhangi bir nesne yok
    $site->getLink();
    Kullanabilirsin..
  • 01-12-2010, 00:03:37
    #4
    Üyeliği durduruldu
    Cycl0ne adlı üyeden alıntı: mesajı görüntüle
    Hataların:
    1.
     if($_POST)
    yerine
     if(isset($_POST['indis']))
    şeklinde kullanman gerekiyor.
    2.
      echo $objekt->getLink();
    objektde herhangi bir nesne yok
    $site->getLink();
    Kullanabilirsin..
    sadece $_POST kullanarak $_POST icinde indis'siz herhangi bir deger varmi diyede kontorl edilebiliyor hocam. sorun orda degil, yukarida yazdigim kodu zaten örnek olmasi acisindan buraya koydum yoksa indisleri kontrol ettiririm .)

    onun disinda $_POST['nesne'] icinde bulunan nesneyi $object'e atiyorum $site->getLink(); ile $object->getLink(); arasinda bi fark yok site, object sadece degisken isimleri..

    kodu tam incelemediniz herhalde.
  • 01-12-2010, 08:25:19
    #5
    hig84 adlı üyeden alıntı: mesajı görüntüle
    sadece $_POST kullanarak $_POST icinde indis'siz herhangi bir deger varmi diyede kontorl edilebiliyor hocam. sorun orda degil, yukarida yazdigim kodu zaten örnek olmasi acisindan buraya koydum yoksa indisleri kontrol ettiririm .)

    onun disinda $_POST['nesne'] icinde bulunan nesneyi $object'e atiyorum $site->getLink(); ile $object->getLink(); arasinda bi fark yok site, object sadece degisken isimleri..

    kodu tam incelemediniz herhalde.
    $objekt = unserialize(base64_decode($_POST['nesne']));
    echo
    $objekt->getLink();



    Arkadaşım objekt değişkeninde getLink fonksiyonu var mı ? Sınıf kullanmayı bilmiyorsun yok öyle yapmadım yok böyle yapmadım ben doğru sen yanlış biliyorsun ne biçim tavırlar bunlar.
  • 01-12-2010, 17:48:04
    #7
    Üyeliği durduruldu
    BHCoder adlı üyeden alıntı:
    tam olarak ne yapmak istiyorsunuz.
    Örnek vererek anlatmaya calisayim.

    Nesnelerle programlama yapmasaydik, düz kod yazsaydik, yapmak istedigimiz islemler icin id gönderirdik. Örnegin:

    echo '<a href="sitesil.php?linkId=1"> 1 Numaralari siteyi sil </a>';
    echo '<a href="sitegetir.php?linkId=1"> 1 Numaralari siteyi getir </a>';
    Nesnelerle calistigimiz zaman bilirsinizki, CRUD(Create, Read, Update, Delete) fonksiyonlarini kullaniriz. Yine nesnelerle calisan arkadaslar bilirlerki static olmayan bu fonksiyonlar sayesinde $nesne->delete(); dedigimiz zaman nesneyi veritabanindan silmis oluruz. Bu yüzden linksil.php dosyasina $nesne'nin ID'sini göndermek delete(); fonksiyonunu kullanmak icin mantiksiz olur. Nesnenin ID'sini gönderirsek nesneyi silmek icin iki yol izleyebiliriz. Ya getLinkById($id); seklinde static bir fonksiyon kullanarak önce nesneyi olustururuz ve olusturdugumuz nesneyi $nesne->delete(); seklinde sileriz yada yine static bir deleteById($id); fonksiyonu yazariz ve nesnemizi bu sekilde sileriz. Bu kadar aciklamanin ardindan ben soruma geleyim. Örnegin bi admin paneli yaziyorsunuz. siteYonetimi diye bir bölümünüz var. Siz bu siteYonetimi icinde site ekleyebiliyor(Create), site silebiliyor(Delete) ve siteleri güncelleyebiliyorsunuz(Update). Simdi örnek olarak sitesil.php'yi kullanmak istersek; ilk önce normal yolla nasil yapiliyor onu yazayim sonra benim nasil yapmak istedigimi anlatayim.

    Nesne kullanmadan link silme islemi;
    $sql = "SELECT id, link from linklist ORDER BY id ASC LIMIT 0 , 30";
    $query = mysql_query($sql);
    while($result = mysql_fetch_assoc($query)){
    	echo '<a href="sitesil.php?id='.$result['id'].'">'.$result['link'].'</a><br />';
    }
    ve sitesil.php'de gerekli islemleri yaparak linkimizi siliyoruz.

    Nesnelerle calisarak ise bunu ben asagidaki gibi yapmayi deniyorum.
    Ilk önce nesneleri sayfalayan kodumu vereyim.
    public static function getPage($page,$count) {
    	$start = $page * $count;
    	$sql = "SELECT id, link from linklist ORDER BY id ASC LIMIT :start , :count";
    	$data = array('start' => $start, 'count' => $count);
    	$rows = Db :: getResult($sql,$data);
    	$results = array();
    	foreach($rows as $row){
    		$results[] = new Site($row);
    	}
    	return $results;
    }
    simdi ise nasil kullandigimi

    	$sites = Site::getPage(0,30);
    	foreach($sites as $site){
    		echo '<a href="sitesil.php?site='.base64_encode(serialize($site)).'">'.$site->getLink().'</a>';
    	}
    Bu sekilde sitesil.php'ye silinecek olan sitenin id'sini degil silinecek olan siteyi nesne olarak gönderdik. sitesil.php'de ise
    base64_encode(serialize($site))
    isleminin tersini yaparak yani,
    // nesnemizi geri olusturuyoruz
    $site = unserialize(base64_decode($_REQUEST['site']));
    // nesnemizi siliyoruz
    $site->delete();
    Bukadar aciklamadan sonra benim sorum ve sorunum, ilk olarak bu yöntem nekadar dogrudur. sdemirkeser'in verdigi linkteki gibi nesneleri session'dami saklamam gerekir? Nesneleri session'da tutarsam bunun dezavantajlari varmidir? Izleyebilecegimiz baska yollar nelerdir? Ikinci olarak yukaridaki anlattigim yöntemi kullanirken bazen
    Fatal error: Call to a member function getLink() on a non-object in ...
    hatasini aliyorum, bunun sebebi ne olabilir

    Cycl0ne adlı üyeden alıntı: mesajı görüntüle
    $objekt = unserialize(base64_decode($_POST['nesne']));
    echo
    $objekt->getLink();



    Arkadasim objekt degiskeninde getLink fonksiyonu var mi ? Sinif kullanmayi bilmiyorsun yok öyle yapmadim yok böyle yapmadim ben dogru sen yanlis biliyorsun ne biçim tavirlar bunlar.
    Ne tavir yapmasi anlamadim? Kod okumayi bilmiyormusun sen? Kafani yorma sinif kullanmayi bilmesem burada soru soramam. Kimin yanlis kimin dogru bildigini sorgulamiyorum burda. Nerede ne yaptigmi anlatiyorum. Birseyler ögrenmeye paylasmaya calisiyorum. Ilk mesajimda yazdigim kodu calistirmayi deneseydin calisma mantigini anlardin zaten.

    Bunu daha önce okumustum hocam, post ve get ile nesne kullanmak yerine nesneleri session'da tutmak dahami dogrudur. Yukarida verdigim örnekte 30 tane nesneyi alt alta siraliyorsam, bunlarin hepsini session'a atmam ne kadar saglikli olur?
  • 02-12-2010, 08:39:41
    #8
    Üyeliği durduruldu
    hig84 adlı üyeden alıntı: mesajı görüntüle
    Bunu daha önce okumustum hocam, post ve get ile nesne kullanmak yerine nesneleri session'da tutmak dahami dogrudur. Yukarida verdigim örnekte 30 tane nesneyi alt alta siraliyorsam, bunlarin hepsini session'a atmam ne kadar saglikli olur?
    formda tutmakla ugrasmak yerine sessiona yazmayi tercih ederim sahsen. bu sekilde kendini forma yazan bir mantik standart degil. ama sessiona yazmak standart bir yontem. hem kullanicinin mudahele sansi olmadigi icin yada formdaki herhangi bir bilesenden etkilenmeyecegi icin daha saglikli

    <kd> sizin tam olarak ne yapmak istediginizi anlamadim ama nesne tabanli calisiyorsaniz illaki nesneleri formdan forma tasimak zorunda degilsiniz. nesneyi ifade eden bir degisken (id gibi) form araciligi ile tasinip. diger sayfada nesneyi tekrar olusturup nesne ozelliklerini okumasini saglamalisiniz. belirli ozellikleri yine formdan alabilir</kd>
  • 02-12-2010, 17:18:05
    #9
    Üyeliği durduruldu
    sdemirkeser adlı üyeden alıntı: mesajı görüntüle
    formda tutmakla ugrasmak yerine sessiona yazmayi tercih ederim sahsen. bu sekilde kendini forma yazan bir mantik standart degil. ama sessiona yazmak standart bir yontem. hem kullanicinin mudahele sansi olmadigi icin yada formdaki herhangi bir bilesenden etkilenmeyecegi icin daha saglikli
    Nesneyi formda yazmamin sebebi nesne gercekten olusturulup base64_encode ve serialize islemleri basariyla gerceklesmismi görmek icindi hocam. Büyük ihtimal artik sessiona atarak gerceklestirecegim yapacagim islemleri.

    sdemirkeser adlı üyeden alıntı: mesajı görüntüle
    <kd> sizin tam olarak ne yapmak istediginizi anlamadim ama nesne tabanli calisiyorsaniz illaki nesneleri formdan forma tasimak zorunda degilsiniz. nesneyi ifade eden bir degisken (id gibi) form araciligi ile tasinip. diger sayfada nesneyi tekrar olusturup nesne ozelliklerini okumasini saglamalisiniz. belirli ozellikleri yine formdan alabilir</kd>
    Eger nesneyi formdan forma(sayfadan[index.php] sayfaya[nesneduzenle.php]) tasimazsak performans kaybi olmaz mi hocam?
    Mesela asagidaki siniftan örnek vereyim.

    // veritabanimizda tablomuzu olusturuyoruz.
    $query = "CREATE TABLE IF NOT EXISTS stadt(
    			id INTEGER PRIMARY KEY auto_increment,
    			name varchar(100) NOT NULL,
    			slug varchar(100) NOT NULL,
    			ecount bigint(20),
    			b_fk bigint(20)
    		);";
    		
    Db::execute($query);
    
    // Stadt sinifindan $stadt diye bir nesne olusturuyoruz.
    // Stadt sinifinin yapisini asagida verdim.
    $stadt = Stadt::create(array('id'=>'','name'=>'Stuttgart','slug'=>'stuttgart','ecount'=> 0,'b_fk'=> 1));
    
    // ayni sayfada isek
    $stadt->setName('Karlsruhe');
    $stadt->update();
    // dedigimiz zaman veritabaninda gerekli islemler gerceklesmis oluyor.
    Eger ayni sayfada isek bu islemi rahatlikla yapabiliriz. Ama islemi baska sayfada yapacaksak, ya daha önce yaptigim gibi base64_encode(serialize($stadt)) seklinde nesneyi serialize edip tasimamiz gerekiyor, yada sizin dediginiz gibi session'a atip tasimam gerekiyor. session Server Side oldugu icin serveri daha fazla sisirmez mi? Kafama takilan noktalardan birisi bu,

    Yada diger türlü yapmayi denersem, yani nesnenin id'sini gönderip, gönderdigim sayfada nesneyi güncellemek istersem, bu sefer

    $yeni_nesne = Stadt::getById($_REQUEST['id']);
    $yeni_nesne->setName('Karlsruhe');
    $yeni_nesne->update();
    Eger nesneyi göndermis olsaydim getById(); fonksiyonunu kullanmam gerekmeyecekti. Direk $nesne->setName('deger'); $nesne->update() diyecektim. getById() kullanmam, sayfa basi bir sorgu daha demek oluyor. Veritabani dogru bisekilde olusturulmussa bir sorgudan cok fazla bir performans kaybi olmaz heleki joinsiz sade bir sorgudan hic olmaz..

    Soruyu sormamin nedeni nesnelerin sayfadan sayfaya en mantikli sekilde nasil tasinacagini ögrenmek idi. Eger bir sayfada 100 tane nesne olusturursam ve bu nesneleri session'a atarsam sunucuyu sisirmis olmaz miyim? eger sunucu session'a cok fazla deger atilmasi yüzünden sisirilmis olursa artik sayfada nesne olusturmak yerine direk id'ler üzerinden islem yapacagim.

    umarim ne demek istedigimi anlatabilmisimdir, cok karisik yazmamisimdir.

    <?php
    
    class CRUD_Stadt{
    	protected $id;
    	protected $name;
    	protected $slug;
    	protected $ecount;
    	protected $b_fk;
    	
    	//GETTER
    	public function getId() {
    		return $this->id;
    	}
    	public function getName() {
    		return $this->name;
    	}
    	public function getslug() {
    		return $this->slug;
    	}
    	public function getEcount() {
    		return $this->ecount;
    	}
    	public function getB_fk() {
    		return $this->b_fk;
    	}
    	
    	//SETTER
    	public function setName($x) {
    		$this->name = $x;
    	}
    	public function setslug($x) {
    		$this->slug = $x;
    	}
    	public function setEcount($x) {
    		$this->ecount = $x;
    	}
    	public function setB_fk($x) {
    		if(is_object($x)){
    			$this->b_fk = $x->getId();
    		} else {
    			$this->b_fk = $x;
    		}
    	}
    
    	//CONSTRUCT
    	function __construct($dic) {
    		$this->id = $dic['id'];
    		$this->name = $dic['name'];
    		$this->slug = $dic['slug'];
    		$this->ecount = $dic['ecount'];
    		$this->b_fk = $dic['b_fk'];
    	}
    	
    	//CREATE
    	public static function create($dic) {
    		if(is_object($dic['b_fk'])){
    			$dic['b_fk'] = $dic['b_fk']->getId();
    		}
    		$sql = "INSERT INTO stadt (id, name, slug, ecount,b_fk) VALUES(:id, :name, :slug, :ecount, :b_fk)";
    		$data = array ('id' => $dic['id'], 'name' => $dic['name'], 'slug' => $dic['slug'], 'ecount' => $dic['ecount'], 'b_fk' => $dic['b_fk']);
    		Db :: execute($sql, $data);
    		$dic['id'] = DB :: getLastInsertId('stadt');
    		return new Stadt($dic);
    	}
    	
    	//READ
    	public static function getById($id) {
    		$id = intval($id);
    		$id = str_replace("-", "", $id);
    		$sql = "SELECT id, name, slug, ecount, b_fk FROM stadt WHERE id = ?";
    		$row =  Db :: getRow($sql, $id);
    		return new Stadt($row);
    	}
    	
    	//GETPAGE
    	public static function getPage($page,$count) {
    		$page = str_replace("-", "", $page);
    		$count = str_replace("-", "", $count);
    		$page = intval($page);
    		$count = intval($count);
    		$start = $page * $count;
    		$sql = "SELECT id, name, slug, ecount, b_fk from stadt ORDER BY slug ASC LIMIT $start , $count";
    		$data = array('start' => $start, 'count' => $count);
    		$rows = Db :: getResult($sql,$data);
    		foreach($rows as $row){
    			$results[] = new Stadt($row);
    		}
    		return $results;
    	}
    	
    	//GETALL
    	public static function getAll(){
    		$sql = "SELECT id, name, slug, ecount, b_fk FROM stadt ORDER BY slug ASC";
    		$rows = Db :: getResult($sql);
    		$results = array();
    		foreach($rows as $row){
    			$results[] = new Stadt($row);
    		}
    		return $results;
    	}
    	
    	//READ
    	public function getStaedteByBundeslandId($id) {
    		$id = intval($id);
    		$id = str_replace("-", "", $id);
    		$sql = "SELECT id, name, slug, ecount, b_fk FROM stadt WHERE b_fk = ?";
    		$row =  Db :: getResult($sql, $id);
    		return $row;
    	}
    	
    	//UPDATE
    	public function update() {
    		$sql = "UPDATE stadt SET name = :name, slug = :slug, ecount = :ecount, b_fk = :b_fk WHERE id = :id";
    		$data = array ('name' => $this->name, 'slug' => $this->slug, 'ecount' => $this->ecount, 'b_fk' => $this->b_fk, 'id' => $this->id);
    		return DB :: execute($sql, $data);
    	}
    	
    	//DELETE
    	public function delete() {
    		$sql = "DELETE FROM stadt WHERE id = :id";
    		$data = array('id' => $this->id);
    		return DB :: execute($sql, $data);
    	}
    	
    	//DELETEBYID
    	public static function deleteById($id) {
    		$id = intval($id);
    		$id = str_replace("-", "", $id);
    		$sql = "DELETE FROM stadt WHERE id = :id";
    		$data = array('id' => $id);
    		return DB :: execute($sql, $data);
    	}
    }
    
    ?>