Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2016, 13:24   #1
Belzik
 
Регистрация: 05.03.2016
Сообщений: 9
По умолчанию Вопрос про ООП и разделение PHP и HTML кода.

Добрый день. В программирование я новичок. Выполняю учебные проекты и по ходу их выполнения возникают вопросы. Какие-то вопросы получается решить на пару с гуглом, а какие-то нет, поэтому прошу у вас помощи.

Вопрос 1.

У меня есть два класса, в которых методы очень похожи, но есть разное кол-во переменных. Сам я новичок и еще не понимаю толком принципов ООП. Нужно ли в данной ситуации применять полиморфизм или можно как-то просто создать третий класс и от него наследовать?

PHP код:
<?php
    
class reports
    
{
        function 
create($from_whom$introductory_part$main_part$application)
        {
            require 
$_SERVER["DOCUMENT_ROOT"] . '/includes/db_connect.php';
        
            
$query "INSERT INTO reports(from_whom, introductory_part, main_part, application) VALUES" 
                        
"('$from_whom', '$introductory_part', '$main_part', '$application')";
            
$result $connection->query($query);
            if (!
$result) echo "Сбой при вставке данных: $query<br>" .
                                 
$connection->error "<br><br>";    
        }
        
        function 
show()
        {
            require 
$_SERVER["DOCUMENT_ROOT"] . '/includes/db_connect.php';
            
            
$query "SELECT * FROM reports";
            
$result $connection->query($query);
            
            if (!
$result) die($connection->error);
            
            
$rows $result->num_rows;
            
            for (
$j $j $rows ; ++$j)
            {
                
$result->data_seek($j);
                
$row $result->fetch_array(MYSQLI_NUM);

                echo <<<EOF
            <br>
            <pre>
from_whom 
$row[1]
introductory_part 
$row[2]
main_part 
$row[3]
application 
$row[4]
        </pre>
EOF;
            }
        }
    }
?>
PHP код:
<?php
    
class technical_sessions
    
{
        function 
create($data$topic$instructor$participant$pass)
        {
            require 
$_SERVER["DOCUMENT_ROOT"] . '/includes/db_connect.php';
        
            
$query "INSERT INTO technical_sessions(data, topic, instructor, participant, pass) VALUES" 
                        
"('$data', '$topic', '$instructor', '$participant', '$pass')";
            
$result $connection->query($query);
            if (!
$result) echo "—бой при вставке данных: $query<br>" .
                                 
$connection->error "<br><br>";    
        }
        
        function 
show()
        {
            require 
$_SERVER["DOCUMENT_ROOT"] . '/includes/db_connect.php';
            
            
$query "SELECT * FROM technical_sessions";
            
$result $connection->query($query);
            
            if (!
$result) die($connection->error);
            
            
$rows $result->num_rows;
            
            for (
$j $j $rows ; ++$j)
            {
                
$result->data_seek($j);
                
$row $result->fetch_array(MYSQLI_NUM);
                
            echo <<<EOF
                <br>
                <pre>
Data 
$row[1]
Topic 
$row[2]
instructor 
$row[3]
participant 
$row[4]
pass 
$row[5]
                </pre>
EOF;
            }
        }
    }
?>
Вопрос 2.

Пишу код в Notepad++. При авторизации пользователя с помощью сессии делаю проверку на то авторизован он или нет, т.е. никакие формы HTML я не могу предоставить пользователю без проверки. И получается так, что HTML код встроен в PHP и он становится серым. Это зависит от среды в которой работаешь? Или есть определенные принципы как можно это все отделить друг от друга, чтобы дизайнер мог спокойно работать с HTML кодом?

Как пример:
PHP код:
<!DOCTYPE html>
<html>
    <head>
    <meta charset="utf-8">
     <title>Пример формы</title>
      <style>
       .signup 
       {
        border: 1px solid #999999;
        font: normal 14px helvetica;
        color:#444444;
       }
      </style>
    </head>
    <body>
    
    <?php
    session_start
();
    if (isset(
$_SESSION['username']))
    {    
        require_once 
$_SERVER["DOCUMENT_ROOT"] . '/includes/get_post.php';
        require 
$_SERVER["DOCUMENT_ROOT"] . '/includes/db_connect.php';
        require_once 
$_SERVER["DOCUMENT_ROOT"] . '/clases/class_reports.php';
        
        
$reports = new reports;
        
        if (isset(
$_POST['from_whom']) &&
            isset(
$_POST['introductory_part']) &&
            isset(
$_POST['main_part']) &&
            isset(
$_POST['application']))
        {
            
$from_whom get_post($connection'from_whom');
            
$introductory_part get_post($connection'introductory_part');
            
$main_part get_post($connection'main_part');
            
$application get_post($connection'application');
            
            
$reports->create($from_whom$introductory_part$main_part$application);
        }

        echo <<<EOF
    <a href="../../console/console.php">Вернуться в консоль.</a><br>
            <table class="signup" border="0" cellpadding="2" cellspacing="5" bgcolor="#eeeeee">
         <th colspan="2" align="center">Отчет о работе <br> ТЧМИ по обучению</th>
         <form method="post" action="reports.php" onSubmit="return validate(this, 'form_registration' )">
          <tr><td>От кого</td><td><input type="text" maxlength="32"
            name="from_whom"></td></tr>
          <tr><td>Ввводная часть</td><td><textarea rows="10" cols="45" 
            name="introductory_part"></textarea></td></tr>
          <tr><td>Основная часть</td><td><textarea rows="10" cols="45" 
            name="main_part"></textarea></td></tr>
          <tr><td>Приложение</td><td><textarea rows="10" cols="45" 
            name="application"></textarea></td></tr>
          <tr><td colspan="2" align="center">
          <tr><td colspan="2" align="center">
          <input type="submit" value="Отправить"></td></tr>
         </form>
        </table>
EOF;
        
        
$reports->show();
    }
    else 
    {
        echo 
"Пожалуйста, для входа <a href='../../index.php'>щелкните здесь</a>.";
    }
    
?>
    
    </body>    
</html>

Последний раз редактировалось Belzik; 22.03.2016 в 13:26.
Belzik вне форума Ответить с цитированием
Старый 22.03.2016, 13:35   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну никто ж не заставляет РНР и HTML в один файл пихать. Например самое простое — include или require. И вместо echo можно что-то типа
Код:
if ... {
?>
html
<?php
}
А так обычно шаблонизаторы используют. Blade, Twig, Smarty и т.п.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 22.03.2016 в 13:39.
Alex11223 вне форума Ответить с цитированием
Старый 22.03.2016, 13:46   #3
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Если два класса выполняют одинаковую работу, но только с разными входными данными – я бы сделал всего один класс, и через параметры конструктора регулировал бы его поведение.
Отображение информации прямо в методах класса – такого быть не должно. Для этого есть шаблоны, как уже отметили выше.
Создавать новое подключение к БД в каждом методе класса – дурное дело.
Andkorol вне форума Ответить с цитированием
Старый 22.03.2016, 14:16   #4
Belzik
 
Регистрация: 05.03.2016
Сообщений: 9
По умолчанию

Спасибо за ответы, пойду пробовать.
Belzik вне форума Ответить с цитированием
Старый 25.03.2016, 18:30   #5
Belzik
 
Регистрация: 05.03.2016
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
Если два класса выполняют одинаковую работу, но только с разными входными данными – я бы сделал всего один класс, и через параметры конструктора регулировал бы его поведение.
Отображение информации прямо в методах класса – такого быть не должно. Для этого есть шаблоны, как уже отметили выше.
Создавать новое подключение к БД в каждом методе класса – дурное дело.
Разобрался с шаблонизацией, за основу взял Smarty. Переписал все странички согласно этому принципу, получилось намного красивее. Убрал подключение из методов.

Но вот с классами до сих пор не выходит. В интернете как правило простые примеры по типу присвоение переменной какого-либо значения в конструкторе, поэтому не могу понять как тут его применить. Могли бы Вы, пожалуйста, показать на конкретном примере двух данных классов? И если таких классов 6 штук, то применяется конструктор? Метод show() изменить не сложно, но вот, что делать с create() я не пойму.

PHP код:
<?php
    
class reports
    
{
        function 
create($connection$from_whom$introductory_part$main_part$application)
        {
            
$query "INSERT INTO reports(from_whom, introductory_part, main_part, application) VALUES" 
                        
"('$from_whom', '$introductory_part', '$main_part', '$application')";
            
$result $connection->query($query);
            if (!
$result) echo "Сбой при вставке данных: $query<br>" .
                                 
$connection->error "<br><br>";    
        }
        
        function 
show($connection)
        {
            
$query "SELECT * FROM reports";
            
$result $connection->query($query);
            
            if (!
$result) die($connection->error);
            
            
$rows $result->num_rows;
            
$dual_mass = array();
            
            for (
$j $j $rows ; ++$j)
            {
                
$result->data_seek($j);
                
$row $result->fetch_array(MYSQLI_NUM);
                
$dual_mass[] = $row;        
            }
            return 
$dual_mass;
        }
    }
?>
PHP код:
<?php
    
class technical_sessions
    
{
        function 
create($connection$data$topic$instructor$participant$pass)
        {
            
$query "INSERT INTO technical_sessions(data, topic, instructor, participant, pass) VALUES" 
                        
"('$data', '$topic', '$instructor', '$participant', '$pass')";
            
$result $connection->query($query);
            if (!
$result) echo "—бой при вставке данных: $query<br>" .
                                 
$connection->error "<br><br>";    
        }
        
        function 
show($connection)
        {
            
$query "SELECT * FROM technical_sessions";
            
$result $connection->query($query);
            
            if (!
$result) die($connection->error);
            
            
$rows $result->num_rows;
            
$dual_mass = array();
            
            for (
$j $j $rows ; ++$j)
            {
                
$result->data_seek($j);
                
$row $result->fetch_array(MYSQLI_NUM);
                
$dual_mass[] = $row;
            }
            return 
$dual_mass;
        }
    }
?>

Последний раз редактировалось Belzik; 25.03.2016 в 18:43.
Belzik вне форума Ответить с цитированием
Старый 25.03.2016, 19:53   #6
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Примерно так:
PHP код:
class Data
{
    public 
$db// DB connection
    
public $table// DB current table name
    
public $fields = array(
        
'reports' => array('from_whom''introductory_part''main_part''application'),
        
'technical_sessions' => array('data''topic''instructor''participant''pass'),
    ); 
// current table fields

    
public function __construct($db$table)
    {
        
$this->db $db// set DB connection
        
$this->table $table// set DB current table name
    
}

    public function 
create($data)
    {
        
$query "INSERT INTO " $this->table " (" implode(", "$this->fields[$this->table]) . ") VALUES" 
                    
"('" implode("', '"$this->set_data($data)) . "')";
        
$result $this->db->query($query);
        if (!
$result) echo "Сбой при вставке данных: $query<br>" .
                             
$this->db->error "<br><br>";    
    }

    public function 
set_data($data)
    {
        
$return = array();
        foreach (
$this->fields[$this->table] as $field) {
            
$return[] = (!empty($data[$field])) ? $data[$field] : '';
        }
        return 
$return;
    }
    
    public function 
show()
    {
        
$query "SELECT * FROM " $this->table;
        
$result $this->db->query($query);
        
        if (!
$result) die($this->db->error);
        
        
$rows $result->num_rows;
        
$dual_mass = array();
        
        for (
$j $j $rows ; ++$j)
        {
            
$result->data_seek($j);
            
$row $result->fetch_array(MYSQLI_NUM);
            
$dual_mass[] = $row;        
        }
        return 
$dual_mass;
    }

Использование:
PHP код:
$data_reports = new Data($connection'reports');
$reports_data $data_reports->show(); // get data
$new_report = array(
    
'from_whom' => 'some value 1',
    
'introductory_part' => 'some value 2',
    
'main_part' => 'some value 3',
    
'application' => 'some value 4',
);
$data_reports->create($new_report); // set new row 
Andkorol вне форума Ответить с цитированием
Старый 25.03.2016, 20:29   #7
Belzik
 
Регистрация: 05.03.2016
Сообщений: 9
По умолчанию

Большое спасибо. Пойду сейчас пробовать и разбираться.
Belzik вне форума Ответить с цитированием
Старый 26.03.2016, 15:33   #8
Belzik
 
Регистрация: 05.03.2016
Сообщений: 9
По умолчанию

Еще раз спасибо. Разобрался что и как работает, стало понятно, что делать если разное кол-во переменных, но по факту выполнение одно и то же. Добавил еще туда 4 массива. В итоге код уменьшился раз в 5 )
Belzik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсветка php,css,html и.т.д кода на движке phpbb dirtez PHP 5 07.01.2011 00:57
Вопрос про ООП Unconnected Общие вопросы Delphi 15 13.02.2010 20:22
Ищу программу, редактор кода php, js, html, css ... iankov Софт 4 27.11.2009 00:04
Вопрос про печать кода ? juan666777 Софт 2 21.07.2009 13:27