<input id="sayi" type="number" placehoder="Sayı" />
<input id="toplanacak" type="number" min="0" placehoder="Toplanacak" />
<input id="cikarilacak" type="number" min="0" placehoder="Çıkarılacak" />
<input id="sonuc" type="text" readonly />
var $sayi = $("#sayi");
var $toplanacak = $("#toplanacak");
var $cikarilacak = $("#cikarilacak");
var $sonuc = $("#sonuc");
function sonucBul() {
var sayi = Number($sayi.val());
var toplanacak = Number($toplanacak.val());
var cikarilacak = Number($cikarilacak.val());
if(isNaN(sayi) || isNaN(toplanacak) || isNaN(cikarilacak) { $sonuc.val("Hatalı Giriş!"); return; }
$sonuc.val(sayi + toplanacak - cikarilacak);
}
$sayi.on("blur keyup", sonucBul);
$toplanacak.on("blur keyup", sonucBul);
$cikarilacak.on("blur keyup", sonucBul);
Bu js komutları html oluşturuldan sonra (input'ların alt satırında kalacak bi'yerlerde) yazılmalı. Aksi halde input'lar henüz DOM'da oluşmadığı için javascript id'ler ile input'ları seçemeyecektir.
Eğer javascript'in input'lardan önce çalıştırılması gerekiyorsa (head tag'ında çağırılması gerekiyorsa mesela) o zaman javascript'e "doküman hazır olduğu zaman çalış" demek lazım:
$(document).ready(function() {
// ... yukarıdaki komutlar
});
$ilceler = json_decode($datas->ilceler);
print("<pre>$ilceler</pre>");
Webview istekleri X-Requested-With: application.package.name
şeklinde bir header gönderiyor olmalı.
Gratis bu tip bir header'ın varlığını kontrol ediyor olabilir. Her şeyi doğru yapıyorsanız, mesela başka url'le denediğinizde başka bir siteye girebiliyorsanız ama sadece gratis'e giremiyorsanız Gratis sizi engelliyor olabilir.
Kaynak olarak Google'a "mysql where kullanımı" yazdığımda karşıma ilk çıkan sonuç: tasarimkodlama.com/veritabani/mysql/mysql-where-kullanimi
Burada nasıl koşullu veri çekebileceğinizi öğrenebilirsiniz.
Ben yine de bi'kaç örnek vereyim:
WHERE koşulu ile sorgularınızda koşul belirtebiliyorsunuz. @rephp7'nin de yazdığı gibi şu şekilde sorgunuzu çalıştırabilirsiniz:
SELECT * FROM urunler WHERE product_status=1
Böylece urunler tablonuzdaki product_status sütununun değeri 1 olan tüm ürünleri çekmiş olursunuz.
SELECT id, product_name, product_quantity FROM urunler WHERE product_status=1
Böylece urunler tablonuzdaki product_status değeri 1 olan tüm ürünlerin sadece id, product_name ve product_quantity sütunlarını çekmiş olursunuz. Veritabanından sadece işinize yarayacak olan sütunları çekmek önemlidir. Çok aktif istekler geldiğinde veritabanıyla ilişkiniz mümkün olduğunca az olmalı.
SELECT * FROM urunler WHERE product_status <> 0
Böylece urunler tablonuzdan product_status değeri 0'dan farklı olanları (1 olabilir, 2 olabilir, -1 olabilir...) istemiş olursunuz.
SELECT * FROM urunler WHERE product_status = 1 AND product_quantity > 0
Böylece urunler tablonuzdan product_status değeri 1 olan ve product_quantity değeri 0'dan büyük olan tüm ürünleri istemiş olursunuz.
Mesela tablonuzda tükenmiş ürünleri göstermeyecekseniz veritabanından onları istememelisiniz. Adeti 0'dan büyük olanları istediğinizde veritabanından daha az ürün çekmiş olursunuz.
SELECT * FROM urunler WHERE product_status = 1 AND product_quantity > 0 AND product_price >= 10 AND product_price <= 100
Böylece urunler tablonuzdan product_status değeri 1 olan ve product_quantity değeri 0'dan büyük olan ve product_price değeri 10'a eşit veya büyük ve 100'e eşit veya küçük olan tüm ürünleri çekmiş olursunuz.
Yani sadece statüsü 1 olan, adeti tükenmemiş olan ve fiyatı 10-100 lira arası olan ürünleri çekmiş olursunuz.
SELECT * FROM urunler WHERE product_status = 1 AND ((product_quantity > 0 AND product_price >= 10 AND product_price <= 100) OR product_quantity = 0)
Böylece urunler tablonuzdan miktarı 0'dan büyük olup da fiyatı 10-100 arası olan veya miktarı 0 olanları (fiyatına bakılmaksızın) istemiş olduk.
engine=2 parametresine özel css çağırmak
http://sitem.com/search?q=ayakkabı&engine=1
şeklinde istek yapıldı diyelim.
istek yapılan sayfadaki parametreleri şu şekilde alabiliyorsunuz:
$engine = isset($_GET["engine"]) ? $_GET["engine"] : null;
Böylece eğer engine parametresi gelmişse değerini aldınız. Gelmediyse null aldınız.
CSS'i çağırdığınız yerde şöyle bir php kodu kullanabilirsiniz:
<?php if($engine && $engine=="2") { ?>
<link rel="stylesheet" href="engine.css" />
<?php } ?>
Böylece eğer engine parametresi geldiyse ve değeri de 2 ise belli bir css dosyasını çağırmış olursunuz.
Eğer engine parametresinin varlığını sunucu taraflı değil istemci taraflı belirlemek ve stil dosyasını ona göre çağırmak istiyorsanız şöyle bir kod yardımcı olabilir:
// url'den parametreleri alan bir fonksiyon oluşturuyoruz.
function getUrlParameters() {
// url'deki parametre kısmını alıyoruz. Diyelim ki url şu: http://sitem/search?q=ayakkabı&engine=2
let parameters = window.location.search; // Şu string'i elde ettik: "?q=ayakkabı&engine=2"
// "?" karakterinden kurtuluyoruz:
parameters = parameters.replace("?",""); // Şu string'i elde ettik: "q=ayakkabı&engine=2"
// Eğer elimizde bi'şey kalmamışsa hiç parametre yok demektir.
if(parameters=='') return {}; // Eğer herhangi bir değer elde etmediysek fonksiyonumuz boş obje dönecek.
// Elimizde kalan kısmı "&" karakterlerinden parçalıyoruz:
parameters = parameters.split("&"); // Şu diziyi elde ettik: ["q=ayakkabı","engine=2"]
// Fonksiyonumuzun döneceği objeyi boş halde oluşturuyoruz:
const obj = {};
// Sonra parameterelerimizi tek tek dönüyoruz:
for(let i=0; i < parameters.length; i++) {
// Şu an baktığımız parametre hangisiyse onu "=" karakterinden parçalıyoruz.
const parameterParts = parameters[i].split("="); // Mesela i=0 için şunu elde ettik: ["q","ayakkabı"]
const key = parameterParts[0];
const value = parameterParts[1];
// Bazen url'lerde aynı key'den 2 tane olabilir. Yani q=ayakkabı&engine=2&size=24&size=25&size=26 gibi olabilir.
// Bu durumda size key'ine birkaç değer atanmak istenmiş diyebiliriz.
// Haliyle bizim her bir key'imizin birkaç değeri olabileceği için değerleri dizi olarak tutmalıyız.
// Eğer şu an baktığımız key daha önce hiç oluşturulmamışsa boş dizi olarak oluşturalım.
if(!obj[key]) obj[key] = [];
// Şimdi bu key'in değeri olan diziye değerimizi push edelim.
obj[key].push(value); // Objemize şunu eklemiş olduk: { "q": ["ayakkabı"] }
}
// Döngü tamamlanınca obj değeri şöyle oldu: { "q":["ayakkabı"], "engine":["2"] }
// Artık fonksiyonumuz sonucu döndürebilir:
return obj;
}
Artık elimizde url'deki parametreleri alıp object haline getirebileceğimiz bir fonksiyonumuz var.
Bu fonksiyon ile parametreleri alalım ve engine değeri varsa ve değeri de 2 ise head tag'ına <link />
ekleyelim.
// Url'deki parametreleri object haline çevirerek alalım:
const urlParameters = getUrlParameters();
// Eğer parametrelerde "engine" diye bir key varsa ve bu key "2" değerini içeriyorsa işlemimizi yapacağız.
// Burada includes("2") dememizin nedeni, bir dizi içinde arama yapacak olmamız.
// Yani mesela şu istekte de bu if bloğu çalışır: "http://sitem/search?q=ayakkabı&engine=1&engine=2&engine=3"
if(urlParameters.engine && urlParameters.engine.includes("2")) {
// <link /> elementimizi javascript ile oluştuyoruz:
const link = document.createElement('link');
link.type = 'text/css';
link.rel = 'stylesheet';
link.href = 'assets/css/engine2.css';
// Oluşturduğumuz elementimizi DOM'a ekliyoruz:
document.head.appendChild(link);
}
codepen.io/ebykdrms/pen/zYRJKmw
Başlangıç olarak Adana > Ceyhan seçimi yapıyor. setSelectBoxes() fonksiyonuna göndereceğiniz veriye göre başlangıçta seçim yapacaktır.
Bunu başka siteler üzerinden değil de doğrudan kendi siteniz üzerinden yapmak istiyorsanız şöyle bir yol kullanabilirsiniz:
1) Veritabanında bir tablo açın ve tüm kısa linkleri ve bunların normal hallerini burada tutun.
2) Kısa linkleri kendinizce bir algoritmaya göre oluşturun. Çözülebilecek herhangi bir hash algoritması kullanabilir veya basit bir şifreleme oluşturabilirsiniz. Burada güvenlik problemimiz yok zaten. Belli bir url bilgisini şifreleyen ve şifrelenmiş url bilgisini çözebilen fonksiyonlar yazın.
3) Sayfala gelen tüm istekleri tek bir sayfa karşılayacak şekilde yönlendirin. (PHP için .htaccess ayarlamaları yaparak tüm istekleri index.php'ye yönlendirin.)
4) Sayfaya gelen tüm GET parametrelerini belli bir değişkene bağlayın. (PHP için, .htaccess'te tüm parametreleri url adında bir anahtara bağlayın.)
5) Sayfaya gelen bu parametreyi okuyun ve bir kontrolden geçirerek kısa kod algoritmanıza uyup uymadığını kontrol edin.
6) Değerin şifresini çözün ve gerçek url'yi elde edin.
7) Sayfayı gerçek url'ye yönlendirin. (PHP için header()
fonksiyonu ile yönlendirme yapın.)
Tabii ki burada yönlendirme işi sizin domain'inize bağlı. Yani sizin domaininiz "prototurk.com" ise kısa linkiniz de mesela "proturk.com/sl1345" gibi bi'şey olacak. Domain'i bizzat kısaltmanız mümkün değil diye biliyorum. Bunun yerine kısa linkleri yönetmek için ayrı bir domain satın alabilirsiniz. mesela "pt.xyz" gibi bir domain'iniz olursa, bu domain'den gelen istekleri belli bir sayfaya yönlendirirsiniz ve o sayfa da sizi doğru link'e yönlendirir. "pt.zyz/sh1234" gibi bir link kullanabilir hale gelirsiniz.
Tüm bunları kendiniz yapmak istemiyorsanız bu hizmeti sunan sitelerden faydalanabilirsiniz. Google'a "kısa link oluşturma" diye yazdığınızda karşınıza birkaç tane çıkacaktır. Muhtemelen onlar da bu mantığı kullanıyorlardır. Bu hizmetin ücretli, ücretsiz ama süre kısıtlamalı versiyonları var sanırım.
Biraz da pratik bir örnek vermek gerekirse:
Diyelim ki "prototurk.com" domaini sizin. Paylaşımlı bir hosting üzerinde PHP ile çalışıyorsunuz. Veritabanını falan araya sokmadan şöyle bir örnek yapalım:
1) Kök klasörünüzde shortlinks.php adında bir dosya oluşturun ve içine şu diziyi ekleyin:
$shortLinks = ["sl1" => "akis", "sl2" => "kesfet", "sl3" => "makaleler"];
Böylece hangi kısa link'in hangi sayfaya gideceğini belirledik.
2) Kök klasörünüzde .htaccess dosyası oluşturun ve içine şunları yazın:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
Böylece domain'e gelen tüm istekleri index.php dosyasına yönlendirdik ve parametre değerlerini url key'ine topladık.
3) Kök klasörünüzde index.php dosyası oluşturun ve içine şunları yazın:
<?php
// Artık tüm istekler bu sayfada karşılanacak ve gerekli sayfalar buraya include edilecek.
// Diğer sayfalarda url hiyerarşisi sorunu yaşamamak için url'leri hep kök dizinden başlatacağız.
// Bu nedenle sabit değişkenler oluşturuyoruz.
define('ROOT_PATH', $_SERVER['DOCUMENT_ROOT']);
define('ROOT_URL', (!empty($_SERVER['HTTPS']) ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST']);
// Eğer bir php sayfasına url üzerinden doğrudan erişilmek istenirse istenmeyen açıklar doğabilir.
// Çağırılan sayfanın doğrudan mı çağırıldığı yoksa index.php'ye include edilerek mi çağırıldığını kontrol edebilmek için her sayfada kontrol edeceğimiz bir sabit değişken oluşturuyoruz.
define('PAGE_ACCESS',true);
// "prototurk.com/soru/5982-domain-nasil-kisa-link-olustururum" gibi bir istek geldiyse
// $_GET['url'] = 'soru/5982-domain-nasil-kisa-link-olustururum' olur.
// Biz bu değeri alıp "/" karakterlerinden parçalayıp ona göre hangi sayfanın istendiğini bulacağız ve bu sayfaya include ile çağıracağız.
$urlLink = isset($_GET['url']) ? $_GET['url'] : "homepage";
$urlLink = trim($urlLink, '/\t\r\0\x08');
$urlLink = explode('/', $urlLink); // $urlLink = ['soru','5982-domain-nasil-kisa-link-olustururum'] şeklinde bir dizi elde etmiş olduk.
// Sayfamızın adını tutacak değişkenimizi oluşturalım. Varsayılan olarak şimdilik ilk parametreyi atayalım.
$pageName = $urlLink[0];
// İlk parametreye bakalım ve bizim kısa linklerimizden biri olup olmadığını kontrol edelim.
// Eğer bu sayfalardan biriyse gerçek sayfa adını alalım ve işlemi burada durdurarak gerçek link'e yönlendirme yapalım.
include('shortlinks.php');
if(isset($shortLinks[$pageName])) {
$pageName = ROOT_URL."/".$shortLinks[$pageName];
header("Location:$pageName");
exit("Yönlendiriliyor...");
}
// Bu satıra kadar gelindiyse linkteki değer bizim kısa linklerimizden biri değilmiş demektir.
// Buradan sonra $urlLinks dizisindeki değerlere göre hangi sayfanın istendiği tespit edilip o sayfa include edilecek.
$pageName = $urlLinks[0];
// Mesela hiç parametre gelmediyse, yani direkt "prototurk.com" olarak istek atıldıysa biz $pageName'e şu an varsayılan olarak "homepage" değerini atadık.
// Başka bi'şey de gelmiş olabilirdi. Mesela "prototurk.com/makaleler" gelmiş olsaydı $pageName'e "makaleler" değerini atamış olacaktık.
// Elde ettiğimiz ada sahip php uzantılı bir dosya var mı diye kontrol edelim.
// Eğer kök klasörümüzde php uzantılı böyle bir dosya yoksa sayfa adımız 404 olsun.
if(!file_exist("$pageName.php")) $pageName = "404";
// Bu satıra kadar geldiysek dosyamıza da var demektir.
// Mesela "prototurk.com" veya "prototurk.com/homepage" şeklinde gelen istekler için "homepage.php" dosyamız var.
// Mesela "prototurk.com/makaleler" şeklinde gelen istekler için "makaleler.php" dosyamız var.
// Mesela "prototurk.com/asdkfjşasldfj" şeklinde gelen istekler için "404.php" dosyamız var. (Var mı diye kontrol etmedik ama olmalı.)
// Artık sayfayı include edebiliriz:
include("$pageName.php");
Daha sonra homepage.php, makaleler.php, 404.php gibi sayfalarımızı kök dizine oluşturabiliriz. Bu sayfaların her birinin başında PAGE_ACCESS
sabitinin oluşturulup oluşturulmadığını da kontol etmeliyiz.
Mesela 404.php sayfası şöyle olabilir:
<?php if(!defined('PAGE_ACCESS')) exit("Bu sayfaya doğrudan erişim yetkiniz yok."); ?>
<html>
<head>
<title>Sayfa Bulunamadı</title>
<style>
* { margin:0; padding:0; box-sizing:border-box; }
html,body { height:100%; }
body { display:flex; align-items:center; justify-content:center; }
h1 { display:flex; text-align:center; line-height:1; color:#333; }
</style>
</head>
<body>
<h1>404 - SAYFA BULUNAMADI!</h1>
</body>
</html>
Elbette bu yolu kullanarak sadece kısa linklerin değil, aslında MVC altyapılı bir sistemin de temelini atmış oluyorsunuz. Ayrıca SEO dostu url meselesine de el atmış oluyorsunuz.
Kodları test etmeden yazdığım için sorunlar, hatalı yazımlar, mantık hataları vs. olabilir. Ama temelde anlatmak istediğimi anlatabildiğimi umuyorum.
Sorunuzun benzeri stackoverflow.com'da sorulmuş.
Cevaben şöyle yazılmış:
Dokümantasyonda doğrudan bununla ilgili bir örnek var:
SELECT * FROM table WHERE SUBSTRING(field, -4) = '.png'
Burada son 4 hanesi ".png" olanları seçmiş. Siz "JPG" olmayanları seçmek istiyorsunuz:
SELECT
ptc.product_id,
p.sort_order
FROM
my_product_to_category ptc
INNER JOIN
my_product p ON p.product_id=ptc.product_id
WHERE
ptc.category_id=20
AND LENGTH(p.image)>2
AND p.status=1
AND p.quantity>0
AND SUBSTRING(p.image, -3) <> 'JPG'
ORDER BY
p.sort_order
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.