- Konu sahibi
- #1
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ığı şey | Sonuç alma yöntemi | Tipik amaç |
|---|---|---|---|
$statement->execute() | Hazırlanmış SQL sorgusu | fetch(), rowCount() | Veritabanı işlemleri |
$pdo->exec() | Doğrudan SQL metni; yer tutucu bağlamaz | Etkilenen satır sayısı | Basit şema veya SQL işlemleri |
exec() | İşletim sistemi komutu | Dizi ve dönüş kodu | Harici 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
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.- Parametre adlarını sorgu ile
execute()dizisinde farklı yazmak. - Sorgu çalıştıktan sonra
fetch()çağırmadan sonuç beklemek. - SQL sorgusunu
exec()ile çalıştırıp dönen değerin sorgu sonuçları olduğunu sanmak. - İş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.