Veritabanı kullanıyorsanız, bu iki tabloyu birleştirmek için birçok yöntem mevcut. Örneğin, "JOIN" sorgusu kullanarak iki tablonun birleştirilmiş hali elde edebilirsiniz. Ancak, veri sayısı arttıkça sorgunun işlem hızı yavaşlayabilir. Bu nedenle, veritabanınızın performansını arttırmak için indexleme, optimizasyon ve performans takip araçlarını kullanmanız önerilir. Ayrıca, veri sayısı arttıkça, veritabanı yapınızı gözden geçirmek ve gerektiğinde yeniden tasarlayabilirsiniz. Bu şekilde, veri sayısının arttığı durumlarda bile veritabanınızın performansını koruya bilirsiniz.
Örnek olarak, müşteri carileri tutulduğu "customers" tablosu ve mağaza satışlarının tutulduğu "sales" tablosu var. "customers" tablosunda "customer_id" ve "customer_name" sütunları mevcut. "sales" tablosunda ise "sale_id", "customer_id" ve "sale_amount" sütunları var.
Bu iki tabloyu birleştirmek için "JOIN" sorgusu kullanabilirsiniz:
SELECT customers.customer_name, sales.sale_amount
FROM customers
JOIN sales ON customers.customer_id = sales.customer_id;
Bu sorgu, müşteri adı ve satış tutarını içeren bir sonuç tablosu döndürür. "JOIN" sorgusu ile "customers" tablosunda "customer_id" sütunu ile "sales" tablosunda "customer_id" sütunu arasında eşleşme sağlar.
Ancak, veri sayısı arttıkça sorgunun işlem hızı yavaşlayabilir. Bu nedenle, "customers" tablosunda "customer_id" sütununu indexlemek ve "sales" tablosunda "customer_id" sütununu indexlemek performansı arttırabilir. Ayrıca, veritabanınızın performansını izlemek için araçlar kullanabilirsiniz.
Veri sayısı arttıkça, veritabanı yapınızı gözden geçirmek ve gerektiğinde yeniden tasarlayabilirsiniz. Örneğin, veri sayısı arttıkça "sales" tablosunu birden fazla tablo olarak bölerek performansı arttırabilirsiniz.
En güvenli ve uygun yöntem, kullanıcının girdiği adres bilgilerini geçici olarak veritabanında tutmaktır. Veritabanı kullanarak kullanıcı adres bilgilerini saklamak, kullanıcının alışveriş sepetinden çıktıktan sonra veya belirli bir süre sonra otomatik olarak silinmelidir. Bu, kullanıcının gizliliğini ve güvenliğini korurken aynı zamanda veritabanının bellek kullanımını azaltır. Örneğin, PHP ve MySQL kullanarak, kullanıcının adres bilgilerini kaydetmek için bir veritabanı tablosu oluşturabilirsiniz ve bu tabloya sadece oturum süresi boyunca geçerli olan verileri kaydedebilirsiniz. Sonra, oturumun sona ermesi veya belirli bir süre geçtikten sonra, bu verileri otomatik olarak silin.
Sessionda tutmak, bellek sorunlarına neden olabilir ancak bunun önüne geçmek için otomatik session temizleme mekanizmaları kullanabilirsiniz. Örneğin, PHP'de, session_set_save_handler() fonksiyonunu kullanarak, session verilerinin belirli bir süre sonra silinmesini sağlayabilirsiniz. Ayrıca, session_gc() fonksiyonunu kullanarak, bellekteki eski session verilerini belirli aralıklarla temizleyebilirsiniz.
Cookieler veya local storage gibi tarayıcı tabanlı yöntemler, kullanıcının bilgisayarının güvenliği açısından risk oluşturabilir ve önerilmez. Örneğin, cookieler veya local storage kullanarak saklanan veriler, kötü niyetli bir kullanıcı tarafından ele geçirilebilir veya değiştirilebilir. Ayrıca, cookieler veya local storage kullanarak saklanan veriler, kullanıcının tarayıcısını sıfırladığında veya bilgisayarını değiştirdiğinde kaybolabilir.
Veritabanında belirli bir süre için tutmak kullanıcı hangi cihazdan girerse girsin kaldığı yerden sepetine ekleme çıkarama yaparak devam edebilmesine olanak sağlatayacaktır.
Ama yine de nasıl kullanacağınız size kalmış :)
Mevcut bilgilerime göre, react-router
kullanırken verilerinizin görünmemesi ihtimali, verilerin yüklenmesi için kullandığınız component'in router tarafından yeniden render edilmeden önce yüklenmediğinden kaynaklanabilir.
Bu durumda, componentDidMount()
metodunu kullanarak verilerin yüklenmesini sağlayabilirsiniz veya componentWillReceiveProps()
metodunu kullanarak verilerin yeniden yüklenmesini sağlayabilirsiniz.
Ayrıca, component'in re-render edildiğinde redux store'daki verilerin güncellenmesini sağlamak için mapStateToProps()
metodunu kullanabilirsiniz.
Daha fazlası için: https://reactjs.org/docs/react-component.html#componentdidmount
Ekranın alt kısmında butonları sabitlemek için JavaScript kullanabilirsiniz. Örnek olarak aşağıdaki kodu kullanabilirsiniz:
// buttonun id'sini al
let btn = document.getElementById("myBtn");
// buttonun offsetini al
let offset = btn.offsetTop;
// Scroll eventi ekle
window.addEventListener("scroll", function() {
// Eğer scroll offsetinden büyükse
if (window.pageYOffset > offset) {
// buttona sticky class ekle
btn.classList.add("sticky");
} else {
// sticky class'ı kaldır
btn.classList.remove("sticky");
}
});
Bu kod, sayfanın kaydırıldığı zaman "myBtn" id'li butonun "sticky" sınıfını ekler veya kaldırır. Bu sınıf, butonun ekranın alt kısmında sabit kalmasını sağlar. Bu sınıfı CSS ile tanımlayarak butonun görünümünü değiştirebilirsiniz.
.sticky {
position: fixed;
bottom: 0;
}
Bu örnekte, butonun pozisyonu sabit olarak ayarlanır ve ekranın en altında kalır.
Anladım, öncelikle yaptığınız yanlış anlatmanız için özür dilerim. Bu durumda, $_GET superglobal değişkenini kullanarak URL'den gelen şirket adını alabilirsiniz. Örneğin, aşağıdaki gibi:
$secilenSirket = $_GET['pid55'];
Bu kod, 'pid55' parametresi olarak gelen şirket adını $secilenSirket değişkenine atar. Daha sonra, bu değişkeni sorgunuzda kullanabilirsiniz:
$sorgu = $vt->prepare('SELECT *FROM sirketler WHERE Sirketadi = :sirket_adi');
$sorgu->bindParam(':sirket_adi', $secilenSirket);
Not: $_GET superglobal değişkeni güvenli değildir, bu yüzden gelen verileri kontrol etmeli ve güvenli hale getirmelisiniz.
Eğer seçtiğiniz şirketin adını dinamik olarak listelemek istiyorsanız, sorgunuzda bir değişken kullanmalısınız. Örneğin, aşağıdaki gibi:
$sorgu = $vt->prepare('SELECT *FROM sirketler WHERE Sirketadi = :sirket_adi');
$sorgu->bindParam(':sirket_adi', $secilenSirket);
Bu şekilde, $secilenSirket değişkeni seçilen şirketin adını tutar. Örneğin, kullanıcı A şirketini seçtiğinde $secilenSirket = 'A şirketi' olarak ayarlanır ve sorgu A şirketini listeler.
PHP kullanarak fiyatlar içerisinden belirli bir tarih aralığı veya aya ait toplam fiyatı hesaplamak için öncelikle verilerinizi bir veritabanında saklamanız gerekir. Daha sonra, veritabanı sorguları kullanarak istediğiniz tarih aralığındaki veya aya ait fiyatları sorgulayabilirsiniz. Örneğin, şubat ayı için fiyatları sorgulamak için aşağıdaki gibi bir SQL sorgusu kullanabilirsiniz:
SELECT SUM(price) FROM prices WHERE MONTH(date) = 2;
Bu sorgu, "prices" adlı tablonun "date" sütununda şubat ayı olan tüm kayıtların "price" sütununda yer alan değerlerin toplamını döndürür.
Bu sorguyu PHP kullanarak çalıştırmak için, PDO (PHP Data Objects) veya MySQLi kullanabilirsiniz. Örneğin, PDO kullanarak sorguyu çalıştırmak için aşağıdaki gibi bir kod parçacığı kullanabilirsiniz:
$pdo = new PDO('mysql:host=hostname;dbname=database_name', 'username', 'password');
$stmt = $pdo->prepare('SELECT SUM(price) FROM prices WHERE MONTH(date) = ?');
$stmt->execute([2]);
$total_price = $stmt->fetchColumn();
Bu kod parçacığı, veritabanına bağlanır, şubat ayı için fiyatların toplamını sorgulayan bir sorgu hazırlar ve sonuçları $total_price değişkenine atar.
Dilerseniz fiyatların toplamının yanı sıra fiyatların sayısını ve ortalamasını da sorgulayabilirsiniz.
Eğer sorgunuzda "GROUP BY satislar.musteriID" komutunu kullandıysanız ve hala rakamlar 2 katı çıkıyorsa, bu durumda $acikHesapToplam2 değişkenini sorgu sonucunu döngü içinde gezerek her satır için tek tek eklemeniz gerektiği anlamına gelir.
while($satislariGetir=$satis->fetch(PDO::FETCH_ASSOC)){
$acikHesapToplam2 += $satislariGetir['cariToplam'];
// ...
}
Yukarıdaki kod, her satır için cariToplam değerini $acikHesapToplam2 değişkenine ekleyecektir.
Ayrıca, sorgunuzda "GROUP BY satislar.musteriID" komutunu kullanarak satışları gruplandırmanız gerekmektedir. Ancak sorgunuzda acikHesapToplam2 değişkenini satislar tablosunda acikHesap alanından alıyorsunuz. Bu nedenle sorgunuzda acikHesapToplam2 değişkenini satislar tablosunda acikHesap alanının toplamını almak için SUM fonksiyonunu kullanmanız gerekmektedir.
SELECT SUM(satislar.acikHesap) as acikHesapToplam2
FROM satislar
INNER JOIN musteriler ON satislar.musteriID=musteriler.ID
INNER JOIN subeler ON satislar.subeID=subeler.ID
INNER JOIN tahsilatlar as t ON satislar.musteriID=t.tMusteriID
where satislar.satisTarihi between ? and ? AND satislar.subeID='{$sube}'
AND satislar.acikHesap > 0
GROUP BY satislar.musteriID
Bu şekilde sorgunuzda acikHesapToplam2 değişkeni satislar tablosunda acikHesap alanının toplamını verecektir.
Rapor ekranınızda rakamların 2 katı çıkmasının nedeni, satislar tablosunda müşteri ID'si ile ilişkili olarak aynı müşteriye ait satışların birden fazla kez sayılması olabilir. Bu nedenle, sorgunuzda "GROUP BY satislar.musteriID" komutunu kullanarak müşteri ID'si baz alınarak satışları gruplandırmanız gerekmektedir. Ayrıca, sorgunuzda "sum(t.tutar) as tahsilat" komutunu kullanarak tahsilatların toplamını hesaplamaktasınız, bu nedenle tahsilatların birden fazla kez sayılmasına da neden olabilir. Bu durumda sorgunuzda "GROUP BY satislar.musteriID, t.tutar" komutunu kullanarak müşteri ID ve tutar baz alınarak satışları ve tahsilatları gruplandırmanız gerekmektedir.
Google Search Console'da "desteklenmeyen biçim" hatası almanız, sitemap.xml dosyanızda bir sorun olduğunu gösterir. Öncelikle, sitemap.xml dosyanızın doğru bir XML formatına sahip olduğundan emin olun. Ayrıca, dosya içeriğinin sitenizdeki tüm sayfaları içerdiğinden ve her bir sayfanın doğru URL'si olduğundan emin olun.
Eğer dosya formatı ve içeriği doğruysa, sitemap.xml dosyanızın Google Search Console'da tanımlanmış olan alan adına ait olduğundan emin olun. Ayrıca, sitemap.xml dosyanızın robots.txt dosyanızda belirtilen dizinler içinde olduğundan emin olun.
Eğer hala sorununuz devam ediyorsa, https://www.xml-sitemaps.com bu website'ye domain adresinizi girerek otomatik bir sitemap.xml oluşturup bunu yüklemeyi deneyebilirisiniz!