Sayfa içerisinde aynı anda düzenleme işlemi #Php#Js
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?
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (4)
<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.
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.
// 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