локальные переменные php теряют значения при вызове второго метода - PullRequest
0 голосов
/ 19 июля 2011

У меня есть простой синглтон, который устанавливает объект pdo из класса фабрики, в первом наборе объект pdo прекрасно видит свое значение.но когда я вызываю метод singleton second (который устанавливает вызов sql), я вижу, что объект pdo не установлен.вот примеры кодов: класс синглтона:

<?php
require_once ('DBFactory.php');
require_once ('Config.php');

class DBHandler {

    private static $instance;
    private $pdo = NULL;

    private function __construct()
    {



    }

    public function ConnectToDb($db_name)
    {
        $ConfigObj = new Config();
        $SelectedDbConfig = $ConfigObj->GetSelectedDB($db_name);
        $pdo = DBFactory::GetDBConnection(Config::DB_TYPE_MYSQL,$SelectedDbConfig["host"],
                                                                 $SelectedDbConfig["db"], 
                                                                 $SelectedDbConfig["user"],
                                                                 $SelectedDbConfig["pass"]);

        if(!isset($pdo))
            return false;

       return true;

    }

    public function SetUserNameAndPass($user,$pass)
    {
        $query_add_user = "INSERT INTO (name ,password) values ('$user' , '$pass') ";
        if(!$this->ExecQuery($query_add_user))
        {
            echo "sql failed";
        }
    }


    public function ExecQuery($query_str)
    {

        $statment_handler = $this->pdo->prepare($query_str);
        if(!$statment_handler) {
            throw new ErrorException($this->pdo->error, $this->pdo->errno);
        }
        if($statment_handler->execute())
            return true;

        return false; 
    }
    public static function GetInstance()
    {
        if (!isset(self::$instance)) {

            $className = __CLASS__;
            self::$instance = new $className;
        }
        return self::$instance;
    }
}

?>

здесь я устанавливаю и вызываю синглетон и в методе SetUserNameAndPass я получаю фатальную ошибку: вызов функции-члена prepare () для необъекта вошибка после проверки в отладчике я вижу, что объект pdo пуст.

<?php
require_once ('DBFactory.php');
require_once ('Config.php');

class DBHandler {

    private static $instance;
    private $pdo = NULL;

    private function __construct()
    {



    }

    public function ConnectToDb($db_name)
    {
        $ConfigObj = new Config();
        $SelectedDbConfig = $ConfigObj->GetSelectedDB($db_name);
        $pdo = DBFactory::GetDBConnection(Config::DB_TYPE_MYSQL,$SelectedDbConfig["host"],
                                                                 $SelectedDbConfig["db"], 
                                                                 $SelectedDbConfig["user"],
                                                                 $SelectedDbConfig["pass"]);

        if(!isset($pdo))
            return false;

       return true;

    }

    public function SetUserNameAndPass($user,$pass)
    {
        $query_add_user = "INSERT INTO (name ,password) values ('$user' , '$pass') ";
        if(!$this->ExecQuery($query_add_user))
        {
            echo "sql failed";
        }
    }


    public function ExecQuery($query_str)
    {

        $statment_handler = $this->pdo->prepare($query_str);
        if(!$statment_handler) {
            throw new ErrorException($this->pdo->error, $this->pdo->errno);
        }
        if($statment_handler->execute())
            return true;

        return false; 
    }
    public static function GetInstance()
    {
        if (!isset(self::$instance)) {

            $className = __CLASS__;
            self::$instance = new $className;
        }
        return self::$instance;
    }
}

?>



<?php
require_once ('DBHandler.php');

//Retrieve form data.
//GET - user submitted data using AJAX
//POST - in case user does not support javascript, we'll use POST instead
$user = ($_GET['user']) ? $_GET['user'] : $_POST['user'];
$password = ($_GET['password']) ?$_GET['password'] : $_POST['password'];


//flag to indicate which method it uses. If POST set it to 1
if($_POST)
{
    $post=1;
}

//Simple server side validation for POST data, of course, you should validate the email
if (!$user) $errors[count($errors)] = 'Please enter your user.';
if (!$password) $errors[count($errors)] = 'Please enter your password.';
$DBhandler_st = NULL;
 if (!$errors) {

     if ($_POST) {
        $DBhandler_st = DBHandler::GetInstance();
        if($DBhandler_st->ConnectToDb("db1"))
        {

            $user = trim($user);
            $password = trim($password);
            $DBhandler_st->SetUserNameAndPass($user,$password);
            echo '1';
        }
        else {
            echo '0';
        }

     }


} else {
    //display the errors message
    for ($i=0; $i<count($errors); $i++) echo $errors[$i] . '<br/>';
    echo '<a href="admin.html">Back</a>';
    exit;
}

?>

1 Ответ

1 голос
/ 19 июля 2011

Вы создаете локальную переменную $ pdo, а не устанавливаете переменную класса.

Использовать self :: $ pdo =

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...