Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Yii数据库连接问题 任务_Php_Database_Apache_Yii_Oracle10g - Fatal编程技术网

Php Yii数据库连接问题 任务

Php Yii数据库连接问题 任务,php,database,apache,yii,oracle10g,Php,Database,Apache,Yii,Oracle10g,我需要的是,基于Oracle DB用户系统对用户进行身份验证: 用户进入登录页面 输入用户名和密码 应用程序尝试与给定参数建立连接 如果成功,将使此连接在应用程序上保持 我正在使用Yii框架 我所做的。。。 我从protected/config/main.php文件中删除了db组件。根据替换的身份验证(位于受保护的/components/UserIdentity.php)和以下内容 public function authenticate() { $dsn='oci:dbname=XE;c

我需要的是,基于Oracle DB用户系统对用户进行身份验证:

  • 用户进入登录页面
  • 输入用户名和密码
  • 应用程序尝试与给定参数建立连接
  • 如果成功,将使此连接在应用程序上保持
我正在使用Yii框架

我所做的。。。 我从
protected/config/main.php
文件中删除了
db
组件。根据替换的
身份验证
(位于
受保护的/components/UserIdentity.php
)和以下内容

public function authenticate()
{
 $dsn='oci:dbname=XE;charset=UTF8';
 $connection=new CDbConnection($dsn,$this->username,$this->password);
 $connection->active=true;
 return $connection->getConnectionStatus();
}
它没有建立任何联系。顺便说一句,我用oracle客户端测试了服务器。一切都很好

问题是
  • 我不确定我做这件事的方式是否正确
  • 如何使已建立的数据库连接在整个应用程序上持久化
  • 顺便提一下 我的开发环境
    Oracle DB和Apache 2.2.4+PHP5.4 Web服务器在Windows Server 2003上工作。

    花了一些时间来理解您想要什么。所以基本上是这样的:

    • 用户尝试使用用户名/密码登录
    • 要验证用户,请检查是否可以使用与DB凭据相同的用户名/密码建立DB连接
    • 如果可以打开连接,则用户应该有一个可用的
      db
      组件,该组件在整个用户会话中使用相同的连接凭据
    您创建自定义
    UserIdentity
    的方法是正确的。它们用于进行身份验证。我不确定你的代码为什么会失败,但你的思路是对的。也许
    getConnectionStatus()
    不适合Oracle。您可以尝试为测试执行另一个简单的SQL命令

    如果您已成功测试连接,则应在用户会话中存储
    用户名
    密码
    ,例如:

    Yii::app()->user->setState('__db_username',$this->username);
    Yii::app()->user->setState('__db_password',$this->password);
    
    现在,在登录后使用
    db
    组件有点棘手。你可以采取不同的方法。我将描述两个:

    1.创建自定义CDB连接 现在,您可以在
    main.php
    中将其配置为
    db
    组件,而无需用户名和密码,当然:

    'components' => array(
        'db' => array(
            'class' => 'DynamicDbConnection',
            'connectionString' =>'oci:dbname=XE;charset=UTF8',
        ),
     ),
    
    2.从控制器::init()添加CDB连接 您可以从基本控制器
    init()
    方法添加
    db
    组件:

    class Controller extends CController
    {
        public function init()
        {
            $username = Yii::app()->user->getState('__db_username');
            $password = Yii::app()->user->getState('__db_password');
    
            if($username && $password) {
                Yii::app()->setComponent('db', array(
                    'username' => $username,
                    'password' => $password,
                ));
            }
            parent::init();
       }
    
    为此,您还需要在
    main.php
    中配置基本的
    db
    组件


    这两种方法可能都需要一些调整,因为我还没有测试过。但是你应该知道基本的想法。

    你到底为什么要删除
    db
    组件。你做错了。2.DB componennt建立到数据库的连接,在配置中将连接字符串和所有需要的参数一起添加到此组件,您将在所有应用上使用dbconnection persistenet。@ineersa重新阅读我的问题。看来你们根本不懂这个问题。主要问题是,我的连接基于用户输入的登录和通过(用户输入数据库本身的登录和通过。当您在数据库的某个表中检查身份验证凭据时,这不是基本的身份验证)。如何在没有db登录和pass的情况下建立持久的db连接?:)@MichaelHärtl阅读上面的评论,你到底为什么需要这个?写CPanel?使用DB连接设置进行cofig,使用用户输入填充,将其与主配置合并。
    class Controller extends CController
    {
        public function init()
        {
            $username = Yii::app()->user->getState('__db_username');
            $password = Yii::app()->user->getState('__db_password');
    
            if($username && $password) {
                Yii::app()->setComponent('db', array(
                    'username' => $username,
                    'password' => $password,
                ));
            }
            parent::init();
       }