Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> нет соединения 
V
    Опции темы
sgrey
Дата 18.3.2010, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 15.4.2006

Репутация: нет
Всего: 4



есть класс который должен подключаться к базе и делать там определённые вещи. ->
Код

include('config.php');
class DbConnect
{
    protected $conn;
    public function make_connection()
    {
        $this->$conn = new mysqli($INFO['sql_host'], $INFO['sql_user'], $INFO['sql_pass'], $INFO['sql_database']); //<------- line 8
        if (mysqli_connect_errno() != 0)
        {
            $msg = mysqli_connect_error();

            echo <<<EOM
            <p>Ошибка при попытке соединения с базой данных.
            Обратитесь к администратору.
            Код ошибки </p>
            $msg
EOM;
        }
    }

    public function add_data($query_str)
    {
        $result = $this->$conn->query($query_str);
        if ($result === FALSE)
        {
            $errno = $this->conn->errno;
            $errmsg = $this->conn->error;
            echo "Не смог соединиться. $errno $errmsg";
            $this->close_connection();
        }
    }

    public function close_connection()
    {
        $this->$conn->close();
    }

}

запускаю его из другого класса, откуда берутся данные для добавления в базу, вот этой функцией.
Код

    public function add_news()
    {
        $conn1 = new DbConnect();
        $conn1->make_connection();
        $query_str = "INSERT INTO news (NOW(), $this->get_news(), $this->get_title())";
        $conn1->add_data($query_str);
        $conn1->close_connection();
    }


выскакивает ошибка 
Код

Warning: mysqli::mysqli() [mysqli.mysqli]: (28000/1045): Access denied for user 'user'@'localhost' (using password: NO) in Z:\home\localhost\www\site\dbconn.php on line 8

Fatal error: Cannot access empty property in Z:\home\localhost\www\site\dbconn.php on line 8

во-первых имя пользователя не правильное, не знаю откуда оно берётся там..... (такое стоит на форуме, который находится в другой папке на локалхосте).
во-вторых пароль к базе имеется и он прописан в конфиге откуда берутся данные.
в-третьих если просто в чистом файле написать 
Код

include('config.php');
$conn = new mysqli($INFO['sql_host'], $INFO['sql_user'], $INFO['sql_pass'], $INFO['sql_database']);

то всё прекрасно работает и можно делать выборки, добавлять данные, вобщем всё что надо.
что не так с классом?  smile  пробовал соединятся в конструкторе, использовать другие функции для соединения и ни чего  smile 

Это сообщение отредактировал(а) sgrey - 18.3.2010, 08:36
PM MAIL   Вверх
skyboy
Дата 18.3.2010, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



переменная $INFO не доступна из метода make_connection. так своя область видимости. однако, не стоит принимать поспешных решений и делать $INFO глобальной.
вариант 0. передавать $INFO параметром в make_connection
вариант 1. брать данные о подключение не из переменной $INFO, а из функции, которая вернет массив с параметрами подключения(функции не ограничены областью видимости переменной) или из объекта-синглтона
вариант 2. сделать сам объект "подкючение" синглтоном. если, конечно, у тебя только одно подключение к единственной БД. в таком случае, можно инициализировать/передавать $INFO любым из указанных выше способов. все равно это надо будет сделать только раз.
PM MAIL   Вверх
Fortop
Дата 18.3.2010, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 3
Всего: 42



Цитата(sgrey @  18.3.2010,  07:35 Найти цитируемый пост)
($INFO['sql_host'], $INFO['sql_user'], $INFO['sql_pass'], $INFO['sql_database'])

Ну и?
Что это за переменные и откуда они берутся?


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
sgrey
Дата 18.3.2010, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 15.4.2006

Репутация: нет
Всего: 4



Цитата(Fortop @ 18.3.2010,  09:24)
Цитата(sgrey @  18.3.2010,  07:35 Найти цитируемый пост)
($INFO['sql_host'], $INFO['sql_user'], $INFO['sql_pass'], $INFO['sql_database'])

Ну и?
Что это за переменные и откуда они берутся?

они находятся в конфиг файле который включается в класс

Добавлено через 6 минут и 54 секунды
Цитата(skyboy @ 18.3.2010,  09:24)
переменная $INFO не доступна из метода make_connection. так своя область видимости. однако, не стоит принимать поспешных решений и делать $INFO глобальной.
вариант 0. передавать $INFO параметром в make_connection
вариант 1. брать данные о подключение не из переменной $INFO, а из функции, которая вернет массив с параметрами подключения(функции не ограничены областью видимости переменной) или из объекта-синглтона
вариант 2. сделать сам объект "подкючение" синглтоном. если, конечно, у тебя только одно подключение к единственной БД. в таком случае, можно инициализировать/передавать $INFO любым из указанных выше способов. все равно это надо будет сделать только раз.

хм..... $INFO находится в конфиг файле 
Код

include('config.php');

мне его внутри класса включать чтоли?

прописал данные прям в функцию

Код

$this->$conn = new mysqli('localhost','user','password', 'database');


теперь выдали такую ошибку
Код

Fatal error: Cannot access empty property in Z:\home\localhost\www\site\dbconn.php  on line 8

т.е. в той же строке.
PM MAIL   Вверх
skyboy
Дата 18.3.2010, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



Цитата(sgrey @  18.3.2010,  15:24 Найти цитируемый пост)
$this->$conn

$this->conn
PM MAIL   Вверх
sgrey
Дата 18.3.2010, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 15.4.2006

Репутация: нет
Всего: 4



Цитата(skyboy @ 18.3.2010,  16:44)
Цитата(sgrey @  18.3.2010,  15:24 Найти цитируемый пост)
$this->$conn

$this->conn

спасибо, теперь работает.
только теперь ошибка в другом месте  smile   smile 

Код

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NOW(), (), ())' at line 1
Warning: mysqli::close() [mysqli.close]: Couldn't fetch mysqli in Z:\home\localhost\www\site\dbconn.php on line 50

мне кажется он ругается вот на эту функцию.... она единственная обращается к этому классу в данный момент....

Код

    public function add_news()
    {
        $conn1 = new DbConnect();
        $conn1->make_connection();
        $query_str = "INSERT INTO `news` (`n_date`, `news_body`, `news_title`) VALUES (NOW(), $this->get_news(), $this->get_title())";
        $conn1->add_data($query_str);
        $conn1->close_connection();
    }

Код

<?php
include('config.php');
class DbConnect
{
    protected $conn;
    public function make_connection()
    {
        $this->conn = new mysqli('localhost','user','password', 'database');
        if (mysqli_connect_errno() != 0)
        {
            $msg = mysqli_connect_error();

            echo <<<EOM
            <p>Ошибка при попытке соединения с базой данных.
            Обратитесь к администратору.
            Код ошибки </p>
            $msg
EOM;
        }
    }

    public function add_data($query_str)
    {
        $result = $this->conn->query($query_str); // выдаёт ошибку здесь, посколько срабатывает первое условие
        if ($result === FALSE)
        {
            $errno = $this->conn->errno;
            $errmsg = $this->conn->error;
            echo "Не смог соединиться. $errno $errmsg";
            $this->close_connection();
        }
    }

    public function close_connection()
    {
        $this->conn->close();
    }

}

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

такое чувство что весь код неправильный (

Это сообщение отредактировал(а) sgrey - 18.3.2010, 18:07
PM MAIL   Вверх
sgrey
Дата 19.3.2010, 02:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 15.4.2006

Репутация: нет
Всего: 4



разобрался с подключением к базе smile 
только вот хотелось бы знать что делать с инклудом и почему переменные находятся вне видимости класса........ 

Это сообщение отредактировал(а) sgrey - 19.3.2010, 02:21
PM MAIL   Вверх
Fortop
Дата 19.3.2010, 02:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 3
Всего: 42



Цитата(sgrey @  19.3.2010,  01:05 Найти цитируемый пост)
и почему переменные находятся вне видимости класса........ 

Потому что их нужно ему передавать.

Код

$db = new MyDB($host, $user, $pass, $dbname);


или так
Код

$db = new MyDB();
$db->connect($host, $user, $pass, $dbname);


Соответственно конструктор класса или метод connect() должны их принимать и использовать для подключения.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
sgrey
Дата 19.3.2010, 04:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 15.4.2006

Репутация: нет
Всего: 4



Цитата(Fortop @  19.3.2010,  02:42 Найти цитируемый пост)

Соответственно конструктор класса или метод connect() должны их принимать и использовать для подключения. 

т.е. язык построен так, что если есть функция соединения с базой - нельзя использовать переменные которые не входят в эту функцию? 
интересно..... пошёл писать хендлер тогда для этого (
PM MAIL   Вверх
Fortop
Дата 19.3.2010, 06:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 3
Всего: 42



Цитата(sgrey @  19.3.2010,  03:38 Найти цитируемый пост)
т.е. язык построен так, что если есть функция соединения с базой - нельзя использовать переменные которые не входят в эту функцию? 

Язык построен так, что можно все.

Но использовать глобальные переменные не рекомендуется во избежание проблем. Лучше их передавать явно.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
sgrey
Дата 19.3.2010, 06:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 15.4.2006

Репутация: нет
Всего: 4



Цитата(Fortop @  19.3.2010,  06:15 Найти цитируемый пост)
Язык построен так, что можно все.

Но использовать глобальные переменные не рекомендуется во избежание проблем. Лучше их передавать явно.


да я вот как раз и думаю про реализацию. думаю по совету skyboy либо синглтон, либо абстрактный класс сделать и наследовать его в этот....
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.1179 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.