-1

すべてのコントローラーで変数 (PDO インスタンス) を使用できるようにしようとしています。私の application/core/MY_Controller.php には次のものがあります。

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class MY_Controller extends CI_Controller
{
    public $pdo;
}

アプリケーション/コントローラー/login.php:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Login extends MY_Controller 
{
    public function index()
    {
        if(!$this->pdo instanceof PDO)
        {
            $this->load->view('login_form');
        }
        else
        {
            redirect('home');
        }
    }

    public function connect()
    {
        $hostname = $this->input->post('hostname');
        $username = $this->input->post('username');
        $password = $this->input->post('password');

        $this->pdo = new PDO("mysql:host=$hostname", $username, $password);

        if($this->pdo instanceof PDO)
        {
            redirect('home');
        }
        else
        {
            $this->index();
        }
    }
}

アプリケーション/コントローラー/home.php:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Home extends MY_Controller
{
    public function index()
    {
        echo 'PDO should be available here but it is not:';
        print_r($this->pdo);
    }
}

アプリケーション/ビュー/login_form.php:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Login form</title>
</head>
<body>
    <div>
        <?php echo form_open('login/connect'); ?>
        <label for="hostname">Hostname</label>
        <input type="text" id="hostname" name="hostname" />
        <label for="username">User name</label>
        <input type="text" id="username" name="username" />
        <label for="password">Password</label>
        <input type="text" id="password" name="password" />
        <input type="submit" id="submit" name="submit" />
        <?php echo form_close(); ?>
    </div>
</body>

これをローカルでテストしています。サイトのアドレスにアクセスすると、ログインフォームが期待どおりに表示されます。送信時に login::connect() が呼び出され、$this->pdo に PDO インスタンスが含まれていることがわかります (login::connect で print_r($this->pdo を使用すると、「PDO オブジェクト ( )」と表示されます)。 Home コントローラにリダイレクトします $this->pdo には PDO インスタンスが含まれていません。

私は何を間違っていますか?ホームコントローラーへのリダイレクトと関係がありますか? 前もって感謝します。

4

1 に答える 1

1

まず第一に、PDO オブジェクトをコントローラーに含めないでください。

2番目の問題は、「ホーム」インスタンスがpdoオブジェクトを作成しなかったことです。これはコントローラーやリダイレクトなどのエラーではなく、オブジェクト指向の考え方の基本的な欠陥です。

class A {
  public $test;
}

class B extends A {
  function setTest($test) { $this->test = $test; }
}

class C extends A
{
}

$b = new B(); // create instance of B
$b->setTest("hello"); // set value in INSTANCE of B
$c = new C(); // create instance of C
echo $c->test; // get value from instance of C

これは基本的にあなたがしていることです。B のインスタンスで設定された値が C のインスタンスで使用できることを期待していますが、それはうまくいきません。コンストラクターまたは init で pdo を初期化することもできますが、これにより多くの pdo インスタンスが作成されるため、適切ではありません。これを格納してすぐに利用できるシングルトンまたはレジストリが必要です。

ともう一度繰り返します。pdo はコントローラーではなく、ドメイン ロジックにある必要があります (つまり、モデル)

于 2013-05-01T08:06:54.983 に答える