Kezdő webfejlesztőként, vagy akár tapasztaltabb programozóként is előfordulhat, hogy szembesülünk egy rettegett hibaüzenettel a PHP alkalmazásunkban: „SQL not supported” vagy „SQL nem támogatott”. Elsőre pánikba eshetünk, azt gondolva, hogy az adatbázisunkkal van baj, vagy a kódunk hibás. Azonban van egy jó hír: ez a hiba sokkal egyszerűbb eredetű, mint gondolnánk, és a megoldása is általában gyerekjáték. Ne ess pánikba, a válasz valószínűleg a PHP konfigurációjában rejlik, nem pedig az SQL lekérdezésedben!
Mi is az a „SQL nem támogatott” hiba?
Ahhoz, hogy megértsük a megoldást, először tisztában kell lennünk a probléma gyökerével. Amikor egy PHP alkalmazás adatbázissal kommunikál (legyen szó MySQL, PostgreSQL, SQL Server, vagy SQLite adatbázisról), nem közvetlenül beszél az adatbázissal. Ehelyett úgynevezett adatbázis-illesztőprogramokra vagy PHP kiterjesztésekre (extensions) van szüksége. Ezek a kiterjesztések fordítják le a PHP kéréseit az adatbázis számára érthető formátumba, és fordítva.
A „SQL nem támogatott” hibaüzenet pontosan azt jelenti, hogy a PHP futtatókörnyezet, amelyen az alkalmazásod fut, nem találja, vagy nem tudja betölteni a szükséges adatbázis-illesztőprogramot. Ez nem azt jelenti, hogy az SQL lekérdezésed hibás, vagy hogy az adatbázisod nem létezik. Egyszerűen arról van szó, hogy a PHP és az adatbázis közötti kommunikációs csatorna nincs kiépítve vagy aktiválva.
Például, ha MySQL adatbázist használsz, a PHP-nak szüksége van a mysqli
vagy a pdo_mysql
kiterjesztésre. Ha ezek közül egyik sincs engedélyezve, a PHP nem tudja megérteni azokat a függvényeket, amelyek az adatbázishoz való kapcsolódásra szolgálnak, és „SQL nem támogatott” hibával tér vissza.
Miért fordul elő ez a hiba? Gyakori okok
Ez a hiba több okból is felmerülhet, a fejlesztői környezettől a éles szerverig:
1. Helyi fejlesztői környezet (XAMPP, WAMP, MAMP, Laragon stb.)
- Alapértelmezett beállítások: Sok fejlesztői csomag alapértelmezés szerint nem engedélyezi az összes PHP kiterjesztést, hogy csökkentse a memóriafogyasztást és a betöltési időt. Lehet, hogy manuálisan kell aktiválnod a szükséges adatbázis-illesztőprogramokat.
- Hibás
php.ini
konfiguráció: A PHP fő konfigurációs fájlja, aphp.ini
felelős a kiterjesztések betöltéséért. Ha a megfelelő sor ki van kommentálva (előtte pontosvessző van), vagy ha azextension_dir
útvonala hibás, a PHP nem találja meg a kiterjesztéseket. - Több PHP verzió: Előfordulhat, hogy több PHP verzió van telepítve a gépeden, és a webkiszolgálód (Apache, Nginx) egy másik verziót használ, mint amellyel te próbálsz dolgozni, vagy amiről azt hiszed, hogy be van állítva.
2. Éles szerver (VPS, Dedikált szerver, Megosztott tárhely)
- Nem telepített kiterjesztések: Különösen frissen telepített VPS-eken vagy dedikált szervereken, az adatbázis kiterjesztéseket gyakran külön kell telepíteni a PHP-hoz.
- Nem engedélyezett kiterjesztések: Még ha telepítve is vannak, előfordulhat, hogy a
php.ini
fájlban nincsenek engedélyezve. - Megosztott tárhely korlátozások: Megosztott tárhely szolgáltatók korlátozhatják az engedélyezhető PHP kiterjesztéseket biztonsági vagy erőforrás-gazdálkodási okokból. Előfordulhat, hogy kérned kell a szolgáltatótól az engedélyezést.
- Containerizált környezetek (Docker): Ha Docker konténereket használsz, a
Dockerfile
-ban explicite meg kell adni a PHP kiterjesztések telepítését. Ha kihagytad, a konténerben nem lesznek elérhetőek.
Hiba diagnosztizálása – Hol kezdjük?
A megoldás első lépése a probléma pontos azonosítása. Ehhez a phpinfo()
függvény a legjobb barátunk.
-
Hozzon létre egy
info.php
fájlt:Hozzon létre egy új fájlt a webgyökérkönyvtárban (pl.
htdocs
XAMPP-ban, vagy a projekt gyökérkönyvtára)info.php
néven, a következő tartalommal:<?php phpinfo(); ?>
-
Nyissa meg a böngészőben:
Navigáljon a böngészőjében a
http://localhost/info.php
(helyi környezetben) vagy ahttp://sajatdomain.hu/info.php
(éles szerveren) címre. -
Mit keressünk?
A megjelenő oldalon keressen rá (Ctrl+F vagy Cmd+F) a következő kifejezésekre:
mysqli
pdo_mysql
pdo_pgsql
(ha PostgreSQL-t használsz)sqlsrv
(ha SQL Servert használsz)sqlite3
(ha SQLite-ot használsz)
Ha az adott adatbázis-típushoz tartozó szekció megjelenik, és a „Client API library version” vagy hasonló információ látható, az azt jelenti, hogy a kiterjesztés telepítve van és engedélyezve van. Ha nem találja a szekciót, vagy csak egy üres szakasz van a kiterjesztésről, akkor valószínűleg nem aktív.
Ezenkívül keresse meg a „Loaded Configuration File” sort is. Ez megmutatja, melyik
php.ini
fájlt használja a PHP. Győződjön meg róla, hogy azt a fájlt szerkeszti, amelyik itt fel van tüntetve!Ellenőrizze az
extension_dir
beállítást is. Ez az útvonal mutatja meg, hol keresi a PHP a kiterjesztés fájlokat (pl.php_mysqli.dll
Windows-on, vagymysqli.so
Linuxon).
A megoldás lépésről lépésre
Miután diagnosztizáltuk a problémát, jöhet a megoldás. A lépések kissé eltérhetnek attól függően, milyen környezetet használsz.
1. Helyi fejlesztői környezet (XAMPP, WAMP, MAMP, Laragon)
Ez a leggyakoribb forgatókönyv, és a legegyszerűbben orvosolható:
-
Keresse meg a
php.ini
fájlt:Mint fentebb említettük, használja a
phpinfo()
kimenetét, hogy megtalálja a „Loaded Configuration File” sorban szereplőphp.ini
fájlt. XAMPP esetén ez gyakran axamppphpphp.ini
útvonalon található. -
Nyissa meg szerkesztésre:
Nyissa meg a
php.ini
fájlt egy szövegszerkesztővel (pl. Notepad++, VS Code, Sublime Text). -
Engedélyezze a kiterjesztéseket:
Keresse meg azokat a sorokat, amelyek a szükséges adatbázis-kiterjesztésekre vonatkoznak. Ezek általában kommentelve vannak (egy pontosvesszővel kezdődnek). Példák:
;extension=mysqli ;extension=pdo_mysql ;extension=pdo_pgsql ;extension=sqlsrv ;extension=php_openssl.dll (példa más kiterjesztésre, ami gyakran kell)
Távolítsa el a pontosvesszőt (
;
) az elől, amire szüksége van. Ha MySQL-t használ, valószínűleg amysqli
és/vagy apdo_mysql
sorokat kell aktiválnia:extension=mysqli extension=pdo_mysql
Megjegyzés: Windows rendszeren a kiterjesztés fájlnevei gyakran
.dll
végződésűek (pl.php_mysqli.dll
), míg Linuxon.so
(pl.mysqli.so
). Aphp.ini
-ban általában a rövidebb, platformfüggetlen forma szerepel, a PHP magától megkeresi a megfelelő fájlt azextension_dir
-ben. -
Ellenőrizze az
extension_dir
beállítást:Győződjön meg róla, hogy az
extension_dir
beállítás helyesen mutat a PHP kiterjesztés fájlokat tartalmazó könyvtárra. Például:extension_dir = "ext"
vagy abszolút útvonallal:
extension_dir = "C:xamppphpext"
Ha ez az útvonal hibás, a PHP nem fogja megtalálni a kiterjesztéseket, még akkor sem, ha a sorok nincsenek kommentelve.
-
Indítsa újra a webkiszolgálót:
A
php.ini
módosításai csak a webkiszolgáló (Apache, Nginx) újraindítása után lépnek érvénybe. Ha XAMPP-ot vagy WAMP-ot használsz, ezt az irányítópultjukon keresztül teheted meg (Apache Restart). Laragon esetén is a menüben található a „Restart all” opció. -
Ellenőrizze újra a
info.php
fájllal:Miután újraindítottad, frissítsd a böngészőben az
info.php
oldalt. Most már látnod kell amysqli
és/vagypdo_mysql
szekciókat, ami azt jelenti, hogy az illesztőprogramok sikeresen betöltődtek.
2. Éles szerver (VPS, Dedikált szerver)
Linux alapú szervereken a kiterjesztések telepítése és engedélyezése parancssorból történik.
- Csatlakozzon a szerverhez SSH-n keresztül.
-
Telepítse a PHP kiterjesztést:
A parancs az operációs rendszertől és a PHP verziótól függően változik. Gyakran az
apt
(Debian/Ubuntu) vagy adnf
/yum
(CentOS/RHEL) csomagkezelővel telepíthető.- Debian/Ubuntu esetén (pl. PHP 8.2-höz):
sudo apt update sudo apt install php8.2-mysql # MySQL/MariaDB esetén sudo apt install php8.2-pgsql # PostgreSQL esetén sudo apt install php8.2-sqlite3 # SQLite esetén
Ha a
php8.2-mysql
csomagot telepíted, az általában tartalmazza amysqli
és apdo_mysql
illesztőprogramokat is. - CentOS/RHEL esetén (pl. PHP 8.2-höz):
sudo dnf install php-mysqlnd # MySQL/MariaDB esetén (általában a 'mysqlnd' a preferált natív illesztőprogram) sudo dnf install php-pgsql # PostgreSQL esetén
A telepítő általában automatikusan engedélyezi a kiterjesztéseket a megfelelő
php.ini
fájlban. - Debian/Ubuntu esetén (pl. PHP 8.2-höz):
-
Indítsa újra a webkiszolgálót és a PHP-FPM-et:
A módosítások érvénybelépéséhez újra kell indítani a webkiszolgálót (Apache vagy Nginx) és a PHP-FPM szolgáltatást (ha használja).
- Apache esetén:
sudo systemctl restart apache2 # Debian/Ubuntu sudo systemctl restart httpd # CentOS/RHEL
- Nginx és PHP-FPM esetén:
sudo systemctl restart nginx sudo systemctl restart php8.2-fpm # Vagy a megfelelő PHP-FPM verzió
- Apache esetén:
-
Ellenőrizze újra:
Frissítse a böngészőjében az
info.php
oldalt, vagy futtassa aphp -m
parancsot a terminálban, amely listázza az összes betöltött PHP kiterjesztést.
3. Megosztott tárhely
Megosztott tárhely esetén kevésbé van közvetlen kontrollunk a szerver konfigurációja felett. Azonban van néhány dolog, amit megtehetünk:
-
Ellenőrizze a vezérlőpultot:
Sok tárhely szolgáltató (pl. cPanel, Plesk) biztosít egy grafikus felületet, ahol engedélyezhetők vagy tilthatók a PHP kiterjesztések. Keresse meg a „Select PHP Version” vagy „PHP Extensions” opciót a vezérlőpulton belül.
-
Lépjen kapcsolatba a szolgáltatóval:
Ha nem találja a megfelelő beállítást, vagy a kiterjesztés nincs a listán, vegye fel a kapcsolatot a tárhely szolgáltató ügyfélszolgálatával. Magyarázza el a problémát, és kérje meg őket, hogy engedélyezzék a szükséges kiterjesztést (pl.
mysqli
vagypdo_mysql
).
4. Docker / Konténerizált környezetek
Ha Dockerrel dolgozik, a kiterjesztéseket a Dockerfile
-ban kell telepíteni:
-
Módosítsa a
Dockerfile
-t:Adja hozzá a következő sort a
Dockerfile
-jéhez, hogy telepítse a szükséges PHP kiterjesztéseket. Ha az alap PHP image-et használja (pl.php:8.2-apache
), akkor adocker-php-ext-install
parancsot használhatja:FROM php:8.2-apache # Telepítse a MySQL (mysqli és pdo_mysql) kiterjesztéseket RUN docker-php-ext-install mysqli pdo_mysql
Ha más adatbázis illesztőre van szüksége, adja hozzá azt is (pl.
pdo_pgsql
,sqlsrv
). -
Építse újra az image-et:
Minden
Dockerfile
változtatás után újra kell építeni a Docker image-et:docker-compose build # Ha docker-compose-ot használ docker build . # Ha csak sima Dockert használ
-
Indítsa újra a konténert:
docker-compose up -d # Ha docker-compose-ot használ docker restart <konténer_neve_vagy_azonosítója> # Ha csak sima Dockert használ
Ezek után a konténerben is elérhetővé válnak a kiterjesztések.
Haladó hibaelhárítás és bevált gyakorlatok
-
PHP verzió kompatibilitás: Mindig győződjön meg arról, hogy a telepített PHP kiterjesztés kompatibilis a PHP verziójával. Például, ha PHP 8.2-t használ,
php8.2-mysql
-t kell telepítenie, nemphp7.4-mysql
-t. -
Hibanaplók ellenőrzése: Ha a fentiek nem segítenek, ellenőrizze a webkiszolgáló (Apache/Nginx) és a PHP hibanaplóit. Ezek gyakran tartalmaznak részletesebb információkat arról, miért nem tudott betöltődni egy kiterjesztés.
- Apache logok:
/var/log/apache2/error.log
(Debian/Ubuntu),/var/log/httpd/error_log
(CentOS/RHEL) - PHP logok: Gyakran a
php.ini
fájlban van beállítva azerror_log
paraméter.
- Apache logok:
- Adatbázis kapcsolati adatok: Bár a „SQL not supported” hiba nem közvetlenül az adatbázis kapcsolati adataival kapcsolatos, miután az illesztőprogramok rendben vannak, győződjön meg róla, hogy az alkalmazása helyes adatbázisnévvel, felhasználónévvel, jelszóval és hoszttal próbál csatlakozni. Ezek hibája egy másik, gyakori hibához vezethet (pl. „Access denied”).
-
PDO vs. MySQLi:
Röviden:
- MySQLi (MySQL Improved Extension) kifejezetten MySQL adatbázisokkal való munkára készült.
- PDO (PHP Data Objects) egy adatbázis absztrakciós réteg, amely lehetővé teszi, hogy különböző adatbázisrendszerekhez csatlakozz ugyanazzal a kódbázissal, feltéve, hogy a megfelelő PDO illesztőprogram (pl.
pdo_mysql
) telepítve van.
A legtöbb modern alkalmazás a PDO-t preferálja a rugalmassága és a egységes API miatt.
- Készített utasítások (Prepared Statements): Mindig használjon prepared statements-eket az SQL lekérdezésekhez az SQL injection támadások megelőzése érdekében. Ez alapvető biztonsági gyakorlat.
Összefoglalás
A „SQL nem támogatott” PHP hibaüzenet elsőre ijesztőnek tűnhet, de amint láthattuk, a megoldás általában viszonylag egyszerű: a megfelelő PHP adatbázis kiterjesztés engedélyezése vagy telepítése. A legfontosabb eszköz a probléma diagnosztizálásához a phpinfo()
függvény, amely segít meghatározni, hogy melyik php.ini
fájl van érvényben, és mely kiterjesztések töltődtek be.
Ne feledje, hogy a webfejlesztésben a hibakeresés a munka szerves része. Ahelyett, hogy pánikba esne, nézzen utána, mi is a hiba valójában, és lépésről lépésre haladva biztosan megtalálja a megoldást. Reméljük, ez a részletes útmutató segít abban, hogy a jövőben magabiztosan kezelje ezt a gyakori problémát, és gyorsan visszatérjen a kódoláshoz!