Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > нет соединения


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

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 

Автор: skyboy 18.3.2010, 09:24
переменная $INFO не доступна из метода make_connection. так своя http://php.net/variables.scope. однако, не стоит принимать поспешных решений и делать $INFO глобальной.
вариант 0. передавать $INFO параметром в make_connection
вариант 1. брать данные о подключение не из переменной $INFO, а из функции, которая вернет массив с параметрами подключения(функции не ограничены областью видимости переменной) или из http://ru.wikipedia.org/wiki/Одиночка_(шаблон_проектирования)
вариант 2. сделать сам объект "подкючение" синглтоном. если, конечно, у тебя только одно подключение к единственной БД. в таком случае, можно инициализировать/передавать $INFO любым из указанных выше способов. все равно это надо будет сделать только раз.

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

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

Автор: sgrey 18.3.2010, 16:24
Цитата(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. так своя http://php.net/variables.scope. однако, не стоит принимать поспешных решений и делать $INFO глобальной.
вариант 0. передавать $INFO параметром в make_connection
вариант 1. брать данные о подключение не из переменной $INFO, а из функции, которая вернет массив с параметрами подключения(функции не ограничены областью видимости переменной) или из http://ru.wikipedia.org/wiki/Одиночка_(шаблон_проектирования)
вариант 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

т.е. в той же строке.

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

$this->conn

Автор: sgrey 18.3.2010, 16:49
Цитата(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 19.3.2010, 02:05
разобрался с подключением к базе smile 
только вот хотелось бы знать что делать с инклудом и почему переменные находятся вне видимости класса........ 

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

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

Код

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


или так
Код

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


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

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

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

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

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

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

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

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

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


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)