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

PHP soruları


Öne çıkan mesajlar

Mesaj tarihi:
Selamlar,

PHP hakkındaki sorularımı buradan sorayım istedim. Lafı dolandırmadan anlatayım;

Şimdi Windows sunucusundan kullanıcıları alıcam. (Active Directory var ama yönetimi yabancı bir firmada. ldap kullanarak bağlanmak sıkıntılı oldu biraz. Bende text dosyasına export etmelerini istiyorum. Düzenli olarak export yapacaklar istediğim şekilde.) Text dosyasına export yapılırken şu şekilde istedim;

isim|soyisim|email

bu üç sütun yetiyor bana. Şöyle bir şey yaptım;


$handle = @fopen("users.txt", "r");
while (!feof($handle))
{
$buffer = fgets($handle, 4096);
list($name,$surname,$email)=explode("|",$buffer);

$query = $db->insert('users')
->set(array(
'name' => $name,
'surname' => $surname,
'email' => $email
));

}

if($query){
echo 'veriler eklendi';
}



bu tayfunerbilen 'den basicdb sınıfını kullanıyorum. Verileri ekleme de sıkıntı yok. Lakin script her çalıştığında aynı verileri tekrar tekrar ekliyor. Kontrol kısmını nereye ve nasıl koyacağımı bilemedim.

Şimdilik soru bu :D bu script ilerledikçe takıldığım noktaları buradan sorarım artık.
Mesaj tarihi:
işte onun mantığını kuramadım. text'den gelen email 'i database de sorgulayıp if koyabilirim ama lakin nasıl devam edecek? Atıyorum;


if($email == $row['email']) {
echo 'Bu kayıt mevcut';
} else {
// insert kodu
}


fakat kayıt olduğunda insert etmeyecektir. Çok ahım şahım bir PHP bilgim yok :)
Mesaj tarihi:
Hayır istediğim şey o kaydın atlanıp olmayan kayıtların eklenmesi. Bir register formu olamayacağı için yeni bir kullanıcı eklendiğinde var olan users.txt 'nin en altına eklenecek.

Bunun mantığını kuramıyorum bir türlü.
Mesaj tarihi:
Iki secenegin var;

1 - Once kayit DB'de var mi diye bakmak, calisacak query sayisini ikiye katlamak.
2 - INSERT IGNORE kullanarak tek sorgu yapip, isi MySQL'e devretmek.

Ikinci opsiyon icin BasicDB.php'ye asagidaki fonksiyonu ekleyip, $db->insertIgnore(..) olarak kullanabilirsin.


/**
* Used for insert operation
*
* @param
* $tableName
* @return $this
*/
public function insertIgnore($tableName)
{
$this->sql = 'INSERT IGNORE INTO ' . $tableName;
return $this;
}


Ha tabi bu degisikligi kendi fork'ladigin repo'da yapip, sonra kutuphanenin yaraticisina PR gondersen de degisiklikler esas repo'da da yerini alsa daha iyi.
Mesaj tarihi:
DB'de email unique ise bu kontrolü yapmana gerek yok. Değilse'de unique yap. Di' nin dediği gibi INSERT IGNORE ile çözersin.

Eğer Unique yapamıyorsan, diğer bir yol olarak DB'de kayıtlı olanları tek SELECT ile çekip array de tutman daha sonra da insert edeceklerin ile karşılaştırıp ( array_diff ) olmayanları ayıklayarak INSERT sorgusunu ayıklananlara uyarlaman.

Tabi bu olay sağ kulağını sol elinle tutmak gibi birşey oluyor ama fikir olsun diye belirteyim dedim.
Mesaj tarihi:
neyse bunu bir şekilde hallletmeye çalışacağım. Olmazsa sürekli bir veri eklenişi olmayacağı için tableyi truncate edip bir daha çalıştırırım.


Şimdi users'a eklemeyi yapıyorum. Kullanıcı AD içinde olduğu için php ile get_current_user() ile userini alıyorum ve karşılaştırma yapıyorum.


users tablom;


id | isim | soyisim | email

1 Onur Kaya [email protected]
2 Onur2 Kaya [email protected]




x.com sabit bir domain. Yukarda dediğim gibi;


$logonname = get_current_user() . '@x.com';
$query = $db->prepare("SELECT * FROM users WHERE id=?");
$query->execute(array(1));
$row = $query->fetch(PDO::FETCH_ASSOC);

if($logonname == $row['email']) {
echo 'test';
} else {
echo 'yalnis bi seyler var';
}


bu şekilde sorgulama yaptığımda sürekli else kısmı çalışıyor. Ama != operatörü kullandığımda test cevabı geliyor. Ters çalışıyor kısacası merak ettim neden.

echo $logonname . '
';
echo $row['email'] . '
';

iki echo da aynı sonucu veriyor: [email protected]


bu arada evet basicdb kullanmaktan vazgeçtim. Elle yazayım hemde pratik yapıp öğrenmiş olurum diye :p

-- düzeltme --

if kontrolü hiç çalışmıyormuş. execute'deki array id değiştirdiğimde çıktılar aynı olmasa bile != test sonucunu veriyor.

-- düzeltme 2 --

sorunun kaynağını buldum. users.txt 'den veritabanına yazdırırken en sonuna boşluk koyuyormuş. trim ile silip düzelttim :D
Mesaj tarihi:
Kulagi tersten de degil baya baya bacak arasindan tutuyon.

1 - Ilk mesajda bahsettigin DB class'i yerine dumduz PDO kullaniyosun, ikisini karistiriyosun. Bad practice.
2 - Madem DB class'ini kullanmican, direkt sorgu gondericen, once SELECT edip sonra INSERT etmek yerine, direkt INSERT IGNORE kullan, sorgu sayisi da yazdigin kod da yariya dussun, if-else hepsi kaybolsun.
Mesaj tarihi:
Yukardaki postta belirtmiştim abi class kullanmadığımı kızma hemen :D

başka bir problemim var. Şu aşağıdaki kod;

$logonname = get_current_user() . '@x.com';

Ağdaki diğer bilgisayarlarda da benim kullandığım user'i gösteriyor.
Mesaj tarihi:
said:
bu tayfunerbilen 'den basicdb sınıfını kullanıyorum.


e bu?

http://php.net/get_current_user

get current user cok alakasiz yapmaya calistigin is ile.
Mesaj tarihi:
said:
bu arada evet basicdb kullanmaktan vazgeçtim. Elle yazayım hemde pratik yapıp öğrenmiş olurum diye :p


yanlış yazmışım :) evet get_current_user() çok alakasız ve saçma olmuş. Dünden beri araştırıyorum da bir yol bulamadım internette. Siteye bağlanan kullanıcının bilgisayar adını almayı.

Bilgisayar adı, C:/Users/k.adı ya da regedit ten bir şekilde almam lazım oldu :)
×
×
  • Yeni Oluştur...