Drupal 7 开发内部培训资料, 分头诗人

drupal session 的问题

赞成!
0
否决!

情况是这样,我在drupal的某页面里加了:

session_start();

$_SESSION['auth']="yes";

然后这个session在drupal 里面的页面里是可以获得的,没有问题:

<?php
    session_start();                                    
 
  if (@$_SESSION['auth'] != "yes")               
  {
    echo "么有session啊";
  }
  else{
  echo"session是有的啊啊啊啊";
  }
  ?>

可是我在drupal root里面放了个文件夹叫emag 里面有一些和drupal 无关的php文件。想在某种情况下调用这里的文件。

顺带说明一下: 这些php 不想写到drupal里面。因为这些文件比较多而且会按时手动更新。实在不想写drupal里面,要是每更新一次要module里面注册一下这个页面真不现实。所以drupal 是不认识他们的。但可以通过 url/emag/xxxx.php 访问

问题在这里的php文件竟然获取不到这个session。

请问这是怎么回事。session 不是写到服务器的么。难道drupal把他们写到数据库里去了?

顺便问一下有什么办法可以让这个文件夹里的所有php文件让drupal 识别。就是让这里的php 文件也可以认得出drupal的当前用户。连接到drupal 的数据库(当然应该也可以给这些东西写一个drupal 数据库链接的php include进去)就如同drupal 里面声明了的页面一样使用。

 

谢谢

8 个回答

赞成!
0
否决!

没错,drupal 写session进去数据库了,在sessions 表里面,Drupal将用户会话保存到它的数据库中而不是文件中。这意味着Drupal能够很容易的应用到多个服务器上,但是为了管理每个用户的会话信息它也增加了数据库的负担。如果一个站点每天有成千上万个用户,那么很容得就会看到这个sessions表将会极速膨胀。

赞成!
0
否决!

你可以看看drupal 的index.php ,参考它引入drupal 的文件试一下。

赞成!
0
否决!

谢谢孤魂,很受用,我最后参考了这个文章:

http://www.avenuewebmedia.com/drupalbootstrap-connect-drupal-external-ph...

 

	//set the working directory to your Drupal root

	chdir('/home/public_html/drupal/');

 

//require the bootstrap include require_once './includes/bootstrap.inc';

//Load Drupal

drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); //(loads everything, but doesn't render anything)

//display a node print '<pre>'; print_r(node_load(12)); print '</pre>';

 

我自己改的是:

 

<?php 
//set the working directory to your Drupal root
chdir('./');

//require the bootstrap include
define('DRUPAL_ROOT', getcwd());
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';

//Load Drupal

drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
//(loads everything, but doesn't render anything)
echo "ok";
//display a node
global $user;
echo "I am".$user->name;

把这个php放到网站根目录下,确实发现把drupal 引入来了。

由此看来确实是可以把其他php代码直接引入到drupal机制中的。

不过有个坑爹的事

我放子目录里面就是不行不知道是怎么了

我试过:

//set the working directory to your Drupal root
//chdir('./');

//require the bootstrap include
define('DRUPAL_ROOT', getcwd());
require_once DRUPAL_ROOT . '../includes/bootstrap.inc';

 

和这样子:

chdir('../');

//require the bootstrap include
define('DRUPAL_ROOT', getcwd());
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';

 

我有用这个方法打出路径看的,应该没问题啊:两个都试过了,就是不行

<?php
//获得当前目录
echo getcwd();
echo "<br />";

//改变为 images 目录
chdir("images");
echo "<br />";
echo getcwd();
?> 
输出:
C:\testweb\main
C:\testweb\main\images 

 

哪位眼尖或看得出来问题的 谢过了,不然就坑爹到只能引入根目录的php   子目录不行,这绝对不可能的。

 

chdir('../');

//require the bootstrap include
define('DRUPAL_ROOT', getcwd());
require_once DRUPAL_ROOT . './includes/bootstrap.inc';

 

这个也试了,真人笨没药医么,那几个点,怎么点的啊?

赞成!
0
否决!

文件叫4.php

<?php 
//set the working directory to your Drupal root
chdir('./');

//require the bootstrap include
require_once './includes/bootstrap.inc';

//Load Drupal

drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
//(loads everything, but doesn't render anything)
echo "olll";
//display a node
global $user;
echo "I am".$user->name;

 $result = db_query("SELECT  subbr, subru, subin, subcn, address1 FROM {subscribe} WHERE user_name = '%s'", $user->name);
    //   print_r ($result);
	//	$re = $result->fetch_array(); // this one can be use but the next line is much better. need to test more on this function
		$re = db_fetch_array($result);
		print_r ($re);

以上的放根目录确实可以啊,,

根目录下可以打出登陆用户名,,可以抽数据库

 

下面是放到一个叫yufei的子目录文件叫3.php

<?php

//set the working directory to your Drupal root
chdir('../');

//require the bootstrap include
require_once './includes/bootstrap.inc';

//Load Drupal

drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
//(loads everything, but doesn't render anything)
echo "olll";
//display a node
global $user;
echo "I am".$user->name;

 $result = db_query("SELECT  subbr, subru, subin, subcn, address1 FROM {subscribe} WHERE user_name = '%s'", $user->name);
    //   print_r ($result);
	//	$re = $result->fetch_array(); // this one can be use but the next line is much better. need to test more on this function
		$re = db_fetch_array($result);
		print_r ($re);

 

见鬼的打不出来 哭~~~~

 

更加神奇的是,我把bootstrap.inc 拷贝到同子目录下用同一个4.php文件也不行,哎,真不懂了

赞成!
0
否决!

getcwd() 函数返回当前目录。 若成功,则返回当前工作目录,否则返回false。所以只能放根目录,如果要放其他目录,不能用getcwd()

赞成!
0
否决!

如果是文件放在网站的二级目录的话,试一下require_once '../includes/bootstrap.inc';

两个点。

赞成!
0
否决!

哎,毫无办法,我改了改,这个是放二级目录的:

<?php
//set the working directory to your Drupal root
chdir('../');
echo "这个死鬼函数的地址:".getcwd();
echo"</br>";
//require the bootstrap include
$current_drupal_root = getcwd() ;
 echo "把这个地址赋值给了".$current_drupal_root;
define('DRUPAL_ROOT', $current_drupal_root);//赋值给静量试试,这样地址绝对是对的
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';

//Load Drupal
aaa();
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
echo "<br>"."+++++++++++++++++++++++++++++++"."<br>";
global $user;
echo "I am".$user->name;
echo"</br>";
 $result = db_query("SELECT  subbr, subru, subin, subcn, address1 FROM {subscribe} WHERE user_name = '%s'", $user->name);
		$re = db_fetch_array($result);
		print_r ($re);
		

 

就还是这段,chdir('../');少个点放root 还是没问题的哈。

为了准确测试是否有require_once 到bootstrap.inc 我直接在bootstrap.inc写了一个

function aaa(){
echo "</br>"."</br>"."</br>"."33333333333333333333"."</br>"."</br>"."</br>";}

 

卧槽的既然打出来了:

证明那个require_once是正确的。可是到底神马原因.$user->name 还是没有,数据库还是抽不了?  就是不能被识别啊。难道drupal  drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);这个只能用在根目录。这没天理啊。

 

这是根目录下正常的5.php文件

<?php
//set the working directory to your Drupal root
chdir('./');
echo "这个死鬼函数的地址:".getcwd();
echo"</br>";
//require the bootstrap include
$current_drupal_root = getcwd() ;//把这个地址赋值给了一个叫$current_drupal_root变量
 echo "把这个地址赋值给了".$current_drupal_root;
define('DRUPAL_ROOT', $current_drupal_root);//赋值给静量试试,这样地址绝对是对的
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';

//Load Drupal
aaa();
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
echo "<br>"."+++++++++++++++++++++++++++++++"."<br>";
global $user;
echo "I am".$user->name;
echo"</br>";
 $result = db_query("SELECT  subbr, subru, subin, subcn, address1 FROM {subscribe} WHERE user_name = '%s'", $user->name);
		$re = db_fetch_array($result);
		print_r ($re);

 

根目录下一切很perfect啊,美好就差一步之遥。哥真给他跪了..

赞成!
0
否决!

1, 拷贝 index.php 到 test/index.php

2,修改index.php 如下:

require_once (__DIR__ . '/../includes/bootstrap-drupalla.inc');
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
menu_execute_active_handler();

 

3,复制includes/bootstrap.inc 为 includes/bootstrap-drupalla.inc

4,找到 bootstrap-drupalla.inc 里面所有 require_once DRUPAL_ROOT . '/includes/errors.inc',修改里成require_once __DIR__. '/errors.inc';

5,访问 http://yourdomain/test/index.php