disket.net Beta
Konu Listesine Dön

PHP 8'de eski bir MySQL kodunu PDO'ya çevirirken karşılaştığım PDOException hatası

Web Geliştirme Açılış: 09.08.2026 07:26 32 Görüntülenme
Selam dostlar, uzun zamandır forumu takip ediyorum ama ilk kez konu açıyorum. Elimde 2005'ten kalma, bir arkadaşımın bıraktığı eski bir PHP scripti var. Script, MySQL 4.1 ile çalışan bir kütüphane sitesi. PHP 5.2 döneminde yazılmış, mysql_* fonksiyonlarını kullanıyor. Şimdi bunu PHP 8.2 çalışan bir sunucuda ayağa kaldırmaya çalışıyorum. Malum mysql_* fonksiyonları kaldırıldı, ben de tüm sorguları PDO ile yeniden yazmaya başladım. Ama bir yerde takıldım.

Scriptte şöyle bir sorgu var: SELECT * FROM kitaplar WHERE yazar = 'Orhan Pamuk' AND yil > 2000 ORDER BY yil DESC. Ben bunu PDO prepared statement ile şöyle yazdım: $stmt = $pdo->prepare('SELECT * FROM kitaplar WHERE yazar = :yazar AND yil > :yil ORDER BY yil DESC'); $stmt->execute(['yazar' => 'Orhan Pamuk', 'yil' => 2000]);. Ama sürekli şu hatayı alıyorum: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined. Benzer sorguları başka scriptlerde de kullandım, neden burada hata veriyor anlamadım. Yardımcı olursanız sevinirim, kafayı yiyeceğim.

Cevaplar (4)

Merhaba synthhacker21, bu hatayı ben de çok yaşadım. Genellikle bu hatanın sebebi, sorgudaki parametre adlarının yanlış yazılması veya execute dizisindeki anahtarlarla uyuşmamasıdır. Ama senin verdiğin örnekte bir sorun göremiyorum. Bir ihtimal, sorgunun içinde ':' ile başlayan ama senin kullanmadığın başka bir parametre daha olabilir. Mesela bazı eski scriptlerde sorgu içinde tarih formatlama falan yapılıyor olabilir. Sorgunun tamamını ve bağlantı kodunu buraya kopyalar mısın? Ayrıca PDO bağlantısını kurarken ERRMODE_EXCEPTION ayarını yaptığından emin ol, yoksa hata mesajı tam olarak görünmeyebilir. Bir de "yil" sütunu MySQL'de ayrılmış bir kelime değil, ama yine de backtick ile sarmayı dene: SELECT * FROM kitaplar WHERE yazar = :yazar AND yil > :yil ORDER BY yil DESC. Bazen bu da işe yarıyor.



Ama sürekli şu hatayı alıyorum: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined.



Kanka, bence sorun büyük ihtimalle sorgudaki parametre sayısı ile execute dizisindeki eleman sayısının uyuşmaması. Ama senin örnekte ikisi de 2. Bir de şuna dikkat et: PDO'nun native prepared statement kullanıp kullanmadığına bak. Bazı sürümlerde, özellikle MySQL eski sürümlerle çalışırken, PDO emülasyon modunda olabilir ve bu durumda parametre isimleri birebir aynı olmalı. Senin sorgunda her şey doğru görünüyor. Belki de sorgunun içinde bir yerde gizli bir karakter var, mesela kopyala-yapıştır sırasında tırnak işareti veya iki nokta üst üste farklı bir karaktere dönüşmüş olabilir. Şunu dene: sorguyu elle yaz, boşluklara dikkat et. Bir de şu kodu dene, bazen işe yarıyor:

$stmt = $pdo->prepare('SELECT * FROM kitaplar WHERE yazar = ? AND yil > ? ORDER BY yil DESC');
$stmt->execute(['Orhan Pamuk', 2000]);

Bu şekilde konumsal parametreler kullanırsan, isim uyumsuzluğu sorunu ortadan kalkar. Eğer hala hata alıyorsan, sorguyu ve bağlantı kodunu paylaş, beraber bakalım.
Selam synthhacker21, ben de bu hatayla çok uğraştım. Bence sorun, PDO bağlantısının kurulumunda. Eğer PDO MySQL için ATTR_EMULATE_PREPARES değerini false yapmadıysan, bazen parametre isimleriyle ilgili tuhaf hatalar alabiliyorsun. Şöyle bir bağlantı dene:

$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'kullanici', 'sifre', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false
]);

Ayrıca, eski scriptlerde bazen sorgu içinde yorum satırları (/* ... */) veya fazladan boşluklar olabiliyor. Sorgunu bir değişkene atayıp var_dump ile yazdırıp kontrol et. Bir de, eğer sorgu bir döngü içinde çalışıyorsa, execute() çağrısından önce stmt->closeCursor() çağırmayı dene. Bazen bu da garip hatalara yol açabiliyor. Umarım çözersin, kolay gelsin.
Herkese teşekkürler, sorunu çözdüm! retrodigger44'in dediği gibi sorguyu elle yazdım ve meğer sorgunun içinde, kopyala-yapıştır sırasında bozulmuş bir karakter varmış. Sorguyu tekrar yazınca hata kayboldu. hexhero70'in önerdiği ATTR_EMULATE_PREPARES => false ayarını da yaptım, artık her şey çalışıyor. Eski scriptin tüm sorgularını PDO'ya çevirdim, site ayağa kalktı. Hepinize çok teşekkür ederim, iyi ki varsınız!

Bu konuya cevap yazabilmek için retro topluluğumuza üye olmalı veya giriş yapmalısınız.

İlgili Konular & Benzer Paylaşımlar

PHP 8.2 ile eski bir projeyi çalıştırırken hata: Call to undefined function mysql_connect() Kategori: Web Geliştirme
Pico W ile kendi web sunucumu kurdum ama CSS dosyası bir türlü yüklenmiyor - neyi yanlış yapıyorum? Kategori: Web Geliştirme
PHP 8.3'te mcrypt kütüphanesi olmadan AES-256-CBC şifreleme nasıl yapılır? Kategori: Web Geliştirme