Sorunu tam olarak anlayamadım, yapmak istediğin şeyi daha açıklayıcı bir şekilde anlatabilirsen yardımcı olmaya çalışacağım. Front-end tarafıyla ilgili bir kısım mevcut ise görseller de ekleyebilirsen sevinirim.
Merhaba, tablodaki id sayısını kontrol etmek yerine sütun sayısını kontrol etmek problemini çözecektir. Aşağıda örnek kod mevcut, inceleyip kendine göre düzenleyebilirsin.
Düz PDO yerine BasicDB kullandım veritabanı işlemleri için.
# users tablosundaki toplam kayıt sayısını alıyoruz.
$query = $db->from('users')
->select('count(user_id) as total')
->total();
if($query >= 50){
# 50 adet veya daha fazla kayıt mevcut ise
die('Bu işlemi gerçekleştiremezsiniz.');
}else{
...
}
Yukarıdaki kodu tablodaki kayıt sayısı 50 adete ulaştığı zaman yeni kayıt eklenmesini engelleyecek şekilde düzenleyebilirsin.
Ancak sen hem maksimum 50 adet kayıt olsun hem de tablodaki kayıtların id değerleri 1 - 50 arasında olsun istiyorsan eğer, tablodaki bütün kayıtların id değerlerini foreach döngüsüyle güncelleyebilirsin.
Sayfamızda 3 adet buton bulunduğunu varsayalım.
<button class="fc-button" id="galatasaray">Galatasaray</button>
<button class="fc-button" id="fenerbahce">Fenerbahçe</button>
<button class="fc-button" id="besiktas">Beşiktaş</button>
.fc-button classı bulunan butonlara tıkladığımız zaman id değerini JQuery ve AJAX kullanarak "takim-detay.php" dosyasına post edeceğiz. Burada ID değilde class kullanmamızın sebebi id'den veriyi elde edeceğiz ve butonlar 3'den fazla olabileceğinden dolayı bu şekilde kullanmak daha mantıklı geldi :)
$(document).on('click', '.fc-button', function() {
var buttonId = $(this).attr('id'); // Tıklanan butonun id değerini alıyoruz.
$.ajax({
url: "takim-detay.php",
method: 'POST',
data: {id: buttonId},
success: function(response) {
// Burada örneğin $('#content').html(response); benzeri bir kullanım yaparak
// gelen yanıtı #content olan bir elemente aktarabilirsin.
console.log('POST işlemi başarılı: ' + response);
},
error: function(xhr, status, error) {
console.error('POST işlemi başarısız: ' + error);
}
});
});
takim-detay.php dosyasının içerisinde $_POST'dan gelen veriyi kullanarak ekrana yazdırmak istediğin veriyi JSON formatında veya HTML formatında ekrana yazdırman yeterlidir. Javascript tarafında gelen yanıtı işlemelisin.
Ayrıca yukarıdaki javascript ajax kodlarında POST metodunu kullandım, POST yerine GET kullanılabilir.
Aşağıdaki kodu denediğimde hedef sitede aradığım bir kelimenin varlığını kontrol edebiliyorum. Muhtemelen işini göreceğini tahmin ediyorum, deneyebilir misin :)?
Eğer kod çalışmadıysa veri çekmeye çalıştığın web sitesinin bağlantısını gönderebilirsen yardımcı olmaya çalışayım.
$url = 'https://www.hurriyet.com.tr/';
$contents = file_get_contents($url);
if ($contents === false) {
die('İçerik alınamadı');
}
$keyword = "Dolar Kuru";
// Düzenli ifadeyle arama yapma (büyük-küçük harf duyarlı olmayan arama)
$pattern = '/\b' . preg_quote($keyword, '/') . '\b/i';
if (preg_match($pattern, $contents)) {
echo "Kelime bulundu!";
} else {
echo "Kelime bulunamadı!";
}
Merhaba, istediğiniz şey Javascript ile yapılabilir. Butona tıklandığı zaman AJAX ile "192.168.1.86:2000/2" adresine istek göndererek bu işlemi gerçekleştirebilirsiniz. Buna ek olarak röleyi tetiklemek için kullandığınız adrese giriş yaptığınız zaman ekranda çalışıp çalışmadığını bildiren bir mesaj geliyor ise aynı şekilde AJAX isteğinden gelen yanıtı dinleyerek, ekranda yazan mesajı sayfayı yenilemeden ekrana yazdırabilirsiniz.
Merhaba, sorunuzu net olarak anlayamadım ama genel mantığı anlamanız için aşağıda kod örnekleri mevcut. Veritabanını ve kodları paylaşman durumunda daha net cevaplar alabilirsin.
Örnek
Ana sayfa, sidebar kısmında kategorileri ve kategorilerin içerisindeki son 5 yazıyı oluşturulma tarihlerine göre listeleteceğiz.
Kategorilerimizin bulunduğu veritabanı (categories):
- category_id
- category_title => Kategori başlığı
- category_create => Kategori oluşturulma tarihi
Blog yazılarımızın bulunduğu veritabanı (blogs):
- blog_id
- blog_category => Blog yazısının bağlı olduğu kategori id
- blog_title => Blog başlığı
- blog_content => Blog yazısının içeriği
- blog_create => Blog oluşturulma tarihi
Kategorileri listeletme
Veritabanımızdan kategorileri, son eklenenler en yukarıda gözükecek şekilde tamamını çekiyoruz.
# $db değişkeninde veritabanı bağlantımız bulunuyor.
$query = $db->prepare("SELECT * FROM categories ORDER BY category_create DESC")->execute();
$categories = $query->fetchAll(PDO::FETCH_ASSOC);
"categories" tablomuzda eğer kategori mevcut ise mevcut olan kategorileri $categories değişkenine aldık.
Şimdi front-end tarafında önce if kontrolü daha sonrasında foreach döngüsü ile kategorilerimizi listeletiyoruz.
<?php if($categories): ?>
<ul>
<?php foreach($categories as $category): ?>
<li><?= $category['category_title'] ?></li>
<?php endforeach; ?>
</ul>
<?php else: ?>
<p>Henüz kategori oluşturulmamış.</p>
<?php endif;?>
Kategorileri ve Kategorilerin içerisinde bulunan yazıları listeletme
Şimdi ise hem kategorileri listeleteceğiz, hem de kategorilerin içerisinde bulunan blog yazılarını listeleteceğiz. Bunun için veritabanından öncelikle categories tablomuzdan kategorileri çekmemiz daha sonrasında kategoriye ait olan blog yazılarını çekmemiz gerekiyor.
# Kodların front-end tarafında daha anlaşılır olması için
# çektiğimiz verileri $data değişkeninin içerisine koyacağız
$data = [];
# Kategorileri çekiyoruz
$categoryQuery = $db->prepare("SELECT * FROM categories ORDER BY category_create DESC")->execute();
$categories = $categoryQuery->fetchAll(PDO::FETCH_ASSOC);
foreach($categories as $category){
# Kategori başlığımızı $data değişkeninin içerisine ekliyoruz.
$data[$category['category_id']]['title'] = $category['category_title'];
# Kategoriye ait olan son 5 blog yazısını blog oluşturulma tarihine göre çekiyoruz.
$blogs = $db->prepate("SELECT * FROM blogs WHERE blog_category = :category_id ORDER BY blog_create DESC LIMIT 5");
$blogs->bindValue(':category_id', $category['category_id'], PDO::PARAM_STR)->execute();
$blogs = $blogs->fetchAll(PDO::FETCH_ASSOC);
if($blogs){
# Eğer blog yazısı mevcut ise foreach döngüsüne alıyoruz
foreach($blogs as $blog){
# Blog başlığı, içeriği ve oluşturulma tarihi gibi verileri $data değişkeninin içerisine ekliyoruz.
$data[$category['category_id']]['posts'][$blog['blog_id']]['title'] = $blog['blog_title'];
$data[$category['category_id']]['posts'][$blog['blog_id']]['content'] = $blog['blog_content'];
$data[$category['category_id']]['posts'][$blog['blog_id']]['date'] = $blog['blog_create'];
}
}
}
Yukarıda veritabanımızdan önce kategorileri daha sonrasında kategoride bulunan blog yazılarını $data değişkeninin içerisine aktardık.
Şimdi front-end tarafında listelemesini yaptıralım.
# Çektiğimiz verileri $data değişkenine aktardığımız için bu sefer
# $categories değişkeninini kullanmak yerine $data değişkenini kullanıyoruz.
# Bunu yapma sebebimiz ise front-end tarafında veritabanı
# sorgusu kullanıp kodu karmaşık hale getirmemek için.
<ul>
<?php foreach($data as $category): ?>
<li>
<?= $category['category_title'] ?>
<?php if(isset($category['posts'])): ?>
<ul>
<?php foreach($category['posts'] as $blog): ?>
<li><?= $blog['title'] ?></li>
<?php endforeach; ?>
</ul>
<?php else: ?>
<p>Bu kategoride blog yazısı henüz eklenmemiş.</p>
<?php endif; ?>
</li>
<?php endforeach; ?>
</ul>
Sorunu net olarak anlamamış olsamda, anladığım kadarıyla yardımcı olmaya çalıştım. Umarım yardımcı olabilmişimdir :)
Üye girişi yapan kullanıcının giriş bilgilerini çerezlerde ve aynı zamanda veritabanında saklayarak istediğin işlem yapılabilir. Aşağıda örneğini verdiğim sistem üye formlarında bulunan "Beni Hatırla" seçeneği için de kullanılabilir.
Örnek
2 adet tablomuz olsun;
- users (Kullanıcı bilgilerinin saklandığı)
- remember_token (Kullanıcının giriş bilgilerinin saklandığı)
Kullanıcı bilgilerini veritabanına kayıt etme ve çerez oluşturma
Kullanıcı users tablosundaki username, password değerleri ile giriş yaptığı zaman kullanıcı için çerez oluşturalım. Oluşturacağımız çerezin içerisinde sadece token bilgisi yer alacak.
Oluşturacağımız çerezi önce veritabanına kayıt ediyoruz. Kayıt ettikten sonra çerez oluşturma işlemini gerçekleştiriyoruz. Veritabanı işlemleri için düz PDO yerine BasicDB sınıfını kullandım.
/*
* 32 Karakter uzunluğunda rastgele token oluşturuyoruz.
*/
$token = bin2hex(random_bytes(32));
/*
* Oluşturacağımız çerezin oluşturulduğu tarihten itibaren +7 gün geçerli olmasını sağlıyoruz.
*/
$time = time() + 604800;
/*
* Giriş yapan kullanıcının tarayıcı ve IP bilgisi
*/
$useragent = $_SERVER['HTTP_USER_AGENT'];
$ip = $_SERVER['REMOTE_ADDR'];
$insert = $db->insert('remember_token')
->set(array(
'user' => $buraya_user_id, # Giriş yapan kullanıcını users tablosunda bulunan id değeri
'token' => $token, # Çerezi oluşturmak için kullandığımız token
'ip' => $ip,
'useragent' => $useragent,
'time' => $time
));
if($insert){
/*
*
* Çerezi Oluşturuyoruz
*
* 1. Parametre: Anahtar
* 2. Parametre: Değer
* 3. Parametre: Çerezin ne kadar süreyle geçerli olacağını belirler.
* 4. Parametre: Çerezin hangi URL yolları altında erişilebilir olduğunu belirler.
*
*/
setcookie("Auth", $token, $time, '/');
}
Oluşturulan bilgilerin kontrol edilmesi
Oluşturduğumuz çerezi şimdi kontrol ettirmemiz gerekiyor. Kullanıcı girişi sırasında eğer kullanıcının bilgileri doğru ise "remember_token" tablosunda kullanıcıya ait bir veri olup olmadığını kontrol etmemiz gerek. Eğer "remember_token" tablosunda kullanıcıya ait bir veri var ise kullanıcı girişini yapmasını engelleyeceğiz.
$query = $db->from('remember_token')
->where('user', $buraya_user_id)
->first();
if($query):
die("Aktif oturumunuz bulunduğu için girişiniz engellendi");
else:
# Giriş işlemine devam
endif;
Kullanıcı oturumunu kontrol etme
Şimdi yaptığımız sistemde kullanıcının giriş yaptığını sisteme bildirmiş olduk ve kullanıcının aktif oturumu var ise giriş yapmasını engellemiş olduk. Şimdi ise kullanıcının giriş yaptığı tarayıcıda oluşturduğumuz çerezi veritabanına kontrol etmemiz ve çerezdeki bilgiler veritabanında mevcut ise oturumuna devam etmesini sağlamamız gerekiyor.
Aşağıdaki kontrol kodlarını projenizin sürekli çağırılan bir dosyasına entegre edebilirsiniz veya kullanıcı oturumlarını belirli aralıklarla kontrol edilmesini sağlayabilirsiniz.
if(isset($_COOKIE['Auth'])){
# Oluşturduğumuz çerezi kontrol ediyoruz, eğer mevcut ise işlemlere devam.
$Cookie = $_COOKIE['Auth']; # Çerezi değişkene aktarıyoruz
$query = $db->from('remember_token')
->where('token', $Cookie)
->first();
if ($query) {
# Token eğer veritabanında mevcut ise süresini kontrol ediyoruz
if(time() > $query['time']){
# Mevcut tarih eğer veritabanında bulunan tarihten büyük ise veritabanındaki tokeni siliyoruz
$delete = $db->delete('remember_token')->where('token', $Cookie)->done();
# Daha sonrasında çerezi de silmemiz gerekiyor.
setcookie('Auth', '');
# Burada kullanıcı session kontrolleri yapılabilir.
# Eğer session mevcut ise kaldırılabilir.
}else{
# Burada kullanıcı sessionları kontrol edilir.
# Session mevcut değil ise kullanıcının girişi için sessionlar oluşturulur.
}
} else {
# Token eğer veritabanında mevcut değil ise user id ile sorgulama yapıyoruz.
# Eğer veritabanında veri var ise sileceğiz, eğer oluşturduğumuz çerez yok ise
# kullanım süresi dolmuş demektir.
$user = $db->from('remember_token')->where('user', $buraya_user_id)->first();
if($user){
# Eğer veritabanında user id ile eşleşen veri bulunduysa siliyoruz.
$delete = $db->delete('remember_token')->where('user', $buraya_user_id)->done();
}
}
} else {
# Eğer çerez tarayıcıda bulunmuyor ise yapılacak işlemler.
echo "Auth çerezi bulunmuyor.";
}
Yukarıdaki kontrol kodlarında ayrıca tarayıcı bilgilerini, ip adresini vb. bilgileri kontrol ettirerek detaylandırabilirsiniz.
Aklıma bu şekilde bir çözüm geldi umarım yanlış bir mantık kurmamışımdır :D Ancak bu sistem biraz daha detaylandırılırsa birden fazla oturumun yönetimi için de kullanılabilir diye düşünüyorum.