Mysqli_query() függvény használata 'User-defined function'-ből
2022-02-03T23:12:02+01:00
2022-02-04T17:44:44+01:00
2022-08-12T07:15:37+02:00
Relative
Sziasztok!

PHP 5.6-ról térek át 7.4-re, ezért mysql_query() függvények helyett mysqli_query()-t kell használnom. Viszont úgy tapasztalom, hogy mysqli_query() nem működik, ha azt egy általam létrehozott function modulból hívom meg. Egyelőre nem tudom, mi a gond. Neten már keresgéltem, de nem jártam sikerrel. Mutatom a kódot:

$db = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname); function krisztina(){ $topic_querry = "SELECT * FROM topic_table"; $rows = mysqli_num_rows(mysqli_query($db,$topic_querry)); echo 'Number of rows: '.$rows; return 1; } $iw = krisztina(); echo '<br />Return: '.$iw; exit;
Előre is köszönöm a segítséget!
Mutasd a teljes hozzászólást!
Mivel nem tudjuk a szerver beállításait, állítsd be, hogy minden egyes hibaüzenetet reportáljon a PHP:

error_reporting(E_ALL);
Amikor függvényt írsz, érdemes ezekre odafigyelni:
1) A függvényed futása ne függjön se a függvény deklarációjának a környezetétől, se a meghívás környezetétől. Kerüld el a globális változókhoz való hozzáférést.
2) Minden olyan információt, amire a függvényednek szüksége van, paraméterként adj át. Az előállt eredményt pedig visszatérési értékként add vissza a hívó félnek. Esetleg ha hiba történik, dobj kivételt, és ez legyen is dokumentálva.
3) Úgy írd meg a függvényedet, hogy ne legyen mellékhatása. Vagyis ne csináljon semmi mást azon túl, amit a neve elárul.
Mutasd a teljes hozzászólást!

  • Hali!

    Egyelőre nem tudom, mi a gond. Neten már keresgéltem, de nem jártam sikerrel.

    Pedig borzasztóan egyszerű: láthatósági probléma van (semmi köze ennek ahhoz, hogy mysqli-re tértél ál). A krisztina() függvényedben nem „látszik” a $db változód, mivel a függvényen kívül deklaráltad. Add át a függvényednek paraméterben a $db változót (akár referenciaként). Esetleg definiálhatod a függvényen belül global-ként (de nem ajánlom – gyere rá, hogy miért).

    És hogy miért nem jártál sikerrel? Például azért, mert nem figyeltél a hibaüzenet(ek)re.

    Mutasd a teljes hozzászólást!
  • Amikor a weboldal 5.6-os PHP-t használt, akkor ugyanez a kód működött. Míg máshol elég volt módosítanom a mysql függvényeket mysqli-re, addig itt ez kevésnek bizonyult. Sokáig nem is értettem, mi a probléma.

    Találtam olyan megoldási javaslatot a neten, ami azt ajánlotta, hogy 'function krisztina($db)' módon deklaráljam a függvényt. Kipróbáltam, nem működik. Találkoztam a global megoldással is. Az sem működött.

    Nem kapok semmilyen hibaüzenetet. Egyszerűen csak nincs értéke (még nulla sem) a $rows változónak futtatáskor.

    Tehát így sem működik:

    $db = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname); function krisztina($kk){ $topic_querry = "SELECT * FROM topic_table"; $rows = mysqli_num_rows(mysqli_query($kk,$topic_querry)); echo 'Number of rows: '.$rows; return 1; } $iw = krisztina($db); echo '<br />Return: '.$iw; exit;
    Mutasd a teljes hozzászólást!
  • Bőven lehet, hogy a connect nem sikerült, csak megspóroltad a hibaellenőzést/-kezelést/-kiírást.
    Mutasd a teljes hozzászólást!
  • $db = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname); function krisztina(){ global $db; $topic_querry = "SELECT * FROM topic_table"; $rows = mysqli_num_rows(mysqli_query($db,$topic_querry)); echo 'Number of rows: '.$rows; return 1; } $iw = krisztina(); echo '<br />Return: '.$iw; exit;
    Mutasd a teljes hozzászólást!
  • Mysql-re én összeállítottam egy fügvényt.

    ezt include-val beilleszted abba a fájlokba amikbe adatbázis kell
    mysql.php

    //$query --> lekérés //$mod --> lekérés tpusa (read "default",write,readarray,rows) //$tabla --> adatbázis tábla function MysqlRead($query="connect", $mod="read",$tabla="breed"){ $myslhost="localhost"; $mysqluser="felhasználónév"; $mysqlpass="jelszó"; if(!isset($GLOBALS["connect"]) || is_int($GLOBALS["connect"])){ $connect = @mysqli_connect($myslhost, $mysqluser, $mysqlpass,$tabla) or die("Hibás adatbázis felhasználó vagy jelszó"); $GLOBALS["connect"]=$connect; } if(isset($GLOBALS["connect"])){ $connect=$GLOBALS["connect"]; } @mysqli_query($connect,"set names utf8mb4"); if($query != "connect"){ $lek = @mysqli_query($connect,$query); if($mod=="write"){ $read = mysqli_insert_id($connect); return $read; } if($mod=="read"){ while($read[] = @mysqli_fetch_assoc($lek)); @mysqli_free_result($lek); $reads = array(); foreach($read AS $k=>$v){ if($v){ $reads[$k] = $v; } } return $reads; } if($mod=="readarray"){ while($read[] = @mysqli_fetch_array($lek)); @mysqli_free_result($lek); return $read; } if($mod=="rows"){ $read=@mysqli_num_rows($lek); return $read; } } if(!isset($GLOBALS["connect"])){ @mysqli_close($connect); } }

    te lekérésedet gy kérném le.

    $iw = MysqlRead("SELECT * FROM topic_table"); echo '<br />Return: '.$iw; exit;
    Mutasd a teljes hozzászólást!
  • Próbáltam már. Nem működik.
    Mutasd a teljes hozzászólást!
  • Köszönöm, de az általam írt kódnak a hibájára/javítására szeretnék rájönni.
    Mutasd a teljes hozzászólást!
  • A kapcsolat rendben van. Ha function függvényen kívülről futtatom ugyanazokat a sorokat, akkor minden rendben működik.
    Mutasd a teljes hozzászólást!
  • function krisztina($db){ $topic_querry = "SELECT * FROM topic_table"; $rows = mysqli_num_rows(mysqli_query($db,$topic_querry)); @mysqli_close($db); echo 'Number of rows: '.$rows; return 1; } $db = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname); $iw = krisztina($db); echo '<br />Return: '.$iw; exit;
    $db változót be kell küldened a krisztina fügvénybe.

    ne felejtsd el lezárni a lekérést
    @mysqli_close($db);
    Mutasd a teljes hozzászólást!
  • Volt itt az előbb egy olyan rész, hogy a függvény nem látja a külső változókat. Természetesen ez fordítva is igaz, a függvény lokális változói ($rows, pl.) sem látszanak a függvények kívül.

    function krisztina($db, &$rows) { $topic_querry = "SELECT * FROM topic_table"; $rows = mysqli_num_rows(mysqli_query($db,$topic_querry)); echo 'Number of rows: '.$rows; return 1; }
    Nyilván ebben a speciális esetben erre a célra elég lenne a `return $rows` a `return 1` helyett.
    Mutasd a teljes hozzászólást!
  • NevemTeve jól mondja.

    function krisztina($db){ $topic_querry = "SELECT * FROM topic_table"; $rows = mysqli_num_rows(mysqli_query($db,$topic_querry)); @mysqli_close($db); return $rows; } $db = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname); $iw = krisztina($db); echo '<br />Return: '.$iw; exit;
    Mutasd a teljes hozzászólást!
  • Nem működik. Próbáltam már ezt a krisztina($db)-s megoldást is.
    Mutasd a teljes hozzászólást!
  • Mi a hiba üzenet?
    Mutasd a teljes hozzászólást!
  • Na itt épp rólad van szó.
    Mutasd a teljes hozzászólást!
  • És miért szeretnéd függvénybe tenni?

    krisztina = mysqli_num_rows(mysqli_query($db,$topic_querry))
    Mutasd a teljes hozzászólást!
  • Nincs hibaüzenet. Illetve nem tudom, hogy hibaüzenetet hogy lehet lekérdezni, ha van is valahol. 
    Az eredmény ez:

    Number of rows: Return: 1
    A Return kiírást egyébként csak azért tettem oda, hogy lássam, hogy évigfut a function. Különösebben nem érdekes. A célom az, hogy function függvényen belül legyen a mysqli lekérdezés.
    Mutasd a teljes hozzászólást!
  • Pont rólad van itt szó.
    Mutasd a teljes hozzászólást!
  • Ezért az 1 lekérésért szerintem felesleges függvénybe raknod.

    Ez olyan mint ha a kapu előtt állnál amibe be szeretnél jutni és a kulcs is nálad van, de te inkább előveszed a pajszert.
    Mutasd a teljes hozzászólást!
  • Használd a fent említett mysql.php

    az össze lett állítva, hogy a lekérdezések minden esetben jók legyenek.

    figyelj az adatbázis terhelésre.
    Mutasd a teljes hozzászólást!
  • Az eredeti kódom jóval bonyolúltabb. Ez a példa-kódsor azért van teljesen leegyszerűsítve, hogy kizárólag a jelenséggel/hibakereséssel foglalkozhassunk. Ugyanis a problémára pontosan jól rámutat. Arra, hogy function függvényen belülről nem működik a mysqli lekérdezés. Gyakorlatilag ezt szeretném orvosolni. Ha lehet. Ha nem, akkor majd megoldom másképp. Csak gondoltam, hátha van rá megoldás.

    Az eddigi ajánlatokat, segítségeket köszönöm. Tegnap egész nap ezzel játszottam eredménytelenül. Ezek után jöttem ide, mivel ti biztosan gyakorlottabbak vagytok ezen a téren.
    Mutasd a teljes hozzászólást!
  • Szeretnélek megnyugtatni: nem a PHP rossz, te bénázol. Ez _nem_ sértegetődés akar lenni, mindenkivel előfordulhat. (Például ma `set PATH=...`-ot írtam `export PATH=...` helyett, nem is működött a bash-script.)
    Mutasd a teljes hozzászólást!
  • Nyilván én bénázok - nincs is ezzel probléma. Egyébként simán át tudom írni a kódomat a function függvény kihagyásával. Kb. 10 perc lenne. De most már kíváncsi vagyok arra, hogy a jelenlegi verzióval mi a probléma.

    Hiányoltad, hogy nem másoltam be mindig, hogy mikkel próbálkoztam. Pár verziót mutatok. Az utolsónál (6) azt demonstrálom, hogy a function-ön belüli rész nem működik, de rögtön alatta ugyanaz a lekérdezés igen.

    // 1.) $db = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname); function krisztina(){ $topic_querry = "SELECT * FROM topic_table"; $rows = mysqli_num_rows(mysqli_query($db,$topic_querry)); echo 'Number of rows: '.$rows; return 1; } $iw = krisztina(); echo '<br />Return: '.$iw; exit; // 2.) $db = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname); function krisztina(){ global $db; $topic_querry = "SELECT * FROM topic_table"; $rows = mysqli_num_rows(mysqli_query($db,$topic_querry)); echo 'Number of rows: '.$rows; return 1; } $iw = krisztina(); echo '<br />Return: '.$iw; exit; // 3.) $db = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname); function krisztina($db){ $topic_querry = "SELECT * FROM topic_table"; $rows = mysqli_num_rows(mysqli_query($db,$topic_querry)); echo 'Number of rows: '.$rows; return 1; } $iw = krisztina($db); echo '<br />Return: '.$iw; exit; // 4.) $db = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname); function krisztina($kkk){ $topic_querry = "SELECT * FROM topic_table"; $rows = mysqli_num_rows(mysqli_query($kkk,$topic_querry)); echo 'Number of rows: '.$rows; return 1; } $iw = krisztina($db); echo '<br />Return: '.$iw; exit; // 5.) function krisztina(){ $db = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname); $topic_querry = "SELECT * FROM topic_table"; $rows = mysqli_num_rows(mysqli_query($db,$topic_querry)); echo 'Number of rows: '.$rows; return 1; } $iw = krisztina(); echo '<br />Return: '.$iw; exit; // 6.) $db = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname); function krisztina(){ $topic_querry = "SELECT * FROM topic_table"; $rows = mysqli_num_rows(mysqli_query($db,$topic_querry)); echo 'Number of rows: '.$rows; return 1; } $iw = krisztina(); echo '<br />Return: '.$iw; // Ez itt lefut, visszaadja szépen a talált sorok számát $topic_querry = "SELECT * FROM topic_table"; $rows = mysqli_num_rows(mysqli_query($db,$topic_querry)); echo 'Number of rows-2: '.$rows; exit;
    Mutasd a teljes hozzászólást!
  • Akkor most nézd meg, hogy ezek között van-e olyan, amiből kimaradt a hibaellenőrzés/-kezelés/-kiírás.
    Mutasd a teljes hozzászólást!
  • Olyan szerintem egyikben sincsen. Ki lehet íratni hibakódot miután valamelyik mysqli lekérdezés lefut? A csatlakozásra tudom, hogy van hiba-lekérdező függvény. De azzal nincs probléma.

    Aham... Találtam egy mysqli_error() függvényt...
    Mutasd a teljes hozzászólást!
  • Mivel nem tudjuk a szerver beállításait, állítsd be, hogy minden egyes hibaüzenetet reportáljon a PHP:

    error_reporting(E_ALL);
    Amikor függvényt írsz, érdemes ezekre odafigyelni:
    1) A függvényed futása ne függjön se a függvény deklarációjának a környezetétől, se a meghívás környezetétől. Kerüld el a globális változókhoz való hozzáférést.
    2) Minden olyan információt, amire a függvényednek szüksége van, paraméterként adj át. Az előállt eredményt pedig visszatérési értékként add vissza a hívó félnek. Esetleg ha hiba történik, dobj kivételt, és ez legyen is dokumentálva.
    3) Úgy írd meg a függvényedet, hogy ne legyen mellékhatása. Vagyis ne csináljon semmi mást azon túl, amit a neve elárul.
    Mutasd a teljes hozzászólást!
  • Megvan a hiba! Az általad említett 2-es pont átgondolása után jöttem rá. Köszönöm! Eredetileg ezt a kódot használtam:

    $topic_querry = "SELECT * FROM ".$topic_table;
    Viszont függvényen belül a $topic_table változó nem volt elérhető.

    Köszönöm mindenkinek a segítséget!
    Mutasd a teljes hozzászólást!
  • Örülök, hogy megoldódott a probléma. De ezt a kérdést egyikünk sem tudta volna megoldani azok alapján, amit te elmondtál nekünk. Azt értsd meg kérlek, hogy neked is érdeked az, hogy minél hamarabb választ kapj a kérdésedre, másrészt pedig mi is a saját szabadidőnket áldozzuk fel, hogy segíthessünk neked. Ezért fontos az, hogy pontosan írd meg a kérdésedet, és ne hallgass el előlünk fontos információkat. Úgy gondolom, mindenki, aki segíteni próbál neked, megérdemli legalább azt, hogy ne vezesd félre őket!
    Mutasd a teljes hozzászólást!
  • Tudom és igazad van.
    Az a helyzet, hogy éppen azért próbáltam minél egyszerűbben vázolni az esetet, hogy nektek  legyen átláthatóbb a probléma. Ugyanakkor éppen ezzel iktattam ki belőle azt a részt, ami nálam a hibát okozta. Tanultam az esetből.

    Még egyszer köszönöm mindenkinek a segítségét, türelmét!
    Mutasd a teljes hozzászólást!
  • Hali!

    Eredetileg ezt a kódot használtam…

    Asztakúrvahéccencségit! Melyik kisujjunkból kellett volna kiszopnunk, hogy eredetileg mit használtál, ha a problémád leírásában nem azt írtad amit használsz?

    Az általad említett 2-es pont átgondolása után jöttem rá.

    Akkor el sem gondolkodtál azon amit írtam?! Azaz, hogy „láthatósági probléma van”., meg hogy a „krisztina() függvényedben nem »látszik« a…”?

    A jövőben azt a választ fogadd el megoldásként ami ELSŐKÉNT azt adja. Most csak azért nem korrigálom, mert az én hozzászólásom lenne az.

    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd