Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
12 / 6 / 1
Регистрация: 17.01.2014
Сообщений: 135
1

Подключение к базе данных через PDO или mysql_connect

27.05.2015, 15:48. Просмотров 2796. Ответов 4
Метки нет (Все метки)

Всем привет) Столкнулся с проблемой - при подключении к базе данных старинным методом:

PHP
1
2
3
4
5
6
7
8
 //константы для подключения к базе данных
 define('HOST', 'localhost');       //сервер
 define('USER', 'root');            //пользователь
 define('PASSWORD', 'root');            //пароль
 define('NAME_BD', 'Lifeexampleshop');      //база
 $connect = mysql_connect(HOST, USER, PASSWORD)or die("Невозможно установить соединение c базой данных".mysql_error( ));
 mysql_select_db(NAME_BD, $connect) or die ("Ошбка обращения к базе ".mysql_error());    
 mysql_query('SET names "utf8"');   //база устанавливаем кодировку данных в базе
Все работает нормально.

А при подключении через PDO:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
try {
    
    // Подключение к базе данных
    define("DSN", "mysql:host=".localhost.";dbname=".Lifeexampleshop."");
    define("USER", "root");
    define("PASSWORD", "root");
    
    $db_connect= new PDO(DSN, USER, PASSWORD);
    $db_connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db_connect->exec("set names utf8");
    
} 
 
// Вывод ошибки при неудачном подключении к базе данных
catch (PDOException $e) {
    
    die("Не подключиться к базе данных". $e->getMessage());
    
}
Переменная $db_connect не существует на других страницах. В чем разница этих двух подключений? В первом случае я подключаюсь к базе данных. Потом подключаю в на индексной странице файл с подключением config.php, вызываю на индексной странице controller, контроллер в свою очередь обращается к модели и в модели идет выборка:

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
// Модель вывода каталога
class Application_Models_Catalog
{
    // Функция формирует массив с данными каталога (данные возвращаются в контроллер)
    public function getListCatalog ()
    {
        
        try {
            
            $Select_catalog= $db_connect->query("SELECT * FROM product");
            $Select_catalog->setFetchMode(PDO::FETCH_ASSOC);
            while ($row= $Select_catalog->fetch())
            {
                    
                $Catalog_items[]= array(
                        
                    "id"=>$row["id"],
                    "name"=>$row["name"],
                    "price"=>$row["price"]
                        
                );
                    
            }
            
        }
        catch(PDOException $e) {
            
            die("Запрос на выборку данных каталога не прошел".$e->getMessage());
            
        }
        
        return $Catalog_items;
        
    }
        
}
И тут вылезает ошибка, что переменная $db_connect не определена. А если делать по старинке, как в первом варианте, и вместо PDO использовать обычное подключение и запрос:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 class Application_Models_Catalog
  {   
      function getList()
      { 
         $sql = "SELECT * FROM product";
         $result = mysql_query($sql)  or die(mysql_error());
    
         while ($row = mysql_fetch_assoc($result))
         {       
            $сatalogItems[]=array(
                "id"=>$row['id'],
                "name"=>$row['name'],
                "price"=>$row['price']
            );
          }
        
        
         return $сatalogItems; 
      }
  }
То все выводится нормально. На сколько я понимаю в первом случае, идет просто подключение к базе данных и нам не нужно никаких объектов типа $db_connect чтобы вызывать их метод, а в PDO создается экземпляр объекта, который мы записываем в переменную $db_connect, но при этом эта переменная не доступна на других страницах сайта. Как это побороть?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.05.2015, 15:48
Ответы с готовыми решениями:

Подключение к базе данных через PDO. Правильный способ
Привет. Наткнулся на такое руководство http://phpfaq.ru/pdo. Автор пишет в уверенном стиле . Ваше...

Не создается таблица при обращении к базе данных через PDO
Добрый день. У меня есть форма с методом "POST",в которую вводится имя пользователя и...

MySql PDO connect как сделать подключение к базе ?
Здравствуйте. Вот нашел в интернете такую функцию для подключения к MySql <?php...

Подключение к базе данных через форму
Как сделать форму подключения к бд? К примеру в textbox вписываешь имя сервера, имя базы и т.д

4
2171 / 2101 / 509
Регистрация: 27.05.2011
Сообщений: 7,226
27.05.2015, 16:35 2
Переменная глобальная-то
PHP
1
2
3
4
5
6
public function getListCatalog ()
    {
        global $db_connect;
        try {
            
            $Select_catalog= $db_connect->query("SELECT * FROM product");
Но лучше синглтон запилить, а то global - не есть гуд
1
12 / 6 / 1
Регистрация: 17.01.2014
Сообщений: 135
27.05.2015, 16:57  [ТС] 3
действительно помогло. Спасибо.

Подскажи пожалуйста на счет синглтона. Я знаю, что это паттерн такой, который позволяет создавать единственный экземпляр объекта, но вопрос в том. где его тут применить целесообразно? Например синглтон применяют часто в cms в классе работы с базой данных, но они там не понятно из каких целей делают этот класс. Может я чего не понимаю, но например зачем создавать класс для работы с базой данных, делающий все тоже самое, если есть уже PDO и mysqli. По сути если посмотреть код, то основной метод в этих классах query, который делает тот же запрос к базе данных.

В моем случае, чтобы все грамотно было, тоже нужен класс для работы с базой данных получается? Или где применять тогда синглтон?

Добавлено через 6 минут
Вообще читая об этом в интернете, все тоже пишут используй синглтон. На сколько я понимаю, чтобы его использовать в любом случае нужно создавать класс для работы с базой данных. То есть будет типа класс, который создает экземпляр объекта для работы с базой данных, у этого объекта есть статический метод query, который и выполняет все функции по работе с базой данных. Так я понимаю? В принципе класс создается именно только с той целью чтобы вместо глобальной переменной использовать нормальный статический метод для работы с базой данных и при этом экземпляр объекта (соединение с базой данных) был только в одном экземпляре?
0
2171 / 2101 / 509
Регистрация: 27.05.2011
Сообщений: 7,226
27.05.2015, 17:02 4
Цитата Сообщение от Maksimus1991 Посмотреть сообщение
В принципе класс создается именно только с той целью чтобы вместо глобальной переменной использовать нормальный статический метод для работы с базой данных и при этом экземпляр объекта (соединение с базой данных) был только в одном экземпляре?
Примерно все так и есть.
0
12 / 6 / 1
Регистрация: 17.01.2014
Сообщений: 135
19.06.2015, 12:41  [ТС] 5
Вспомнил о этой теме) С синглотоном разобрался) Очень удобная штука)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.06.2015, 12:41

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Подключение к базе данных через Hibernet
Доброго времени суток, ребята! Подключаюсь к БД с помощью Hibernet и вот процесс подключения...

Подключение к базе данных через mysql c++
Мне нужно, чтобы человек подключался к базе данных и мог получать от туда информацию. К локальному...

Подключение к базе данных MS Access через ADO
Добрый вечер! У меня следующий вопрос - почему, когда пытаюсь подключиться к БД через ADO...

Подключение к Базе Данных через скрипт PHP
Запутался. Где имя, где префикс где что. Допустим: Логин мой: admin Имя базы: admin_index...

Подключение к базе данных MySQL через Delphi
при попытки подключение к базе выходит такая ошибка не пойму то ли я не правильно ввожу данные для...


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

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

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