Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi

PHP execute nedir?​


PHP'de execute tek başına kullanılan genel bir komut değildir. Hangi sınıf veya fonksiyon içinde geçtiğine göre anlamı değişir. En yaygın kullanım, PDOStatement::execute() ile hazırlanmış SQL sorgusunu çalıştırmaktır. Ayrıca exec() fonksiyonu işletim sistemindeki dış komutları çalıştırır; bu iki kullanım birbirinden farklıdır.

PDO ile execute nasıl çalışır?​


PDO'da önce sorgu prepare() ile hazırlanır, ardından execute() ile parametreleri verilerek çalıştırılır. Parametre kullanmak, kullanıcı girdisini SQL metnine doğrudan birleştirmekten daha doğru yaklaşımdır.

Aşağıdaki örnek yerel PHP CLI ortamında PDO ve PDO_SQLITE sürücüsüyle çalıştırılmak içindir; ayrı bir veritabanı sunucusu gerektirmez:

Kod:
<?php
$pdo = new PDO('sqlite::memory:');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$pdo->exec('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)');

$insert = $pdo->prepare('INSERT INTO users (name) VALUES (:name)');
$insert->execute(['name' => 'Ayşe']);

$select = $pdo->prepare('SELECT id, name FROM users WHERE name = :name');
$select->execute(['name' => 'Ayşe']);

$user = $select->fetch(PDO::FETCH_ASSOC);
echo $user['name'];

Başarılı çalışmada çıktı Ayşe olur. execute() sonuç satırlarını döndürmez; başarıda true, başarısızlıkta false döner veya hata moduna göre istisna oluşur. SELECT sorgusunun sonuçlarını almak için sonrasında fetch() veya fetchAll() çağrılır. INSERT, UPDATE ve DELETE işlemlerinde ise işlem sonucunu rowCount() ile ayrıca kontrol edebilirsiniz.

Bu örneğin çalışmaması genellikle PDO sürücüsünün, özellikle SQLite sürücüsünün PHP kurulumunda etkin olmamasından veya SQL sözdizimindeki hatadan kaynaklanır. PDO::ATTR_ERRMODE değeri PDO::ERRMODE_EXCEPTION olduğu için hata sessizce yok sayılmak yerine istisna olarak bildirilir.

execute ile exec arasındaki fark​


İsimleri benzer olsa da amaçları farklıdır:

KullanımÇalıştırdığı şeySonuç alma yöntemiTipik amaç
$statement->execute()Hazırlanmış SQL sorgusufetch(), rowCount()Veritabanı işlemleri
$pdo->exec()Doğrudan SQL metni; yer tutucu bağlamazEtkilenen satır sayısıBasit şema veya SQL işlemleri
exec()İşletim sistemi komutuDizi ve dönüş koduHarici program çalıştırma

İşletim sistemi komutu çalıştırmak için exec()​


Kastedilen PHP fonksiyonu exec() ise, PHP'nin çalıştığı sunucuda bir sistem komutu yürütülür. Örneğin:

Kod:
<?php
$output = [];
$returnCode = 0;

exec('php -v', $output, $returnCode);

echo 'Dönüş kodu: ' . $returnCode . PHP_EOL;
echo implode(PHP_EOL, $output);

Bu örnek php adlı CLI yürütücüsünün sunucunun PATH’inde bulunduğunu varsayar. Çıktı dizisi standart çıktıyı toplar; standart hata ayrı olabilir. Komut başarıyla çalışırsa dönüş kodu genellikle 0 olur ve komutun çıktısı $output dizisine yazılır. Komut bulunamıyorsa, PHP'nin bu fonksiyonu kullanması engellenmişse veya sunucu kullanıcısının yetkisi yoksa farklı bir dönüş kodu ya da hata görebilirsiniz.

Kullanıcıdan gelen veriyi exec() içine doğrudan eklemeyin. Bu, sunucuda istenmeyen komutların çalıştırılmasına yol açabilir. Dış komut gerçekten gerekli değilse PHP içindeki yerleşik işlevleri tercih edin. Gerekliyse komut adını sabit tutun, izin verilen argümanları doğrulayın ve argümanları escapeshellarg() ile uygun biçimde kaçışlayın. exec() ayrıca bazı barındırma ortamlarında devre dışı bırakılmış olabilir.

Sık yapılan hatalar​


  1. execute() çağrısını yanlış nesnede kullanmak. Bu metot PDOStatement nesnesine aittir; parametreli sorgu için olağan yol $pdo->prepare(...) ile bu nesneyi oluşturmaktır.
  2. Parametre adlarını sorgu ile execute() dizisinde farklı yazmak.
  3. Sorgu çalıştıktan sonra fetch() çağırmadan sonuç beklemek.
  4. SQL sorgusunu exec() ile çalıştırıp dönen değerin sorgu sonuçları olduğunu sanmak.
  5. İşletim sistemi komutunu kullanıcı girdisiyle birleştirmek.

Önce hangi execute kullanımının söz konusu olduğunu belirleyin: veritabanı sorgusuysa PDOStatement::execute(), sunucu komutuysa exec(). Veritabanı işleminde sorgu sonucunu ayrıca okuyun; dış komutta ise çıkış metnini ve dönüş kodunu ayrı ayrı kontrol edin.

Sık sorulan sorular​


Bir IN sorgusundaki bütün değerler tek parametreye verilebilir mi?​


Hayır. Tek yer tutucuya bir liste bağlamak, onu otomatik SQL değer listesine dönüştürmez. Her değer için ayrı yer tutucu oluşturup değerleri ayrı bağlayın. Kullanıcı girdisinden doğrudan virgüllü SQL metni üretmeyin.

SELECT kaç kayıt getirdiğini rowCount ile öğrenebilir miyim?​


Buna taşınabilir bir davranış olarak güvenmeyin; sürücülerde SELECT için rowCount sonucu farklı veya tanımsız olabilir. Sayı gerekiyorsa aynı koşulla COUNT sorgusu yapıp fetchColumn ile okuyun; verinin kendisi gerekiyorsa fetch/fetchAll akışını kullanın.

escapeshellarg kullanmak her komut argümanını güvenli kılar mı?​


Kabuk kaçışlaması, programın kendi seçeneklerini ve iş kurallarını doğrulamanın yerine geçmez. Kullanıcı girdisi tehlikeli bir program seçeneği olarak yorumlanabilir. Çalıştırılabilir programı ve kabul edilen argümanları sınırlandırın; dış komuta ihtiyaç yoksa doğrudan PHP işlevini kullanın.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.