Arkadaşlar selam, PDO ile prepared statement kullanırken bir hatayla karşılaştım ve kafamı duvarlara vuruyorum. Şöyle ki, basit bir kullanıcı giriş sistemi yapıyorum, veritabanı bağlantısı sorunsuz çalışıyor ama sorgu çalıştırırken "Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number" hatası alıyorum. Kodum şöyle bir şey:
$stmt = $db->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
$stmt->execute(array(':username' => $username, ':password' => $password));
Hata mesajı parametre sayısında bir uyuşmazlık olduğunu söylüyor ama bence iki parametre de doğru şekilde eşleşiyor. Acaba bindParam mı kullanmalıyım yoksa execute içinde array vermek yeterli mi? Bu konuda tecrübesi olan var mı?
Ayrıca, aynı sorguyu bindParam ile denediğimde bu sefer de "SQLSTATE[42000]: Syntax error or access violation" gibi farklı bir hatayla karşılaştım. Şifreyi hashliyorum, sorguda direkt string olarak gönderiyorum ama yine de sorun çıkıyor. Belki de PDO ayarlarında bir yanlışlık vardır? Veritabanı bağlantısını şöyle kuruyorum:
$db = new PDO("mysql:host=localhost;dbname=test;charset=utf8", "root", "", array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
Bu ayarlar yeterli mi yoksa ekstradan emülasyon modunu mu kapatmam lazım? Çünkü bazı kaynaklarda PDO::ATTR_EMULATE_PREPARES => false öneriliyor. Sizce bu hatanın kaynağı ne olabilir? Benzer bir sorun yaşayan var mı aramızda? Ya da şifre alanında özel karakterler mi sorun çıkarıyor? Kullanıcı adı ve şifre hem harf hem rakam içeriyor ama SQL injection koruması için prepared statement yeterli değil mi?
Son olarak, bu hatayı çözmek için debug yaparken hata mesajlarını nasıl daha detaylı görebilirim? errorInfo() metodunu kullanmayı denedim ama bazen null dönüyor. PDO exception yakalama konusunda da tavsiyelerinizi alabilirsem çok sevinirim. Şimdiden teşekkürler, yardımlarınızı bekliyorum.
$stmt = $db->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
$stmt->execute(array(':username' => $username, ':password' => $password));
Hata mesajı parametre sayısında bir uyuşmazlık olduğunu söylüyor ama bence iki parametre de doğru şekilde eşleşiyor. Acaba bindParam mı kullanmalıyım yoksa execute içinde array vermek yeterli mi? Bu konuda tecrübesi olan var mı?
Ayrıca, aynı sorguyu bindParam ile denediğimde bu sefer de "SQLSTATE[42000]: Syntax error or access violation" gibi farklı bir hatayla karşılaştım. Şifreyi hashliyorum, sorguda direkt string olarak gönderiyorum ama yine de sorun çıkıyor. Belki de PDO ayarlarında bir yanlışlık vardır? Veritabanı bağlantısını şöyle kuruyorum:
$db = new PDO("mysql:host=localhost;dbname=test;charset=utf8", "root", "", array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
Bu ayarlar yeterli mi yoksa ekstradan emülasyon modunu mu kapatmam lazım? Çünkü bazı kaynaklarda PDO::ATTR_EMULATE_PREPARES => false öneriliyor. Sizce bu hatanın kaynağı ne olabilir? Benzer bir sorun yaşayan var mı aramızda? Ya da şifre alanında özel karakterler mi sorun çıkarıyor? Kullanıcı adı ve şifre hem harf hem rakam içeriyor ama SQL injection koruması için prepared statement yeterli değil mi?
Son olarak, bu hatayı çözmek için debug yaparken hata mesajlarını nasıl daha detaylı görebilirim? errorInfo() metodunu kullanmayı denedim ama bazen null dönüyor. PDO exception yakalama konusunda da tavsiyelerinizi alabilirsem çok sevinirim. Şimdiden teşekkürler, yardımlarınızı bekliyorum.