Merhaba. Soru-cevap bölümünü kullanırken karşılaştığım önemli bir ihtiyaç var.
Biri benim adımı @ebykdrms diye etiketlediğinde bana bildirim gelmeli. Bir cevabımda anlaşılmayan bi'şey olduğunda kullanıcılar bunu bana ana soruya cevap olarak soruyorlar ve bana bildirim gelmediği için bu durumu kaçırıyorum. Böyle olunca kullanıcılar yeni sorularını boş yere yeni bir başlık açarak sormak zorunda kalıyorlar.
Eğer benim cevabıma karşılık yeni bir soru soracaklarsa bunu adımı etiketleyerek yapabilirler. Ben de bildirim aldığımda cevap verebilirim.
Kısacası, bir kullanıcı bir cevap yazarken veya cevap düzenlerken benim kullanıcı adımı etiketlerse bana bildirim gelmesi gerekiyor.
Merhaba,
örnek kodunuzu inceledim. countdownInterval
değişkenini IftarSahurHesapla
fonksiyonu içinde tanımladığınız için SetInterval
fonksiyonunuzda aslında istediğiniz countdownInterval
değişkenine değer atamıyorsunuz. Aslında yeni bir countdownInterval
değişkeni oluşturuyorsunuz. Aynı şekilde StopInterval
fonksiyonunuzda da countdownInterval
değişkenine ulaşamadığınız için istediğiniz interval'i durduramamış oluyorsunuz.
countdownInterval
değişkenini, 3 fonksiyonun da kapsayıcısı olan bir blokta tanımlamalısınız. Yani aslında function IftarSahurHesapla()
satırınızın bir satır üstünde tanımlarsanız 3 fonksiyon da aynı değişkene ulaşabilecektir.
function IftarSahurHesapla(targetLocationId)
{
var countdownInterval = null;
var $test = $("#imsakiye").eq(0);
//...
yerine
var countdownInterval = null;
function IftarSahurHesapla(targetLocationId)
{
var $test = $("#imsakiye").eq(0);
//...
Bir de interval'i durdurduktan sonra yeniden başlatmalısınız. Yani
if(countdownInterval == null) {
SetInterval(BugunImsakDate, bugunAksamDate, yarinImsakDate, $countdown);
}
else{
StopInterval(countdownInterval);
}
yerine
if(countdownInterval == null) {
SetInterval(BugunImsakDate, bugunAksamDate, yarinImsakDate, $countdown);
}
else{
StopInterval(countdownInterval);
SetInterval(BugunImsakDate, bugunAksamDate, yarinImsakDate, $countdown);
}
veya SetInterval
fonksiyonu her halükârda çalıştırılacağı için şu 2 satır da aynı işi görür:
if(countdownInterval) StopInterval(countdownInterval);
SetInterval(BugunImsakDate, bugunAksamDate, yarinImsakDate, $countdown);
Bir hata yapmış olmalısınız. Verdiğiniz linkte JS kodlarını şu şekilde düzenlediğimde bir sorunla karşılaşmadım:
$(function(){
IftarSahurVakti(9146);
$('#sehirler option[value="9402"]').prop("selected", true);
});
// global olarak interval'i tutacak bir değişken oluşturuyorum:
var countdownInterval = null;
function IftarSahurVakti(targetLocationId)
{
var $test = $("#imsakiye").eq(0);
$countdownName = $test.find("#test-countdown-name");
$countdown = $test.find("#test-countdown");
var now = new Date();
var tomorrow = new Date(now);
tomorrow.setDate(tomorrow.getDate()+1);
$.ajax({
type:"get",
url:"https://namaz-vakti-api.herokuapp.com/data?region="+targetLocationId,
success:function(response){
var todayImsak = response[0][1].split(":");
var todayAksam = response[0][5].split(":");
var tomorrowImsak = response[1][1].split(":");
var todayImsakDate = new Date(now.getFullYear(), now.getMonth(), now.getDate(), todayImsak[0], todayImsak[1], 0);
var todayAksamDate = new Date(now.getFullYear(), now.getMonth(), now.getDate(), todayAksam[0], todayAksam[1], 0);
var tomorrowImsakDate = new Date(tomorrow.getFullYear(), tomorrow.getMonth(), tomorrow.getDate(), tomorrowImsak[0], tomorrowImsak[1], 0);
if(now <= todayImsakDate) $countdownName.text("Sahura kalan süre:");
else if(now > todayImsakDate && now <=todayAksamDate) $countdownName.text("İftara kalan süre:");
else $countdownName.text("Sahura kalan süre:");
calculateCountdown(todayImsakDate, todayAksamDate, tomorrowImsakDate, $countdown);
// daha önce oluşturulmuş bir interval varsa onu kaldırıyorum.
if(countdownInterval) clearInterval(countdownInterval);
// Yeni oluşturacağım interval'i global interval değişkenime atıyorum.
countdownInterval = setInterval(function() {
calculateCountdown(todayImsakDate, todayAksamDate, tomorrowImsakDate, $countdown);
},1000);
}
});
}
function calculateCountdown(imsakDate, aksamDate, tomorrowImsakDate, $element) {
now = new Date();
var targetDate = null;
if(now <= imsakDate) targetDate = imsakDate;
else if(now > imsakDate && now <=aksamDate) targetDate = aksamDate;
else targetDate = tomorrowImsakDate;
var hours = parseInt((targetDate - now) / (1000 * 60 * 60) % 24);
var minutes = parseInt((targetDate.getTime() - now.getTime()) / (1000 * 60) % 60);
var seconds = parseInt((targetDate.getTime() - now.getTime()) / (1000) % 60);
$element.text(hours + " saat " + minutes + " dakika " + seconds + " saniye");
}
Merhaba,
Ajax isteği sonucunda size metod adı ve parametreler dönüyor ama fonksiyonu ne iş yaptığı dönmüyorsa sanırım bu fonksyonlar sizin sitenizde önceden hazırlanmış olarak bekliyorlar. Siz sadece ajax isteği sonucunda hangi fonksiyonun hangi parametrelerle çalışacağını belirlemeye çalışıyorsunuz. Eğer durum buysa, fonksiyonlarınızı şu şekilde tanımladığınızı varsayalım:
var app = {
merhabaYazdir: function(parametreler=[]) {
var parametreSayisi = parametreler.length;
var ad = parametreSayisi>0 ? parametreler[0] : "";
var soyad = parametreSayisi>1 parameterler[1]; : "";
console.log("Merhaba "+ad+" "+soyad);
},
hoscakalYazdir: function(parametreler) {
var parametreSayisi = parametreler.length;
var ad = parametreSayisi>0 ? parametreler[0] : "";
var soyad = parametreSayisi>1 parameterler[1]; : "";
console.log("Hoşçakal "+ad+" "+soyad);
}
}
Şimdi ajax'tan şöyle bir sonuç geldi diyelim:
{
"sinif": "app",
"method": "merhabaYazdir",
"parametreler": ["Adım", "Soyadım"]
}
Bu durumda ajax'ın success fonksiyonunda şu şekilde bir yazım, fonksiyonu çalıştıracaktır:
function success(response) {
window[response.sinif][response.method](response.parametreler);
}
@ilkertuncer cevap doğruysa doğru cevap
olarak işaretler misin? Bu soru Çözülmemiş Sorular başlığında listelenmesin.
Fotoğraf küçültme konusunda 4 tane başlık açmışsın. Cevap beklemelisin.
O konuda benim önerim foroğrafı front-end tarafında boyutlandırman ve ajax ile bu değeri PHP'ye göndermen.
9 gün önce açtığın Php ile veritabanına görsel yüklerken farklı 2 boyutta küçültülerek (croplanmadan) farklı iki klasöre ve veritabanına yüklenmesi başlığına fırsat bulursam bir cevap yazarım. Gerçi oraya zaten bir cevap yazmışım. 2 gün geçtiği için cevabımı düzenleyemem ama fırsat bulursam orada bahsettiğim yönteme göre yeni bir cevap gönderirim. Bu konuda tekrar tekrar başlık açmak yerine açtığın başlıktan cevap beklemelisin. Cevap gelene kadar internetten araştırabilirsin. Örneğin:
stackoverflow.com: php resize image on upload
stackoverflow.com: PHP upload and resize image
stackoverflow.com: Scale Image Using PHP and Maintaining Aspect Ratio
Bunlardan biri mutlaka işini görüyordur.
PHPMailer Örneği
Basit bir örnek paylaşıyorum.
PHPMailer Kütüphanesi
github.com/PHPMailer/PHPMailer
index.html
<div id="form">
<input name="name" type="text" placeholder="Ad Soyad" />
<input name="email" type="email" placeholder="E-posta" />
<textarea name="message"></textarea>
<button data-type="send-mail">Gönder</button>
</div>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="sendmail.js"></script>
sendmail.js
var $form = $("#form");
var $name = $form.find("[name='name']");
var $email = $form.find("[name='email']");
var $message = $form.find("[name='message']");
var $submitButton = $form.find("[data-type='send-mail']");
$submitButton.on("click",function(){
$submitButton.prop("disabled", true);
$.ajax({
url: "sendmail.php",
data: { name:$name.val(), email:$email.val(), message:$message.val() },
type: "post",
dataType: "json",
success: function(response) {
alert("MAİL GÖNDERİMİ\n"+response.message);
if(response.type==="success") {
console.log("Mail gönderildi.");
}
else if(response.type==="error") {
console.warn("Mail gönderilemedi.");
}
else {
console.error("Mail gönderiminde beklenmedik bir response");
}
},
error: function(err) {
alert("HATA!");
console.log(err);
},
complete: function() {
$submitButton.prop("disabled", false);
}
});
});
sendmail.php
<?php
header('Content-Type: application/json');
date_default_timezone_set('Europe/Istanbul');
$fromName = "prototurk.com"; // Gönderen adı
$title = 'Web sitesinden mesaj var'; // Mail konusu
$mailFrom = '[email protected]';
$password = 'proto1234';
$mailTo = '[email protected]';
$host = 'smtp.yandex.com';
$port = 465;
$name = isset($_POST["name"]) ? htmlentities($_POST["name"]) : "<i style='color:#777'>Belirtilmedi</i>";
$email = isset($_POST["email"]) ? htmlentities($_POST["email"]) : "<i style='color:#777'>Belirtilmedi</i>";
$message = isset($_POST["message"]) ? htmlentities($_POST["message"]) : "<i style='color:#777'>Belirtilmedi</i>";
$date = date('d.m.Y H.i.s');
$ipAddress = $_SERVER['REMOTE_ADDR'];
$tableRowStyle = "display:table-row";
$tableCellStyle = "display:table-cell; padding:5px; border-bottom:1px solid #eee;";
$body = "<div style='display:table;'>";
$body .= "<div style='$tableRowStyle'><b style='$tableCellStyle'>Ad Soyad</b><span style='$tableCellStyle'>$name</span></div>";
$body .= "<div style='$tableRowStyle'><b style='$tableCellStyle'>E-posta</b><span style='$tableCellStyle'>$email</span></div>";
$body .= "<div style='$tableRowStyle'><b style='$tableCellStyle'>Mesaj</b><span style='$tableCellStyle'>$message</span></div>";
$body .= "<div style='$tableRowStyle'><b style='$tableCellStyle'>Gönderim Tarihi</b><span style='$tableCellStyle'>$date</span></div>";
$body .= "<div style='$tableRowStyle'><b style='$tableCellStyle'>IP Adresi</b><span style='$tableCellStyle'>$ipAddress</span></div>";
$body .= "</div>";
$altBody = "Ad Soyad: $name\n";
$altBody .= "E-posta: $email\n";
$altBody .= "Mesaj: $message\n";
$altBody .= "Gönderim Tarihi: $date\n";
$altBody .= "IP Adresi: $ipAddress\n";
include("PHPMailer.php");
include("SMTP.php");
include("Exception.php");
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
$mail = new PHPMailer(true);
try {
$mail->SMTPDebug = 0;
$mail->isSMTP();
$mail->CharSet = 'UTF-8';
//$mail->setLanguage('tr',"language/");
$mail->Host = $host;
$mail->SMTPAuth = true;
$mail->Username = $mailFrom;
$mail->Password = $password;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
$mail->Port = $port;
$mail->From = $mailFrom;
$mail->FromName = $fromName;
$mail->addAddress($mailTo);
$mail->isHTML(true);
$mail->Subject = $title;
$mail->Body = $body;
$mail->AltBody = $altBody;
$mail->send();
echo json_encode([
"type" => "success",
"message" => "Mesajınız gönderildi. Teşekkür ederiz."
]);
}
catch (Exception $e) {
echo json_encode([
"type" => "error",
"message" => "Bir sorun oluştu ve mesajınız gönderilemedi."
]);
}
exit;
Gelen tüm istekleri .htaccess dosyası yardımıyla index.php dosyanıza yönlendirin.
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
Burada, siteye gelen tüm istekleri index.php dosyasına yönlendirdik ve url'nin geri kalanını da get parametresi olarak url
key'ine atadık. Şimdi index.php dosyasında gelen url'yi alabiliriz. Gelen url değerinin ne olduğunu kendinize göre sorgulayabilir ve hangi sayfanın istendiğini kendi algoritmanıza göre anlayıp sayfayı include
edebilirsiniz.
Örnek olarak aşağıdaki örnekte gelen url isteğini alıp "/" karakterlerinden parçalıyorum. Eğer hiç değer gelmemişse varsayılan değer olarak "anasayfa" diyorum. Aksi halde 4 adet değer dönmesini zorunlu tutuyorum: 3'ü tarih 1'i makale başlığı. Sonra da ilgili sayfayı include
ediyorum.
// index.php dosyanız
define('ROOT_URL', (!empty($_SERVER['HTTPS']) ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'].'/');
$urlLink = isset($_GET["url"]) ? mb_strtolower($_GET["url"], 'UTF-8') : 'anasayfa';
$urlLink = trim($urlLink, "/\t\r\0\x08");
if($urlLink == 'anasayfa') {
include("anasayfa.php");
exit();
}
$urlLink = explode("/", $urlLink);
$urlLinkCount = count($urlLink);
if($urlLinkCount !== 4) {
include("404.php");
exit();
}
echo 'Şu makaleye ulaşmaya çalışıyorsunuz: '.$urlLink[3].'<br>';
echo 'Tarih: '.$urlLink[2].'.'.$urlLink[1].'.'.$urlLink[0].'<br>';
echo 'Bu makaleyi bulup size getireceğim...';
exit();
Bu şekilde if-else
yapılarıyla sayfa yönlendirmelerinizi yapabilirsiniz. Elbette kodun çokça geliştirilmesi lazım ama her şeyi burada anlatmam mümkün değil. "seo dostu url php" gibi bir arama yapıp daha detaylı makaleler/videolar bulabilirsiniz.
Örneğin şöyle bir tablonuz var:
<div class="container">
<h2>Basic Table</h2>
<p>The .table class adds basic styling (light padding and only horizontal dividers) to a table:</p>
<table id="myTable" class="table">
<thead>
<tr> <th> Firstname </th><th> Lastname </th><th> Email </th></tr>
</thead>
<tbody>
<tr> <td> John </td><td> Doe </td><td> [email protected] </td></tr>
<tr> <td> Mary </td><td> Moe </td><td> [email protected] </td></tr>
<tr> <td> July </td><td> Dooley </td><td> [email protected] </td></tr>
</tbody>
</table>
</div>
Bootstrap'ta table
class'ı varsayılan olarak width: 100%
stiline sahip. CSS ile bu işlemi overload edin.
#myTable { width:auto !important; }
İki ürünü birden foreach
döngüsüne sokmuşsunuz. <article>
'lardan sadece birini döngüye sokmalısınız. Ama ilk ürünün görünümü farklı olduğu için ya ilk ürünü döngüye almayacaksınız ya da döngüde kontrol edip farkı ekleyeceksiniz. Aynı şekilde mesela her iki üründen birinin <article>
elementindeki class'ında farklılık varsa bunu da döngü içinde PHP ile kontrol edip farklı eklemelisiniz.
<?php
$yenigelenurunekle_index_sorgusu = "SELECT * FROM yenigelenurunekle";
$yenigelenurunekle_index_sorgusu_query = mysqli_query($db, $yenigelenurunekle_index_sorgusu);
?>
<div class="new-product-slider owl-carousel owl-nav-style">
<?php foreach($yenigelenurunekle_index_sorgusu_query as $yenigelenurunekle_index_goster) { ?>
<?php
$resim = 'images/yenigelenurunekle/'.$yenigelenurunekle_index_goster['yenigelenurunekle_resim'];
$baslik = $yenigelenurunekle_index_goster['yenigelenurunekle_baslik'];
?>
<div class="product-inner-item">
<article class="list-product">
<div class="img-block">
<a href="single-product.html" class="thumbnail">
<img class="first-img" src="<?=$resim?>" alt="" />
</a>
<div class="quick-view">
<a class="quick_view" href="#" data-link-action="quickview" title="Quick view" data-bs-toggle="modal" data-bs-target="#exampleModal">
<i class="ion-ios-search-strong"></i>
</a>
</div>
</div>
<ul class="product-flag">
<li class="new">New</li>
</ul>
<div class="product-decs">
<a class="inner-link" href="shop-4-column.html"><span>STUDIO DESIGN</span></a>
<h2><a href="single-product.html" class="product-link"><?=$baslik?></a></h2>
<div class="rating-product">
<i class="ion-android-star"></i>
<i class="ion-android-star"></i>
<i class="ion-android-star"></i>
<i class="ion-android-star"></i>
<i class="ion-android-star"></i>
</div>
<div class="pricing-meta">
<ul>
<li class="old-price">€23.90</li>
<li class="current-price">€21.51</li>
<li class="discount-price">-10%</li>
</ul>
</div>
</div>
<div class="add-to-link">
<ul>
<li class="cart"><a class="cart-btn" href="#">ADD TO CART</a></li>
<li>
<a href="wishlist.html"><i class="ion-android-favorite-outline"></i></a>
</li>
<li>
<a href="compare.html"><i class="ion-ios-shuffle-strong"></i></a>
</li>
</ul>
</div>
</article>
</div>
<?php } ?>
</div>
undefined variable
tanımlanmamış değişken demek. Birçok ihtimal var.
Sizin veriGetir()
fonksiyonunuz mutlaka dolu bir dizi dönecek diye varsayıyorsunuz.
$ayarlar
değişkeniniz false
değildir ama belki de boş dizidir. Yani $ayarlar[0]
diye sıfırıncı index'i yoktur mesela. Böylece siz olmayan bir index altındaki baslik
değerini almaya çalışıyorsunuz.
Eğer sorun buysa bir if
ile gelen değer var mı yok mu diye inceleyebilirsiniz.
$ayarlar = $db -> veriGetir("ayarlar","WHERE id= ?",array(1),"ORDER BY id ASC",1);
if($ayarlar != false && count($ayarlar)>0){
$sitebaslik = $ayarlar[0]['baslik'];
$siteanahtar = $ayarlar[0]['anahtarkelime'];
$siteaciklama = $ayarlar[0]['aciklama'];
$siteurl = $ayarlar[0]['url'];
}
else {
echo "Boş değer döndü!";
exit();
}
Eğer sorun bu değilse, size veriGetir()
fonksiyonuntan tam olarak ne döndüğüne bakmanız gerekir. Bunu var_dump()
fonskiyonu ile yapabilirsiniz.
function getDatas($data) { echo "<pre>"; var_dump($data); echo "</pre>"; exit(); }
$ayarlar = $db -> veriGetir("ayarlar","WHERE id= ?",array(1),"ORDER BY id ASC",1);
getDatas($ayarlar);
Ekrana basılanları inceleyerek hangi veriye ulaşamadığınızı bulabilirsiniz.
DÜZENLEME
db
class'ınızı inceledim. Veritabanından dönen değerleri $datalar
değişkenine aktarıyorsunuz ama bunu return
etmiyorsunuz. Dolayısıyla $ayarlar
değişkeninize $datalar
dizinizdeki değerleri iletmemiş oluyorsunuz.
Ayrıca return etmiş olsanız bile, $datalar[] = array();
dediğiniz satırda aslında $datalar
dizinizin ilk elemanına boş dizi atıyorsunuz. Bu yüzden $ayarlar[0]
dediğinizde aslında elinizde boş bir dizi olur.
Kodunuzu aşağıdaki şekilde güncellemeyi deneyebilirsiniz:
class DB
{
private $db;
private $lastQueryString;
function __construct()
{
try { $this -> db = new PDO("mysql:host=localhost; dbname=admin; charset=utf8", 'root', ''); }
catch (PDOException $error) { echo $error -> getMessage(); exit(); }
$this->lastQueryString = "";
}
public function getLastQueryString() {
return $this->lastQueryString;
}
public function get($tableName, $where = '', $data = [], $orderby = '', $limit = ''){
$sql = "SELECT * FROM $tableName";
if(!empty($where)) $sql = "$sql WHERE $where";
if(!empty($orderby)) $sql = "$sql ORDER BY $orderby";
if(!empty($limit)) $sql = "$sql LIMIT $limit";
$this->lastQueryString = $sql;
$start = $this->db->prepare($sql);
$sonuc = $start->execute($data);
$veri = $start->fetchAll(PDO::FETCH_ASSOC);
return $veri;
}
}
Kullanırken de...
$db = new DB();
$ayarlar = $db->get('ayarlar', 'id=:id', ["id"=>1], 'id ASC', 1);
echo $db->getLastQueryString();
if(!empty($ayarlar)){
$sitebaslik = $ayarlar[0]['baslik'];
$siteanahtar = $ayarlar[0]['anahtarkelime'];
$siteaciklama = $ayarlar[0]['aciklama'];
$siteurl = $ayarlar[0]['url'];
}
Dikkat: Class adları mecburi olmasa da standart olarak büyük harfle başlar. Class adını değiştirdim. Sizinkiyle karışmaması için fonksiyon adını da veriGetir
yerine get
olarak değiştirdim.