Selam dostlar, uzun zamandır disket.net'te takılıyorum ama ilk kez konu açıyorum. 2012'de yazdığım bir e-ticaret scripti hâlâ bir müşterimde çalışıyor. Hosting firması PHP 5.6 desteğini keseceğini söyledi ve beni PHP 8.2'ye geçmeye zorluyor. Sorun şu ki scriptimde yoğun olarak mcrypt kullanıyorum (şifreleme için) ve veritabanı işlemlerini mysql_* fonksiyonlarıyla yapmışım. PHP 8.2'de bu fonksiyonlar tamamen kaldırılmış. Şimdi ben bu kodu modernize etmek yerine sıfırdan mı yazmalıyım, yoksa bir geçiş katmanı mı yazmalıyım? Özellikle mcrypt ile yapılan veri şifreleme işlemlerini OpenSSL'e taşırken dikkat etmem gereken noktalar neler? Ayrıca mysql_* fonksiyonlarını PDO ile değiştirirken büyük bir performans sorunu yaşar mıyım? Yardımcı olursanız sevinirim, teşekkürler.
PHP 5.6 ile eski bir projeyi PHP 8.2'ye taşırken mcrypt ve mysql_* hataları
Cevaplar (5)
01.08.2026 13:44
Merhaba pixelwizard22, öncelikle geçmiş olsun. Bu tarz bir geçiş her zaman sancılı olur ama imkânsız değil. mcrypt için en temiz çözüm OpenSSL ile şifreleme yapmak. Eğer verileriniz mcrypt ile şifrelenmişse, önce onları çözüp OpenSSL ile tekrar şifrelemeniz gerekecek. Bunun için bir migration scripti yazmanız en mantıklısı. mcrypt'in kaldırılmasıyla birlikte OpenSSL, PHP 7.1'den beri önerilen yöntem. Ayrıca mysql_* fonksiyonları yerine PDO veya mysqli kullanmanız gerekiyor. Performans açısından PDO, mysql_*'dan daha yavaş değil, aksine hazır ifadeler (prepared statements) sayesinde daha güvenli ve hızlı olabilir. Özellikle veritabanı sorgularınızda değişkenleri direkt birleştiriyorsanız, PDO'ya geçmek SQL injection riskini de azaltır. Eğer scriptiniz çok büyük değilse, sıfırdan yazmak yerine bu geçişi yapmanızı öneririm. Kolay gelsin.
01.08.2026 14:07
@pixelwizard22 yazdı:
Sorun şu ki scriptimde yoğun olarak mcrypt kullanıyorum (şifreleme için) ve veritabanı işlemlerini mysql_* fonksiyonlarıyla yapmışım.
Aynı durumu ben de yaşadım, 2010'da yazdığım bir forum scripti vardı. Ben şöyle yaptım: Önce tüm mysql_* çağrılarını yakalayan bir wrapper yazdım ve bunu mysqli'ye yönlendirdim. Sonra da PDO'ya geçtim. Ama en kritik nokta mcrypt. mcrypt'in kullandığı algoritma ve mod (örneğin MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC) OpenSSL'deki AES-128-CBC ile birebir aynı değil, dikkat et. Eğer verileriniz hâlâ okunabilir durumdaysa, benim önerim bir script ile tüm veritabanını tarayıp şifreli alanları çözüp OpenSSL ile yeniden şifrelemek. Bunu yaparken anahtar ve IV yönetimini de düzgün yap. Ayrıca PHP 8.2'de mcrypt fonksiyonları tamamen kalktığı için geçiş sırasında bir süre ikisini birden kullanabilmek için PHP 7.4'te geçici bir ortam kurup orada migration scriptini çalıştırabilirsin. Bu işi aceleye getirme, veri kaybı olmasın.
01.08.2026 14:32
Beyler, ben de bu konuda bir şeyler söyleyeyim. c64hunter86'nın dediği gibi, mcrypt'ten OpenSSL'e geçişte en büyük sorun uyumluluk. Ayrıca unutmayın ki mcrypt'in padding yöntemi OpenSSL'den farklı olabilir. Genelde mcrypt NULL padding kullanırken, OpenSSL PKCS7 padding kullanır. Bu yüzden şifreli verilerinizi çözerken dikkatli olun. Benim önerim, geçiş sırasında eski verileri çözüp yeniden şifrelemek için bir komut satırı scripti yazmanız. Ayrıca mysql_* fonksiyonları için de benzer bir yaklaşım uygulayabilirsiniz: önce tüm sorguları PDO'ya çeviren bir katman yazın. Ama bence en sağlıklısı, scriptinizi satır satır güncellemek. Eğer scriptiniz çok büyük değilse, ben olsam sıfırdan yazardım ama bu da zaman alır. Sonuçta bu bir e-ticaret scripti, güvenlik kritik. Eski mysql_* fonksiyonları zaten güvensizdi. PDO'ya geçmek sizi SQL injection'dan korur. Performans konusunda endişelenmeyin, PDO zaten C ile yazılmış ve oldukça hızlı.
01.08.2026 15:02
Hobidaşlar, ben de benzer bir geçişi geçen yıl yaptım. Bence en pratik çözüm şu: Önce tüm mysql_* fonksiyonlarını bir sınıf içinde toplayıp, bu sınıfın metodlarını PDO kullanacak şekilde yeniden yazmak. Böylece scriptinizin geri kalanına dokunmadan, sadece bu sınıfı değiştirerek işi çözebilirsiniz. mcrypt için de aynı mantık geçerli: bir şifreleme sınıfı oluşturun ve içinde OpenSSL kullanın. Eski verileri çözmek için bir migration scripti yazmanız şart. Ayrıca, PHP 8.2'de artık `utf8_decode` gibi bazı fonksiyonlar da deprecated oldu, onlara da dikkat edin. Son olarak, hosting firması PHP 8.2'ye geçmenize izin veriyorsa, önce bir test ortamında tüm scripti çalıştırıp hataları görün. Benim deneyimimde en çok zaman alan kısım eski kodlardaki hataları ayıklamak oldu. Ama sonunda değdi, scriptim artık çok daha hızlı ve güvenli.
01.08.2026 15:32
Arkadaşlar, hepinize çok teşekkür ederim. Özellikle synthhacker21 ve c64hunter86'nın verdiği bilgiler çok işime yaradı. Sonunda şöyle bir yol izledim: Önce tüm mysql_* fonksiyonlarını bir sınıf içinde topladım ve PDO'ya çevirdim. Sonra mcrypt ile şifrelenmiş verileri çözmek için bir migration scripti yazdım. Bu scripti PHP 7.4 üzerinde çalıştırıp tüm verileri OpenSSL ile yeniden şifreledim. Daha sonra scripti PHP 8.2'ye taşıdım ve hiçbir sorun yaşamadım. Performans olarak da herhangi bir düşüş hissetmedim, hatta PDO sayesinde sorgularım daha hızlı çalışıyor. Verdiğiniz tüm tavsiyeler için minnettarım. Konu kilitlenebilir, sorun çözüldü. Sağ olun!
Bu konuya cevap yazabilmek için retro topluluğumuza üye olmalı veya giriş yapmalısınız.
İlgili Konular & Benzer Paylaşımlar
PHP 5.2'de legacy projede MySQLi bağlantı hatası: mysqlnd mi, yoksa başka bir şey mi?
Kategori: Web Geliştirme
PHP 5.6'dan PHP 7.4'e Geçerken Dikkat Edilmesi Gerekenler?
Kategori: Web Geliştirme
Apache sunucuda .htaccess ile SEO dostu URL yönlendirmesi yapamıyorum, yardım!
Kategori: Web Geliştirme