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.
Sorunu daha net açıklar mısınız?
İsteğiniz: Kullanıcının tarayıcısı Türkçeyse hiçbir şey olmasın. Değilse /en sayfasına yönlensin.
Sorununuz: Kullanıcının tarayıcısı İngilizceyse (Türkçe değilse) /en adresine yönleniyor.
Zaten istediğiniz şey olmuyor mu?
Öncelikle yönlendirme işlemini front-end kısmında değil back-end kısmında yapmanızı tavsiye ederim.
Front-end kısmında yapacaksanız, kullanıcının tarayıcısına 3-4 şekilde veri eklemeniz mümkün: Local Storage, Session Storage, IndexedDB, Cookies.
Bunlardan birine istediğiniz bir veriyi ekleyebilir ve ziyaretçiler her geldiğinde bu verinin varlığını kontrol edebilirsiniz. Böylece bu tarayıcıda tek seferlik çalışacak kodlar yazmanız mümkün olur.
Örneğin:
// Local Storage'deki "isFirst" key'inin değerini alalım.
let isFirst = localStorage.getItem("isFirst");
// Eğer aldığımız değer null ise bu tarayıcıya daha önce girilmediğini anlıyoruz.
if(!isFirst) {
// Local Storage'deki "isFirst" key'ine bir değer yazalım.
// Böylece birdahaki istekte "isFirst" key'i boş olmayacağı için ziyaretçinin ilk kez gelmediğini anlayabileceğiz.
localStorage.setItem("isFirst", "1");
// Böylece mesela ilk kez siteye giriş yapan birine "Seninle tanıştığıma memnun oldum" diyebiliriz.
const browserLang = navigator.language || navigator.userLanguage;
if(browserLang == "tr-TR" || browserLang == "tr") alert("Seninle tanıştığıma memnun oldum!");
else alert("I'm glad to meet you!");
}
Belki bu örnek yapmak istediğiniz şeyle ilgili ipucu verir.
Eğer siz kullanıcının tarayıcı diline göre Türkçe sayfaya hiç uğramadan /en'e gitmesini istiyorsanız bunu back-end tarafında çözmelisiniz.
Örneğin PHP ile tarayıcı dilini yakalamak için aşağıdaki gibi bir kod kullanabilirsiniz:
<?php
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
$acceptLang = ['fr', 'it', 'en'];
$lang = in_array($lang, $acceptLang) ? $lang : 'en';
require_once "index_{$lang}.php";
?>
Kaynak: stackoverflow
Bu kadar yardımcı olabiliyorum...
SELECT * FROM categories WHERE id = ? sorgunuz yeterli olmalı.
Eğer categories tablonuzda category_id diye bir sütununuz varsa bu zaten dönecektir.
Veritabanına döngü içinde çok sayıda istek atmamanızı öneririm. Nasıl bir istek atacaksanız onu PHP ile kurgulayıp veritabanından tek seferde cevap almaya çalışmanız veritabanını daha az yoracaktır.
Aşağıdaki örnekte 4 kategoriniz varmış gibi düşünelim.
Veritabanına foreach içinde istek atmayı kaldırdığımız için veritabanına 4 kez istek atmak yerine sadece 1 kez istek atabilecek hale getirmiş oluyoruz. posts tablosuna attığımız istekle birlikte 5 yerine 2 istekte veritabanından sonuçlarımızı alabiliyoruz.
function getUrl($url){
global $db;
$query = $db->prepare('SELECT * FROM posts WHERE url = ?');
$query->execute([$url]);
$data = $query->fetch(PDO::FETCH_ASSOC);
$idValues = [];
foreach($data as $dataItem) $idValues[] = "id = $dataItem["id"]";
// $idValues dizisi içinde şuna benzer bir veri oluştu: ["id=1", "id=2", "id=4", "id=12"]
$idValues = implode(" OR ", $idValues);
// $idValues şu string'e döndü: "id=1 OR id=2 OR id=4 OR id=12"
$query = $db->prepare("SELECT * FROM categories WHERE $idValues");
$query->execute();
$categories = $query->fetchAll();
return $categories;
}
$cats = getUrl("url verisi");
echo "ilk category_id verisi: ".$cats[0]->category_id;
Aslında daha da ileri gidip tek sorguda iki tabloyu birleştirerek sonuç almak en güzel.
<ul id="liste">
<li>
<div class="yorum">YORUM 1</div>
</li>
<li>
<div class="yorum">YORUM 2</div>
<ul>
<li>
<div class="cevap">CEVAP 2.1</div>
</li>
<li>
<div class="cevap">CEVAP 2.2</div>
</li>
<li>
<div class="cevap">CEVAP 2.3</div>
<ul>
<li>
<div class="cevap">CEVABA CEVAP 2.3.1</div>
</li>
</ul>
</li>
</ul>
</li>
<li>
<div class="yorum">YORUM 3</div>
<ul>
<li>
<div class="yorum">YORUMA YORUM 3.1</div>
</li>
</ul>
</li>
</ul>
#liste {
padding:20px 0;
display: flex;
flex-direction: column;
position:relative;
}
#liste ul {
display: flex;
flex-direction: column;
padding-left: 15px;
position:relative;
}
#liste ul li {
display: flex;
flex-direction: column;
}
#liste div {
display: flex;
padding:20px;
margin:5px 0;
}
#liste div.yorum {
background:#ccc;
}
#liste div.cevap {
background:#eee;
}
5.satırda string'inizi bitirmişsiniz sonra birleştirme operatörü (nokta) kullanmadan 6.satırda yeni bir string'e başlamışsınız.
5.satırın sonuna nokta koyarsanız düzelecektir. Ama benim tavsiyem:
Verileri satır satır olacak şekilde bir değişkende birleştirin. Kafanız karışmasın.
$html = '';
foreach ($sorgu as $deg) {
$html .= '<div class="kutu">';
$html .= ' <div class="icerik">';
$html .= ' <a href="#">';
$html .= ' <img src="' . $deg['kapakresmi'] . '" alt="">';
$html .= ' <p>' . $deg['konu'] . '</p>';
$html .= ' </a>';
$html .= ' </div>';
$html .= '</div>';
}
echo $html;
2012 yılında stackoverflow.com üzerinde sorunuza cevap verilmiş.
Web Sitesinde Bildirim Sesi Nasıl Verilir?
Belirli bir olay geliştiğinde web sitemin kullanıcıya bir bildirim sesi çıkarmasını istiyorum.
Sayfa açıldığında ses otomatik olarak oynatılmamalıdır. Bunun yerine bir olay gerçekleştiğinde javascript ile devreye sokulmalıdır.
Bunun eski tarayıcılarda (IE 6 gibi) çalışması da gerekiyor.
Yani basitçe 2 sorum var:
- Hangi codec bileşenini kullanmalıyım?
- Ses dosyasını gömmek için en iyi yol nedir? (
<embed>,<object>,<audio>, Flash...)
Doğru Cevap
2021 Çözümü
function sesOynat(url) {
const audio = new Audio(url);
audio.play();
}
<button onclick="sesOynat('https://dosyaniz.mp3');">Oynat</button>
Tarayıcı Desteği
Edge 12+, Firefox 20+, Internet Explorer 9+, Opera 15+, Safari 4+, Chrome
Codec Desteği
Sadece mp3
Eski Çözüm
(eski tarayıcılar için)
function sesOynat(dosyaAdi){
var mp3Source = '<source src="' + dosyaAdi + '.mp3" type="audio/mpeg">';
var oggSource = '<source src="' + dosyaAdi + '.ogg" type="audio/ogg">';
var embedSource = '<embed hidden="true" autostart="true" loop="false" src="' + dosyaAdi +'.mp3">';
document.getElementById("sound").innerHTML='<audio autoplay="autoplay">' + mp3Source + oggSource + embedSource + '</audio>';
}
<button onclick="sesOynat('bing');">Oynat</button>
<div id="sound"></div>
Tarayıcı Desteği
<audio>Modern tarayıcılar için<embed>Eski tarayıcılar için
Codec Kullanımı
- Chrome, Safari ve Internet Explorer için MP3
- Firefox ve Opera için OGG