hakonvl Skrevet 4. februar 2011 Del Skrevet 4. februar 2011 (endret) Hei Jeg sitter og gjør et forøk på programere en modul til Drupal for å dele brukere mellom FluxBB og Drupal. Alt går helt fint frem til nå. Problemet oppstår når jeg skal koble meg til FluxBB databasen. Dette gjør jeg ved å inkludere filen forum/includes/dblayer/db_common.php der objektet $db opprettes. Senere i filen inkluderer jeg forum/includes/common.php som igjen inkluderer /includes/functions.php. I functions.php er det en funksjon som heter function set_default_user() som ser slik ut: // // Fill $pun_user with default values (for guests) // //Er $db tilgjengelig utenfor funksjonen? var_dump($db) //Ja. function set_default_user() { global $db, $db_type, $pun_user, $pun_config; //Men er den tilgjengelig innenfor funksjonen? var_dump($db); //Nei, og den finnes heller ikke i $GLOBALS $remote_addr = get_remote_address(); // Fetch guest user $result = $db->query('SELECT u.*, g.*, o.logged, o.last_post, o.last_search FROM '.$db->prefix.'users AS u INNER JOIN '.$db->prefix.'groups AS g ON u.group_id=g.g_id LEFT JOIN '.$db->prefix.'online AS o ON o.ident=\''.$remote_addr.'\' WHERE u.id=1') or error('Unable to fetch guest information', __FILE__, __LINE__, $db->error()); if (!$db->num_rows($result)) exit('Unable to fetch guest information. The table \''.$db->prefix.'users\' must contain an entry with id = 1 that represents anonymous users.'); $pun_user = $db->fetch_assoc($result); // Update online list if (!$pun_user['logged']) { $pun_user['logged'] = time(); // With MySQL/MySQLi/SQLite, REPLACE INTO avoids a user having two rows in the online table switch ($db_type) { case 'mysql': case 'mysqli': case 'mysql_innodb': case 'mysqli_innodb': case 'sqlite': $db->query('REPLACE INTO '.$db->prefix.'online (user_id, ident, logged) VALUES(1, \''.$db->escape($remote_addr).'\', '.$pun_user['logged'].')') or error('Unable to insert into online list', __FILE__, __LINE__, $db->error()); break; default: $db->query('INSERT INTO '.$db->prefix.'online (user_id, ident, logged) SELECT 1, \''.$db->escape($remote_addr).'\', '.$pun_user['logged'].' WHERE NOT EXISTS (SELECT 1 FROM '.$db->prefix.'online WHERE ident=\''.$db->escape($remote_addr).'\')') or error('Unable to insert into online list', __FILE__, __LINE__, $db->error()); break; } } else $db->query('UPDATE '.$db->prefix.'online SET logged='.time().' WHERE ident=\''.$db->escape($remote_addr).'\'') or error('Unable to update online list', __FILE__, __LINE__, $db->error()); $pun_user['disp_topics'] = $pun_config['o_disp_topics_default']; $pun_user['disp_posts'] = $pun_config['o_disp_posts_default']; $pun_user['timezone'] = $pun_config['o_default_timezone']; $pun_user['dst'] = $pun_config['o_default_dst']; $pun_user['language'] = $pun_config['o_default_lang']; $pun_user['style'] = $pun_config['o_default_style']; $pun_user['is_guest'] = true; $pun_user['is_admmod'] = false; } Se den øveste biten av funksjonen, resten har ikke noe å si enda. I allefall, dette skjønner jeg ikke helt. $db er jo tilgjengelig etter global $db til vanlig, men tydeligvis ikke når vil at den skal være der. Er det noe jeg har gjort feil, eller misforstått angående global? Takk Edit: Beklager to stk. av samme emne. Skal få den andre slettet nå. Edit2: Nå prøvde jeg å flytte inkluderingen av common_db.php inn i functions.php slik: if(!isset($db)){ include PUN_ROOT . "/include/dblayer/common_db.php"; } Gjorde dette først og fremst for å konsentrere eventuelle feilkilder på samme sted, men selv dette hjalp ikke. Endret 4. februar 2011 av Rockie Lenke til kommentar
FraXinuS Skrevet 5. februar 2011 Del Skrevet 5. februar 2011 Hvor includerer du forum/includes/dblayer/db_common.php? Hvis det gjøres fra inni en funksjoin så blir ikke $db global. Lenke til kommentar
hakonvl Skrevet 5. februar 2011 Forfatter Del Skrevet 5. februar 2011 (endret) Nå tulla jeg veldig, jeg trenger ikke å inkludere db_common.php, den FluxBB inkluderer alltid den fra common.php. Fikk det for meg at den ikke gjorde det, selv om jeg egentlig viste det. I allefall, den blir ikke direkte inkludert fra en funksjon, men Drupal inkluderer modulen min og det tror jeg går via en funksjon ( ! ) Fatal error: Call to a member function query() on a non-object in /home/hakon/dev/www/aslan/forum/include/functions.php on line 192 Call Stack # Time Memory Function Location 1 0.0002 637992 {main}( ) ../index.php:0 2 0.0043 1393928 drupal_bootstrap( ) ../index.php:21 3 0.0342 6475264 _drupal_bootstrap_full( ) ../bootstrap.inc:2056 4 0.0586 11856528 module_load_all( ) ../common.inc:4910 5 0.0869 17967312 drupal_load( ) ../module.inc:25 6 0.0872 18028152 include_once( '/home/hakon/dev/www/aslan/modules/fluxbb/fluxbb.module' ) ../bootstrap.inc:933 7 0.1259 18216608 require( '/home/hakon/dev/www/aslan/forum/include/common.php' ) ../fluxbb.module:18 8 0.1763 19515768 check_cookie( ) ../common.php:142 9 0.1763 19517952 set_default_user( ) ../functions.php:123 Mulig det er det som gjør det? Er det noen løsning på dette? Hvis ikke må jeg droppe å bruke koden fra FluxBB installasjonen, men heller kopiere den over i modulen min. Vil helst ikke, men det er kanskje en løsning. Jeg vill også prøve å gjøre så lite som mulig meg koden til FluxBB. Endret 5. februar 2011 av Rockie Lenke til kommentar
FraXinuS Skrevet 5. februar 2011 Del Skrevet 5. februar 2011 Ja, det er nok det som gjør det. Filen din blir includert fra inni en funksjon og da blir ikke variablene som ser ut som de er globale, globale likevel. Det kan være litt vanskelig å løse tror jeg, men det er noen muligheter. 1: includer filene du trenger i index.php utenfor alle funksjoner. Men da må du passe på at ikke drupal og fluxbb bruker globale variabler med samme navn, da kan det bli tull. 2: Før du includerer common.php kan du gjøre variablene som blir brukt globale. global $db; include PUN_ROOT . "/include/dblayer/common.php"; //Når $db nå blir satt i common_db.php skal den bli global. Men her også må du passe på at du ikke overskriver noen globale variabler fra drupal. 3: Hvis drupal og fluxbb bruker noen av de samme variablene så vil ikke de to metodene over funke så bra. Da kan kanskje denne måten funke: $backup = array(); $backup['db'] = $GLOBALS['db']; // Ta en backup av de variablene som blir overskrevet global $db; include PUN_ROOT . "/include/dblayer/common.php"; // kjør fluxbb kode set_default_user(); //Gjennopprett backup foreach($backup as $key => $value) $GLOBALS[$key] = $value; // Hvis du bruker fluxbb koden flere ganger kan det kanskje være lurt å lage noen funksjoner som setter og resetter de globale variablene før og etter bruk. Lenke til kommentar
hakonvl Skrevet 5. februar 2011 Forfatter Del Skrevet 5. februar 2011 Jeg tror jeg heller kommer til å finne akkuratt de kodebitene i FluxBB og kopiere de inn i koden til modulen min. Det er vell uansett den beste metoden, siden jeg i prinsippet laster inn alt som ligger under FluxBB, og ikke bare den biten som setter coockien og setter brukeren som akttiv i databasen. Takk fo hjelpen, har strengt talt aldri tenkt noe særlig over hvordan levetiden til variabler oppfører seg før, men jeg burde ha tenkt på å dette. Enten har jeg vell ikke trengt det, ellers har ting vært tilgjengelig via klasser. Nå vet jeg i allefall til neste gang Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå