SQLSTATE[HY000] [2002] hatası alındığında ilk refleks kullanıcı adı ve parolayı değiştirmek olmasın. MySQL sunucusuna ulaşamama, yanlış TCP adresi veya Unix socket yolu gibi bağlantı katmanı sorunları bu aşamada daha olasıdır. Kimlik doğrulama hataları ise genellikle farklı bir kodla, örneğin erişim reddi olarak görünür.
Uygulamanın hangi yolu kullandığını netleştirin
PDO MySQL DSN içinde host, port veya unix_socket tanımı bağlantı şeklini belirler. localhost kullanıldığında bazı PHP ve işletim sistemi kurulumları yerel socket tercih edebilir; 127.0.0.1 TCP bağlantısını hedefler. Davranış kullandığınız sürücü ve ortama bağlı olduğundan, yalnızca adresi değiştirip sorunun kesin çözüldüğünü varsaymayın.
// TCP bağlantısı için örnek DSN
$dsn = 'mysql:host=127.0.0.1;port=3306;dbname=app;charset=utf8mb4';
// Yerel socket yolu kullanılıyorsa örnek DSN
$dsn = 'mysql:unix_socket=/run/mysqld/mysqld.sock;dbname=app;charset=utf8mb4';
Socket yolu dağıtıma ve yapılandırmaya göre değişebilir; örnekteki yol her sunucuda doğru değildir. PHP'nin çalıştığı makine ve kullanıcı bağlamından MySQL servisinin gerçekten dinlediği socket ya da portu doğrulayın. Komut satırından yönetici hesabıyla başarılı bağlantı, PHP-FPM kullanıcısının da aynı yola ve yetkilere sahip olduğunu tek başına kanıtlamaz.
PHP bir konteynerde, veritabanı başka bir konteynerde çalışıyorsa 127.0.0.1 çoğu kurulumda veritabanı konteynerini değil PHP konteynerinin kendisini gösterir. Bu durumda ağ adı, servis portu ve konteyner ağı incelenmelidir. Uzak MySQL'e bağlanırken de yalnız portun açık olması yeterli değildir; sunucu dinleme adresi, ağ ACL'si ve kaynak host yetkisi birbirinden ayrı katmanlardır.
Katmanları sırayla sınayın
- Veritabanı servisi çalışıyor mu ve doğru porta/socket'e mi bağlı?
- PHP ile veritabanı aynı sunucuda mı, yoksa DNS ve güvenlik duvarı üzerinden mi konuşuyor?
- Uygulama ayarındaki host, port veya socket değeri gerçekten dağıtılmış yapılandırma mı?
- Sunucuya ulaşılıyor ama erişim reddediliyorsa kullanıcı, parola ve kaynak host yetkilerini ayrı inceleyin.
Hata mesajının tamamını herkese açık sayfada göstermeyin; bağlantı ayrıntıları, veritabanı adı veya dosya yolları ifşa olabilir. Günlükte bağlantı türü, hedef servis ve hata kodu gibi tanı için gereken alanları tutun, sırları kaydetmeyin. PHP'nin PDO_MYSQL DSN belgesi TCP ve socket seçeneklerini; PDO bağlantı belgesi bağlantının kurulma biçimini açıklar. Uygulama içindeki oturum açma örneği için PHP kullanıcı giriş sistemi rehberine bakabilirsiniz.