PH Mysql lekérdezés egyik szerevern jó, másikon nem.
2021-06-10T17:12:29+02:00
2021-06-30T07:31:32+02:00
2022-08-12T03:30:32+02:00
GZolee79
Sziasztok!

A kövtkező probléma megoldásában szeretném a segítségetelk kérni.
Adott egy keresés ez php script ami egy MySql tárolt eljárást hív meg a művelet végrehajtásához.

MySql:

BEGIN DECLARE result_json JSON; SET result_json = (SELECT CONCAT( '[', GROUP_CONCAT(JSON_OBJECT('id', `h`.`horgasz_id`, 'nev', `h`.`nev`) SEPARATOR ','), ']' ) AS `json` FROM( SELECT `horgasz_id`, `vez_nev`, `keresztnev`, CONCAT(`vez_nev`, ' ', `keresztnev`) AS nev FROM `horgaszok_tb` WHERE CONCAT(`vez_nev`, ' ', `keresztnev`) LIKE CONCAT('%', nevreszlet, '%') GROUP BY `nev` )AS h); RETURN(result_json); END

PHP:

error_reporting(E_ALL); ini_set("display_errors","1"); ini_set("html_errors","1"); header('Content-type: application/json; charset=utf-8; Content-Language: content=hu-hu'); $nevreszlet=$_GET['nevreszlet']; $names=array(); require_once('connectvars.php'); $mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) or die('valami nem ok az adatbázishoz történé kapcsolódáskor: ' . mysqli_error()); $mysqli->query('SET NAMES "utf8" collate "utf8_hungarian_ci'); $mysqli->query("SET character_set_results=utf8"); $mysqli->set_charset("utf8"); $result = $mysqli->query("SELECT name_search(" . "'" . $nevreszlet . "'" . ") as horgasz"); $names = array(); if (mysqli_num_rows($result) != 0) { while ($row = mysqli_fetch_assoc($result)) { array_push($names, json_decode($row['horgasz'], true)); } } else { array_push($names, json_encode("error", "Nincs találat")); } $mysqli->close(); echo json_encode($names);
Így tesztelem:
../name_search.php?nevreszlet=zol

Ez például listázza azokat a neveket amelyekben van zol (Pl Zoltán)

Nos a probléma az ékezetes karakterekkel van. 
Ha, meg akarom keresni a Zoltánokat akkor beírom, hogy ../name_search.php?nevreszlet=tán

Ez szépen működik ez, de csak saját szerveren!
Viszont ha feltöltöm, ott már nem.
A legérdekesebb az, hogy ha meg akarom keresni a Zoltánokat, akkor tökmindegy, hogy írom,
ha a keresztnévben van "á" betű akkor nem találja meg.
A saját szerveren ez is működik!
Ja! PhpMyadminban a szerveren is működik a lekérdezés!
Csak ha saját PHP fájlból futtatom, akkor nem!

Tudjátok esetleg mi lehet a hiba?

Előre is köszönöm a válaszokat!
Üdv:
Z.
Mutasd a teljes hozzászólást!
Hali!

Közben rájöttem mi a baj. A GROUP_CONTACT van lekorlátozva. 1024 -re. Ki is próbáltam, ha a találatok száma 1024, akkor ott levágja a találatot, pont ott. Mivel így a json sem lesz jó, nem egenrál eredményt.
A saját szerveren megemeltem 5000-re, azért fut le ott, de ez a parancs a publikus szerveren nem fut le mert nincs hozzá jogosultságom.
Amit írtál kódot, azért nem jó, mert már mysql tárolt eljárásban elhasal a lekérdezés, így nem ad vissza semmit.

Amúgy először nem is tárolt eljárással akartam, csak sehogy nem sikerült utf8 -as karakterekkel lefuttatni :)Azon is el kellene gondolkodnod, hogy ha tényleg ilyen sok a találat, mit tud vele *értelmesen* kezdeni a kliens, és a felhasználó.




Olyan keresőt írok, ami akkor mutatj a találatokat amikor elkezdesz gépelni, és felhozza a találati listát, és abból választ a felhasználó. Ha példát vesszük alapul, jelen esetben az összes Zoltánt.
De ha mondjuk egy webáruházban rákeresel valamire, akkor is van, hogy vagy 30 találatot hoz.
Úgyhogy át kell írnom a lekérdezést, úgy hogy ne legyen benne GROUP_CONTACT.
Ezt is itt mondták, de talán meg tudom oldani :)
Mutasd a teljes hozzászólást!

  • Csak egy tipp :
    Feltöltött file - adatbázis karakterkódolás eltérés?
    Mutasd a teljes hozzászólást!
  • Ami különbséget felfedeztem:

    Amelyiken jó:

    Adatbázis-kiszolgáló:
    • Kiszolgáló: Localhost via UNIX socket
    • Kiszolgáló típusa: MySQL
    • Szerver kapcsolat: SSL is not being used
    • Kiszolgáló verziója: 8.0.25-0ubuntu0.20.04.1 - (Ubuntu)
    • Protokoll verzió: 10
    • Felhasználó: pmauser@localhost
    • A kiszolgáló karakterkódolása: UTF-8 Unicode (utf8mb4)

    Webkiszolgáló:

    Apache/2.4.41 (Ubuntu)
    • Adatbázis-kliens verziója: libmysql - mysqlnd 7.4.3
    • PHP-kiterjesztés: mysqli curl mbstring
    • PHP verzió: 7.4.3

    Amelyiken nem:

    Adatbázis-kiszolgáló:
    Kiszolgáló: Localhost via UNIX socket
    • Kiszolgáló típusa: MariaDB
    • Szerver kapcsolat: SSL is not being used 
    • Kiszolgáló verziója: 10.3.29-MariaDB-cll-lve - MariaDB Server
    • Protokoll verzió: 10
    • Felhasználó: alaszkah@localhost
    • A kiszolgáló karakterkódolása: cp1252 West European (latin1)

    Webkiszolgáló:
    cpsrvd 11.94.0.11
    • Adatbázis-kliens verziója: libmysql - 5.6.43
    • PHP-kiterjesztés: mysqli curl mbstring
    • PHP verzió: 7.3.28

    De a táblázat mindenhol utf8 kódolású.

    Egyébként lehet olyan keresőt írni, ahol minden ékezetet figyelembe vesz a rendszer?
    Vagyis az Ő  nem egyenlő Ö-vel, az Á nem egyenlő A-val?

    Szóval látszik, hogy az egyik MariaDB a másik MySql.
    Viszont ha ez okozza, akkor nem tudom, hogy a PhpMyadmin alatt miért működik tökéletesen
    Mutasd a teljes hozzászólást!
  • Innen hiányzik egy idézőjel - ha azt pótolod, akkor van valami változás?

    $mysqli->query('SET NAMES "utf8" collate "utf8_hungarian_ci'); ^
    Mutasd a teljes hozzászólást!
  • Köszi!

    Kipróbáltam, sajnos nincs változás...
    Mutasd a teljes hozzászólást!
  • Jó:mysqlnd 7.4.3
    nem jó:libmysql - 5.6.43
    Valószínűleg a mysql verzió nem stimmel.
    On ≥ 5.7.22

    Nem támogatja a JSON_OBJECT-et
    Mutasd a teljes hozzászólást!
  • Ok, de akkor PhpMyadminból miért működik?
    Ugyanaz a böngésző, ugyanaz a környezet.

    Mit a PhpMyadmin, amit az én php fájlom nem? :)
    Mutasd a teljes hozzászólást!
  • phpinfon() a mysqli mind a kettőn aktív?
    Mutasd a teljes hozzászólást!

  • A kiszolgáló karakterkódolása: UTF-8 Unicode (utf8mb4)

     Nem jó
    A kiszolgáló karakterkódolása: cp1252 West European (latin1)
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Igen, megnéztem, mindkettőn aktív.
    Mutasd a teljes hozzászólást!
  • A kiszolgálókapcsolat illesztése pont ugyanaz mint a képen, amit csatoltál.
    A kiszolgáló karakterkódolását nem találom, hol kell állítani.

    Viszont még ha sikerül is átállítanom, akkor sem tudjuk meg, hogy phpmyadminban miért jó :)
    Mutasd a teljes hozzászólást!
  • Közben még felfedeztem néhány furcsaságot.
    Ha a keresztnév Bálint és annyit írok be a keresőbe, hogy bál
    Akkor nem találja meg, ha viszont végig írom, hogy Bálint, akkor megtalálja.

    Ugyenez a Zoltánnal nem működik.

    Ha a vezetéknévet keresem és abban van ékezet akkor is megtalálja,
    Csináltam egy másik keresőt, ahol a vezetéknév és keresztnév mező helyett egy full_name mező van.
    Az működk.
    Nem lehet, hogy valahogy a CONCAT-hoz van köze?
    Mutasd a teljes hozzászólást!
  • Na, annyit sikerült kiderítenem, hogy a hibának semmi köze a karakterkódoláshoz.
    Eddig tényleg azt hittem ahhoz van köze, de csak véletlen egybeesés volt!

    Szóval a hibát a találat hossza okozza. (Zoltánból sok volt :) )
    Azért működött a saját szerveren, mert ott kevés teszt regisztrált volt az élesen meg sok.
    A csak simán kiíratom az eredmény JSON-t így:

    if (mysqli_num_rows($result) != 0) { $row = mysqli_fetch_assoc($result); echo $row['horgasz'] . "<br>"; }
    Akkor jó.
    Viszont ha bele akarom tenni egy tömbbe így:

    $names = array(); if (mysqli_num_rows($result) != 0) { $row = mysqli_fetch_assoc($result); array_push($names, json_decode($row['horgasz'], true)); } echo json_encode($names);
    Így már nem jó...
    A saját szerveren viszont ez is megy. Gondolom más array_max_size van beállítva rajta...
    Szóval erre szeretnék kérni valami megoldást. :)
    Mutasd a teljes hozzászólást!
  • Szia,

    "array_max_size" - biztos van ilyen PHP-ban? Inkább egy szigorú "memory_limit" az esélyes.
    Konkrét hibaüzenetet sikerült kapnod? Akár outputban, de főleg logokban?

    Hány "Zoltán" jön elő az éles szerveren, mennyi a "sok"? Próbáltad limitálni a lekérdezésben a találatok számát ("limit", vagy más feltétel, pl. Bélák, bár az is sok szokott lenni ;), hogy tényleg ez okozza-e a problémát?

    A legutolsó példáidból kimaradt a ciklus.

    Megoldások lehetnek:

    A) page-ing bevetezése az alkalmazásban. Így soha nem kérsz le egyszerre túl sok rekordot, viszont a kliens oldalt erre fel kell készíteni.

    B) Ciklusból, "kézzel" rakod össze a JSON-t.

    $rc = 0; echo "["; if (mysqli_num_rows($result) != 0) { while ($row = mysqli_fetch_assoc($result)) { if ($rc++ > 0) { echo ', '; } // a 'horgasz' elvileg már JSON az adatbázisban is echo $row['horgasz']; // ha mégsem az, akkor encode kell: // echo json_encode($row['horgasz']); } } echo "]";
    Mutasd a teljes hozzászólást!
  • Azon is el kellene gondolkodnod, hogy ha tényleg ilyen sok a találat, mit tud vele *értelmesen* kezdeni a kliens, és a felhasználó.
    Mutasd a teljes hozzászólást!
  • Hali!

    Közben rájöttem mi a baj. A GROUP_CONTACT van lekorlátozva. 1024 -re. Ki is próbáltam, ha a találatok száma 1024, akkor ott levágja a találatot, pont ott. Mivel így a json sem lesz jó, nem egenrál eredményt.
    A saját szerveren megemeltem 5000-re, azért fut le ott, de ez a parancs a publikus szerveren nem fut le mert nincs hozzá jogosultságom.
    Amit írtál kódot, azért nem jó, mert már mysql tárolt eljárásban elhasal a lekérdezés, így nem ad vissza semmit.

    Amúgy először nem is tárolt eljárással akartam, csak sehogy nem sikerült utf8 -as karakterekkel lefuttatni :)Azon is el kellene gondolkodnod, hogy ha tényleg ilyen sok a találat, mit tud vele *értelmesen* kezdeni a kliens, és a felhasználó.




    Olyan keresőt írok, ami akkor mutatj a találatokat amikor elkezdesz gépelni, és felhozza a találati listát, és abból választ a felhasználó. Ha példát vesszük alapul, jelen esetben az összes Zoltánt.
    De ha mondjuk egy webáruházban rákeresel valamire, akkor is van, hogy vagy 30 találatot hoz.
    Úgyhogy át kell írnom a lekérdezést, úgy hogy ne legyen benne GROUP_CONTACT.
    Ezt is itt mondták, de talán meg tudom oldani :)
    Mutasd a teljes hozzászólást!
  • Sziasztok!

    Le szeretném zárni a témát. Gondolkoztam kinek a megoldását fogadjam el, mert nem szívesen fogadom el a saját megoldásomat, de sajnos a többi megoldás nem működött...
    De több, egyébként hasznos válasz született, így nem szeretném törölni a témát.

    Utólag is köszönöm a válaszokat!

    Üdv:
    Z.
    Mutasd a teljes hozzászólást!
abcd