Вопросы по PHP
Пользователю _1_ в этой теме не оффтопить
В процессе изучения PHP по книжкам, самые большие проблеммы и трудности для меня составляет для меня синтакис и форма записи.
Вот пример контролера подключения к БД методом трай/катч:
.
Мне не понятна та строка, и то место, где выделено цветом. Почему хост и пользователь БД записываются и закрываются одинарной кавычкой, вместо того, чтоб эта кавычка стояла в конце строки? И почему хост, имя БД, пользователь, и пароль просто не объявляются через запятую?
И второй вопрос взят из инсталятора ИнтБ (стр 124):
Выделено цветом. Почему 'action_step' записана в одинарных кавычках? Вижу вызов функции из объекта, вижу 2 записи переменной $this, и дальнейшее подключение, а вот что можно вписывать между переменными, и через какой синтаксис-не пойму.
Вот пример контролера подключения к БД методом трай/катч:
<?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/
. Редактировалось 1 раз, последний — #2
Одинарными и двойными кавычками в PHP выделяются строковые данные. При этом они могут быть частью более сложных выражений.
В частности, тут происходит вот что: new PDO — это создание нового объекта с вызовом специальной-функции конструктора. У функции (любой, не только конструктора) может быть разное число аргументов (которое определяется тем, для чего она нужна). В данном случае у данной функции три отдельных аргумента-строки, в первом из которых указывается тип и имя базы и имя хоста в специальном формате, вторая строка — это имя пользователя и третья строка — это пароль. Соответственно, кавычки ставятся в начале и конце каждой из строк. Почему сделали так, что функции нужно три аргумента, а не один, в котором перечисленно все одной строкой — это уже вопрос к разработчикам расширения PDO.
По второму вопросу. Тут происходит вот что: у нас есть переменная $this->step, в которой записан номер нужного шага инсталляции как обычное число. Т.е. 1, 2, 3 и т.д. Но функции, которые выполняют соответствующие шаги, называются action_step1, action_step2 и т.д. То есть тут происходит вот что: к постоянной строке action_step (именно потому что она постоянная, а не берется из какой-то переменной, она и записывается в кавычках) мы приклеиваем номер из переменной $this->step. Чтобы склеить две строки, мы записываем сначала первую, потом пишем точку (она означает операцию склейки), потом вторую. А дальше уже то, что получилось в результате склекйи, передаем в функцию call_user_func в качестве параметра.
В принципе, все то же самое можно было бы расписать в несколько строк:
Но так получается гораздо дольше писать.
Еще на всякий случай поясню, что в качестве аргумента функции вовсе не обязательно должна быть переменная, это может быть и константа, или (как в данном случае), выражение, которое посчитается перед вызовом функции и в качестве аргумента будет передан его результат.
В частности, тут происходит вот что: 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.
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/
. Редактировалось 3 раза, последний — #4
4X_Pro, а можно ли в конструкции if else применять html-код?
Например:
Понимаю, что пример не очень правильный, интересует сам факт применения 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/
Можно, работать будет. С точки зрения PHP теги HTML ничем не отличаются от обычных строк с текстом. А в целом работа происходит так: сначала на сервере обрабазывается PHP-часть кода, потом то, что получилось в результате ее работы, передается брозуеру на стороне клиента, и уже он обрабатывает полученное как HTML-разметку, разделяя теги и текст.
Другой вопрос, что с точки зрения стиля оформления программ все же желательно не смешивать PHP и HTML, а разделять их как в плане размещения в файле, так и в плане выполнения. В идеале должно быть так: сначала выполняется часть кода, которая считает все необходимые нам переменные, а потом они вставляются в HTML-код, и та часть, которая отвечает за вставку, содержит, в лучшем случае, только простые if и for. (Собственно, то, что я так не сделал в IntB 2.x, и стало в свое время его гланвым недостатком.)
Другой вопрос, что с точки зрения стиля оформления программ все же желательно не смешивать PHP и HTML, а разделять их как в плане размещения в файле, так и в плане выполнения. В идеале должно быть так: сначала выполняется часть кода, которая считает все необходимые нам переменные, а потом они вставляются в HTML-код, и та часть, которая отвечает за вставку, содержит, в лучшем случае, только простые if и for. (Собственно, то, что я так не сделал в IntB 2.x, и стало в свое время его гланвым недостатком.)
Критикуя — предлагай, предлагая — обосновывай!
4xpro.ru — мой личный сайт-мультиблог на Intellect Board.
. Редактировалось 1 раз, последний — #6
4X_Pro, помоги. Я разработал программу, хотел бы тебе показать. Как отдельный файл-она работает. Подключаю файл к движку phpbb на локалхосте, и тут проблеммы. Я подключился include_once к файлу index.php, но в шаблон хтмл, куда я подключил вывод работы скрипта передаётся только html-код, а код php-игнорируется. Виндошный Open Server. К чему вообще нужно подключатся? Может, к самому модулю(библиотекам) PHP? Если к нему, то к какому из его файлов? Указывать абсолютный путь, или относительный?
Всё, что мне известно о PHP-меня научил 4X_Pro
Опрос пользователей о деятельности _1_ http://intbpro.ru/flood/119/
Проблемму успешно решил. Показать тебе мой первый PHP-скрипт?
Всё, что мне известно о PHP-меня научил 4X_Pro
Опрос пользователей о деятельности _1_ http://intbpro.ru/flood/119/
. Редактировалось 1 раз, последний — #9
Я назвал эту программу-Адаптивные часы. Их размер меняется в зависимости от девайса, с которого юзер смотрит сайт. Это реализация медиазапросов шрифтов средствами 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>
Вот скрины. Я выделил красным-мой вывод, и вывод стандартных часов (посмотри разницу в размере шрифта). И скрин кода страницы. Успешная подстановка.
В PhpBB натыкано много защит, и php-код в шаблонах рассматривается логикой движка как xss. Кроме разрешения из админки, оказывается, вычитал в документации разработчиками был введён специальный тег
<!-- INCLUDEPHP /name.php -->
. Однако я попробую перехватить результат выполнения после выполнения интерпретатором, но до вывода на экран-в буфер. И из буфера уже вывести чистый html-код в шаблон. А теги-убрать.
P.S. Эту программу в будущем можно доработать до подключения в общую таблицу стилей, подстанавливать в body, для каскадной регулировки всех шрифтов сайта. Или как switch-переключатель на разные версии сайта для планшетов и мобильных.
P.P.S. В общем, по поводу программы-критика, предложения, замечания-принимаются.
Всё, что мне известно о PHP-меня научил 4X_Pro
Опрос пользователей о деятельности _1_ http://intbpro.ru/flood/119/
. Редактировалось 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 можно перечислять несколько имен классов через пробел.)
В остальном вроде бы нормально. Хотя я сам пошел бы иным путем: дописал бы к DOM-элементу, куда выводится время второй класс, и сделал бы media-запрос на него. Т.е. было бы что-то вроде <div id="time" class="oldclass otherclass">Текущее время... </div>. (В аттрибуте class можно перечислять несколько имен классов через пробел.)
Критикуя — предлагай, предлагая — обосновывай!
4xpro.ru — мой личный сайт-мультиблог на Intellect Board.
У вас нет прав для отправки сообщений в эту тему.