Gå til innhold

Global variabel ikke global?


Anbefalte innlegg

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 av Rockie
Lenke til kommentar
Videoannonse
Annonse

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 av Rockie
Lenke til kommentar

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

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...