Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Как заставить класс увидеть переменные в файле?
Покинул форум
Сообщений всего: 49
Дата рег-ции: Дек. 2016
Помог: 0 раз(а)
Доброго времени суток.
Пытаюсь научиться применять классы, но что то не со всем выходит.
Грубо говоря, если я делаю класс на запись в файл данных, то и потом перед вызовом класса определяю переменные которые в нём задействованы, то всё нормально.
Класс для записи в файл:
$file='connect.php';//Подключаем обработчик записи данных подключения в файл
$write_file= new write_connect($host,$bd,$login,$passw,$file);
Этот код работает исправно как я и хотел. Т.е. Есть форма мастера которая создаёт первоначальное подключение к БД и записывает его в файл connect.php.
А вот после этого необходимо из класса подключения к базе mysql увидеть переменные в этом файле и их значения.
Нашёл самый элементарный пример(на этом же форуме) и пытаюсь им воспользоваться, но с одной оговоркой, данные я хочу передать из файла который подключил через require_once 'connect.php'
Код класса:
Осталось теперь научиться наращивать в нём функционал для дальнейших манипуляций. Например сейчас думаю о том как внедрить проверку на защиту от SQL инъекций с помощью плейсхолдеров. В сети куча готовых примеров, но тупо вставить код и надеяться что он будет работать как мне нужно не понимая сути написанного не хотелось бы. По этому хотел бы узнать, может кто кинет ссылкой(на русском) где разжёвано как правильно составлять плейсхолдеры?
ЧИМ
Отправлено: 06 Февраля, 2017 - 12:05:54
Новичок
Покинул форум
Сообщений всего: 49
Дата рег-ции: Дек. 2016
Помог: 0 раз(а)
А как теперь в этот класс подключить файл connect.php? Чтоб не загружать 2 файла по отдельности, а загрузить один класс который будет подключаться к БД используя файл настроек.
Строитель
Отправлено: 16 Февраля, 2017 - 19:16:57
Участник
Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014 Откуда: Украина
Помог: 73 раз(а)
ЧИМ пишет:
А как теперь в этот класс подключить файл connect.php? Чтоб не загружать 2 файла по отдельности, а загрузить один класс который будет подключаться к БД используя файл настроек.
Можно передать ссылку на файл в конструктор дочернего класса, в дочернем конструкторе произвести подключение этого файла, и после этого вызывать родительский конструктор, в который и передавать данные для соединения с БД
Потому как она постоянно говорила о том что такого файла нет и что имя файла не может быть пустым. Параметры передавал так же как и в isset. Но в isset всё заработало с этими же параметрами.
Потом перебрав все страницы и исправив везде код для создания класса, я понял что это не совсем удобно, так как в каждом файле нужно прописывать путь подключения файла, а в некоторых из них он разнится, из этого следует что может рано или поздно произойти путаница не будет доступа к файлу. В общем я решил что единственно правильным решением будет сделать единственное подключение в классе создания подключения. Теперь у меня класс выглядит так:
Подскажите, может какие советы будут ещё по этому классу? Здесь я не проверяю на предмет существования файла, так как уверен в его существовании и прописываю его в одном месте.
Создание нового подключения теперь происходит так:
return conn('my_database');//[b]Просто возвращаем имя базы?[/b]
}
Вот это для меня вообще непонятно, это всё в классе? Т.е. Мы обрабатываем исключение вызова функции myDatabase() Если там есть ошибка то выводим её на экран?
Первый раз просто сталкиваюсь с использованием extract и по этому многие моменты непонятны. Например, почему мы объявляем постоянный массив "static $conns = [];" и сразу проверяем существует ли в нём "$dbName"? Как до if(!isset($conns[$dbName])) в нём появится значение $dbName? Так же мне непонятно, почему мы присваиваем значению массива подключение к базе? "$conns[$dbName] = new mysqli($host, $user_name, $password, $dbName); "
Чёт какой то бардак в голове от данного примера. Может я конечно туплю, но я был бы очень признателен если бы вы растолковали что к чему.
Строитель
Отправлено: 18 Февраля, 2017 - 21:50:57
Участник
Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014 Откуда: Украина
Помог: 73 раз(а)
ЧИМ пишет:
Поправьте меня если я неправильно понимаю.
Елси не возражаете, я дам пояснения:
ЧИМ пишет:
Здесь мы создаём в файле массив с переменными
Ассоциативный массив значений - так корректнее.
ЧИМ пишет:
Просто возвращаем имя базы?
Нет, возвращается объект mysqli (если в процедурном - то это был бы тип "ресурс"), с которым вы будет производить дальнейшие операции (выборка из базы, и т.п.).
ЧИМ пишет:
Вот это для меня вообще непонятно, это всё в классе?
Нет, создание экземпляра класса mysqli происходит в теле функции conn() при условии, что ранее этот объект не был создан.
ЧИМ пишет:
Первый раз просто сталкиваюсь с использованием extract
Эта функция, если говорить упрощённо, преобразует ассоциативный массив в переменные, при этом ключи массива становятся именами переменных, а значения массива - значениями переменных. И это всё импортируется в текущую область видимости.
ЧИМ пишет:
почему мы объявляем постоянный массив "static $conns = [];" и сразу проверяем существует ли в нём "$dbName"? Как до if(!isset($conns[$dbName])) в нём появится значение $dbName?
Поле $conns можно было бы объявить и не статичным, но тогда при каждом обращении к базе происходило бы создание объекта mysqli. Именно поэтому в условии написана проверка на его существование, ну а static будет хранить ранее сохранённые параметры.
ЧИМ
Отправлено: 18 Февраля, 2017 - 22:53:51
Новичок
Покинул форум
Сообщений всего: 49
Дата рег-ции: Дек. 2016
Помог: 0 раз(а)
Строитель пишет:
Нет, возвращается объект mysqli (если в процедурном - то это был бы тип "ресурс"), с которым вы будет производить дальнейшие операции (выборка из базы, и т.п.).
return conn('my_database');//[b]Просто возвращаем имя базы?[/b]
}
На сколько я понял тут задаётся имя базы, но я его так же получаю из файла, так как "мастер создания подключения" его записывает в файл с настройками подключения и я его оттуда беру.
И вот эта строчка меня смущает "$conns[$dbName] = new mysqli($host, $user_name, $password, $dbName); " Почему например здесь не "$conns[$host]... " или вообще не отдельная переменная ? Ведь по идее мы можем после получения переменных из фала сразу сделать подключение с обычной переменной "$con = new mysqli($host, $user_name, $password, $dbName); " Просто так же объявим её статичной в начале "static $con;" и всё, зачем мы используем именно "$conns[$dbName]"? Или это делается просто для простоты проверки? Т.е. Если есть какое либо присвоенное значение в массиве $conns[] с элементом массива $dbName то просто вернуть это значение? Получается что в моём случае эта функция не совсем корректна. Дело в том что у меня сначала происходит просто подключение к серверу, а после этого создаётся база и используется в подключении во всех остальных манипуляциях. Но идея с "extract" отличная.
Скажите а если я сделаю следующим образом:
т.е. по идее я смотрю в файл, если там присутствует переменная, то я пытаюсь подключиться с её значением, если же нет то я просто выполняю подключения к серверу MYSQL для последующего создания базы. Правильно?
Строитель
Отправлено: 19 Февраля, 2017 - 00:00:45
Участник
Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014 Откуда: Украина
Помог: 73 раз(а)
ЧИМ пишет:
На сколько я понял тут задаётся имя базы, но я его так же получаю из файла
Строго говоря, в функцию conn() передаётся имя файла, которое должно совпадать с именем базы данных, к которой вам необходимо произвести подключение.
Чтобы долго не ходить вокруг да около, то можно сказать так - этот код позволит вам использовать одновременное подключение к разным бд. Для этого вам нужно создать соответствующие пхп-файлы, по аналогии с приведённым примером (т.е., чтобы файл возвращал ассоциативный массив значений), и просто вызывать одну и ту же функцию, но передавая в неё разные параметры. См. пример:
$row1=$db1->query("SELECT `name` FROM `users`")->fetch_assoc();
echo$row1['name'].'<br />';
// Работаем с my_database2
$row2=$db2->query("SELECT `id` FROM `news`")->fetch_assoc();
echo$row2['id'];
ЗЫ: Можно код упростить так, как предложили вы, но тогда потеряется возможность подключения к нескольким бд одновременно (если я всё верно понял)
armancho7777777
Отправлено: 19 Февраля, 2017 - 10:06:03
Активный участник
Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011 Откуда: Москва
Помог: 221 раз(а)
Строитель пишет:
имя файла, которое должно совпадать с именем базы данных
Не обязательно. Переменную $dbName можно переопределить из конфига.
Т.е. "extract" затрёт раннее переданную переменную $dbName, если одноимённый ключ передать из конфига.
Проверьте версию пхп. Она должна быть не ниже 5.4. Если версия ниже, и нет возможности её поднять, тогда замените строку с сокращённым синтаксисом объявления массива на этот вариант:
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.