Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

php Hata nerde ?


Öne çıkan mesajlar

Mesaj tarihi:

$rdesult = mysql_query("SELECT sonkg FROM `tanitim` WHERE sonkg >='$gun' AND (sonky ='$yil' AND sonka ='$ay') ORDER BY `sonkg` ASC LIMIT 0 , 7");
while($row = mysql_fetch_array($rdesult))
{
$betad=$row['sonkg'];
foreach( range(0,6) as $cnt )
{
$alfad =strtoupper( date('j',strtotime( "today + $cnt day") ) );
if($alfad!=$betad)
{
echo "<option value='" . $alfad . "'>" . $alfad . "</option>";
}
else
{
echo "";
}
}
}
Mesaj tarihi:
Hatayı yazsana :)

Birde SQL string icindeki `tanitim` tırnak gibi şeyleri kaldır. sadece tanitim yazsın

Birde (sonky ='$yil' AND sonka ='$ay') burada neden bunları tekrar parantez icine aldın ki? paratezden çıkart onları AND ile kontrol ediyorsun sonuçta. (Bu hataya sebep olmaz ama gereksiz olmuş )
Mesaj tarihi:
$rdesult = mysql_query("SELECT sonkg FROM `tanitim` WHERE sonkg >='$gun' AND (sonky ='$yil' AND sonka ='$ay') ORDER BY `sonkg` ASC LIMIT 0 , 7") or die(mysql_error());

olarak değiştirip 4everın dediği gibi hata mesajını gönder bakalım bize
Mesaj tarihi:
sql error vermiyor
boş dönüyor ben de boş dönerse alttaki döngü dönsün istiyorum ama dönmüyor. parantezler ve tırnaklar kalmış öyle orada or vardı galiba, arıza yoksa ellemiyorum
Mesaj tarihi:
foreach( range(0,6) as $cnt )
{
$alfad =strtoupper( date('j',strtotime( "today + $cnt day") ) );
$rdesult = mysql_query("SELECT sonkg FROM `tanitim` WHERE sonkg >='$gun' AND (sonky ='$yil' AND sonka ='$ay') ORDER BY `sonkg` ASC LIMIT 0 , 7");
while($row = mysql_fetch_array($rdesult))
{
$betad=$row['sonkg'];
if($alfad!=$betad)
{
echo "";
}
else
{
echo "";
}
}
}

yani bu da olmadı ben anlayabilmiş değilim
Mesaj tarihi:
site açılmıyo ne hikmetse bakamıyom şimdi de, ben şöyle diyeyim

foreach önümüzdeki 7 günü sıralıyor ve option olarak select menü basıyor

ben veritabanından o ayda girilmiş kayıtların gunlerini alıyorum,

eğer o gün daha önce kullanılmışsa option olarak basılmasın istiyorum.
Mesaj tarihi:
Şimdi ben anlamadım, yazdığın kod hatamı veriyor? yoksa sonuç döndürmüyor mu? eğer hata almadan boş dönüyorsa SQL sorguna karışık gelen kayıt yoktur.

Onu bir kontrol et.

2. olarakda tam olarak ne yapmak istediğini söyle de ona göre bir yol izleyelim koddan pek bişi anlamadım.
Mesaj tarihi:
22519 verdi.

foreach( range(0,6) as $cnt )
{
$alfad =strtoupper( date('j',strtotime( "today + $cnt day") ) );
$rdesult = mysql_query("SELECT sonkullanmag FROM `tanitim` WHERE sonkullanmag >='$gun' AND (sonkullanmay ='$yil' AND sonkullanmaa ='$ay') ORDER BY `sonkullanmag` ASC LIMIT 0 , 7");
if(mysql_num_rows($rdesult)<1)
{
echo "";
} else {
while($row = mysql_fetch_array($rdesult))
{
$betad=$row['sonkullanmag'];

if($alfad!=$betad)
{
echo "";
}
else
{
echo "";
}
}
}
}

böyle çalıştı
Mesaj tarihi:
Her foreach için tekrar SQL çalıştırıyorsun yapı olarak hatalı. Belki bu projede birşey olmayabilir ama büyük Veritabanlarında fazladan gereksiz sorgu yaparsın performans acısından pek uygun değil
Mesaj tarihi:
Şöyle bir yapı daha uygun olabilir.

foreach( range(0,6) as $cnt ){
$alfadArray[] = strtoupper( date('j',strtotime( "today + $cnt day" ) ) );
}

$alfadString = implode(",",$alfadArray);

Not: tek foreach ile istediğin bilgileri array e alıyorsun. daha sonra arrayde bilgileri implode ile string yapıyorsun virgül ile ayrılmış. Çıkan string e sql ile bağlıyorsun burada JOIN yapcaz ve senin kontrolün eşit değil olduğu için NOT IN ile SQL'e bağlayacağım.

$rdesult = mysql_query("SELECT sonkullanmag FROM `tanitim` WHERE sonkullanmag >='$gun' AND sonkullanmay ='$yil' AND sonkullanmaa ='$ay'
AND sonkullanmag NOT IN (".$alfadString." ) ORDER BY `sonkullanmag` ASC LIMIT 0 , 7" );

Tek 1 SQL çalışacak ve senin istediğin günlere eşit olmayan değerleri verecek.
Mesaj tarihi:
eğer sonuçta bir veya birden çok değer dönerse while ile bunlar alınıp if ile bugün ve önümüzdeki günlerle karşılaştırılıyor ve olmayanlar basılıyor.

NOT IN ile sonuçları eleyebiliyoruz. ancak veritabanında zaten fazla kayıt yok ki olanları eleyip olmayanları bastırayım. olanlar dediğimiz "bugün ve önümüzdeki 6 gün" onu da php ile yaratıyorum. yani ben başka bir çözüm göremedim.
Mesaj tarihi:
2. yaptığın daha doğru olmuş.

Olabildiğince az çalışan bir sistem yapmak lazım tabiki şuan gözle görülür bir etki olmayabilir ama veritabanın ve join tabloların büyüdükçe sıkıntı yaşamaya başlarsın.
Mesaj tarihi:
ikinci yaptığımı sildim. çünkü kontrol edince istediğim işi yapmadı.
eğer değer girilmişse duruyordu. sonraki tarihleri basmıyordu.
işin kötü yanı bu sorgudan bir tane daha çalıştıracağım. o da sonraki ay için. çünkü sorgu aslında önümüzdeki 7 gün için aslında çalışmıyor. eğer önümüzdeki 7 gün içeisinde ay değişmezse çalışıyor.

ben aslında 7 bilemedin 14 günlük kayıtlar tutmak istiyorum. yani geçmişi tutmayı düşünmüyorum. ama otomatik olarak geçmişi silecek bir şey henüz yazmadım.
  • 2 hafta sonra ...
Mesaj tarihi:
4Ever said:

Hatayı yazsana :)

Birde SQL string icindeki `tanitim` tırnak gibi şeyleri kaldır. sadece tanitim yazsın

Birde (sonky ='$yil' AND sonka ='$ay') burada neden bunları tekrar parantez icine aldın ki? paratezden çıkart onları AND ile kontrol ediyorsun sonuçta. (Bu hataya sebep olmaz ama gereksiz olmuş )


Iıh olmamış. Tırnaklar kendini korusun ki bu şekilde kod yazmaya alışsın. Örneğin mod adında bir field varsa;


$mod="OK";
$sorgu = mysql_query("select id from tablo where mod = ".$mod." ");



Şeklinde kullanamaz orada where koşulundan sonra gelen mod tırnak içerisine alınması gerekir aksi halde çalışmaz. Mysql'in temel değişkenlerini field olarak belirtirseniz o zaman tırnak kullanmak zorunda kalırsınız.

Ayrıca parantezlere gerek var. Siz düzgün çalıştığını sanıyorsunuz ama reportları açarsanız ne kadar çok warning verdiğini görürsünüz.

Sanıyorsunuz ki report kapalı kalınca warningleri görmüyorum o zaman problem yok. Hiçde öyle değil o warningler tek tek log dosyalarına kayıt ediliyor buda sunucunun gereğinden fazla şişmesine sebep olabilir.

Temiz kod yazmak profesyonel bir yazılımcı için en önemli esastır. Amatörlüğün yazılımda yeri yok.
Mesaj tarihi:
Kendini ispatlamak için arayıp tarayıp geçmiş konuyumu buldun anlamadım ki :)

Zaten table adı gibi yerler de tırnak yazmaya gerek yok. operator vs ile aynı isimleri kullanıyorsan tablo adında zaten amatörsün.

Ayrıca AND ile sorgulama yapıyorsan paranter kullanmaya gerek yok.

Profesyonel hayatında başarılar dilerim.
×
×
  • Yeni Oluştur...