Bu sorunun çok detaylar içeren cevapları var. Burada yazmak zor. Ama Youtube üzerinde "php haber sitesi yapımı" diye yazdığımda 2-3 ilgili sonuç çıktığını gördüm. "php yönetim paneli yapımı" üzerine daha da çok içerik var. Bunları izlemeli, denemelisiniz. Blog yapmak ile haber sitesi yapmak aynı mantığa dayanır: Bir wysiwyg editör yardımıyla sayfa oluşturup veritabanına kaydetmek.
Kabaca söylemek gerekirse:
Veritabanınızda her haber için bir satır kayıt tutarsınız. Bu satırda string halde haberin içeriğinin html kodlarını tutarsınız.
Haberi görüntülemek istediğinizde id'si ile haberi veritabanından çeker, html'i sayfaya basarsınız.
Şimdi böyle söyleyince anlamak zor. Eğitimleri izlemeli ve aynen yaparak kendiniz görmelisiniz.
$forbidden = ['2022-06-11', '2022-06-12', '2022-06-18', '2022-06-19', '2022-06-25', '2022-06-26'];
$allDatesExceptForbidens = [];
$now = date('Y-m-d');
for($i=0; $i<30; $i++) {
$thisDate = date('Y-m-d', strtotime("$now + $i days"));
if(in_array($thisDate, $forbidden)) continue;
$allDatesExceptForbiddens[] = $thisDate;
}
Bu şekilde bugünden itibaren 30 günü (?) $allDatesExceptForbiddens dizisine aktarmış olursunuz.
Ama tabi 30 günden mesela 4 forbidden tarih denk gelmişse 30 değil 26 günü elde etmiş olursunuz.
Peki tam 30 gün elde etmek için ne yapabiliriz?
$forbidden = ['2022-06-11', '2022-06-12', '2022-06-18', '2022-06-19', '2022-06-25', '2022-06-26'];
$allDatesExceptForbidens = [];
$now = date('Y-m-d');
$targetDateCount = 30;
for($i=0; $i<$targetDateCount; $i++) {
$thisDate = date('Y-m-d', strtotime("$now + $i days"));
if(in_array($thisDate, $forbidden)) { $targetDateCount++; continue; }
$allDatesExceptForbiddens[] = $thisDate;
}
Hedef tarih sayısı olarak 30 dedik. Eğer for döngüsü istenmeyen bir tarihe denk geldiyse hedef tarih sayısını 1 artırarak döngünün fazladan 1 kere daha dönmesini sağladık. Böylece tam olarak 30 gün elde edene kadar dönmeye devam edecek.
Peki mesela tam 30 gün değil de bulunduğumuz ayın son gününe kadar olan bütün tarihleri elde etmek isteseydik?
$forbidden = ['2022-06-11', '2022-06-12', '2022-06-18', '2022-06-19', '2022-06-25', '2022-06-26'];
$allDatesExceptForbidens = [];
$now = date('Y-m-d');
$targetDateCount = (int)date('t',strtotime($now));
$dayOfToday = (int)date('d', strtotime($now));
$targetDateCount -= $dayOfToday;
for($i=0; $i<=$targetDateCount; $i++) {
$thisDate = date('Y-m-d', strtotime("$now + $i days"));
if(in_array($thisDate, $forbidden)) continue;
$allDatesExceptForbiddens[] = $thisDate;
}
Bu sefer de ayın son gününden bugünü çıkarıp döngünün bu sayıda dönmesini sağladık. Ayın son gününe kaç gün varsa, forbidden date'ler hariç, hepsini elde ettik.
Sonuç olarak elde ettiğimiz tarihleri echo ile yazdırmak istiyorsak:
// html içine alt alta yazmak için:
echo implode('<br>', $allDatesExceptForbiddens);
// textarea gibi bir yere yazmak için:
// echo implode('\n', $allDatesExceptForbiddens);
Not: Kodları onlinephp.io sitesinde test ettim.
Kullanıcı "kaan" yazdığı zaman hangi ürünleri veya hizmetleri göstereceksiniz? "kaan" burada bir ürün/hizmet sağlayıcısı mı?
Varsayımsal olarak cevap vereceğim. Diyelim ki:
Kullanıcı geldi ve "kaan" adlı ürün/hizmet sağlayıcısının tüm ürünlerini/hizmetlerini görmek istedi ve arama kutusuna "kaan" yazdı.
MySQL'deki products tablonuz:
id
item_title
item_supplier
item_price
MySQL'deki services tablonuz:
id
service_title
service_supplier
service_price
SELECT
products.id ad item_id, products.item_title, products.item_supplier, products.item_price,
services.id as service_id, services.service_title, services.service_supplier, services.service_price
FROM
products
INNER JOIN
services ON products.item_supplier = services.service_supplier
WHERE
products.item_supplier LIKE '%kaan%'
Bu sorguda products tablosuyla services tablosunu products.item_supplier = services.service_supplier koşulunu sağlayacak şekilde birleştirdik sağlayıcı ifadesinin içinde "kaan" ifadesinin geçmesi gerektiğini söyledik.
Emin değilim ama sanırım sorun şurada olabilir:
$_SESSION["kullanici_giris"] değerine "yes" veya "no" değerlerinden birini atıyorsunuz. Yani $_SESSION'a "kullanici_giris" key'i atıyorsunuz.
Ama kontrolü yaparken $_SESSION["guvenlik"]["kullanici_giris"] şeklinde kontrol ediyorsunuz. Yani $_SESSION'ın "guvenlik" key'inin "kullanici_giris" key'ine bakıyorsunuz.
Algoritmanızı bilmiyorum ama gözünüzden kaçmış olabilir.
$_SESSION["kullanici_giris"] = "yes"; ve $_SESSION["kullanici_giris"] = "no";
yazan yerleri
$_SESSION["guvenlik"]["kullanici_giris"] = "yes"; ve $_SESSION["guvenlik"]["kullanici_giris"] = "no"; olarak düzeltmeniz gerekiyor olabilir.
isset() fonksiyonu true veya false döner ve sadece değişkenin varlığını ve varsa değerinin null olup olmadığını kontrol eder.
Ayrıca "" ifadesi de if içinde false kabul edilir. Çünkü "" ifadesi PHP tarafından 0 elemanlı bir dizi olarak algılanır. Zaten elemanı olmayan bir array de PHP'de if içinde false kabul edilir.
Kodunuzu, yorumlayıcının anladığı şekilde adım adım bakacak olursak,
$_SESSION["guvenlik"]["kullanici_giris"] değişkeninde null haricinde bir değer varsa:
if (isset($_SESSION["guvenlik"]["kullanici_giris"]) == "") { exit("izinsiz işlem tespit edildi."); }if(true == "") { exit("izinsiz işlem tespit edildi."); }if(true == false) { exit("izinsiz işlem tespit edildi."); }if(false) { exit("izinsiz işlem tespit edildi."); }- koşul sağlanmadığı için if bloğu atlandı.
Veya $_SESSION["guvenlik"]["kullanici_giris"] değişkeninde null haricinde bir yoksa veya bu değişken hiç oluşturulmamışsa:
if (isset($_SESSION["guvenlik"]["kullanici_giris"]) == "") { exit("izinsiz işlem tespit edildi."); }if(false == "") { exit("izinsiz işlem tespit edildi."); }if(false == false) { exit("izinsiz işlem tespit edildi."); }if(true) { exit("izinsiz işlem tespit edildi."); }- koşul sağlandığı için if bloğuna girildi ve
exitile yorumlama durduruldu.
Yani aslında kodlar istediğiniz işi yapıyor gibi görünüyor. Büyük ihtimalle siz bi'yerlerde $_SESSION["guvenlik"]["kullanici_giris"] değişkenine "" değeri atıyorsunuz. Yani session'ı oluşturuyorsunuz ama içine "" değeri atıyorsunuz. isset() fonksiyonu "" değeri de olsa bu durumda true döner. Yani isset()e göre değişken oluşturulmuştur ve değeri de sonuçta değer null değildir.
Eğer tek sorun buradaysa büyük ihtimalle paylaştığınız kodun yerine şunu yazarsanız sorun ortadan kalkacaktır:
// session hiç oluşturulmamışsa durdur. Oluşturulmuş ama değeri "" ise yine durdur:
if (!isset($_SESSION["guvenlik"]["kullanici_giris"])) exit("izinsiz işlem tespit edildi.");
if ($_SESSION["guvenlik"]["kullanici_giris"]=="") exit("izinsiz işlem tespit edildi.");
Elinizdeki verinin çıktısını nasıl elde ettiniz? Bu bir array mı yoksa object mi?
Sorunuzu #php ve #javascript şeklinde etiketlemişsiniz. Javascript'in bu sorudaki yeri nedir?
Ben varsayımsal olarak PHP'ye göre 2 cevap vereceğim.
Cevap 1:
Diyelim ki normalde elinizde key'leri belli olan böyle bir veri var:
$arr = [
["id"=>1, "location"=>'Abana', "locationId"=>37],
["id"=>2, "location"=>'Acıgöl', "locationId"=>50],
["id"=>3, "location"=>'Acıpayam', "locationId"=>20],
["id"=>4, "location"=>'Adaklı', "locationId"=>12],
["id"=>5, "location"=>'Adalar', "locationId"=>34],
["id"=>6, "location"=>'Adapazarı', "locationId"=>54],
["id"=>7, "location"=>'Adıyaman', "locationId"=>2],
["id"=>8, "location"=>'Adilcevaz', "locationId"=>13],
["id"=>9, "location"=>'Afşin', "locationId"=>46],
["id"=>10, "location"=>'Afyonkarahisar', "locationId"=>3],
["id"=>11, "location"=>'Ağaçören', "locationId"=>68],
["id"=>12, "location"=>'Ağın', "locationId"=>23]
];
Bahsettiğiniz şekilde bir dizi elde etmek için şu fonksiyonu kullanabilirsiniz:
$groupedArr = ["ilceler"=>[], "sehirID"=>[]];
for($i=0; $i < count($arr); $i++) {
$thisRecord = $arr[$i];
$groupedArr["ilceler"][] = $thisRecord["location"];
$gropedArr["sehirID"][] => $thisRecors["locationId"];
}
Cevap 2:
Diyelim ki normalde elinizde key'leri belli olmayan ama sıraları belli olan böyle bir veri var:
$arr = [
[1, 'Abana', 37],
[2, 'Acıgöl', 50],
[3, 'Acıpayam', 20],
[4, 'Adaklı', 12],
[5, 'Adalar', 34],
[6, 'Adapazarı', 54],
[7, 'Adıyaman', 2],
[8, 'Adilcevaz', 13],
[9, 'Afşin', 46],
[10, 'Afyonkarahisar', 3],
[11, 'Ağaçören', 68],
[12, 'Ağın', 23]
];
Bahsettiğiniz şekilde bir dizi elde etmek için şu fonksiyonu kullanabilirsiniz:
$groupedArr = ["ilceler"=>[], "sehirID"=>[]];
for($i=0; $i < count($arr); $i++) {
$thisRecord = $arr[$i];
$groupedArr["ilceler"][] = $thisRecord[1];
$groupedArr["sehirID"][] => $thisRecors[2];
}
isset() fonksiyonu ile bir değişkenin varlığını kontrol edebilirsiniz.
Bkz. PHP.net > isset
isset() fonksiyonu PHP 4.0 ve üstü sürümlerde çalışır.
Parametresinde verilen değişken varsa ve değeri null değilse true döner. Aksi halde false döner.
Uyarı: Sabitlerin tanımlı olup olmadığını öğrenmek için isset yerine defined(), fonksiyonu kullanın.
if (!isset($_SESSION['dil'])) {
header('Location:dil-sec.php');
exit();
}else{
require("dil/".$_SESSION["dil"].".php");
}
stackoverflow.com diyor ki:
Bu mümkün değil ama mümkün olsaydı bile bu bir "çözüm" olmazdı çünkü veriler başka yöntemlerle de görülebilir.
Güvenlik için farklı yöntemler kullanmalısınız. Tehlikeli verileri front-end'e göndermeyin veya veriyi görme yetkisine göre gönderin.
API'ınız yetkilendirmeyle çalışsın. Mesela elinde doğru token olmayan bir isteğe 401 dönsün. Yani servisten token almadan servisin diğer endpoint'lerine istek gönderilemesin.
Ama bahsettiğiniz şekilde istek atıldığını gizlemenin bir yolu yok. Tarayıcım bi'yere istek atıyorsa bunu görebilirim. Görebilmeliyim de zaten.
JQuery ile örnek kod hazırladım. İnceleyebilirsiniz:
<button id="open-sign-popup">Login / Sign Up</button>
<div id="sign-popup" class="my-popup">
<div class="my-popup-backdrop"></div>
<div class="my-popup-window">
<div class="my-popup-tabs">
<div class="my-popup-tab active">Oturum Aç</div>
<div class="my-popup-tab">Kayıt Ol</div>
</div>
<div id="sign-up" class="my-popup-tab-content">
<h1>Oturum Aç</h1>
<p>Buraya oturum açma formu gelecek.</p>
</div>
<div id="sign-in" class="my-popup-tab-content active">
<h1>Kayıt Ol</h1>
<p>Buraya kayıt olma formu gelecek.</p>
</div>
</div>
</div>
.my-popup {
position:fixed;
top:0;
left:0;
right:0;
bottom:0;
display:flex;
flex-direction:column;
z-index:-1;
pointer-events:none;
align-items:center;
justify-content:center;
opacity:0;
transition:opacity ease .3s, z-index .3s linear 0s;
}
.my-popup.active {
z-index:500;
opacity:1;
pointer-events:auto;
}
.my-popup > .my-popup-backdrop {
position:absolute;
top:0;
left:0;
right:0;
bottom:0;
z-index:1;
background:#00000080;
}
.my-popup > .my-popup-window {
position:relative;
z-index:2;
background:#fff;
display:flex;
flex-direction:column;
border-radius:10px;
box-shadow:0 5px 20px #00000040;
width:500px;
max-width:95%;
transform:scale(0.95);
transition:transform ease .3s;
}
.my-popup.active > .my-popup-window {
transform:scale(1);
}
.my-popup > .my-popup-window > .my-popup-tabs {
display:flex;
flex-directon:row;
width:100%;
}
.my-popup > .my-popup-window > .my-popup-tabs > .my-popup-tab {
flex:1;
display:flex;
align-items:center;
justify-content:center;
padding:25px 15px;
cursor:pointer;
color:#777;
font-weight:bold;
}
.my-popup > .my-popup-window > .my-popup-tabs > .my-popup-tab.active {
color:#000;
}
.my-popup .my-popup-window > .my-popup-tab-content {
display:flex;
visibility:hidden;
height:0;
opacity:0;
pointer-events:none;
}
.my-popup .my-popup-window > .my-popup-tab-content.active {
visibility:visible;
flex-direction:column;
height:auto;
padding:15px;
transition:opacity ease .3s;
opacity:1;
pointer-events:auto;
}
const $signPopup = $("#sign-popup");
// Butona tıklandığında popup'ımıza active class'ı basılsın. Böylece popup açılmış olacka.
$("#open-sign-popup").on("click",function(){ $signPopup.addClass("active"); });
// popup'taki siyah arkaplana tıklanırsa popup kapansın.
$signPopup.on("click", ".my-popup-backdrop", function() {
const $contents = $(this).closest(".my-popup").removeClass("active");
});
// popup'taki sekmelere tıklanınca, sekmeyle aynı sıradaki içerik görüntülensin.
$signPopup.on("click", ".my-popup-tabs > .my-popup-tab", function() {
const $thisTab = $(this);
$thisTab.siblings().removeClass("active");
$thisTab.addClass("active");
// Tıklanan sekmenin kaçıncı sırada olduğunu bul:
const indexOfThisTab = $thisTab.index();
const $contents = $thisTab.closest(".my-popup-window").find(".my-popup-tab-content");
// Tıklanan sekme kaçıncı sıradaysa o sıradaki içeriği aktif et.
$contents.removeClass("active").eq(indexOfThisTab).addClass("active");
});
Burada JQuery ile sadece neye ne zaman active class'ı verileceğini ayarladık. Animasyon işini tamamen CSS'e bıraktık.