yapılan işlem yetki sistemine tâbi ise yaptıracağın sayfa da kontrol etmen gerekiyor
GROUP_BY
yazmışım o GROUP BY
olacak direk kopyalama orayı düzeltirsin yorumu düzenle alanı olmadığı için düzenleyemedim.
Direk senin kodunu alıntıladğım için echo echo yazmışsın görmedim büyük ihtimal onun hatasını veriyordur.
şimdi tablo id | musteri_tutar | musteri_durum
bu 3 sütündan oluşuyor ise başta büyük bir yanlışın var kullanıcıları nerde tutuyorsun sorusu çıkıyor ortaya.
Ben yapını söyle düşündüm ona göre söyledim id | musteri_id | musteri_tutar | musteri_durum
bu tablonda müşteri her borç yazdırdığında bir satır ekleniyor diye düşündüm.
Sana önerim şu müşteri durumu iptal et odenen_tutar
diye bir alan yap ödenen tutarı buraya yaz yani yapın şöyle görünecek.
id | musteri_id | musteri_tutar | odenen_tutar |
---|---|---|---|
1 | 1 | 50 | 25 |
2 | 1 | 20 | 10 |
2 | 2 | 40 | 20 |
2 | 3 | 60 | 15 |
yapın eğer böyle olur ise örnek tablo da verdiğim mesela 1
numaralı müşterinin toplam borcu 70 ₺
ödediği toplam borç miktarı ise 35 ₺
Bu mantıkta olmalı ozaman şöyle bir sorgu istediğin sonucu alabilirsin.
SELECT
SUM(musteri_tutar) as toplam_borc,
SUM(odenen_tutar) as toplam_odenen_tutar,
musteri_id
FROM
musteri
GROUP_BY musteri_id
eğer sorgun böyle olur ise bunun çıktısı sana şunu verecek
toplam_borc | toplam_odenen_tutar | musteri_id |
---|---|---|
70 | 35 | 1 |
40 | 20 | 2 |
60 | 15 | 3 |
şeklinde bir çıktı verecektir.
böylelikle hangi müşterinin ne kadar toplam borcu var ve bu borcun ne kadarını ödediğini görebilirsin.
Bunun php'de kullanımı nasıl olacak peki.
<?php
$sorgu = $db->prepare(
'SELECT SUM(musteri_tutar) as toplam_borc,
SUM(odenen_tutar) as toplam_odenen_tutar,
musteri_id
FROM musteri GROUP_BY musteri_id'
);
$sorgu->execute();
$veriler = $sorgu->fetchAll(PDO::FETCH_ASSOC);
foreach($veriler as $sutun){
echo 'Müşteri Numarası: '.$sutun['musteri_id'].PHP_EOL;
echo 'Toplam Tutar: '.$sutun['toplam_borc'].PHP_EOL;
echo 'Ödenen Toplam Tutar: '.$sutun['toplam_odenen_tutar'].'<hr>';
}
?>
Bunun çıktısı da bu şekilde;
Müşteri Numarası: 1
Toplam Tutar: 70
Ödenen Toplam Tutar: 35
Müşteri Numarası: 2
Toplam Tutar: 40
Ödenen Toplam Tutar: 20
Müşteri Numarası: 3
Toplam Tutar: 60
Ödenen Toplam Tutar: 15
Merhaba,
Aleyküm selam, benimde sorun yaşadığım bir mevzu şu şekilde bir çözüm ürettim.
2 kere cache aldırıyorum biri giriş yaptıktan sonra sadece içerik alanını diğeri ise tüm sayfayı kontrol ediyorum eğer bir kullanıcı girişi yok ise bu tüm sayfa cache gösteriyorum o alanda zaten giriş yap, kayıt vb. görünüyor ama eğer giriş yapmış ise o dediğim diğer cache gösteriyorum.
Böylelikle o 2 alanı ayırmış oluyorum tabi bunun için yapının bu mantığa uygun olması gerekir ne gibi post edilecek sayfayı cache dışında tutman gerekir yoksa cevap alamazsın cache çalışacağı için yazdığın kodlar işlemeyecektir.
Örneğin Tayfun ERBİLEN Udemy üzerinde Php Eğitim Setinde kullandığı mvc yapısını ele alalım.
Onun bir controller
ve birde views
alanı bulunuyor sen eğer cache bu gibi yapı da kalkıp views
alanında kullanıyorsan cache kullanmanın bir anlamı yok.
Cache niye kullanıyoruz aynı sorguları her seferinde tekrar tekrar yapmamak için bu yüzden bu gibi bir yapı da controller
alanında sorguların üstünde kullanmalısın ki sorgular 1 sefer yapılsın daha sonra sayfa açıldığın da aynı sorgular sorgulanmasın.
Soruya geri dönelim neydi soru sağ veya solda giriş yap var ise mesela bunu erbilenin yapısında kullanamazsın.
Neden onun yapısı bu tür bir cache kullanımına uygun değil ama uygulanabilir hale getirebilirsin
Örneğin;
Giriş yapmamış ise; Cache sistemini controller'ın başında başlatabilirsin.
Giriş yapmış ise; cache kullanacağın için sorgularını bir sınıfta tutmalısın ve kullanırken direk view içinde sınıf içindeki fonksiyonu çağırarak sorgunu yapacaksın.
Bunu neden yapıyoruz çünkü eğer giriş yapmış ise header'dan sonra cache başlatacaksın sorgular sınıftan geleceği için controllerı kapsamayacak böylece giriş yapılmış ise sadece içeriği cachelersin, giriş yapılmamış ise tüm sayfayı cachlemiş olursun.
Tabi bu verdiğim erbilen'in yapısı için geçerli.
Merhaba
bu bir sorun değil aslında bir önlem ama gene de bu önlemi kaldırmak mümkün.
Kullandığın mysql sürümü fark etmez hepsinde my.ini
dosyası bulunuyor bu dosyayı açıp
ister CTRL
+F
ile istersen de tek tek bakarak sql_mode
kelimesini bul bulduktan sonra içinde yazan değeri değiştirister CTRL
+F
ile istersen de tek tek bakarak sql_mode
kelimesini bul bulduktan sonra içinde yazan değeri değiştireceksin.
Eğer tüm kontrolleri kaldırmak istiyorsan sql_mode=""
olarak içi boş şekilde kaydedip mysql yeniden başlat. Ama sadece bazı değerleri string
gibi kaldırmak istiyorsan ozaman da aralarında STRICT_TRANS_TABLES
kelimesini bulup sil ve kaydet bu ikisi de sorunu çözecektir.
- Bir eksik daha cevapladığım soruyu daha sonra düzenleyemiyorum yanlış bir değer yazdığın da öylece kalıyor düzenleyebilirsek sorunsuz bir yazım olmuş olur.
- Soruyu soran kişi cevaplar arasında doğru cevabı işaretler ise ve bu işaretlenen cevap yorumlar da en üste sabitlenir ise çözüme yönelik sorular ortaya çıkar.
- Üstteki maddeye ek olarak birde ziyaretçilerin soruya verilen cevaplara puan verebilmeleri olabilir ben sorun yaşadığım da stackoverflow da çözüm arıyorum bazen işaretlenen cevap doğru cevap olmayabiliyor alternatif cevaplara bakıyorum ve arasından doğru cevap olanlar oluyor.
- Yanlışlık ile soruya cevap verirken bir yere tıkladım ve geri döndüğüm de yazdığım her şey silinmişti. Forumlarda kullanılan form içine yazılan değerleri cache'de tutabilirsin bu eğer olurda yanlışlık ile bir yere tıkladığın da onca yazlan şeyi tekrar yazmak zorunda bırakmaz insanları ki sırf bu yüzden soruyu yanıtlamaktan bile vazgeçebiliyor insan.
Merhaba,
Soru biraz eksik kalmış anlamam için yardımcı ol lütfen. Şimdi sormak istediğin şey bir Müşteri tablon bulunuyor.
Bu tablo üzerinde musteri_tutar,musteri_durum
olarak 2 adet konu ile alakalı sütün bulunuyor bu sütünların musteri_durum
olanı 0
veya 1
şeklinde ödendi, ödenmedi gibi değer tutuyor.
Bu anladığım kadarı anlamadığım kısım ise musteri_tutar
kısmı şimdi eğer musteri_durum
alanında ödendi ve ödenmedi diye değer tutacaksan ödenen tutarı da tutacak bir sütün oluşturman gerekir yada ayrı bir tablo yaparak bunu ayrıştırman gerekir.
Soruya yazdığın örnek üzerinden bir çözüm sunayım.
<?php
// İlk olarak sorgu da select ile sadece musteri_tutarını değil müsteri durumunuda alacaksın
$Fiyat=$db->prepare("SELECT SUM(musteri_tutar) AS sayi,musteri_durum FROM musteri");
$Fiyat->execute();
$FiyatYaz= $Fiyat->fetch(PDO::FETCH_ASSOC);
// daha sonra
if ($FiyatYaz['musteri_durum'] == 1) {
echo echo "Ödenen Toplam Para: ".$FiyatYaz['sayi']." TL";
}else {
echo "Ödenmeyen Toplam Para: ".$FiyatYaz['sayi']." TL";
}
Bu şekilde bunu dediğim gibi gösterdiğin örneğe göre sunuyorum eğer istediğin bu ise bu şekilde yapabilirsin.
merhaba
Altta verdiğim fonksiyonu kullanarak bu tür dışardan girilen kodları önleyebilirsin daha önce bu konudan dolayı müzdarip olduğum için zamanında böyle bir fonksiyon hazırlamıştım.
form üzerinden gelen içerik yazısını bu bug_crusher
fonksiyonundan geçirir isen benim standart olarak izin verdiğim zararsız bir kaç html koda izin verir ve onclick
gibi kodları da her bir yazıyı filtreden geçirerek temizlemiş olursun.
Fonksiyonu kullanırken benim standart olarak ayarladığım kelimeler yetersiz gelir ise 2 inci bir argüman olarak istediğin filtreleri girerek sadece o kodlara izin verebilirsin.
function bug_crusher($text,$filter = null){
if (!$filter) {
$filter = '<p><a><span><strong><u><img><div><code><b><i><h1><h2><h3><h4><h5><h6><h7><em><s><blockquote><iframe><embed></embed><pre></pre><address><kbd><small><ul><li><ol><sub><sup><table><tr><td><th><tbody><thead>';
}
$text = strip_tags(htmlspecialchars_decode(stripcslashes($text)), $filter);
$text = preg_replace('/([onON]+)([a-zA-Z]+)(\s+|)=(\s+|)(["\']+)(.*?)(["\']+)/','', $text);
return htmlspecialchars(trim($text));
}
Örnek bir kullanım;
<?php
$icerik = '
<a href="#" onclick="alert(\'Tıkladın\');">Tıkla Bakalım</a>
<script>alert("2 inci kod girdisi");</script>
<p>Masum bir paragraf</p>
';
function bug_crusher($text,$filter = null){
if (!$filter) {
$filter = '<p><a><span><strong><u><img><div><code><b><i><h1><h2><h3><h4><h5><h6><h7><em><s><blockquote><iframe><embed></embed><pre></pre><address><kbd><small><ul><li><ol><sub><sup><table><tr><td><th><tbody><thead>';
}
$text = strip_tags(htmlspecialchars_decode(stripcslashes($text)), $filter);
$text = preg_replace('/([onON]+)([a-zA-Z]+)(\s+|)=(\s+|)(["\']+)(.*?)(["\']+)/','', $text);
return htmlspecialchars(trim($text));
}
// Standart Kullanım
echo bug_crusher($icerik);
# Çıktı
# <a href="#" >Tıkla Bakalım</a>
#<p>Masum bir paragraf</p>
// Özelleştirilmiş Kullanım - Script koduna izin verme
echo bug_crusher($icerik,'<p><script><a>');
# Çıktı
# <a href="#" >Tıkla Bakalım</a>
#<script>alert("2 inci kod girdisi");</script>
#<p>Masum bir paragraf</p>
?>
Kullanımı gayet basit ve açık onclick
değeri isterse OnCliCk
gibi yazsın fark etmez filtre yakalayıp silecektir.