С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP: базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Sluchayno
30 / 30 / 20
Регистрация: 22.09.2013
Сообщений: 312
1

PDO авторизация

03.12.2017, 17:52. Просмотров 528. Ответов 3
Метки нет (Все метки)

Здравствуйте, помогите справится со следующей проблемой.
Написал класс для подключения к бд PDO и выполнения SQL запросов

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
class BaseModule    
{
    private $db;
    
    public function __construct()
    {
        global $host;
        global $base;
        global $user;
        global $pass;
        global $secret_key;
        
        try
        {
            $this->db = new PDO('mysql:host='.$host.'; dbname='.$base.'', $user, $pass);
            $this->db->exec("SET NAMES UTF8");
        }
        catch (PDOException $e) 
        {
            die ('База данных временно недоступна '.$e);       
        }
        
    }       
    public function __get($value)
    {
        if ($value=='db')
            return $this->db;
        return NULL;
    }
    
    //Вставляем SQL запрос
    protected function insertSql($text, $param)
    {
        try
        {
            $sql = $this->db->prepare($text);
            for ($i = 1; $i <= count($param); $i++) 
            {
                $sql->bindParam($i, $param[$i], PDO::PARAM_STR);
            }
            return $sql->execute();
        }
        catch (PDOException  $ex) 
        {
            echo "Ошибка работы базы данных ".$ex;
        }
   }
    
    //Запросы в базу данных
    protected function sqlQuery($text, $param)
    {
        try
        {
            $sql = $this->db->prepare($text);
            for ($i = 1; $i <= count($param); $i++) 
            {
                $sql->bindParam($i, $param[$i], PDO::PARAM_STR);
            }
            $sql->execute();
            return $sql->fetch();
        }
        catch (PDOException  $ex) 
        {
            echo "Ошибка работы базы данных ".$ex;
        }
    }
}
?>
Теперь создаю экземпляр объекта класса который наследуется от BaseModule

PHP
1
2
3
include_once ('BaseModule.php');
 
$auth = new auth($_GET);
И код самого класса авторизации

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Class Auth extends BaseModule
{
    public function __construct($get)
    {
        $param[1] = $get["login"];
        $param[2] = md5($get["password"]);
        
        $result = j$this->checkAuth($param);
}
//Проверяем аутентификацию пользователя
    private function checkAuth($param)
{
$result = $this->sqlQuery("select count(*), id from users where `login` = '?' and `password` = '?'", $param);
return $result['count(*)']
}
 
}

В итоге получаю ошибку

PHP
1
Fatal error: Call to a member function prepare() on a non-object in BaseModule.php on line 55
Если же изменить класс Auth следующим образом то все работает

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
include_once ('BaseModule.php');
 
$auth = new auth($_GET);
 
Class Auth extends BaseModule
{
public function getMethod($get)
    {
        $param[1] = $get["login"];
        $param[2] = md5($get["password"]);
        
        $result = $this->checkAuth($param);
}
}
Вопрос, почему при вызове из конструктора $this->checkAuth($param) не работает а при вызове из функции все срабатывает?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2017, 17:52
Ответы с готовыми решениями:

PDO
Всем привет, нашёл готовый PDO класс но вот не могу разобраться как сделать...

PDO
Есть код: $Plan_ID = 1; $stmt = $pdo-&gt;prepare('SELECT * FROM Plans WHERE ID...

BETWEEN в PDO
Начал буквально час назад работать с опцией BETWEEN, чтобы сделать вывод...

PDO и IN
Как в PDO реализовать такой запрос? SELECT name FROM products WHERE id IN...

PDO
Я уже довольно долгое время использую это расширение в своих проектах и...

3
Jodah
Эксперт PHP
2855 / 2484 / 1059
Регистрация: 01.08.2012
Сообщений: 8,785
03.12.2017, 20:17 2
Не надо наследовать класс работы с БД. Передавайте его экземпляр в Auth через конструтор.
0
Sluchayno
30 / 30 / 20
Регистрация: 22.09.2013
Сообщений: 312
03.12.2017, 21:39  [ТС] 3
А можете объяснить чем так лучше? Почему стоит передать экземпляр а не наследоваться?

Просто дело в том что я привел пример. На деле я наследованиеи происходит от другого класса который в свою очередь наследуется от BaseModule и вся эта конструкция работает, за исключеним выше изложенной проблемы.
0
Jodah
Эксперт PHP
2855 / 2484 / 1059
Регистрация: 01.08.2012
Сообщений: 8,785
03.12.2017, 23:56 4
Цитата Сообщение от Sluchayno Посмотреть сообщение
Почему стоит передать экземпляр а не наследоваться?
Ответ тут.

Цитата Сообщение от Sluchayno Посмотреть сообщение
почему при вызове из конструктора $this->checkAuth($param) не работает а при вызове из функции все срабатывает?
Потому что объявляя конструктор класса Auth вы затираете конструктор BaseModule. Но можно в новом конструкторе Auth вызвать конструктор родителя:
PHP
1
2
3
4
5
6
class SubClass extends BaseClass {
   function __construct() {
       parent::__construct(); // Вызываем конструктор родителя.
       print "Конструктор класса SubClass\n"; // Что-то делаем.
   }
}
Цитата Сообщение от Sluchayno Посмотреть сообщение
Почему стоит передать экземпляр
Для удобства можно использовать паттерн Синглтон, тогда не придётся ничего передавать.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2017, 23:56

Переход на PDO
Решил перейти на PDO Написал такую функцию для подключения к бд:function...

Транзакция в PDO
Привет. Помогите с кодом. $user='root'; $pass=''; try { $dbh = new...

Mysql_result в pdo
Подскажите, как этот запрос выглядит в PDO:) for($m=0;$m&lt;$list;$m++){...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru