MySQL kezelő függvény?

Anonymous képe

Már korábban is kaptam itt segítséget a kis problémáimmal kapcsolatban, úgyhogy bátorkodom most is "zaklatni" a tisztelt hozzáértőket!
A helyzet az, hogy létrehoztam a MySQL adatbázisban néhány saját táblát, illetve a 'users' táblát is kibővítettem pár új mezővel. A kérdés, hogy ad-e a Drupal valami egyszerűsített adatbáziskezelő függvényeket, amivel tudom írni, olvasni, bővíteni a tábláimat, avagy a rendes MySQL parancsokat kell használnom ehhez.
Olyasmire gondolok egyébként, mint ez:

global $user;
$userid = $user->uid;

Ezzel a módszerrel ugye nagyon egyszerűen tudom olvasni a 'users' tábla aktuális felhasználóra vonatkozó sorát, de én írni is szeretném azt, illetve más táblákhoz is szeretnék hozzáférni.
Mi a legegyszerűbb megoldás ebben az esetben?

bye:vili
www.kekhalal.net

Fórum: 
Sweetchuck képe

Szia

Nem szokás más modulok adattábláihoz mezőket hozzáadni. A Drupal a Hook rendszer segítségével lehetőséget ad mindenféle beavatkozásra.

Az adatbázis kezelő függvényekről itt olvashatsz.

további ovasmányok
http://drupal.hu/kezikonyv/fejlesztes
http://api.drupal.org/api/function/hook_user/6

0
0
vili képe

Köszönöm a gyors reagálást!
Értsem úgy, hogy akkor nincs a global user -hez hasonló egyszerű mód, hanem maradnak a MySQL parancsok!?

> Nem szokás más modulok adattábláihoz mezőket hozzáadni.
De én mégis ezt szeretném... :)

> A Drupal a Hook rendszer segítségével lehetőséget ad mindenféle beavatkozásra.
Lehet erről a Hook rendszerről valahol magyarul is olvasni?

> Az adatbázis kezelő függvényekről itt olvashatsz.
Esetleg ezekről valami magyar nyelvű infó?

bye:vili

0
0
Sweetchuck képe

Mit akarsz csinálni?

0
0
vili képe

>Mit akarsz csinálni?

Egy kis játékos oldalt. Néhány beviteli mező, pontozás, ilyesmi.

0
0
nevergone képe

Így keletkeznek az olyan Drupal rendszerek, melyeket nem lehet majd frissíteni a hagyományos módon, minden esetben túrni kell a kódon, és persze jönnek elő sorban a hibák... és akkor megy a sírás-rívás, meg minden.
Értsd meg: olyan táblákat, melyeket nem te hoztál létre, ne piszkálj élesnek szánt rendszeren. Minden olyan adatot, amelyet te adsz hozzá a rendszerhez, külön táblába tedd, és valamilyen kulccsal (jelen esetben uid) kösd össze a Drupalban szereplő adatokkal.

A hook rendszerről magyar nyelvű leírást itt találsz, de utána már ez is különösebb probléma nélkül érthető.

0
0
vili képe

>Értsd meg: olyan táblákat, melyeket nem te hoztál létre, ne piszkálj élesnek szánt rendszeren.
OK, értem én! És elfogadom. De...
...nem kötekedni akarok, csak érdeklődök: Ha kibővítem a 'users' táblát pár plusz mezővel, az milyen problémát okozhat nekem a későbbiekben? A mezőknek van kezdőértékük, a nevük pedig olyan, ami tuti nem fog bekerülni a hivatalos Drupal kiadásba.

>külön táblába tedd, és valamilyen kulccsal (jelen esetben uid) kösd össze
A fő gondom ezzel a megoldással az (pedig az eredeti elképzelésem ez volt), hogy nem tudom miként hozhatnék létre egy új sort a regisztrációkor ebben a külön táblában.

>A hook rendszerről magyar nyelvű leírást itt találsz
Köszönöm!

0
0
nevergone képe

Nem használtam soha, de talán segíthet:

miként hozhatnék létre egy új sort a regisztrációkor ebben a külön táblában.

hook_user

"register": The user account registration form is about to be displayed. The module should present the form elements it wishes to inject into the form.

0
0
vili képe

Valóban a hook_user lett a megoldás. Igaz, nem a 'register' $op-pal, hanem a 'login'-nal, mivel a regiszráció alatt nem tudtam lekérdezni a felhasználóhoz tartozó uid-t, míg a bejelentkezéskor már igen.

Az eredmény egy 10 soros kód lett, amivel fél napot tököltem (még csak tanulgatom a PHP-t és a MySQl-t is, a Drupal szépségeivel együtt). A vicc az, hogy ennyi munka után kb. ugyanott vagyok, mint amikor 10 perc alatt kibővítettem az users táblát... :)
De nem bánom, mert megismertem a modul készítés szépségét, és tetszik.

Pedig először nagyon el akartam kerülni, főleg, hogy bármit is kérdeztem a fórumon, mindenki azzal jött, hogy ne gányoljak, hanem fejlesszek modult. Ez elég zavaró volt, de tudom, hogy jószándék vezette a hozzászólókat!

0
0

bye:vili
www.kekhalal.net

pp képe

A vicc az, hogy ennyi munka után kb. ugyanott vagyok, mint amikor 10 perc alatt kibővítettem az users táblát... :)

Az biztos, hogy tanultál egy csomó mindent és megismertén egy nagyon jó rendszert, tehát ezért sem vagy ugyan ott. A kapott rendszered pedig (már ha mindent jól csináltál) nem fog egy fél év múlva a fejedre omlani, mert egy összegányolt kóddal pont ez lenne a baj.

pp

0
0
Sweetchuck képe

Most már legalább tudod hogy mi különbség a gányolás és a profi megoldás között.

Egyébként nagyon furcsa volt, hogy Nevergone a hook_user() „register” részét idézte. Főleg hogy ott az egyértelmű angol szöveg hogy mire való. Biztos vagyok benne, hogy csak véletlenül tévesztett, vagy azt hitte hogy arra van szükséged.

Innen a távolból a pontos cél ismerete nélkül azt mondom, hogy az én megoldásom a következő lenne:

function xxx_user($op, &$edit, &$account, $category = NULL) {
  switch ($op) {
    case 'insert' :
      //Tudomásom szerint ilyenkor jön létre egy új felhasználó.
	$sql = ”INSERT INTO {xxx_my_data_for_users} (uid, ...) VALUES ('%d', ...);
      $dbr = db_query($sql, $account->uid, ...);
      if (!$dbr) {
        //Hiba kezelés.
      }
      break;
    case 'load' :
      $sql = ”SELECT * FROM {xxx_my_data_for_users} WHERE uid = '%d';
      $dbr = db_query($sql, $account->uid);
      $account->xxx = db_fetch_object($dbr);
      break;
  }
}

Ez csak egy példa volt, ami feltételezi, hogy minden felhasználóhoz tartozik egy rekord a táblában.

Továbbá az adattáblák létrehozása nem kézzel történik.
http://api.drupal.org/api/function/hook_install/5
Ha szeretnéd tudni, hogy hova kell rakni az xxx_install() függvényt, ahhoz lapozgasd át a kézikönyvet.

Az adattábla alapértékekkel való feltöltése:
http://api.drupal.org/api/function/hook_enable/5

Amikor egy telepített Drupal rendszeren először engedélyezel egy modult akkor lefut a hook_install() és utána a hook_enable().
Ez után ha kikapcsolod a modult, és újra engedélyezed, akkor már csak a hook_enable() fog lefutni.

Amennyiben a Drupal 6-hoz fejlesztesz keresgélj a 'hook_schema' kulcsszóra.

0
0
nevergone képe

Nem volt tiszta a kérdés számomra, ezért csak a használandó függvényt tudtam meghatározni, de hogy azon belül pontosan mi kellene, abban már nem voltam biztos. Akkor ezek szerint tévedtem, de nem is baj, köszönöm a precíz hozzászólásokat, én is tanultam belőlük. :)

0
0
vili képe

Az én megoldásom ez lett:

function helix_user($op) {
  if ($op == 'login') {
  	global $user;
	$uid = $user->uid;
 
  // Ez a rész mevizsgálja a 'helix_users' táblát, hogy szerepel-e benne az
  // 'uid' érték. Ha igen, akkor az $uid2 = $uid.
  $eredmeny = db_query("SELECT * FROM helix_users WHERE uid2 LIKE $uid");
  while($sor = db_fetch_object($eredmeny)){
  	$uid2 = $sor->uid2;
  }
  // Ha az $uid2 nem egyenlő $uid -dal, akkor beszúrja a kezdő sort a
  // helix_users táblába 
  	if ($uid != $uid2) {
		db_query("INSERT INTO helix_users (uid2) VALUES ($uid)");
	}
  }
}


Továbbá az adattáblák létrehozása nem kézzel történik.
Tudom, de itt most csupán egy saját felhasználású modulról van szó. Ha terjeszteni akarnám, akkor mindenképp csinálnék install részt is.

Amennyiben a Drupal 6-hoz fejlesztesz keresgélj a 'hook_schema' kulcsszóra.
Ó, megmaradok egyelőre az 5-ös verziónál. Itt is van tanulnivaló bőven! :)

Még egyszer köszönöm mindenkinek a segítő hozzászólásokat!
Ezek után ha gondom lesz, akkor már a fórum modul fejlesztéses részében fogok kérdezni tőletek!

0
0

bye:vili
www.kekhalal.net

Sweetchuck képe

Régen a Füles újságban volt olyan játék, hogy két egyformának tűnő képen meg kellet keresni az apró, ám de lényeges különbségeket.

Szerintem neked is kéne ilyen játékot játszanod. :-D
egyik kép

  $eredmeny = db_query("SELECT * FROM helix_users WHERE uid2 LIKE $uid");



másképp
  $eredmény = db_query("SELECT * FROM {helix_users} WHERE uid2 = '%d'", $user->uid);

Van különösebb oka annak, hogy a LIKE operátort választottad?
Ha az adattábla rekordjából csak 1 mezőre vagy kíváncsi akkor ne a ”SELECT *”-ot használd. Fölöslegesen növeli a hálózati adatforgalmat.
Ha az uid2 mező egyedi akkor miért kell while ciklus?
Ha az uid2 mező nem egyedi akkor miért csak az utoljára kiolvasott rekordra vagy kíváncsi?
A hook_user signaturája így néz ki:hook_user($op, &$edit, &$account, $category = NULL)
Az $account paraméter nem véletlen.
http://api.drupal.org/api/function/db_num_rows/5

Előbbi hozzászólásod alapján azt hinné az ember, hogy megértetted hogy miért fontos a Drupal hook rendszerét használni, és a javaslatokat (nem az enyémét/miénket hanem a Drupal-ét) betartani. (hook_install())
Külnben a Drupal fog betartani neked. :-)

0
0
vili képe

Átalakítottam egy kicsit a kódot, a javaslataid szerint.

Különösebb oka a LIKE operátornak nem volt, csupán így láttam egy mintán és mivel működött nálam is, ezért használta. Most kicsit átolvastam az idevonatkozó részt, és valóban felesleges volt.

A SELECT * helyett már SELECT {mezoneve} van és a while ciklust is kiszedtem a kódból.

A miértekre a válaszom az, hogy még nagyon az út elején járok! Ám ha ilyen segítőkész emberek vannak a fórumon, biztos gyorsan fogok haladni. :)

0
0

bye:vili
www.kekhalal.net

Sweetchuck képe

A tábla neveket azért kell kapcsos zárójelek közé tenni, mert az SQL stringek autómatikusan egy átalakításon esnek át a végrehajtás elött.
http://api.drupal.org/api/function/db_prefix_tables/5
Az ehhez szükséges beállításokat a settings.php -ben lehet elvégezni a $db_prefix résznél.
Tehát a SELECT {mezoneve} csak addig működik amíg nincsen megadva db_prefix.

0
0
aries képe

Nagyon hosszú lesz az az út a zsákutcák miatt úgy látom. Azt javaslom olvasd el a szakirodalmat először. Hosszútávon megéri nem vaktában lövöldözni kiollózott kódrészletekkel, amiről nem tudod, hogy miért működik, ha egyáltalán működik.

Aries
http://aries.mindworks.hu

0
0
aries képe

Új moduloknak új táblát érdemes létrehozniuk, mivel van hook_uninstall is, ami legtöbbször letörli a modul által létrehozott táblákat és így a Te adataidat is. Bár ez a user modulra nem vonatkozik, érdemes konzekvensnek maradni és külön szedni, amit más valósít meg.

Aries
http://aries.mindworks.hu

0
0