Selam dostlar, uzun süredir takip ediyorum ama ilk kez konu açıyorum. Elimde 2008'den kalma bir e-ticaret projesi var, hala production'da çalışıyor. Sunucuyu yeni bir VPS'e taşıdım, CentOS 7 üzerine PHP 5.2.17 derledim (evet, biliyorum, güvenlik açısından riskli ama müşteri ısrar ediyor, legacy kod ve eski MySQL fonksiyonları var). Şimdi sorun şu: MySQLi ile bağlanmaya çalıştığımda şu hatayı alıyorum: 'Call to undefined function mysqli_connect()'. php.ini'de extension=mysqli.so satırını ekledim, extension_dir doğru, dosya da orada duruyor. php -m çıktısında mysqli görünmüyor. Ayrıca mysql (eski API) çalışıyor, mysql_connect() sorunsuz bağlanıyor. Acaba PHP'yi derlerken --with-mysqli=mysqlnd mi kullanmalıyım, yoksa --with-mysqli=/usr/bin/mysql_config mi? Bir de mysqlnd yerine libmysqlclient ile mi derlemek lazım? Kafam karıştı. Yardımcı olursanız sevinirim, yoksa bu hafta sonu uykusuz kalacağım.
PHP 5.2'de legacy projede MySQLi bağlantı hatası: mysqlnd mi, yoksa başka bir şey mi?
Cevaplar (5)
01.08.2026 13:41
Merhaba, öncelikle geçmiş olsun, bu tarz legacy projeler hep sıkıntı çıkarıyor. Senin sorunun büyük ihtimalle PHP derleme aşamasında --with-mysqli bayrağını yanlış vermenden kaynaklanıyor. PHP 5.2'de MySQLi desteği için iki seçenek var: ya libmysqlclient kütüphanesini kullanırsın (--with-mysqli=/usr/bin/mysql_config) ya da mysqlnd'yi (--with-mysqli=mysqlnd). mysqlnd, PHP 5.3'ten itibaren varsayılan oldu ama 5.2'de de kullanılabilir. Ancak, mysqlnd ile derlemek için PHP kaynak kodunda ext/mysqlnd klasörünün mevcut olması lazım. Eğer PHP'yi --with-mysqli=mysqlnd ile derlediysen ve hala mysqli_connect tanımsızsa, büyük ihtimalle derleme sırasında mysqlnd devre dışı kalmıştır. Şunu kontrol et: php -i | grep mysqli çıktısında 'Client API library version' satırına bak. Eğer 'mysqlnd' yazmıyorsa, derlemeyi --with-mysqli=mysqlnd ile tekrar dene. Ayrıca, extension=mysqli.so satırını php.ini'ye eklediysen, extension_dir'in doğru olduğundan emin ol. Bir de 'php -m' çıktısında mysqli yoksa, extension yüklenmemiş demektir. Derleme sırasında ./configure çıktısında 'mysqli' satırını kontrol et, 'enabled' yazması lazım. Eğer 'disabled' yazıyorsa, bağımlılıkları kontrol et (libmysqlclient-dev veya mysqlnd geliştirme paketleri). Umarım işe yarar, kolay gelsin.
01.08.2026 13:57
bitwizard54 yazdı:
Acaba PHP'yi derlerken --with-mysqli=mysqlnd mi kullanmalıyım, yoksa --with-mysqli=/usr/bin/mysql_config mi?
Kanka, ben de benzer bir sorun yaşamıştım. Bence mysqlnd kullanmalısın, çünkü libmysqlclient ile derlediğinde eski MySQL API ile çakışma ihtimali oluyor. Ama önce şunu dene: php.ini'de extension=mysqli.so satırını eklediysen, php -i çıktısında 'Loaded Configuration File' satırına bak, doğru php.ini'yi mi okuyorsun? Bazen farklı php.ini olabiliyor. Ayrıca, extension_dir'i kontrol et, 'php-config --extension-dir' komutuyla öğrenebilirsin. Eğer orada mysqli.so yoksa, derleme sırasında mysqli modülü hiç oluşturulmamış olabilir. PHP kaynak kodunda ext/mysqli klasörüne girip 'phpize' ve './configure --with-php-config=/usr/local/php/bin/php-config --with-mysqli=mysqlnd' ile ayrıca derleyip extension olarak eklemeyi deneyebilirsin. Bu yöntem bende işe yaramıştı. Ama dikkat, PHP 5.2'de mysqlnd deneysel olabilir, bazı fonksiyonlar farklı davranabiliyor. Yine de dene derim.
01.08.2026 14:16
Beyler, olaya biraz farklı bakalım. PHP 5.2.17'de mysqlnd varsayılan değil, ama derlenebilir. Eğer --with-mysqli=mysqlnd ile derlediysen ve hala çalışmıyorsa, büyük ihtimalle PHP'nin configure aşamasında mysqlnd bağımlılıkları eksik. Şu komutu dene: ldd /usr/local/lib/php/extensions/no-debug-non-zts-20060613/mysqli.so (kendi extension_dir'ine göre yol değişir). Eğer 'libmysqlclient.so.16' gibi bir bağımlılık görüyorsan, o zaman mysqlnd yerine libmysqlclient ile derlenmiş demektir. mysqlnd ile derlenen mysqli.so, libmysqlclient'e bağımlı olmaz. Ayrıca, eski mysql API (mysql_connect) ile mysqli'yi aynı anda kullanmak istiyorsan, --with-mysql=/usr/bin/mysql_config ve --with-mysqli=/usr/bin/mysql_config şeklinde ikisini de libmysqlclient ile derlemen daha tutarlı olur. Ama mysqlnd kullanırsan, mysql (eski API) ile mysqli aynı anda çalışabilir mi? Evet, çalışır, çünkü mysqlnd PHP'nin kendi kütüphanesi, mysql API de mysqlnd üzerinden çalışabilir. Ama PHP 5.2'de bu pek test edilmemiş olabilir. Bence en garantisi, libmysqlclient ile derlemek. Yani şunu dene: ./configure --with-mysqli=/usr/bin/mysql_config --with-mysql=/usr/bin/mysql_config. Ama önce mysql_config'in varlığını kontrol et, yoksa mysql-devel paketini kur.
01.08.2026 14:34
Hobidaşlar, ben de bu tarz bir sunucu taşıma işinde çok çektim. Öncelikle şunu söyleyeyim: PHP 5.2'de mysqli.so uzantısını php.ini'ye eklemek yetmez, eğer PHP derlenirken mysqli statik olarak gömülmediyse, extension olarak yüklenmesi gerekir. Ama senin durumunda 'Call to undefined function' hatası, uzantının hiç yüklenmediğini gösteriyor. Şimdi, php -i çıktısında 'Configure Command' satırına bak, orada --with-mysqli nasıl verilmiş göreceksin. Eğer --with-mysqli=mysqlnd yazıyorsa ama hala çalışmıyorsa, muhtemelen mysqlnd modülü derlenmemiştir. PHP 5.2 kaynak kodunda ext/mysqlnd klasörü var mı? Eğer yoksa, PHP'yi --enable-mysqlnd ile derlemen gerekir. Ayrıca, PHP 5.2.17'nin son sürüm olduğunu hatırlatayım, ama mysqlnd desteği 5.2'de deneyseldi. Bence en temiz çözüm, PHP'yi --with-mysqli=/usr/bin/mysql_config ile derlemek. Ama dikkat, eğer sistemde MySQL 5.7 veya üstü kuruluysa, mysql_config eski sürümleri işaret edebilir, o yüzden mysql_config --version ile kontrol et. Eğer uyumsuzluk varsa, mysqlnd kullanmak zorundasın. Son çare olarak, PHP 5.2'yi bırakıp PHP 5.6'ya geçmeyi düşün, çünkü PHP 5.2'nin güvenlik açıkları cabbar, müşteriyi ikna etmeye çalış.
01.08.2026 14:59
Arkadaşlar, hepinize çok teşekkür ederim. Sonunda çözdüm! Sorun, PHP'yi derlerken --with-mysqli=mysqlnd vermeme rağmen, configure aşamasında mysqlnd'nin devre dışı kalmasıymış. Çünkü PHP kaynak kodunda ext/mysqlnd klasörü yokmuş, ben sadece PHP 5.2.17 tarball'ını indirmiştim, ama mysqlnd ayrı bir paket olarak geliyor. Neyse, ben de --with-mysqli=/usr/bin/mysql_config ile derledim, libmysqlclient-dev paketini kurdum ve her şey çalışmaya başladı. Şimdi mysqli_connect() sorunsuz bağlanıyor. Ayrıca, eski mysql_connect() da çalışıyor, çakışma olmadı. Özellikle segabreaker88'in dediği gibi, mysql_config ile derlemek en garantisiymiş. help.php ve dosknight99'e de teşekkürler, ipuçları işe yaradı. Konu kilitlenebilir, sorun çözüldü. Herkese iyi forumlar!
Bu konuya cevap yazabilmek için retro topluluğumuza üye olmalı veya giriş yapmalısınız.
İlgili Konular & Benzer Paylaşımlar
PHP 5.3'te mcrypt ile AES-256-CBC şifreleme: OpenSSL'e geçişte veri uyumluluğu sorunu
Kategori: Web Geliştirme
PHP 5.6 ile eski bir projeyi PHP 8.2'ye taşırken mcrypt ve mysql_* hataları
Kategori: Web Geliştirme
PHP 5.6'dan PHP 7.4'e Geçerken Dikkat Edilmesi Gerekenler?
Kategori: Web Geliştirme