Merhaba. PHP dizinizin içinde kimsenin görmemesi gereken bir veri yoksa dizinizi javascript'e iletmelisiniz. Böylece sayfa içinde dizinizdeki değerleri dilediğiniz gibi gösterebilirsiniz. (PHP dizinizdeki değerleri javascript'le değiştiremezsiniz. Javascript'le değiştirdiğiniz veriden PHP'nin haberi olmaz.)
<script>
const vary_info = <?=json_encode($vary_info)?>;
console.log(vary_info);
</script>
Eğer dizinizde çok büyük bir değer varsa bu yöntem performans kaybına neden olur. Söylediğiniz gibi sadece görüntüleneceği zaman ilgili veriyi ajax yardımıyla PHP'den istemek sayfanın açılış hızını olumlu etkileyecektir.
Ama yine söylediğiniz gibi bu sefer de aynı isteğin tekrar tekrar ajax ile PHP'den istenmesi sorunu olabilir. Bu da sunucuyu gereksiz yorar.
Sunucunun gereksiz yorulmasını önlemek için attığınız istekleri bir javascript değişkeninde tutabilirsiniz. Böylece aynı isteği yeniden atmanız gerektiğinde önce bu değişkeninize bakıp bu isteğin daha önce alınmış bir yanıtı olup olmadığını kontrol edersiniz ve gereksiz yere aynı isteği tekrar atmamış olursunuz. Yani attığınız her isteği cache'lemiş olursunuz.
Bunu yaptığınızda tarayıcının kullandığı ram miktarını bir miktar şişirmiş olursunuz. Eğer her bir istekten gelen veri çok büyük boyutluysa bu da çok ram harcamak demektir ama bence bu durum göz ardı edilebilir.
Eğer ram'in de çok şişmesini istemiyorsanız veriyi tarayıcının hafızasına kaydetmelisiniz. Yani bahsettiğiniz gibi local storage veya session storage burada size yardımcı olur. Tabi bunların 5'er mb sınırı (Chrome için) olduğunu da unutmamak lazım.
Eğer aldığınız veriyi session storage'a kaydedecekseniz önce string'e çevirmelisiniz çünkü bu storage'ler sadece string veri tutuyorlar.
<script>
sessionStorage.setItem("vary_info", JSON.stringify(<?=json_encode($vary_info)?>));
const vary_info = JSON.parse(sessionStorage.getItem(vary_info));
console.log(vary_info);
</script>
Bu örnekte session storage'ı kontrol ederseniz verinizin orada tutulduğunu görebilirsiniz. Veriniz json formatına uygun olduğu için tarayıcınız size veriyi json gibi gösterebilir ama aslında tutulan veri string'dir. Bu yüzden kullanmak istediğiniz zaman JSON.parse() fonksiyonu ile string'i json'a dönüştürmelisiniz.
Bu örnekte veriyi ram'da tutmak yerine storage'da tuttuk diyebilir miyiz? Diyemeyiz. Sonuçta veriyi okumak için yine bir değişkene aktarıyoruz ve aynı veri ram'da da yer kaplıyor. Burada session storage'ın bize sağladığı şey, sayfa yenilense bile bu veriyi kaybetmeyecek olamız. Ama tarayıcı kapatıldığı zaman bu veri kaybolabilir.
Tarayıcı kapatıldığı zaman da veri saklansın istiyorsak session storage yerine local storage kullanabiliriz. Kullanımı session storage ile birebir aynı. yine .setItem(key, value) ve .getItem(key) fonksiyonlarına sahip.
Bana göre; PHP ile tüm verileri sayfaya çağırmak yerine sadece sayfa ilk yüklendiğinde görünecek olan verilerin sayfaya çekilmesi daha uygundur.
Eğer kullanıcı diğer verileri görecekse ajax isteği atılır ve PHP'den gerekli veriler istenir. Aynı zamanda yapılan istek ve isteğin sonucu bir js değişkeninde (ram'de) tutulur.
Her ajax isteğinde önce bu değişken kontrol edilir ve yeniden istek atılıp atılmayacağı buna göre belirlenir. Daha önce atılmış istek tekrar atılmaz. (ta ki sayfa yenilenenene kadar)
Bunu nasıl yaparız? Mesela bir select'in change olayıyla PHP'den veri isteyeceğiz diyelim:
// Yaptığımız istekleri cache'leyecek olan değişkenimiz:
const requests = [];
// #my-select id'li select elementinin change olayı tetiklendiğinde çalışacak fonksiyon:
$("select#my-select").on("change", function() {
// Bu elemente kolayca (ajax fonksiyonu içinden de) erişebilmemiz için bir değişkene alıyoruz.
const $this = $(this);
// Ajax isteğimiz sonlanana kadar bu element'in kullanıcı tarafından tekrar değiştirilememesi gerekiyor. Elementi disabled edelim.
$this.prop("disabled",true);
// Kullanıcının seçtiği değeri alalım.
const value = $this.val();
// Ajax ile get isteği atılacak url'yi belirleyelim.
const url = "newdata.php?value="+value;
// Bu url'ye daha önce istek atılmış mı?
const lastRequest = requests.find(function(request) { return request.url === url });
// Eğer daha önce istek atılmışsa yeniden istek atmaya gerek olmadığı için veriyi direkt console'a yazdıralım.
if(lastRequest) {
console.log(lastRequest.data);
alert("Bu istek daha önceden atıldığı için yeniden ajax isteği atılmadı. Elimizdeki veri console'a yazıldı.");
// Bu adımdan sonra change olayının yapacağı başka bir işlem yok. select'in disabled değerini kaldırıp fonksiyonu return ile sonlandırabiliriz.
$this.prop("disabled", false);
return;
};
// Eğer buraya kadar geldiysek daha önce hiç istek atılmamış demektir. İsteği atabiliriz.
$.ajax({
url: url,
type: "get",
success: function(response) {
// Verimizi başarıyla aldıysak gelen veriyi console'a yazdıralım.
console.log(response);
alert("İlk kez istek atıldı ve veriler alındı. Console'a yazıldı.");
// Ayrıca bu veriyi cache'leyelim ki bi'daha bu istek atılmasın.
requests.push({url: url, data: response});
},
error: function(err) {
alert("Hata var!");
console.error("Ajax isteğinden hata döndü: ", err);
},
complete: function() {
// Olumlu veya olumsuz bir sonuç döndüğüne göre elementin disabled özelliğini kaldırabiliriz ki yeniden change edilebilsin.
$this.prop("disabled", false);
}
});
});
Kodları test etmeden yazdığım için hatalar olabilir. Ama aşağı yukarı kurgusal bir cevap yazdım sanıyorum. :)
Merhaba. Sorunuza varsayımsal bir cevap vermek istedim ama algoritmanızı nasıl kurduğunuzla ilgil çok fazla ihtimal var.
Sorunuzu biraz daha detaylandırmalısınız. "Bu şekilde bu sayfadan bu sayfaya veri gönderiyorum, bu şekilde işlemden geçirip bu şekilde sonlandırıyorum ve şu olsun istiyorum" şeklinde, kodlarınızdan da örnekler paylaşabilirseniz yardımcı olalım.
back-end dünyasında yeniyseniz bizim tahmin edemeyeceğimiz şekilde yanlış algoritma kurmuş olabilirsiniz.
Eğer bir input'un value'sini javascript ile değiştirmek istiyorsanız:
$myInput = $("#my-input");
const myInput_currentValue = $myInput.val(); // Input'un mevcuttaki value'sini aldık.
const myInput_newValue = myInput_currentValue.replaceAll(",",""); // Aldığımız değerdeki "," karakterlerini sildik.
$myInput.val(myInput_newValue); // Yeni oluşturduğumuz değeri input'un value'sine yazdık.
Veya bir input'ta bir değişiklik olduğu zaman bu işlemi yapmak istiyoruz diyelim:
$myInput = $("#my-input");
$myInput.on("input",function(){ // Input'a herhangi bir giriş olduğunda "input" adlı event çalışır.
const currentValue = $(this).val(); // Bu input'un value değerini aldık.
const newValue = currentValue.replaceAll(",",""); // Aldığımız değerdeki "," karakterlerini sildik.
$(this).val(newValue); // Bu input'un value'sine yeni değeri yazdık.
});
Ama mesela burada PHP kullanamazsınız. Sayfa kullanıcıya ulaştığı anda PHP ile bağlantısı sonlanır. Siz PHP'ye yeni bir istek atmadığınız sürece PHP sizin sayfanıza yapılan değişikliklerden haberdar olmaz.
Yani şöyle bir kullanımda verinin değiştiğini göremezsiniz:
<?php $myValue = "Merhaba, Dünya!"; ?>
<input type="text" value="<?=$myValue?>" />
<script>
$myInput = $("#my-input");
$myInput.on("input",function(){ // Input'a herhangi bir giriş olduğunda "input" adlı event çalışır.
<?php $newValue = str_replace(",","",$myValue); ?>
$(this).val("<?=$newValue?>");
});
</script>
Çünkü tarayıcı sizin PHP kodlarınızı göremez. PHP kodlarınız sunucu tarafında işlenip sayfanız dümdüz bir string'e dönüştürülerek istemciye gönderilir. İstemci (tarayıcı) sizin <?php ?> gibi ifadelerinizi veya php değişkenlerinizi görmez. PHP kendine ait olan işlemlerin hepsini sunucu tarafında halledip gönderir.
Yani siz yukarıdaki kodu yazdığınızda aslında tarayıcıya şu kod iletilmiş olur:
<input type="text" value="Merhaba, Dünya!" />
<script>
$myInput = $("#my-input");
$myInput.on("input",function(){ // Input'a herhangi bir giriş olduğunda "input" adlı event çalışır.
$(this).val("Merhaba Dünya!");
});
</script>
Gördüğünüz gibi sunucu tarafında PHP yapacağı her şeyi yaptı ve kendini yazdığınız koddan tamamen arındırdıktan sonra sayfayı tarayıcıya gönderdi.
Böylece input'unuzda her "input" event'i gerçekleştiğinde aslında input'un değerini direkt "Merhaba Dünya!" olarak değiştir demiş olduk.
$("#yayinci").animate({ scrollTop: $("#yayinci").attr("scrollHeight") }, 1500); satırındaki
$("#yayinci").attr("scrollHeight") ifadesi size #yayinci elementinin scrollHeight attribute'sindeki değeri verir. Ama bu elementinizin böyle bir attribute'si yok.
Ayrıca siz #yayinci elementi içinde bir scroll yapmaya çalışıyorsunuz. Oysaki muhtemelen body elementinin scroll'unu kaydırmak istiyorsunuz.
Yani sanırım siz orda şunu demek istediniz: $("body").animate({ scrollTop: $("#yayinci").offset().top}, 1500);
Hata diyor ki:
C:\xampp\htdocs\datayukle\class.upload.php dosyasındaki 2662.satırda, küme parantezleri ile bir array veya string elemanına erişim söz dizimi kullanılmış ama bu söz dizimi artık desteklenmiyor.
Kullandığınız Verot class'ının uyumlu olduğu PHP sürümü ile sizin sunucunuzdaki PHP sürümü uyumsuz gibi görünüyor.
Muhtemelen kullandığınız Verot class'ı PHP'nin 7.4 versiyonundan önceki versiyonlara göre yazılmış ve şöyle bir kullanımla array veya string bir değişkenin index'ine ulaşılmaya çalışılmış: $degisken{0}
PHP 7.4'ten itibaren bu yöntem kullanımdan kaldırıldı ve şu şekilde köşeli parantezli kullanım zorunlu oldu: $degisken[0]
3 yoldan biriyle çözebilirsiniz:
1) Sunucunuzdaki PHP versiyonunu 7.4'ün altında bir sürüme düşürün. Tabi bu başka sorunlara neden olabilir.
2) Hatalı satırı düzeltin: Örnek verdiğim gibi küme parantezli bir kullanım varsa bunu köşeli paranteze çevirin.
3) Verot class'ınızı daha güncel bir versiyonuyla değiştirin. (tavsiyem)
Roblox oyununu ve API'ını hiç bilmediğim için kısa bir araştırdım.
Google'da "roblox api" yazdığım zaman karşıma https://api.roblox.com/docs çıktı. Burada API'ın hangi endpoint'lerine nasıl istek atılacağı açıklanmış.
1) https://api.roblox.com/users/get-by-username?username=thandito şeklinde GET isteği attım ve sonuçta thandito adlı kullanıcının verileri geldi. Yani kullanıcı adından kullanıcı id'sini almak mümkün.
2) https://api.roblox.com/users/1 şeklinde istek atınca da id'si 1 olan kullanıcının verileri geldi. Yani id'den kullanıcı adı almak da mümkün.
Sizin işinize yarayacak olan endpoint 1.si olabilir. Ama bu endpoint, kullanıcı adının tamamının doğru şekilde (büyük-küçük harf duyarlı değil) yazılmasını istiyor. Yani thandito yazdığınızda Thanditoy, thanditop2k11, thanditoni gibi diğer kullanıcı adlarını bu yolla alamıyorsunuz.
Bu durumda tüm kullanıcıları kendi sisteminize çekmeyi denemeyi düşünebilirsiniz. Yani id ile arama yapıp 1'den x'e kadar kaç kullanıcı varsa hepsini kendi sisteminize ekleyip, aramaları kendi sisteminiz içinde kendi algoritmanıza göre yapmayı düşünebilirsiniz.
Az sayıda kullanıcı olsa bu uygun bir çözüm olabilirdi ama acaba kaç kullanıcı var diye bi'deneme yaptım ve yüksek bir Id değeri denedim.
https://api.roblox.com/users/3629318000 şeklinde istek attım ve sonuç döndü. Yani sistemlerinde şu an kayıtlı 3.629.318.000'den fazla kullanıcı kaydı var ve sürekli artmaya devam ediyor.
Bir script yapıp şu ana kadar kaydolmuş tüm kullanıcıların verilerini almak amacıyla tek tek her kullanıcı için istek atmak isterseniz ve bu işlemi çok hızlı yaparsanız sistem sizi saldırı yaptığınızı düşünerek engelleyecektir. 1 saniyede 1 istek atarsanız da işleminiz 40 günden uzun sürer.
Yani kullanıcı adı üzerinden arama yapıp kullanıcı adının tamamının doğru girilmesini sağlamalısınız.
Yine de bu API'ı kullanmanız geçici bir çözüm olacak gibi görünüyor. Çünkü şöyle bir uyarı koymuşlar:
Merhaba geliştiriciler. Platformumuzun güvenilirliğini artırmak ve ölçeklenebilirliği geliştirmek için ApiProxy'yi kullanımdan kaldırıyoruz. Daha fazla bilgi için https://devforum.roblox.com/t/action-needed-sunsetting-apirobloxcom/1796897 adresine bakın.
Bahsettiği linkte de demiş ki:
15 Temmuz 2022'den itibaren, api.roblox.com'dan API endpoint'leri kaldırmaya başlayacağız. Tüm endpoint'lerin yıl sonuna kadar kaldırılması planlanıyor.
Bu değişiklik yalnızca üçüncü taraf sunuculardan, tarayıcı eklentilerinden veya araçlardan api.roblox.com'a istekte bulunan geliştiricileri etkiler.
Sadece Roblox oyun motorunun içinde geliştirme yapıyorsanız herhangi bir değişiklik yapmanıza gerek yok.
Lütfen api.roblox.com'a dayanan tüm araçları, tarayıcı eklentilerini veya üçüncü taraf sitelerini aşağıda listelenen daha yeni uç noktalara güncelleyin.
Buralarda dolaşırken bir API daha gördüm: https://users.roblox.com/docs
Şöyle bir istek attım: https://users.roblox.com/v1/users/search?keyword=thandito&limit=10
10 kullanıcıyla sınırlı olmak üzere "thandito" kelimesiyle arama yapıp birkaç kullanıcıyı döndürdü. Bu tam aradığınız şey.
Ama sanırım bunun da kullanımını kaldıracaklar. Zaman ayırıp detaylı okumak lazım. Şu an benim gibi herhangi birine veri sunan bu API'ların kullanımını sonlandırıp sadece kayıtlı geliştiriciler için bi'şeyler sunmayı mı planlıyorlar bilemedim.
Muhtemelen herkesin istek atmasını önleyerek hem saldırıların bir kısmının önüne geçmek hem de sunucularını biraz daha rahatlatmak istiyorlar.
Demem o ki, buraları kurcalayıp işinize yarar bi'şeyler bulabilirsiniz.
Deneyip yapamadığınız bi'şey varsa doğrudan kodlarınız üzerinden yorum yapabiliriz.
// input olayı gerçekleştiğinde sayı veya "." karakteri hariç her şeyi sil:
<input oninput="this.value=this.value.replaceAll(/[^\d\.]/g, '');">
Doğru. Bir fonksiyon çalıştırılırken return ifadesine denk geldiği anda fonksiyon sonlanır. return ifadesinden sonraki satırlar çalıştırılmaz.
Örneğin:
function test() {
const a = 10;
const b = 15;
const c = 35;
return a + b;
return a + b + c;
}
// Çıktı: 25
function test() {
const a = 10;
const b = 15;
const c = 35;
if(a+b >= 30) { return a + b; } // Koşul sağlanmadığı için if bloğu çalışmadı ve bu return işletilmedi.
return a + b + c;
}
// Çıktı: 70
function test() {
let a = 0;
for(let i=0; i < 30; i++) {
if(a > 10) return a; // a değeri 11'e ulaştığı zaman if koşulu sağlanacağı için return işletilir ve fonksiyon sonlanır. Haliyle for döngüsü de bu noktadan sonra çalışmaz.
a++;
}
return a;
}
// Çıktı: 11
Aşağıdaki örnekte myButton id'li bir butona click olayını işliyoruz.
Butona tıklandığında butonda wait adında bir class var mı diye kontrol ediyoruz. Varsa hiçbir işlem yapılmaması için return ifadesi koyuyoruz.
Sonraki satır işletiliyorsa wait adında bir class yok demektir. Bu class'ı butona ekliyoruz.
setTimeout yardımıyla 5 saniye sonra wait class'ını butondan siliyoruz.
Haliyle butona ilk tıkladığımızda konsola "BUTON ÇALIŞTI" yazacak. Sonra 5 saniye boyunca butona ne kadar tıklarsak tıklayalım "BUTON ŞU AN MEŞGUL" yazacak ve return sayesinde bundan sonraki satırlar işletilmeyecek.
Bu şekilde mesela bir ajax isteği yapıyorsanız, ajax isteği sonlanıncaya kadar butona tekrar tekrar basıldığında tekrar tekrar ajax isteği atılmasını önleyebilirsiniz.
$("#myButton").on("click", function() {
const $thisButton = $(this);
if($thisButton.hasClass("wait")) {
console.log("BUTON ŞU AN MEŞGUL");
return;
}
$thisButton.addClass("wait");
console.log("BUTON ÇALIŞTI");
setTimeout(function() { $thisButton.removeClass("wait"); }, 5000);
});
name ve class bölümlerini doğru şekilde eklemişsiniz.
value ekleme işini label'i clone'ladığımız yerde yapabiliriz.
$item.find("span").text(sehir.ilceleri[i]); satırının hemen altına
$item.find("input[type=checkbox]").val(sehir.ilceleri[i]); satırını ekleyebilirsiniz.
codepen.io pen'ini de düzenledim.
Direkt çalışmasını istiyorsan da aynı yöntemi kullanabilirsin. Mesela:
<div class="ekleyen">
İlanı Kim Ekledi ?:
<div id="ekleyen">...</div>
<script>
function ekleyenn(parametre1, parametre2, parametre3) {
const element = document.getElementById("ekleyen");
// Bu elemente ulaştıktan sonra üzerinde istediğin manipülasyonu yapabilirsin.
// Mesela biz ilk parametreyi ve diğer 2 parametrenin toplamını elementin içine yazalım:
element.innerHTML = parametre1 + ": " + (Number(parametre2) + Number(parametre3));
}
ekleyenn("Ekleyen Adı",10, 20);
</script>
</div>