v2.5.2
Giriş yap

Sayfa içerisinde aynı anda düzenleme işlemi #Php#Js

ozzy34
417 defa görüntülendi ve 1 kişi tarafından değerlendirildi

Merhaba, düz php ile yazılmış sipariş panelim var. Panel içerisinde siparişlerin düzenleme ekranına girip adres, telefon ya da ürün bilgileri güncelleme ekranı var.
Düzenleme sayfasına kullanıcılardan birisi girip düzenleme işlemi yaparken, başka birisi daha açarsa; o sayfanın şu an başkası tarafından düzenlendiğini görmesini ve düzenleme işlemi yapamamasını sağlamam gerekiyor.
Bunu sanırım sayfaya girdiğinde session ataması yapıp js ile kaydet butonunu kitleyerek yapabilirim ama birisi o sayfadayken bunun bilgisini alıp başkalarına nasıl gösterebilirim?
Session ile sayfayı kapattığında session'u nasıl temizleyebilirim ?
Ya da aynı anda girerlerse session ile ilgili sorun yaşar mıyım ? Şu an için 1-2 kişi var 100-200 kişi aynı anda tıklarsa ne gibi sorun yaşarım?

Cevap yaz
Cevaplar (4)
ozzy34
231 gün önce

<script>

window.addEventListener('beforeunload', function (event) {
	var params = window.location.search;
	
	var xhr = new XMLHttpRequest();
	xhr.open('GET', 'kapat.php' + params, true);
	xhr.send();
});

</script>

Bu kod ile çözdüm. Burada açtığım soru aklıma geldi hiç cevap gelmemiş eklemek istedim lazım olanlar alabilir.

ozzy34
255 gün önce
	require_once('config.php');
	$order_id = $_GET['order'];

	$editing = $db->prepare("SELECT * FROM editing_status WHERE order_id = :order_id && status=1");
	$editing->execute(array("order_id" => $order_id));
	$editing_status = $editing->fetch(PDO::FETCH_ASSOC);

	if ($editing_status){
		echo "Bu sayfa şu anda başkası tarafından düzenleniyor. Lütfen daha sonra tekrar deneyin.";
	}else{
		$orderID = $db->prepare("SELECT * FROM editing_status WHERE order_id = :order_id");
		$orderID->execute(array("order_id" => $order_id));
		$haveOrderID = $orderID->fetch(PDO::FETCH_ASSOC);
		
		if($haveOrderID){
			$query = $db->prepare("UPDATE editing_status SET status = :status, username = :username WHERE order_id = :order_id");
			$update = $query->execute(array(
			"status"	=> 1,
			"username"	=> $_SESSION['user'],
			"order_id"	=> $order_id
			));
			echo "OrderID status 0 dan 1 olarak değiştirildi.";
		}else{
			$query	= $db->prepare("INSERT INTO editing_status SET order_id = :order_id, username = :username, status = :status");
			$add	= $query->execute(array("order_id" => $order_id, "username" => $_SESSION['user'], "status" => 1));
			echo "Sıfır veri vardı eklendi.";
		}
	}

Status ekleyip onun üzerinden gitmek daha iyi gibi geldi bu şekilde ayarladım bir kaç kontrol ile.
Anlamadığım kısım // "editing" durumunu kaldır için yaptığınız bölüm. Sayfayı görüntüleyen kişinin sayfayı kapattığını nasıl kontrol edebilirim ? Süre koymak çok mantıklı gelmedi belki 10 saniye belki 15 dakika açık tutabilir kişi bunu net olarak bilemem ya da süre sınırı koyup sayfadan atmak istemem özel bir durumu olabilir o işle ilgili o an.

hakankorkz
400 gün önce
   
   // Veritabanındaki "editing" durumunu sorgula
$stmt = $db->prepare("SELECT * FROM editing_status WHERE page_id = :page_id");
$stmt->bindParam(':page_id', $page_id);
$stmt->execute();
$editing_status = $stmt->fetch(PDO::FETCH_ASSOC);

// Eğer sayfa düzenleniyorsa, kullanıcıyı uyar ve çıkış yap
if ($editing_status && $editing_status['user_id'] != $_SESSION['user_id']) {
    echo "Bu sayfa şu anda başkası tarafından düzenleniyor. Lütfen daha sonra tekrar deneyin.";
    exit;
}

// Sayfa düzenlenmiyorsa, "editing" durumunu kaydet
$stmt = $db->prepare("REPLACE INTO editing_status (page_id, user_id) VALUES (:page_id, :user_id)");
$stmt->bindParam(':page_id', $page_id);
$stmt->bindParam(':user_id', $_SESSION['user_id']);
$stmt->execute();

// Sayfayı göster
echo "Sayfa düzenlenebilir.";

// "editing" durumunu kaldır
$stmt = $db->prepare("DELETE FROM editing_status WHERE page_id = :page_id AND user_id = :user_id");
$stmt->bindParam(':page_id', $page_id);
$stmt->bindParam(':user_id', $_SESSION['user_id']);
$stmt->execute();

// Session'ı sonlandır
session_destroy();

// Sayfayı yönlendir
header("Location: index.php");
exit;

buna ek olarak tabloya bir de süre koyarsın kullanıcı aniden terk edebilir sayfayı ortalama 1 saat geçtiyse durumu siler false felan çekersin

sahindev
401 gün önce

Veritabanında güncelleme yapmadan önce güncellenecek veriyi doğrulamak için transaction kullanabilirsin. Araştırmanı tavsiye ederim.