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

Вопросы по PHP

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

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

0
#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
Основатель проекта
Всего сообщений: 401
Зарегистрирован: 22 сент. 2014 г., 18:56
Откуда: Москва, Перово
Рейтинг пользователя: 15

0
. Редактировалось 1 раз, последний — #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.

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

0
#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/

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

0
. Редактировалось 3 раза, последний — #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
Основатель проекта
Всего сообщений: 401
Зарегистрирован: 22 сент. 2014 г., 18:56
Откуда: Москва, Перово
Рейтинг пользователя: 15

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

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

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

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

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

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

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

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

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

0
#8
И в чем же там дело было?
Да, покажи!

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

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

0
. Редактировалось 1 раз, последний — #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
Основатель проекта
Всего сообщений: 401
Зарегистрирован: 22 сент. 2014 г., 18:56
Откуда: Москва, Перово
Рейтинг пользователя: 15

0
. Редактировалось 3 раза, последний — #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.

Следующие сообщения >>>
Страницы:
Распечатать

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