Php dinamik checkbox sorunu

gezginbilge

Öğrenci
Katılım
21 Haziran 2012
Mesajlar
17
Reaksiyon puanı
0
Puanları
0
Merhaba arkadaşlar başlıkta da belirttiğim gibi dinamik checkbox yapımında sorun yaşıyorum. Sorun şöyle ki veri tabanından bazı bilgileri çekiyorum. Bunları listeliyorum ve her satırın yanında bir checkbox mevcut. Aktif olmayan checkbox ları seçip güncelle diyince aktif olmayan kayıtlar aktif oluyor. Fakat aktif durumda listelenen checkboxlardan aktifliğini kaldırınca veri tabanında tekrardan değerini '0' yapamıyorum.(güncelleyemiyorum). Bu konuyla ilgili araştırmadığım site kalmadı. Ya ben bulamadım yada kimse paylaşma gereği duymamış. Genelde basit çapta anlatılmış. Ya seçilenlerin değerini almış yada sadece 3 checkbox ile işlem yapmış. Bu konuda yardımlarınızı bekliyorum. Şimdiden tüm arkadaşlara teşekkür ediyorum... Umarım konu yanlış yerde değildir.
 

annttiigs

Profesör
Katılım
7 Şubat 2007
Mesajlar
2,589
Reaksiyon puanı
24
Puanları
218
Şimdi bize bu şekilde sormak yerine; kullandığın kod bloklarını yollarsan sana daha hızlı yardımcı olabileceğiz diye düşünüyorum. Bize aktifleştirmek için kullandığın form ve php bloğunu yapıştır.

Pasifleştirmek için denediğin varsa onu da yaz. Arkasından bir çözüme ulaşacağızdır ;)
 

gezginbilge

Öğrenci
Katılım
21 Haziran 2012
Mesajlar
17
Reaksiyon puanı
0
Puanları
0
Haklısınız hocam :)
en basit haliyle bu şekilde bir listeleme yapıyorum.
PHP:
<?php $sql=mysql_query("SELECT * FROM `urunler`"); ?>

<form id="form1" name="form1" method="post" action="">  
<p>
      <?php   while($listele=mysql_fetch_assoc($sql)){  ?>   
       <label>
           <input type="checkbox" name="deger[<?php echo($listele['id']) ?>]" value="<?php echo($listele['durumu']) ?>" id="deger_0" <?php if($listele['durumu']==0){} elseif($listele['durumu']==1){ echo ' checked="checked"'; } ?>/>
         <?php echo $listele['urun_adi']; ?>
    </label><br />  
 <?php } ?> 
 </p> 
 <p> <input type="submit" name="button" id="button" value="Gonder" />    <br />  </p></form>

Buraya kadar herşey normal fakat iş güncellemeye gelince orada sıkıntı başlıyor.

Güncelleme kısmında da en basitinden :
PHP:
  <?php 
      if(!empty($_POST)){   
 $checkbox=$_POST['deger'];   
   //var_dump($_POST);    
   foreach($checkbox as $eleman => $eleman2){        
               //echo $eleman." = ".$eleman2."<br/>";        
                 if($eleman2==0){$sonuc=1;}elseif($eleman2==1){ $sonuc=1 ;}      
     $sql_update=mysql_query("UPDATE `urunler` SET `durumu`='$sonuc' WHERE `id`='$eleman'");     }
    } ?>

bu kodla güncelliyorum fakat diyelim ben bu ürünün durumunu değişecem ve sitede görüntülenmemesini sağlayacam. İşte tam bu noktada sorun başlıyor. Seçilmeyenlerin değerini alamadığımdan ilerleyemiyorum. Umarım anlatabilmişimdir :D
 

annttiigs

Profesör
Katılım
7 Şubat 2007
Mesajlar
2,589
Reaksiyon puanı
24
Puanları
218
eve gittiğimde kontrol etmeye çalışıcam. bakalım bir şeyler çıkar mı.
 

annttiigs

Profesör
Katılım
7 Şubat 2007
Mesajlar
2,589
Reaksiyon puanı
24
Puanları
218
Haklısınız hocam :)
en basit haliyle bu şekilde bir listeleme yapıyorum.
PHP:
<?php $sql=mysql_query("SELECT * FROM `urunler`"); ?>

<form id="form1" name="form1" method="post" action="">  
<p>
      <?php   while($listele=mysql_fetch_assoc($sql)){  ?>   
       <label>
           <input type="checkbox" name="deger[<?php echo($listele['id']) ?>]" value="<?php echo($listele['durumu']) ?>" id="deger_0" <?php if($listele['durumu']==0){} elseif($listele['durumu']==1){ echo ' checked="checked"'; } ?>/>
         <?php echo $listele['urun_adi']; ?>
    </label><br />  
 <?php } ?> 
 </p> 
 <p> <input type="submit" name="button" id="button" value="Gonder" />    <br />  </p></form>

Buraya kadar herşey normal fakat iş güncellemeye gelince orada sıkıntı başlıyor.

Güncelleme kısmında da en basitinden :
PHP:
  <?php 
      if(!empty($_POST)){   
 $checkbox=$_POST['deger'];   
   //var_dump($_POST);    
   foreach($checkbox as $eleman => $eleman2){        
               //echo $eleman." = ".$eleman2."<br/>";        
                 if($eleman2==0){$sonuc=1;}elseif($eleman2==1){ $sonuc=1 ;}      
     $sql_update=mysql_query("UPDATE `urunler` SET `durumu`='$sonuc' WHERE `id`='$eleman'");     }
    } ?>

bu kodla güncelliyorum fakat diyelim ben bu ürünün durumunu değişecem ve sitede görüntülenmemesini sağlayacam. İşte tam bu noktada sorun başlıyor. Seçilmeyenlerin değerini alamadığımdan ilerleyemiyorum. Umarım anlatabilmişimdir :D

Burada çalıştırdığın sql sorgusuna göre tek bir ürün tablon olduğunu varsayıyorum. Çözüm tam ihtiyacını karşılamasa da. Seçilenler harici zaten seçilmemiş sayılmaz mı ?

Bir başka yöntem hidden field'lar. Her checkbox'un yanına bir de hidden koyuyorsun. Sonra server tarafında hidden'lerin değerinden sonuca ulaşabilirsin.

Bir başka yöntem. javascript ile submit'i interrupt edip yolanacak form datasında bir değeri checkbox'ların durumuna göre düzenlersin. Gelen datayı buna göre parse edersin.
 

Turab Garip

Dekan
Emektar
Katılım
30 Mayıs 2007
Mesajlar
6,902
Reaksiyon puanı
181
Puanları
1,243
Veritabanından çektiğin ürün bilgilerindeki duruma göre devre dışı olan (ya da sen ne diyorsan) zaten ekranda görüntülenmeyecek şekilde düzenlenir.

Örneğin;

PHP:
if ($urun_durumu != 'devre_disi')
    echo $urun;

Güncelleme sayfasında ise checkbox'ları mevcut duruma göre doldurursun formda. Sonra tüm ürünlerin toplanmış olduğu bir dizide (array) foreach döndürerek hangisinin POST içinde olup olmadığına bakarsın ve ona göre POST içinde değişkeni olmayan ürünün seçili olmadığını anlamış olursun ve ona göre de veritanına insert edersin.

Örneğin:

PHP:
$sql_sorgusu = 'kendine göre insert sorgusunun baslangıcı';
foreach ($urunler as $urun)
    if (isset($_POST[$urun] && !empty($urun))  // İlgili ürün seçili.
        $sql_sorgusu .= "$urun[durumu] = 'etkin'";
    else                                          // İlgili ürün seçili değil.
        $sql_sorgusu .= "$urun[durumu] = 'devre_disi'";

mysql_query($sql_sorgusu);

Böylece seçili olanlar etkin, seçili olmayanlar devre dışı olarak güncellenir veritabanında. Kodlar daha da azaltılıp daha etkin hale getirilebilir bunlar hayali kodlar sadece.
 

gezginbilge

Öğrenci
Katılım
21 Haziran 2012
Mesajlar
17
Reaksiyon puanı
0
Puanları
0
Aslında akşam bu konuyla ilgili bir javascript kodu buldum.
Kod:
$('form').submit(function(){    $(":checkbox:not(:checked)").each(function(element, index){
       $(this).attr({value: 'false', checked:'checked'});
    });
    return true;
    });
});

Bu kod form submit sırasında seçili olmayanların değerini off olarak değişip checkboxları seçili olarak gönderiyor. Bu da görsellik olarak güncelleme sırasında güzel durmuyor. Sonuç itibari ile formu gönderdiğinizde seçilmeyen değerler seçili olarak görünüyor ondan sonra sayfaya post ediyor. Sanırsam bana lazım olan asıl kod javascript fakat güzel bir script bulamadım. Şu an çalışır olarak yukarıda belirttiğim kod var ki onda da biraz sorun var. Bir de annttiigs dediğiniz gibi gizli hidden gondermek ama oda işime gelmiyor. Çünkü bu tarz çalışan bazı siteler var ve en azından onların izledikleri yola yakın bir yol bulabilsek daha güzel olacak.

- - - Mesaj Güncellendi - - -


Turab Garip Hocam eğer yanlış anlamadıysam formu post ettikten sonra post edilen sayfada aynı sorguyu çalıştırarak bu işlemi gerçekleştirmemi istemişsiniz. ?
 

Turab Garip

Dekan
Emektar
Katılım
30 Mayıs 2007
Mesajlar
6,902
Reaksiyon puanı
181
Puanları
1,243
Checkbox'ları yazdırdığın sayfada muhtemelen bir diziyi foreach ile döndürüyor ve ekrana yazdırıyorsun. İşte aynı diziyi POST'un döndüğü (action) sayfada da oluştur. Sonra o diziyi tekrar döndür foreach ile. Her elemanı POST içinde var mı yok mu diye kontrol ettir. Varsa işaretlenmiştir, yoksa işaretlenmemiştir.

Yani anladığın gibi, POST'u işlerken aynı sorguyu çalıştırabilirsin. JS ile yapmak da bir çözüm, hangisi kolayına geliyorsa onu yapabilirsin; muhtemelen JS çözümü daha verimli olabilir.
 

gezginbilge

Öğrenci
Katılım
21 Haziran 2012
Mesajlar
17
Reaksiyon puanı
0
Puanları
0
Hocam dediğiniz yollardan biri. Ama asıl amacım ikinci bir sql sorgusu yapmamak . Sonuc olarak ne kadar az sql kodu o kadar hız (yanlışım var ise affola). Maksak sadece listelemede ve güncelleme kısmında iki kod ile bitirmek . Dediğiniz yolu 1000 kayıt için düşündüğümüzde sanki yavaşlama olacak.
Belkide ben Php'nin hızını tam olarak bilmiyorum.
Birde hocam eğer zahmet olmaz ise bu konu ile ilgili küçük bir script yazmanız mümkün müdür.
Javascript olsa daha makbule geçer çünkü işlemlerimi sayfa yenilemesiz gerçekleştiriyorum. Hem daha kullanışlı olur diye düşünüyorum. Yukarıda belirttiğim kod iş görüyor fakat dediğim gibi gönderirken işaretli olmayanlarıda işaretli olarak gönderiyor ve kullanıcı bu işaretleri görüyor. Bu da kullanıcı açısından bazı durumlarda farklı anlaşılabilir. Ve istemeden de olsa sistemin yanlış kullanılmasına yok açabilir.
 
Üst