Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 27.07.2017
Сообщений: 4

Прошу подсказки по MVC и соединению с БД

27.07.2017, 14:35. Показов 1326. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В учебных целях пишу MVC приложение. Уперся в нормальную организацию запросов к базе данных через mysqli
Структура каталогов такая:

По файлам: Index.php
PHP
1
2
3
4
<?php 
    ini_set('display_errors', 1);
    require_once 'application/bootstrap.php';
?>
core/controller
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php 
class Controller {
    
    public $model;
    public $view;
    
    function __construct()
    {
        $this->view = new View();
    }
    
    function action_index()
    {
    }
}
?>
core/model
<?php
PHP
1
2
3
4
5
6
7
8
9
10
11
class Model
{
    public function get_data()
    {
    }
    public function set_data()
    {
 
    }
}
?>
core/view
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php 
class View
{
    //public $template_view; // здесь можно указать общий вид по умолчанию.
    
    function generate($content_view, $template_view, $data = null)
    {
        /*
        if(is_array($data)) {
            // преобразуем элементы массива в переменные
            extract($data);
        }
        */
        
        include 'application/views/'.$template_view;
    }
}
?>
Есть контроллер addtask
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
<?php 
class Controller_AddTask extends Controller
{
    
    function __construct()
    {
        $this->model = new Model_AddTask();
        $this->view = new View();
    }
    
    function action_index()
    {   
        if(isset($_POST['userMail']) && isset($_POST['taskName'])&& isset($_POST['taskText'])){
            $userMail=trim(mysql_escape_string(htmlspecialchars(strip_tags($_POST['userMail']))));
            $taskName=trim(mysql_escape_string(htmlspecialchars(strip_tags($_POST['taskName']))));
            $taskText=trim(mysql_escape_string(htmlspecialchars($_POST['taskName'])));
            $data = $this->model->set_data($userMail,$taskName,$taskText);
            //header('Location:/');
        }
        
        $this->view->generate('addtask_view.php', 'template_view.php',$data);
        
    }
}
?>
Ну и модель addTask
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php 
class Model_AddTask extends Model
{
    public function set_data($userMail,$taskName,$taskText)
    {   
 
        
        $mysqli = new mysqli("host","user", "pwd","db" );
        if ($mysqli->connect_errno) {
            return "Не удалось подключиться к MySQL: " . $mysqli->connect_error;
        }
        $res = $mysqli->query("SELECT id FROM users WHERE email='$userMail'");
        $row = $res->fetch_assoc();
        return count($row);
        
    }
}
?>
В целом то такой вариант работает, но как такие соединения создаются правильно, что бы все модули свободно имели доступ к базе. Мне необходимо создать новый контроллер для этого? Или как?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.07.2017, 14:35
Ответы с готовыми решениями:

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

Прошу подсказки
Ребят помогите. 2 ноутбука, один из них подключен к интернету. Можно ли сделать так чтобы второй ноут подключить через беспроводную сеть к...

Прошу подсказки
Вот простой код C++: int main() { int ppc= {17,7,18,56,3,64,71,88,91,15,11,115,130,11,20}; int p=0; int w=0; for(w ; w &lt;...

7
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,904
27.07.2017, 14:40
Цитата Сообщение от djo987 Посмотреть сообщение
PHP
1
2
class Controller {
public $model;
Неверно, контролер не должен быть привязан к какой-то модели. Он может работать с десятком моделей сразу или вообще без них.
1
0 / 0 / 0
Регистрация: 27.07.2017
Сообщений: 4
27.07.2017, 14:46  [ТС]
Спасибо. То же самое и с view, верно?
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,904
27.07.2017, 15:00
djo987, если это некий генератор шаблонов - можно оставить. Если подразумевается, что контроллер должен быть привязан к конкретному шаблону - да, это тоже неправильно.
0
0 / 0 / 0
Регистрация: 27.07.2017
Сообщений: 4
27.07.2017, 16:20  [ТС]
Понял. Спасибо. А по поводу работы с БД?
0
276 / 201 / 143
Регистрация: 22.01.2016
Сообщений: 637
27.07.2017, 16:28
Цитата Сообщение от djo987 Посмотреть сообщение
А по поводу работы с БД?
Создаёте отдельный класс, в котором статический метод (чтобы каждый раз не создавать экземпляр класса) будет возвращать установленное соединение. В дальнейшем метод вызываете в нужной вам модели.
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
27.07.2017, 16:31
Цитата Сообщение от djo987 Посмотреть сообщение
но как такие соединения создаются правильно, что бы все модули свободно имели доступ к базе
Гуглите в сторону Ioc, DI, IoC-контейнер. А примеры это любой популярный фреймворк.
1
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,904
27.07.2017, 16:33
Цитата Сообщение от djo987 Посмотреть сообщение
как такие соединения создаются правильно, что бы все модули свободно имели доступ к базе
Это архитектурный вопрос. Сейчас в моде сервис-контейнеры, можете почитать документацию по ним у Laravel и Yii. По примерам кода можно примерно понять, что там происходит.

Есть старые, менее удобные или правильные решения. Например использование паттерна Registry, выглядит примерно так:
PHP
1
2
3
4
5
6
7
8
9
10
// Где-то в начале приложения
$registry = new Registry();
$registry->set('db', new Database('root', '', 'localhost', 'db_name'));
$registry->set('request', new Request());
$registry->set('config', new Config());
 
// В контроллере
$db = $this->registry->get('db'); // Получаем объект БД
$model = new SomeModel($db); // Передаём объект БД в модель
$model->work();
Также можете погуглить синглтон, позволяющий получить экземпляр класса в любой точке приложения.

В учебных целях я бы предложил сначала изучить два последних, понять их минусы и затем плавно перейти на сервис-контейнер.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.07.2017, 16:33
Помогаю со студенческими работами здесь

прошу подсказки
Доброго времени суток, уважаемые. Прошу подсказать малоопытному. Работаы в IAR AVR 6.20 Задачка - создать во FLASH структуру данных,...

Прошу подсказки новичку
Господа оптимизаторы! Подскажите пожалуйста как правильно раскрутить сайт. Особенно интересует: 1. Запрещены ли дорвеи (о которых...

Не срабатывает clearInterval. Прошу подсказки
Доброго всем времени суток. Решил написать простенький скрипт эффекта печатания текста. var text = &quot;&quot;; var sl =...

Прошу подсказки с .ini файлом
Привет, прошу посоветовать как решить данную проблему: В config.ini я записываю имя последней таблицы с которой пользователь работал ...

Прошу подсказки - куда копать?
При подключении второго монитора к VGA-выходу ноутбука Asus X301A http://www.asus.com/ru/Notebooks_Ultrabooks/X301A/specifications/ Win...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru