Kodları lütfen aşağıdaki butonları kullanarak renklendirin. Örnek: <php> echo "Selam Dünya"; </php>
Yardım
karakter kaldı

Php ile asc ve desc dışında sıralama yapma mantığı?

Merhaba arkadaşlar,

id ve yazi adında kolonlardan oluşan bir tablom var. Ben bu tablodaki verileri order by yardımı ile id'ye göre azalan yada artan şekilde listeleyebiliyorum. Yapmak istediğim şey ise bu iki kullanım dışına çıkarak sıralama şekline farklı bir biçimde müdahale etmek.

Bu amaçla sira adında üçüncü bir kolon ekledim. Sira kolonundaki değerlere göre sıralama yapıyorum.
İçeriği yöneten kişi her yazı eklediğinde bu alana elle değer girmek durumunda. Ben bu durum dışında daha pratik olması için aşağı yukarı yön oklarıyla yazının sırasının değiştirilebilmesini istiyorum. Bu yöntem bir tanıdıktan duyduğum kadarıyla joomla yönetim panelinde varmış. Aranızda bu yöntemi kullanan veya gören bilgili arkadaşlar bir örnek kod veya mantık sunabilirlerse çok memnun olurum.
+0
-0
Cevaba KatılıyorumKatılmıyorum
Cevap Yaz Yorum Yaz Arşivime Ekle Takip Et

Cevaplar

  • sharq adlı üyenin fotoğrafı
    11 yıl önce yazılmış
    115 cevap - 124 soru
    tıkladığında get ile o sırayı alarısın sıraya +1 eklersin ve o sıranın bi üstündeki sıraya -1 eklersin veri tabanına kaydedersin bu işlem olmuş olur .
    • Lupus adlı üyenin fotoğrafı Lupus
      -'sine tıkladığın kaydın altındakini +1 yapmayı ve
      +'ına tıkladığının üstündekini de -1 yapmayı unutma
      11 yıl önce yazılmış
    • huseyiniskender adlı üyenin fotoğrafı huseyiniskender
      Merhaba arkaşlar öncelikle yardımcı olmaya çalıştığınız için teşekkür ederim.

      Söylediklerinizden yola çıkarak bir şeyler yaptım fakat bir süre sonra tablodaki sira alanı hepsi için aynı değere ulaşıyor dolayısıyla hata oluşuyor.

      Tablo yapım ve kodları aşağıya yazıyorum. Kendi bilgisayarınızda deneyip sonucu görebilirsiniz. Nerede mantık hatası yaptığımı anlayamadım. Elinizde örnek uygulama varsa paylaşabilir misiniz?

      sql tablo kodları ve içindeki örnek veriler.

      CREATE TABLE IF NOT EXISTS `tablo` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `yazi` varchar(250) NOT NULL,
        `sira` int(11) DEFAULT NULL,
        PRIMARY KEY (`id`)
      ) ENGINE=InnoDB  DEFAULT CHARSET=latin5 AUTO_INCREMENT=7 ;
      
      INSERT INTO `tablo` (`id`, `yazi`, `sira`) VALUES
      (1, 'a', 1),
      (2, 'b', 2),
      (3, 'c', 3),
      (4, 'd', 4),
      (6, 'f', 5);
      


      php yazdığım kod

      <?php
      $dbhost="localhost";
      $dbadi="siralama";
      $dbuser="root";
      $dbpass="";
      
      $baglanti=@mysql_connect($dbhost,$dbuser,$dbpass);
      if(!'baglanti') die("Mysql Bağlantısında hata oluştu");
      @mysql_select_db($dbadi,$baglanti) or die("İstenilen Veritabanına Bağlanılamadı.");
      mysql_query("SET NAMES 'latin5'");
      mysql_query("SET CHARACTER SET latin5");
      mysql_query("SET COLLATION_CONNECTION = 'latin5_turkish_ci'");
      
      if(isset($_GET["islem"]) and $_GET["islem"]!="" and isset($_GET["sira"]) and $_GET["sira"]!="" and isset($_GET["id"]) and $_GET["id"]!=""){
      if(mysql_num_rows(mysql_query("select id from tablo where sira='".$_GET["sira"]."' and id='".$_GET["id"]."' limit 1"))==1){
      	
      if($_GET["islem"]=="artir"){
      	$ust_satir=mysql_query("select sira from tablo where sira<'".$_GET["sira"]."' limit 1");
      	if(mysql_num_rows($ust_satir)!=0){
      		$ust_satir_veri=mysql_fetch_assoc($ust_satir);
      		$ust_sira=$ust_satir_veri["sira"];
      		$ust_art=$ust_satir_veri["sira"]+1;
      		mysql_query("update tablo set sira='$ust_art' where sira='$ust_sira' limit 1");
      		$kendisi=$_GET["sira"]-1;
      		mysql_query("update tablo set sira='$kendisi' where id='".$_GET["id"]."' limit 1");
      	}
      }
      else if($_GET["islem"]=="azalt"){
      	$ust_satir=mysql_query("select sira from tablo where sira>'".$_GET["sira"]."' limit 1");
      	if(mysql_num_rows($ust_satir)!=0){
      		$ust_satir_veri=mysql_fetch_assoc($ust_satir);
      		$ust_sira=$ust_satir_veri["sira"];
      		$ust_art=$ust_satir_veri["sira"]-1;
      		mysql_query("update tablo set sira='$ust_art' where sira='$ust_sira' limit 1");
      		$kendisi=$_GET["sira"]+1;
      		mysql_query("update tablo set sira='$kendisi' where id='".$_GET["id"]."' limit 1");
      	}
      }
      
      }}
      
      
      ?>
      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      <style type="text/css" media="screen">
      a:link,a:visited,a:hover{ text-decoration:none; color:#000;}
      </style>
      </head>
      <body>
      <table width="180" border="0" cellspacing="0" cellpadding="0" align="center">
      <?php
      
      $result = mysql_query("SELECT * FROM tablo ORDER BY sira ASC") or die(mysql_error());
      while($veri = mysql_fetch_array($result)) {
      ?>
        <tr>
          <td width="140" height="20" align="left" valign="middle"><?php echo $veri["yazi"]; ?></td>
          <td width="100" height="20" align="left" valign="middle"><?php echo "  <a href='index.php?islem=artir&id=".$veri["id"]."&sira=".$veri["sira"]."'>+</a>  <a href='index.php?islem=azalt&id=".$veri["id"]."&sira=".$veri["sira"]."'>-</a><br>"; ?></td>
        </tr>
      <?php
      }
      ?>
      </table>
      </body>
      </html>
      
      11 yıl önce yazılmış
  • kucukharf adlı üyenin fotoğrafı
    11 yıl önce yazılmış
    7 cevap - 7 soru
    yukarı yada aşşağı okla taşımaktansa ajax kullanarak drag list yapabilirsin. bu konuda prototype frameworkler bolca mevcut, ben scriptaculous framework u bazı projelerde kullanıyorum tavsiye ederim.
    • huseyiniskender adlı üyenin fotoğrafı huseyiniskender
      Drag list olayıyla ilgili bir örnek bulup incelemiştim, gayet kullanışlı. Fakat bir yerde bir sorunla karşılaştığım için kullanmadım.

      Belki sorunun çözümünü biliyorsunuzdur diye size sorayım: Veritabanında 12 tane kayıt olsun. Ben bu kayıtları 10'arlı şekilde sayfalıyorum. Dolayısıyla verileri görüntülediğimde karşıma birinci sayfada 10 tane veri çıkıyor, ikinci sayfada ise 2 tane veri çıkıyor. Bu kayıtların sırasıda 0'dan 12'ye kadar gidiyor...

      Yani:
      Tablo yapısı
      ----------------------
      id - veri - sira
      ----------------------
      1.kayıtın sırası:0
      2.kayıtın sırası:1
      3.kayıtın sırası:2
      4.kayıtın sırası:3
      5.kayıtın sırası:4
      6.kayıtın sırası:5
      7.kayıtın sırası:6
      8.kayıtın sırası:7
      9.kayıtın sırası:8
      10.kayıtın sırası:9
      11.kayıtın sırası:10
      12.kayıtın sırası:11


      Ben onlu sıralamada 2. sayfadayken karşıma id'si 11 ve 12 olan kayıtlar gelecektir. Ben bu iki kayıt arasında drag list ile yer değişimi yaptığımda elimdeki draglist uygulaması bu iki kayıtı dizi mantığıyla ele alıyor ve yeni sıralamayı sıfırdan başlatıp 0 , 1, n+1... şeklinde kayıt ediyor.

      Yani tablonun son hali şu oluyor.

      ----------------------
      id - veri - sira
      ----------------------
      1.kayıtın sırası:0
      2.kayıtın sırası:1
      3.kayıtın sırası:2
      4.kayıtın sırası:3
      5.kayıtın sırası:4
      6.kayıtın sırası:5
      7.kayıtın sırası:6
      8.kayıtın sırası:7
      9.kayıtın sırası:8
      10.kayıtın sırası:9
      11.kayıtın sırası:0
      12.kayıtın sırası:1

      Bu verileride sira kolonuna göre listelediğimde benzer kayıtlar oluştuğundan hatalı sonuçlar dönüyor.

      Yani sonuç olarak eğer tüm verileri sayfalama yapmadan direk ekrana basarsam drag list uygulaması sıkıntısız çalışıyor. Sayfalama yaptığımda ise yukarda bahsettiğim sonuçlar doğuyor.

      Siz böyle bir durumla karşılaşmamak için nasıl bir yol izliyorsunuz veya bu hatalara yakalanmamam için önerebileceğiniz örnek bir uygulama gösterebilir misiniz?

      İlginiz için teşekkür ederim.
      11 yıl önce yazılmış
    • huseyiniskender adlı üyenin fotoğrafı huseyiniskender
      11 yıl önce yazılmış
    • kucukharf adlı üyenin fotoğrafı kucukharf
      Sayfalamada kullandığın scrippten dolayı böyle bir hata veriyor, biraz araştırınca bu aşşağıdaki arkadaş güzel anlatmış, bir incelersin,

      sira_kaydet, fonksiyonuna, şu şekilde bir eklenti yaparsan problem yaşamazsın diye tahmin ediyorum denemedim, db deki kayıtlardan icerik sırasına göre son kaydı çek, ve bunu bir değişkene ata örneğin a olsun, sonra sıra değişkenine b değerini verip a+1 e eşitle, a değeride boşsa 1 den başlasın saymaya, dolayısıyla kaçıncı sayfadan gelirse gelsin, son verdiğin sıranın üzerine saymaya başlayacak.

      basitçe örnekliyim;
      
      function kaydet($gelen_id)
      {
      	if (!isset($_POST[$gelen_id]) || !is_array($_POST[$gelen_id])) return;
      	
          // $sorgu = mysql_query(" select * from iceriklerim order by icerik_siram desc limit 1");
      
      


      burda $son_sira diye bir değişkenle icerik sirasını aldım;

      daha sonra;

      
      $sira = $son_sira+1;
      	foreach ($_POST[$gelen_id] as $icerik_id)
      	{
      		if (!array_key_exists($icerik_id, $icerikler)) continue;
      		$sorgu = sprintf('update iceriklerim set icerik_siram = %d where icerik_id = %d',
      		$sira,
      		$icerik_id);
      		mysql_query($sorgu);
      		$sira++;
      	}
      }
      
      


      diye son gelen sıra üstüne saydırmaya başladım. umarım temiz anlatmışımdır. pek iyi değilimdir anlatmakta.

      örnek anlatım: http://www.lampforweb.com/index.php/mysql/php-mysql-ajax-ornek-uygulama-surukle-birak-sirali-listeler/

      kolay gelsin.
      11 yıl önce yazılmış
    • axaturk adlı üyenin fotoğrafı axaturk
      // $sorgu = mysql_query(" select * from iceriklerim order by icerik_siram desc limit 1");

      sen burda son eklenen satırı çağırıyosun. aşağıdaki örnek senin sql tablon olsun diyelim. sen desc ile çağırırsan son eklenen satır 4, c , 2 yi çağıracak ve 2+1 dediğinde 3 diyecek. yeni eklediğinde 3 diye kaydedeceksin. sira sutununda iki tane 3 olacak. ve karışacak.

      id , yazi , sira
      ----------------
      1, a , 0
      2, d , 3 (sıralama yapıldıktan sonra ki hali)
      3, b , 1
      4, c , 2
      11 yıl önce yazılmış
    • kucukharf adlı üyenin fotoğrafı kucukharf
      son eklenen satırı değil son sıradaki kayıtı çağırıyor. "icerik_siram"
      11 yıl önce yazılmış
  • axaturk adlı üyenin fotoğrafı
    11 yıl önce yazılmış
    3 cevap - 2 soru
    sana bir mantık vereyim. bu yöntemi bende kullanıyorum.

    listeleme : id, yazi, sira
    1, a, 0 yukarı(link) aşağı(link)
    2, b, 1 yukarı(link) aşağı(link)
    3, c, 2 yukarı(link) aşağı(link)
    böyle olsun diyelim

    sen yukarı linkine tıklatınca, bir önceki sıradakinin sira nosuyla yer değiştirecek.

    örnek 2, b, 1 de yukarı dediğinde sira 0 olacak, üsttekinin sira ise 1 olcak. yer değiştircek yani.

    neden bu yöntemi kullanmalısın?
    eğer +1 ya da -1 dersen. Arada silinmiş satırlar olabilir. o zaman iş karışır :)