Intellect Board Pro
Расширяемая система управления форумами с открытым исходным кодом
Объявление
Выпущена версия 3.02 с двумя новыми типами разделов: блог и микроблог.
Перейти к скачиванию
Привет, гость!

Вопросы по PHP

Пользователю _1_ в этой теме не оффтопить

Настройки отображения темы Показывать по сообщений с сортировкой .
Выводить , отправленные .
Страницы:
Распечатать
ПнБ
Начинающий
Всего сообщений: 98
Зарегистрирован: 5 мая 2015, 11:37
Рейтинг пользователя: 0

0
6 сентября 2016, 16:06#1
    В процессе изучения PHP по книжкам, самые большие проблеммы и трудности для меня составляет для меня синтакис и форма записи.
    Вот пример контролера подключения к БД методом трай/катч:
    <?php try { $pdo = new PDO('mysql:host=localhost;dbname=ijdb', [color=#ff3366]'ijdbuser', 'm y p a s sw o r d ' ) ;[/color] $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->exec('SET NAMES "utf8"'); } catch (PDOException $e) { $output = 'Невозможно подключиться к серверу баз данных.'; include 'output.html.php'; exit(); } $output = 'Соединение с базой данных установлено.'; include 'output.html.php
    .
    Мне не понятна та строка, и то место, где выделено цветом. Почему хост и пользователь БД записываются и закрываются одинарной кавычкой, вместо того, чтоб эта кавычка стояла в конце строки? И почему хост, имя БД, пользователь, и пароль просто не объявляются через запятую?
    И второй вопрос взят из инсталятора ИнтБ (стр 124):
    <div id="output"> <?php call_user_func(array($this,[color=#ff3366]'action_step'[/color].$this->step)); ?> </div>
    Выделено цветом. Почему 'action_step' записана в одинарных кавычках? Вижу вызов функции из объекта, вижу 2 записи переменной $this, и дальнейшее подключение, а вот что можно вписывать между переменными, и через какой синтаксис-не пойму.

    Всё, что мне известно о PHP-меня научил 4X_Pro
    Опрос пользователей о деятельности _1_ http://intbpro.ru/flood/119/

    4X_Pro
    Основатель проекта
    Всего сообщений: 240
    Зарегистрирован: 22 сен 2014, 18:56
    Откуда: Москва, Перово
    Рейтинг пользователя: 6

    0
    6 сентября 2016, 16:50. Редактировалось 1 раз, последний — 6 сентября 2016, 17:26#2
      Одинарными и двойными кавычками в PHP выделяются строковые данные. При этом они могут быть частью более сложных выражений.
      В частности, тут происходит вот что: new PDO — это создание нового объекта с вызовом специальной-функции конструктора. У функции (любой, не только конструктора) может быть разное число аргументов (которое определяется тем, для чего она нужна). В данном случае у данной функции три отдельных аргумента-строки, в первом из которых указывается тип и имя базы и имя хоста в специальном формате, вторая строка — это имя пользователя и третья строка — это пароль. Соответственно, кавычки ставятся в начале и конце каждой из строк. Почему сделали так, что функции нужно три аргумента, а не один, в котором перечисленно все одной строкой — это уже вопрос к разработчикам расширения PDO.

      По второму вопросу. Тут происходит вот что: у нас есть переменная $this->step, в которой записан номер нужного шага инсталляции как обычное число. Т.е. 1, 2, 3 и т.д. Но функции, которые выполняют соответствующие шаги, называются action_step1, action_step2 и т.д. То есть тут происходит вот что: к постоянной строке action_step (именно потому что она постоянная, а не берется из какой-то переменной, она и записывается в кавычках) мы приклеиваем номер из переменной $this->step. Чтобы склеить две строки, мы записываем сначала первую, потом пишем точку (она означает операцию склейки), потом вторую. А дальше уже то, что получилось в результате склекйи, передаем в функцию call_user_func в качестве параметра.
      В принципе, все то же самое можно было бы расписать в несколько строк: $common_name = 'action_step'; // записываем в переменную общую часть имени $func_name = $common_name.$this->step; // склеиваем полное имя функции из двух частей: общей части и номера шага call_user_func(array($this,$func_name)); // вызываем функцию с указанным именем
      Но так получается гораздо дольше писать.
      Еще на всякий случай поясню, что в качестве аргумента функции вовсе не обязательно должна быть переменная, это может быть и константа, или (как в данном случае), выражение, которое посчитается перед вызовом функции и в качестве аргумента будет передан его результат.

      Критикуя — предлагай, предлагая — обосновывай!
      4xpro.ru — мой личный сайт-мультиблог на Intellect Board.

      ПнБ
      Начинающий
      Всего сообщений: 98
      Зарегистрирован: 5 мая 2015, 11:37
      Рейтинг пользователя: 0

      0
      6 сентября 2016, 17:35#3
        4X_Proнаписал(а):
        Почему сделали так, что функции нужно три аргумента, а не один, в котором перечисленно все одной строкой — это уже вопрос к разработчикам расширения PDO.

        А-ааа... это требования документации к функции, а не выбор самого программиста, как написать. Понятно.
        4X_Proнаписал(а):
        $common_name = 'action_step'; // записываем в переменную общую часть имени
        $func_name = $common_name.$this->step; // склеиваем полное имя функции из двух частей: общей части и номера шага
        call_user_func(array($this,$func_name)); // вызываем функцию с указанным именем

        Так мне намного понятней, так пошагово. Так видно, что за чем. А то первый вариант записи вызывал у меня ступор, из-за написания.
        На данный момент всё понятно, буду читать дальше, и задавать вопросы.

        Всё, что мне известно о PHP-меня научил 4X_Pro
        Опрос пользователей о деятельности _1_ http://intbpro.ru/flood/119/

        ПнБ
        Начинающий
        Всего сообщений: 98
        Зарегистрирован: 5 мая 2015, 11:37
        Рейтинг пользователя: 0

        0
        9 сентября 2016, 19:47. Редактировалось 3 раза, последний — 9 сентября 2016, 21:01#4
          4X_Pro, а можно ли в конструкции if else применять html-код?
          Например:
          <?php $a=b; $c=d;{ if ($a+$c>12); } else echo "<html>12-это не $a</html>"; ?>
          Понимаю, что пример не очень правильный, интересует сам факт применения html.

          Всё, что мне известно о PHP-меня научил 4X_Pro
          Опрос пользователей о деятельности _1_ http://intbpro.ru/flood/119/

          4X_Pro
          Основатель проекта
          Всего сообщений: 240
          Зарегистрирован: 22 сен 2014, 18:56
          Откуда: Москва, Перово
          Рейтинг пользователя: 6

          0
          10 сентября 2016, 19:05#5
            Можно, работать будет. С точки зрения PHP теги HTML ничем не отличаются от обычных строк с текстом. А в целом работа происходит так: сначала на сервере обрабазывается PHP-часть кода, потом то, что получилось в результате ее работы, передается брозуеру на стороне клиента, и уже он обрабатывает полученное как HTML-разметку, разделяя теги и текст.
            Другой вопрос, что с точки зрения стиля оформления программ все же желательно не смешивать PHP и HTML, а разделять их как в плане размещения в файле, так и в плане выполнения. В идеале должно быть так: сначала выполняется часть кода, которая считает все необходимые нам переменные, а потом они вставляются в HTML-код, и та часть, которая отвечает за вставку, содержит, в лучшем случае, только простые if и for. (Собственно, то, что я так не сделал в IntB 2.x, и стало в свое время его гланвым недостатком.)

            Критикуя — предлагай, предлагая — обосновывай!
            4xpro.ru — мой личный сайт-мультиблог на Intellect Board.

            ПнБ
            Начинающий
            Всего сообщений: 98
            Зарегистрирован: 5 мая 2015, 11:37
            Рейтинг пользователя: 0

            0
            18 сентября 2016, 23:03. Редактировалось 1 раз, последний — 18 сентября 2016, 23:07#6
              4X_Pro, помоги. Я разработал программу, хотел бы тебе показать. Как отдельный файл-она работает. Подключаю файл к движку phpbb на локалхосте, и тут проблеммы. Я подключился include_once к файлу index.php, но в шаблон хтмл, куда я подключил вывод работы скрипта передаётся только html-код, а код php-игнорируется. Виндошный Open Server. К чему вообще нужно подключатся? Может, к самому модулю(библиотекам) PHP? Если к нему, то к какому из его файлов? Указывать абсолютный путь, или относительный?

              Всё, что мне известно о PHP-меня научил 4X_Pro
              Опрос пользователей о деятельности _1_ http://intbpro.ru/flood/119/

              ПнБ
              Начинающий
              Всего сообщений: 98
              Зарегистрирован: 5 мая 2015, 11:37
              Рейтинг пользователя: 0

              0
              20 сентября 2016, 02:36#7
                Проблемму успешно решил. Показать тебе мой первый PHP-скрипт?

                Всё, что мне известно о PHP-меня научил 4X_Pro
                Опрос пользователей о деятельности _1_ http://intbpro.ru/flood/119/

                4X_Pro
                Основатель проекта
                Всего сообщений: 240
                Зарегистрирован: 22 сен 2014, 18:56
                Откуда: Москва, Перово
                Рейтинг пользователя: 6

                0
                20 сентября 2016, 15:25#8
                  И в чем же там дело было?
                  Да, покажи!

                  Критикуя — предлагай, предлагая — обосновывай!
                  4xpro.ru — мой личный сайт-мультиблог на Intellect Board.

                  ПнБ
                  Начинающий
                  Всего сообщений: 98
                  Зарегистрирован: 5 мая 2015, 11:37
                  Рейтинг пользователя: 0

                  0
                  21 сентября 2016, 13:17. Редактировалось 1 раз, последний — 21 сентября 2016, 13:41#9
                    4X_Proнаписал(а):
                    Да, покажи!

                    Я назвал эту программу-Адаптивные часы. Их размер меняется в зависимости от девайса, с которого юзер смотрит сайт. Это реализация медиазапросов шрифтов средствами PHP, вместо CSS. Дело в том, что у меня на сайте время очень мелко выводится. И CSS медиа запрос тут не применим-при увеличении шрифта ломается вёрстка. Потому что на этот класс "навешано" много других текстов сайта. Скрипт разбирает строку юзер-агента пользователя, и игнорируя всё, только по названию его операционной системы присваевает выводу часов на монитор свой размер шрифта. Для компьютеров-12 pt, для планшетов-14, для всех остальных-16. Затем проиходит вызов даты, перевод на русский, и подстановка переменных в html-код.
                    В коде всё подписано, см. построчные комментарии. Ниже-скрины, того, что получилось:
                    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <?php $detectOS=($_SERVER["HTTP_USER_AGENT"]);                  //запрос USER_AGENT. При каждой перезагрузке страницы. Индивидуален для каждого пользователя. $detectOS= preg_split("/[\(,),2-9,0,Q,E,R,T,Y,U,I,O,A,S,D,F,G,H,J,K,L,Z,C,V,B,N,., ,\/,]+/", $detectOS, -1, PREG_SPLIT_NO_EMPTY);  //Обрезка пробелов и букв верхнего регистра. Кроме W,X, и M.    $target=16;                                           //размер шрифта по умолчанию (мобильные девайсы.) if (in_array("ablet", $detectOS)) {                       //это планшет. Переменная перезаписывается с 16 на 14. $target=14; } if (in_array("iPad", $detectOS)) {                        //это тоже планшет $target=14; } if (in_array("Macintosh", $detectOS)) {                   //и это планшет $target=14; } if (in_array("Windows", $detectOS)) {                     //это десктроп. Размер шрифта ещё меньше. Перезапись переменной. $target=12; } if (in_array("X11", $detectOS)) {                         //это Линукс десктроп. Дебиан, Убунту, Минт, и даже Соларис. $target=12; }                                                         //поиск по массиву закончен. date_default_timezone_set("UTC");                         // Устанавливаем часовой пояс по Гринвичу $time = time();                                           // присваем значение переменной $offset = 3;                                              // смещение относительно Гринвича составляет +3 часа. Время моей страны-Украина, Киев. $time += 3 * 3600;                                        // Добавляем 3 часа к времени по Гринвичу $x=date("d M Y H:i:s",$time);                             //запрос даты по Киевскому времени $patterns = array();                                      //функция замены ключей массива на значения. Так делаю перевод 12-ти месяцев на русский язык с англ. $patterns[0] = '/Jan/'; $patterns[1] = '/Feb/'; $patterns[2] = '/Mar/'; $patterns[3] = '/Apr/'; $patterns[4] = '/May/'; $patterns[5] = '/Jun/'; $patterns[6] = '/Jul/'; $patterns[7] = '/Aug/'; $patterns[8] = '/Sep/'; $patterns[9] = '/Oct/'; $patterns[10] = '/Nov/'; $patterns[11] = '/Des/'; $replacements = array(); $replacements[11] ='Дек'; $replacements[10] ='Ноя'; $replacements[9] = 'Окт'; $replacements[8] = 'Сент'; $replacements[7] = 'Авг'; $replacements[6] = 'Июля'; $replacements[5] = 'Июня'; $replacements[4] = 'Мая'; $replacements[3] = 'Апр'; $replacements[2] = 'Март'; $replacements[1] = 'Февр'; $replacements[0] = 'Янв'; ksort($patterns); ksort($replacements);                                      //сортировка ключей и значений массива unset($detectOS, $time, $offset);                          //убиваем переменные.Ниже-таблица стилей и подстановка переменной в font-size, и вывод отформатированной даты в рамке.                   ?> <title>Дата и время</title>                         <style>   other {   font-family: "Lucida Grande", Verdana, Helvetica, Arial, sans-serif;   font-size: <?php echo $target;?>pt;   font-weight: 600;   color: #72747A;    border: 4px solid #FFFEC7;    padding: 2px; width: 300px;   } </style> </head> <body> <td><other><img src="http://s017.radikal.ru/i410/1609/8c/166a59bd35b5.png"><?php echo preg_replace($patterns, $replacements, $x);?></other></td> </body> </html>
                    Вот скрины. Я выделил красным-мой вывод, и вывод стандартных часов (посмотри разницу в размере шрифта). И скрин кода страницы. Успешная подстановка.


                    4X_Proнаписал(а):
                    И в чем же там дело было?

                    В PhpBB натыкано много защит, и php-код в шаблонах рассматривается логикой движка как xss. Кроме разрешения из админки, оказывается, вычитал в документации разработчиками был введён специальный тег
                    <!-- INCLUDEPHP /name.php -->
                    . Однако я попробую перехватить результат выполнения после выполнения интерпретатором, но до вывода на экран-в буфер. И из буфера уже вывести чистый html-код в шаблон. А теги-убрать.
                    P.S. Эту программу в будущем можно доработать до подключения в общую таблицу стилей, подстанавливать в body, для каскадной регулировки всех шрифтов сайта. Или как switch-переключатель на разные версии сайта для планшетов и мобильных.
                    P.P.S. В общем, по поводу программы-критика, предложения, замечания-принимаются.

                    Всё, что мне известно о PHP-меня научил 4X_Pro
                    Опрос пользователей о деятельности _1_ http://intbpro.ru/flood/119/

                    4X_Pro
                    Основатель проекта
                    Всего сообщений: 240
                    Зарегистрирован: 22 сен 2014, 18:56
                    Откуда: Москва, Перово
                    Рейтинг пользователя: 6

                    0
                    21 сентября 2016, 17:02. Редактировалось 3 раза, последний — 21 сентября 2016, 17:03#10
                      Из критики: пока непонятно, для чего ты делаешь ksort на $patterns и $replacements. Они же и так в правильном порядке идут. Ну и задавать их можно в гораздо более простой форме: $patterns = array('/Jan/','/Feb/',....), чтобы не расписывать на пять строк. Еще, раз у тебя часовой пояс является hardcoded (т.е. жестко прописанным, а не берется из профиля пользователя), то можно было бы сразу выставлять в date_default_timezone_set("Europe/Kiev"), вместо коррекции вручную. Кстати, в этом случае перевод на зимнее/летнее время (если он у вас есть) будет делаться корректно.
                      В остальном вроде бы нормально. Хотя я сам пошел бы иным путем: дописал бы к DOM-элементу, куда выводится время второй класс, и сделал бы media-запрос на него. Т.е. было бы что-то вроде <div id="time" class="oldclass otherclass">Текущее время... </div>. (В аттрибуте class можно перечислять несколько имен классов через пробел.)

                      Критикуя — предлагай, предлагая — обосновывай!
                      4xpro.ru — мой личный сайт-мультиблог на Intellect Board.

                      Страницы:
                      Распечатать

                      У вас нет прав для отправки сообщений в эту тему.

                      0: Контрольная точка "Конец инициализации". Время выполнения: 0.001. Запросов: 8, время запроса: 0.001 (51.10)%. Памяти использовано: 519920 байтов

                      0: Контрольная точка "Фиксация действия пользователя выполнена". Время выполнения: 0.002. Запросов: 10, время запроса: 0.001 (56.94)%. Памяти использовано: 520248 байтов

                      0: Контрольная точка "Основное действие выполнено". Время выполнения: 0.007. Запросов: 17, время запроса: 0.003 (38.83)%. Памяти использовано: 759360 байтов

                      0: Контрольная точка "Вспомогательные действия выполнены". Время выполнения: 0.007. Запросов: 21, время запроса: 0.003 (39.32)%. Памяти использовано: 775008 байтов

                      0: Контрольная точка "После срабатывания шаблонизатора.". Время выполнения: 0.012. Памяти использовано: 1077744 байтов