Anasayfa » Codeigniter, Php

Codeigniter Dersleri – 18 – Database Veri Güncelleme (Updating Data)

17 Temmuz 2011 5.305 kez okundu 9 yorum
1 Star2 Stars3 Stars4 Stars5 Stars (2 oy,5 üzerinden : 5,00 )
Loading ... Loading ...

Bir önceki dersimizde verileri düzenlemek için forma göndermiştik. Ama bir sorunla karşı karşıya kaldık. pizza_order.php (view) dosyamıza yeni değişkenler ekledik ancak bunlara default değerler atamadık. Böyle olunca düzenleme değilde direk sipariş verme sayfasında girdiğimizde hatayla karşılaşıyoruz. Bunun çözümü dediğim gibi çok basit. Bu değişkenlere default değerler vermek. Bunun için pizza_model.php dosyamıza giriyoruz ve genel() fonksiyonumuzun herhangi bir yerine aşağıdaki kodları ekliyoruz. (Ben kodlarımı $data[‘menu’] = $menu->show_menu();  satırından sonra ekliyorum.)

...
$data['menu'] = $menu->show_menu();
 
$data['temiz_id']['value']=0;
$data['temiz_pizza']['value']=0;
$data['temiz_tip']['value']=0;
...

Şimdi istediğimiz gibi formumuzu kullanabiliriz. İster yeni sipariş için isterse sipariş düzenlemek için, ancak bir sorun daha var aslında. Sipariş düzenlemek için tıkladığınızda ve yeniden submit ettiğinizde kodlarımız düzenleme işi yerine yeni bir sipariş ekliyor olacak. Bugünkü dersimizde bunu halledeceğiz.

Öncelikle siparişimizi düzenlediğimizde düzenleme işini yapacak fonksiyonu yazacağız. Bunu model dosyamıza aşağıdaki fonksiyonu ekleyerek hallediyoruz.

1
2
3
4
5
6
7
8
9
10
11
12
13
function order_update(){
		$data = array(
          'name'=>$this->input->post('isim'),//formdaki verileri teker teker arraya atıyoruz
		  'pizza'=>$this->input->post('pizza'),
		  'thin_edge'=>$this->input->post('kenar'),
		  'unit'=>$this->input->post('adet'),
		  'address'=>$this->input->post('adres'),
		  'type'=>$this->input->post('tip'),
		  'cost'=>'20',//burası dediğimiz gibi fiyat hesaplayan bir fonksiyon yazarak halledilebilir.
        );
		$this->db->where('id',$this->input->post('id'));//id=$id olan satırı buluyoruz.
		$this->db->update('pizza',$data);  //ve bu satırı $data arrayı ile güncelliyoruz.
	}

Şimdi de controller dosyamızda gelen submitin yeni sipariş mi yoksa düzenleme mi olduğuna karar veren bir if-else yapısı yazacağız. Bunun için pizza.php(controller) dosyamızdaki order() fonksiyonunda bulunan  if($this->input->post(‘mysubmit’)) {}  yapısını aşağıdaki şekilde tekrar düzenliyoruz.

1
2
3
4
5
6
7
8
9
	if($this->input->post('mysubmit'))
	{  
		if($this->input->post('id')){//id nin 0 dan farklı olması TRUE kabul edildiği için düzenleme moduna girecek
			$this->pizza_model->order_update();	  
		}
		else{//eğer id=0 ise yeni sipariş moduna girecek
			$this->pizza_model->insert_new_entry();
		}
	}

Şimdi denemelerimizi yapabiliriz, Önce yeni bir sipariş girin daha sonra girdiğiniz siparişi düzenlemeyi deneyin. Update dersimizde bugünlük bu kadar. İyi günler…

<<< Önceki:

Sonraki: >>>


Facebookta Paylaş

9 yorum »

  • Hasan Hüseyin İŞLER dedi ki:

    order_upadete() fonksiyonunda daha önce yazmış olduğumuz insert_new_entry() fonksiyonundan farklı olarak $this->load->database(); satırını kullanmadık ve buna rağmen database sınıfının fonksiyonu olan where ve update fonksiyonlarını kullanabildik. Yani model dosyasının herhangi bir yerinde 1 kere $this->load->database(); database sınıfını yükleyince başka fonksiyonlarda yüklemeye gerek kalmıyor mu?

  • Hasan Hüseyin İŞLER dedi ki:

    Aynı şekilde insert_new_entry den de sildim dediğim satırı kodlar çalıştı. Sorun yok. Peki biz neden database sınıfını yüklüyoruz o zaman_?

  • admin dedi ki:

    Haklısınız, dediğiniz satıra gerek yok. Ben onu yanlışıkla yazmış olabilirim. Normalde database işlemi yapacağınız zaman her fonksiyonun içinde çağırmanız gerekiyor. Ancak biz her fonksiyonda sıklıkla kullanılan kodları. function __construct() fonksiyonu içine yazıyoruz. Böylece o komutun bir kere çağrılması yeterli oluyor ve heryerden kullanabiliyoruz. Ama dediğiniz gibi classın herhangi bir yerinde değil construct içinde kullanılırsa geçerli. Yazıyı düzelttim.

  • Yahya dedi ki:

    Admin, teşekkürler. Bir soru:

    Ben ısrarla db’deki varchar’ı değişikliğini yapmadım. Kayıt oluştururken sıkıntı yok. 1 ya da 0 yazdırıyorum.

    Seçili datayı çekerken controller’da:


    if($query['pizzaThinEdge'] == 1)
    {
    $data['kenar']['checked'] = TRUE;
    }else{
    $data['kenar']['checked'] = FALSE;
    }

    diyorum ama işe yaramıyor.

    Form oluştururken:

    diye oluşturuyorum. Tabii ki bu arada controllerda
    if ($selectedID > 0> {
    ...
    $data['kenar']['value'] = $query['pizzaThinEdge'];
    }

    demeyi ihma etmiyorum. Echo edildiğinde 1 ya da 0 doğru olarak geliyor. Sorun nerede olabilir?

  • admin dedi ki:

    Eğer database de değişiklik yapmayıp, int olarak kullanmak istiyorsanız, 3 yerde değişiklik yapmanız gerekiyor. pizza.php içerisinde order fonksiyonunda ilgili yeri
    if ( $ query['thin_edge ']== 1){
    şeklinde pizza_model.php içerisinde order_update fonksiyonunda ve insert_new_entry fonksiyonundaki ise ilgili yerleri
    'thin_edge' = >$this - >input- >post( 'kenar )= ='yes '? 1:0,
    şeklinde düzenlemen gerekiyor. Çünkü checkbox seçildiğinde yes değeri döndürür.

  • Yahya dedi ki:

    Teşekkür ederim admin, cevapsız soru bırakmamak için harcadığınız emeğe teşekkür ederim.

    deneme yanılmalarla ben de şöyle bir yol buldum, sadece view’da değişlik yaptım, sorun olur mu bilmiyorum ama çalışıyor gibi:
    echo form_checkbox('kenar',1,$kenar['checked']);

    Tekrar teşekkür ederim,

  • eren dedi ki:

    merhabalar.
    veri tabanına veri ekleme ve veri güncelleme fonksiyonlarında tanımladığımız ‘cost’ değerleri ne işe yarıyor??
    ben kendi projemi geliştirmeye çalışıyorum ve kendi sitemde ‘cost’ değerleri tanımladığımda düzgün çalışan site hata veriyor.

  • admin dedi ki:

    Merhaba eren,
    cost değeri sadece bizim projeye ait bir özellik. Kullanmak zorunda değilsin. Şöyleki orada bulunan cost değeri sipariş verilen pizzanın tutarı. Projeyi geliştirirken aslında cost değeri seçilen pizzaya göre bir fonksiyonda hesaplanıp database e o şekilde yazılacak. Ancak bununla zaman kaybetmemek için cost değeriyle uğraşmıyoruz ve her pizzanın cost değerini 20 yapıyoruz. Çok önemli bir şey değil sonuçta.

  • Emre dedi ki:

    Merhaba,

    düzenle dedikten sonra bütün alanlar dolu geliyor ancak “ince kenar” checkbox işaretli gelemiyor. Bunun bir çözümü var mı acaba?

Yorum Bırakın!

Yorum yaz, yada kendi sitende trackback (Geri besleme) olarak ekle. Ayrıca RSS ile bu konuya üye olabilirsin. .

Nazik olun. Temiz tutun. Konu dışına çıkmayın. Spam yaratmayın.

Bu tagları kullanabilirsiniz:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Bloğumuz gavatarı desteklemektedir. Kendi gavatarınızı edinmek için lütfen Gravatar a üye olun.