Сохранен 809
https://2ch.hk/pr/res/864640.html
Прошлые домены больше не функционируют, используйте адрес ARHIVACH.HK.
24 декабря 2023 г. Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!

Клуб изучающих PHP 82

 Аноним 27/10/16 Чтв 15:58:45 #1 №864640 
14775731253680.png
14775731253691.jpg
14775731253722.jpg
14775731253763.png
Добро пожаловать в наш уютный тред. Тут мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет научиться программировать, кто-то - делать сайты, кто-то - просто размять мозги и заняться чем-то полезным.

Это не чат! Высказывайтесь одним большим постом, а не цепочкой мелких

Это тред для начинающих. Не написал за свою жизнь ни одной программы и имеешь тройку по математике? Ты наш человек.

Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (с ним будет удобнее).

Предыдущий тред был тут: >>848550 (OP)

Мейлруч лежит? Есть запасной тред: http://dobrochan.org/s/res/23225.xhtml#i46467

Что самое главное для программиста? Умение аккуратно оформлять код (читай второй пост, прежде чем писать код).

Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания. ОП заходит редко, где-то раз в 2-3 дня, у него мало времени, не жди его, решай задачки дальше. ОП отвечает на все вопросы по его задачкам и учебнику, а вот насчет каких-то других вещей - только если останется время. Но в треде немало анонимных экспертов разного уровня, так что вряд ли вопрос останется без ответа.

У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru/ Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то надо начать с него. Он простой и понятный (по крайней мере в начале). Там есть задачи, их надо решать обязательно (чтобы стать программистом, надо писать код — иначе никак). Пости ссылки на решения в тред, мы их проверим, напишем замечания и дадим советы по улучшению.

Если не знаешь как решать, запости код, напиши в каком месте остановился и попроси подсказку.

Ты прошел весь учебник? Молодец, но это были лишь основы языка PHP, этого недостаточно. Вот что в идеале надо изучить еще: ООП, как работает веб-сервер, HTML/CSS, SQL, PDO, работа с таблицами в БД, работа с формами, MVC, git, composer, JS, фреймворки, автоматизированное тестирование.

Надо переходить к более серьезным задачкам, которые научат тебя всему этому.

- для начала прочти урок https://github.com/codedokode/pasta/blob/master/soft/web-server.md
- установи Апач + PHP (советы выше и ниже) и читай туториал http://php.net/manual/ru/tutorial.php
- Учи HTML/CSS и SQL, PDO, хотя бы основы
- Далее простая, но полезная задача сделать список студентов, в ней много полезных советов: https://github.com/codedokode/pasta/blob/master/student-list.md
- Более сложная задача сделать файлообменник на микрофреймворке Slim: https://gist.github.com/codedokode/9424217
- Еще более сложная и долгая задача на Yii/Symfony: https://gist.github.com/codedokode/8733007
- После нее можно изучать автоматизированное тестирование https://gist.github.com/codedokode/a455bde7d0748c0a351a
- Если ты все решил, переходи к Symfony 2/Doctrine 2
- Почитать про паттерны http://designpatternsphp.readthedocs.org/ru/latest/README.html (если ты не изучил ни одного фреймворка, то это будет рановато), тут с примерами кода http://designpatternsphp.readthedocs.org/ru/latest/README.html . Имей в виду что без примеров использования их учить бесполезно - не поймешь, хочешь увидеть примеры использования паттернов - ковыряй исходники Симфони, например Symfony Forms. Не заучивай паттерны - смотри код и думай, зачем тут они использованы.

Чтобы делать эти задания, тебе надо установить Апач + PHP (можно заодно сразу и MySQL) на компьютер. Вот полезные инструкции:

https://github.com/codedokode/pasta/blob/master/soft/php-install.md
https://github.com/codedokode/pasta/blob/master/soft/apache-install.md

Может тебе понадобится пользоваться командной строкой, вот гайд https://github.com/codedokode/pasta/blob/master/soft/cli.md

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

Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.

- HTML/CSS: https://github.com/codedokode/pasta/blob/master/html/html.md
- JS: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
- SPA (сложно): https://github.com/codedokode/pasta/blob/master/js/spa.md
- Проверялка решений на JS: http://dkab.github.io/jasmine-tests/
- MySQL: https://github.com/codedokode/pasta/blob/master/db/databases.md

Что почитать

- Мануал по PHP — http://www.php.net/manual/ru/langref.php
- Сайт phptherightway (перевод на русский: http://getjump.me/ru-php-the-right-way/ )
- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
- По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
- JS: learn.javascript.ru
- Про Git: https://git-scm.com/book/ru/v1

Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492

Платиновые вопросы

- Почему PHP? Потому что фейсбук и википедия на нем написаны, и вакансий море, и учить легко.
- Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.ru/6bfCY9lfl и получи личную немного устаревшую оффлайновую копию сайта (можно читать хоть на андроиде без интернета)
- Что надо знать чтобы найти работу - разработчику: PHP, SQL, HTML/CSS, JS, ООП, Git, композер, MVC, фреймворк. Верстальщику - HTML/CSS, JS, jQuery
- Сколько времени надо изучать все это? - все зависит от тебя, но не меньше 6-8 месяцев
- Посоветуйте редактор кода - Sublime Text 3, Notepad++, PhpStorm
- Нужен ли ООП, фреймворки, MVC, git, composer? — Да, однозначно. Посмотри любую вакансию.
- Что самое главное для программиста? Умение аккуратно оформлять код.
- ОП, сделай за меня мою работу или домашнее задание? — Это конечно, хорошая идея, но нет.
- Подскажи сайты для поиска работы, я не умею гуглить? — hh.ru, geekjob.ru, moikrug.ru (склеен с brainstorage.me), fl.ru, upwork.com (бывший одеск). Имей в виду, что кроме фриланса есть еще постоянная удаленная работа (remote job) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.
Прочти внимательно Аноним 27/10/16 Чтв 16:02:09 #2 №864641 
14775733300360.png
14775733300371.jpg
14775733300472.png
Код нужно писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.

Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока (да, прогресс не стоит на месте). Если ты используешь мощную IDE вроде PhpStorm, там тоже есть функция форматирования кода.

Горячие клавиши для форматирования кода в разных IDE: https://gist.github.com/codedokode/8759492

Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть стандарты PSR-1 и 2. Вот как надо оформлять код:

- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- Название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо из-за обилия точек и кавычек
- мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)

Вот ссылка на стандарты, где все это описано подробнее и даны примеры оформления:

PSR-1: https://github.com/samdark/fig-standards-ru/blob/master/accepted/ru/PSR-1-basic-coding-standard.md
PSR-2: https://github.com/samdark/fig-standards-ru/blob/master/accepted/ru/PSR-2-coding-style-guide.md

------------------

Итак, ты зашел в тред и решил помочь какому-то анону, дав ему совет или подсказку. Спасибо! Но прочти сначала эти напоминания, чтобы твоя помощь действительно была полезной.

Давай удочку, а не рыбу

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

Будь доброжелателен

Не годится: «Ты мануал хоть раз в жизни открывал, обезьяна?»
Не годится: «В гугле забанили?»
Не годится: «Твой код плохой»
Хорошо: «Вот, как можно улучшить этот код: ...»
Хорошо: «Ты неправильно используешь функцию abc(). Вот ее описание: ссылка, и как видишь ей надо передать строку, а не массив»

Не придирайся к знанию английского языка.

Объясняй

Не очень хорошо: «сделай как в этом коде»
Хорошо: «если ты вставляешь текст от пользователя в SQL запрос, то получается SQl-инъекция, которая позволяет взломать твой сервер (ссылки). Чтобы этого избежать, надо вставлять данные с помощью плейсхолдеров (ссылки)»
Хорошо: «Помни, что код пишется для людей. Если писать такие большие функции, то в них становится трудно разобраться...»

Не проповедуй

Мы учим использованию самых распространненных подходов, стандартов, библиотеки фреймворков. Если ты не любишь ООП, пробелы в коде, jQuery, сам PHP, то рассказать об этом стоит в каком-нибудь другом треде.

Не придирайся к знанию английского языка, анон пишет как умеет.

Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
Аноним 27/10/16 Чтв 18:47:05 #3 №864755 
Yii2-знатоки, вопрос к вам. Имеется пикрелейтед. Header и footer подключаются через шаблон. При переходе на данную страницу срабатывает actionProfile контроллера Master, который рендерит страницу целиком(кроме очевидных хедера и футера). При нажатии на ссылку из меню управление передается контроллеру Master actionСсылкаНейм, который рендерит тот же самый profile, а помимо этого через параметры передает ссылку для рендера в правой части вида, т.е получается рендер в рендере.

По-хорошему же надо сделать так, чтобы view Profile, в котором только левое меню рендерилось один раз, а правая часть страницы менялась ajaxом при клике на другой пункт меню. Через скрытие блоков сделать нельзя, т.к. url в зависимости от выбранной ссылки должен меняться. Также планируются пункты меню из других контроллеров, которым тоже нужно передавать значение Мастера, в результате получаются охуенные костыли.
Буду рад любой помощи.
Аноним 27/10/16 Чтв 18:47:53 #4 №864757 
14775832737050.png
>>864755
Как назло отклеилось
Аноним 27/10/16 Чтв 18:50:50 #5 №864763 
ребят помогите мне самбу настроить
делаю вроде простой конфиг, а всё равно ничего не разрешает в папке редактировать

comment = none
path = /var/www/html
browsable = yes
guest ok = yes
writable = yes
Аноним 27/10/16 Чтв 22:59:13 #6 №864924 
>>864763
Юзер самбы != юзер ос. Ты это ушёл?
Аноним 27/10/16 Чтв 22:59:56 #7 №864925 
>>864924
Учел *
Аноним 27/10/16 Чтв 23:29:41 #8 №864934 
Все треды как треды, а пхп как для даунов
>Это не чат! Высказывайтесь одним большим постом, а не цепочкой мелких

А на самом деле шапка оче годная.
Satosi 28/10/16 Птн 05:05:51 #9 №865009 
Аноны, подскажите мне пожалуйста. Хочу запилить свою страничку, что-то типа бложика + раздел с проектами. Как думаете стоит это делать сейчас (Изучаю с 1 октября), когда знаю только функционалку, или стоит ещё месяц изучать ООП и MVC?
Аноним 28/10/16 Птн 05:58:08 #10 №865014 
Sup
есть задачка
Например: есть число 123, то программа должна вычислить сумму цифр 1, 2, 3, т. е. 6.
мое решение

$numberRandom = 55;
$array = str_split($numberRandom);
echo array_sum($array);

решение автора

$number = "1547";
$sum = 0;
for($i = 0; $i <= strlen($number); $i++) {
$sum += $number[$i];
}
echo $number."<br/>";
echo $sum;

все разное, но мое короче
или что то я сделал не так?

вон какую программку я написал, теперь у меня есть шансы стать программистом?
Аноним 28/10/16 Птн 05:58:51 #11 №865015 
Салам.
В чем разница фулстэк, бэкенд и т.д.?
Куда лучше стремиться развиваться? Плюсы и минусы.
Аноним 28/10/16 Птн 06:02:57 #12 №865016 
>>865014
Теперь вычисли факториал 100! т.е. 12 ... 99100
Аноним 28/10/16 Птн 06:05:55 #13 №865017 
>>865016
1x2x ... x99x100
Аноним 28/10/16 Птн 06:08:27 #14 №865018 
>>865015
>бэкенд
Часто только PHP (+ вариации CGI, Java, Linux...)
>фулстэк
PHP(в общих чертах) + JS + CSS + HTML + 100500 технологий JS типа cofeeScript, React, Angular нутыпонял.
Аноним 28/10/16 Птн 06:17:36 #15 №865019 
Чот в прошлом треде спросил про то, как push делать через PHPStorm, мне ответили, я сказал спасибо, да и забил. А сечас перечитываю тред, а там ответов 40 про то, что надо консоли изучать и вообще я нуб. Ребзя, вопрост был, "Почему после каммита и пуша, происходит 20 изменений в 20 разных файлах и пуш перестаёт работать, выдавая сообщение что изменений нет? " Откуда вы взяли что я про Gitbush не знаю? Почему вы подумали что я консольные команды не знаю? Зачем вы об этом спорили, когда вопрос был именно про IDE? Вообще непонял.
Аноним 28/10/16 Птн 06:22:39 #16 №865020 
>>865017
Подсказка log xy = log x + log y
Аноним 28/10/16 Птн 07:39:31 #17 №865024 
>>864924
да мне уже подсказали
в ручную нужной папке уровень доступа нужный сделал
всё равно спасибо :3
Аноним 28/10/16 Птн 19:24:52 #18 №865339 
ПОБЕДА. Взяли джуном, на испытательный. Опыта 0. Показал решение задачи про регитрацию студентов из ОП-поста и решил тестовое задание. На вопросы на собеседовании отвечал очень хуево. Знаю ли битрик, что такое ORM, как сделать наследовать от нескольких классов, как запрашивать данные сразу из нескольких таблиц, ни на что ответить не смог. Спасло только то что, в отличии от конкурентов, придумал хороший алгоритм тестовой задачи и хорошо закомментировал там все. И наверное что попросил низкую зп на первое время.
Очень признателен ОПу за его уроки.
Аноним 28/10/16 Птн 19:32:00 #19 №865344 
>>865339
Но там еще был такой момент, в тестовом задании говорилось что нужно использовать МВЦ, ну я вспомнив урок Опа разделил всю логику приложения, работы с данными и отображения по разным классам и шаблонам и думал что этого достаточно, требования соблюдены. Но в конторе мне сказали ни хрена так не правильно, нужно именно создавать три папки модел, вью, контролер и складывать все в них. Такая хуйня.
А и да, я 27 лвл, образования нет, кодинг учу полгода где то.
Аноним 28/10/16 Птн 20:40:51 #20 №865364 
Не в тему, но спрошу тут, так как нигде больше не отвечают: вот я через npm глобально установил яpug-cli (интерфейс командной строки для pug), все компилируется, а тогда зачем сам pug нужен, в том числе глобальный?
Аноним 28/10/16 Птн 20:42:30 #21 №865366 
>>865364
pug-cli
Аноним 28/10/16 Птн 21:21:28 #22 №865379 
>>865344
> ни хрена так не правильно, нужно именно создавать три папки модел, вью, контролер
Ну тогда понятно, почему они берут тех, кто "что такое ORM, как сделать наследовать от нескольких классов, как запрашивать данные сразу из нескольких таблиц, ни на что ответить не смог".

Хотя, забей. Искренне тебя поздравляю! :3
Аноним 28/10/16 Птн 22:57:04 #23 №865424 
14776846247240.jpg
Необходимо добавить значение в массив. Удаляет корректно, а вот добавить не могу, что-то идет не так.
Аноним 29/10/16 Суб 02:40:34 #24 №865554 
Серьёзно торможу, как выбрать при помощи jQuery или JS значение поля формы, если есть несколько полей с одним именем в виде массива. Есть скрипт, который генерирует количество форм с одинаковым параметром name, взависимости от выбора пользователя. В каждую из этих форм вводится значения, как получить массив со всеми значениями? То есть допустим пользователь выбрал 3 формы и в каждое ввёл данные:

Введите телефон номер 1:
<input type="text" name="phones[]">
Введите телефон номер 2:
<input type="text" name="phones[]">
Введите телефон номер 3:
<input type="text" name="phones[]">

Как при помощи jquery выбрать все введённые значения?
Аноним 29/10/16 Суб 03:15:20 #25 №865559 
>>865339
>придумал хороший алгоритм тестовой задачи
Напиши пожалуйста какую ты задачу решал?
Аноним 29/10/16 Суб 08:27:37 #26 №865571 
>>865554
stackoverflow.com/questions/19529443/jquery-get-input-array-field
Аноним 29/10/16 Суб 08:32:32 #27 №865573 
>>865554

1) найти по name
2) обойти в цикле, например, each()


Аноним 29/10/16 Суб 08:45:22 #28 №865574 
>>858807
> $student=$this->c['table']->getStudentByHash($_COOKIE['hash']);
> а почему это делается не через класс авторизации?

А зачем?

> https://github.com/TheSidSpears/Students/blob/master/app/Models/Student.php#L38
> Вообще, конечно методы вроде addInfo - это открытый путь к уязвимостям, так как люди забывают делать фильтрацию и передают туда сразу $_POST. Гитхаб так взломали однажды

Лучше всё вручную передавать? $s->name=$name; итл Или как?
Аноним 29/10/16 Суб 09:33:35 #29 №865582 
Можно ли в action <form> писать ссылки с переменными?

<form method='get' action='main?sortBy=group_num&orderBy=desc'>
Аноним 29/10/16 Суб 11:45:40 #30 №865626 
14777307402820.png
Сап , аноны. Помогите начинающему программисту. Я изучаю PHP по вашим урокам ( http://archive-ipq-co.narod.ru/). На 3 уроке встретился с проблемой выполнения задания , анон , помоги. Вот код который я написал для выполнения :
<?рhp
error_reporting(-1) ;
$anonDice1 = mt_rand (1, 6);
$anonDice2 = mt_rand (1, 6);
$compDice1 = mt_rand (1, 6);
$compDice2 = mt_rand (1, 6);
echo "У анона выпало {$anonDice1} и {$anonDice2} \n У компьютера выпало {$compDice1} и {$compDice2}\n";
if {$anonDice1} == {$anonDice2} && {$compDice1} == {$compDice2} {
echo "У тебя выпали даблы\n";
exit();
}
$anonSum = $anonDice1 + $anonDice2;
$compSum = $compDice1 = $compDice2;
if {$anonSum} > {$compSum} {
echo "anon wins";
} else {
echo "comp wins"
exit()
}
?>
Но вместо выполнения оператора условия , мой код просто полностью выходит и всё. Команды не выполняются.
Жду вашей помощи , аноны
Аноним 29/10/16 Суб 11:49:17 #31 №865628 
>>858807
> Насчет валидатора - у тебя нет желания как-то сделать его более ООП?

Да, попозже займусь этим

> У тебя есть такие относительные УРЛ и потому возможен баг.

Все url'ы рабочие

> > if( (isset($user->email)) and ($user->email==$student->email) ):
> Лучше проверять наверно по hash или id как неизменному значению. А если используется правильный дата маппер с Identity Map, то можно просто писать $user === $student.

Звучит прикольно, но как это реализовать? Погуглил, суть ясна, но сложно представляю с чего начать.
$user - это return ф-ии getStudentByHash();
$student- это элемент массива полученного от getStudents();
Аноним 29/10/16 Суб 11:54:01 #32 №865629 
>>865626
Кидай лучше ссылку на код, а не копируй сюда.

Начни с простого: http://ideone.com/cptdIr
У тебя уже на этом этапе код работает неверно (см. на то, что он выводит). Разберись сначала с этим, дальше может поймешь, что не так
Аноним 29/10/16 Суб 12:03:31 #33 №865633 
>>865629
Хотя подожди, какой-то глюк, вот тут тот же код выполняет всё: http://ideone.com/JoGYDy

Вообщем, ошибка в синтаксисе if'а. Там не нужны никакие {}

if($a==$b){
echo "Равны";
}

exit'ы тоже не нужны
Аноним 29/10/16 Суб 12:12:49 #34 №865640 
>>853691
Просто оставлю это здесь для себя.
Аноним 29/10/16 Суб 12:33:41 #35 №865647 
Кошерно ли использовать $_SESSION для передачи какихнить не очень важных данных между файлами пхп. например у меня сложный сайт с роутером и отедльными классами для работы с данными. Мне надо как то на рендер передавать информационные сообщения или ошибки (не кода, а пользовательских действий), после нескольких проб я попробовал передавать в $_SESSION['errors'] массив с ошибками, после чего я обрабатываю его при рендере, в зависимости от массива вывожу сообщение или информацию и очищаю эту переменную в $_SESSION. какие подводные камни? работает и выглядит все просто вроде
Аноним 29/10/16 Суб 16:48:52 #36 №865783 
Насколько плохо я выполнил задачу со списком студентов?

https://github.com/anonymous011010/studentslist
Аноним 29/10/16 Суб 18:06:53 #37 №865850 
>>865626

ideone видимо сломался и вместо выолнения php кода просто его выводит.

Попробуй другие сайты, например http://phptester.net/ или http://codepad.org/ или http://www.runphponline.com/

Или погугли по словам "run php code online".
Аноним 29/10/16 Суб 18:08:51 #38 №865852 
>>865647

Нет, неправильно. Зачем тебе сессия для передачи данных внутри скрипта если их просто можно передать через переменные?

Для передачи данных между скриптами сессии тоже не лучший вариант, так как куки (а следовательно и сессии) общие для всех вкладок в браузере. Если ты знаешь, как реализованы сессии, то понимаешь почему.

Аноним 29/10/16 Суб 20:57:09 #39 №865948 
>>865852
вот именно между скриптами. там просто есть класс который возвращает данные, так за время выполнения (загрузки одной страницы) создается 3 экземпляра в разных местах. Получается в одном из экземпляров есть нужный мне массив, но хз как из него передать в другой скрипт, в котором создается новый экземпляр.

а $GLOBALS не правильно, аналогично сессиям или $GLOBALS уже норм?
Аноним 29/10/16 Суб 21:12:40 #40 №865956 
>>865948

Нет, все это не норм. Проблема с сессиями, как я уже написал, в том, что они общие для нескольких вкладок и данные будут перепутываться если открыть несколько вкладок с сайтом.

Способ, который работает в нескольких вкладках - передавать данные через POST/GET (но тут есть подвох что пользователь видит и может менять передаваемые данные).

Проблема с глобальными переменныим в том, что код превратится в нечитаемую лапшу. Трудно будет понять откуда берутся и куда передаются данные.

Для проверки форм и вывода ошибок есть готовый алгоритм, не требующий сессий: https://github.com/codedokode/pasta/blob/master/forms.md

Он тебе подходит?

Аноним 29/10/16 Суб 23:03:13 #41 №866012 
Добрый вечер, не знаю в этот или в JS тред писать, с какой стороны проблема.
Написал скрипт который работает долго, если лимитов нет по времени на сервере то часов 5-6, для того, чтобы не смущать пользователя сделал вывод информации в реальном времени о ходе выполнения, онлайновый стрим данных сделал с помощью 'text/event-stream', echo json даты и ob_flush(); flush();
На стороне браузера есть eventListener по message который обновляет статистику для юзера. Так вот, на локалке у меня всё нормально работает, обновляется примерно раз в 1-2 секунды, на продакшне сервер пошустрее работает - по-идее там выполнение скрипта в пару раз быстрее и статистика там не обновляется, висит долго ожидание соединения, потом через пару минут прилетает сразу огромное количество сообщений по eventStream за всё время ожидания, потом снова пауза. Я подозреваю что из-за более быстрой работы скрипта - браузер не справляется с флудом и не отрабатывает так как надо. Или всё же может быть другая проблема?
Аноним 30/10/16 Вск 00:03:44 #42 №866034 
>>865559
https://docs.google.com/document/d/1H2H9h-UtaBGjrfmHh1ClbdJl1nH1Vx9wA6rAfcVbyEo/edit
Аноним 30/10/16 Вск 00:09:37 #43 №866037 
>>866034
У кого есть опыт, скажите это сложное задание для джуна?
Аноним 30/10/16 Вск 00:13:21 #44 №866039 
>>866037
Простенькое, роутинг сделать самодельный и построить дерево на основе одной таблицы через связь id-parent
Аноним 30/10/16 Вск 00:19:41 #45 №866042 
>>866039
А нет ли у тебя примеров заданий средней высокой сложности? Напомню задание на позицию джуна. Я вот даже не знаю что такое роутинг и зачем он нужен. Это что то с __DIR__?
Кстати, был еще в двух конторах, в одной попросили написать скрипт который бы находил страницу пользователя в фейсбуке зная его телефон. В другой нужно было написать 2 СКЛ запроса на выборку из двух таблиц.Как по мне это значительно проще.
Аноним 30/10/16 Вск 00:43:41 #46 №866051 
>>866042
>Я вот даже не знаю что такое роутинг
Это формирование линков >Построить пути к элементам. Элементы каталога выводить ссылками. Например для Id=6 «Телевизор Series 7» вида «/catalog/samsung/s7/»
>средней высокой сложности
Мне давали тестовый таск однажды: Есть сторонний API который отдает за один раз 200 записей, API принимает некоторые параметры, к примеру я могу задать начиная с какой записи получить эти 200 записей.
Задача состояла получить все записи начиная с первой, вне зависимости от их общего числа и записать в CSV-файл, при этом остановиться, когда записи закончатся. На PHP это было бы просто, но задача стояла на nodejs и там была рекурсивная функция с асинхронными запросами.
Аноним 30/10/16 Вск 01:10:07 #47 №866058 
>>866051
http://ideone.com/mGR87D
Потом в шаблоне $linkArray выводиться на экран.
Это и есть роутинг?
>Мне давали тестовый таск однажды
На php задача и правда не сложная. А есть примеры именно для php?
Аноним 30/10/16 Вск 03:32:03 #48 №866093 
14777875233440.png
14777875233451.png
14777875233472.jpg
Аноны, как настроить ебучий автокоплит в Атоме? Ну это просто пиздец, такой красивый редактор, есть плагины, а автокомплит просто сука не работает, я же везде прописал верные пути к композеру и пхп, ну вы только гляньте на сколько красив атом и вырвиглазен нетбинс.

Что делать? Хожу писать код в красивом редакторе, а в нетбинсе сидеть противно.
Аноним 30/10/16 Вск 03:50:48 #49 №866096 
>>866093
Поставить другую тему в Netbeans не пробовал?
Аноним 30/10/16 Вск 03:54:17 #50 №866097 
>>866096
да они все там вырвиглазные
Аноним 30/10/16 Вск 07:23:54 #51 №866112 
>>866093
Разве что самому плагин писать.
PHPStorm попробуй, его можно купить на торрентах.
Satosi 30/10/16 Вск 08:19:41 #52 №866117 
Что-то вместо круга получился полукруг (ideone не отобразит)
http://ideone.com/lfiQW3

Есть идеи как поправить?
Аноним 30/10/16 Вск 08:43:13 #53 №866128 
А может кто сказать как работает роутинг простым языком? А то у меня голова взорвалась.

Все объяснения которые я нахожу в интернете.

1 Делаем ссылку вида /pr/res/privet
2 Передаём её в роутер
3 ????
4 ШАБЛОН

3 пункт мне совершенно непонятен. Как роутер понимает какой шаблон брать? Как он понимает что нужно взять 5 шаблонов (футеры хедеры и прочее)? Как шаблон контактирует с CSS? Как шаблон содержит переменные, но при этом они все должны обрабатываться роутером, или нет?
Аноним 30/10/16 Вск 09:18:21 #54 №866133 
На проверку

https://github.com/TheSidSpears/Students
https://github.com/TheSidSpears/FileHosting
Аноним 30/10/16 Вск 10:36:25 #55 №866143 
>>866128
Точка входа в программу у тебя одна. Роутинг всегда обрабатывается. Получаешь ссылку по которой зашел пользователь, потом в зависимости от правил роутинг у тебя, делишь ссылку на составные части, из базы получаешь, что означает каждая часть (декодишь), исходя из этих данных определяешь какой контроллер должен обрабатывать ссылку и передаешь управление ему.
При построении ссылок пользуешься обратной функцией - которая из параметров собирает ссылку.
Аноним 30/10/16 Вск 11:16:48 #56 №866160 
>>866128

Роутинг (=маршрутизация) это процесс определения контроллера по УРЛ. Роутер - это часть приложения, которая получает на вход УРЛ определяет, какой контродллер его будет обрабатывать.

Логика работы роутера может быть любая, как программист решил, так и будет.

Если ты по-прежнему не понимаешь, могу пример кода дать, без ООП, сделам роутер обычной функцией:

function route($url) {
if ($url == '/') {
return 'indexController';
} elseif ($url == '/news') {
return 'newsController';
} else {
return null;
}
}

Набрав MVC роутер в гугле, можно найти еще кучу примеров.

При чем тут шаблон, я не понимаю. Шаблон обычно выбирается и вызывается контроллером.

Почитай для начала про MVC https://github.com/codedokode/pasta/blob/master/arch/mvc.md

Потом изучи какой-нибудь MVC фреймворк, в котором есть роутер.
Аноним 30/10/16 Вск 11:42:58 #57 №866170 
>>865956
Вот этот алгоритм, только исправленный так, как у меня работает.
$data = new Data(); //создаем экземпляр класса для работы с данными
$values = значения по умолчанию (пустые);
$errors = пустой массив;
Если (форма отправлена) {
Копируем переданные значения полей в $values;
Проверяем значения в $values и записываем найденные ошибки в $errors;
Тут валидация простая. а у меня идет в $data работа с БД + потом возвращаются данные. Конкретно у меня проводятся транзакции, где проверяется 1. Не заблокирован ли счет отправителя/получателя. 2. Хватило ли баланса 3. Если все ок с 1 и 2 проведена ли транзакция успешно.

Если (ошибок нет) {
$errors = $data->someDataMethod($values);
// если все ок то $errors = ['check' => 1, 'balance' => 1, 'transaction' => 1];
// Но как его передать в следующий скрипт, в котором ко всему создается свой экземпляр $data.

}
}

Выводим форму($values, $errors);

Но потом на самой странице выводится темплейт и в начале него создается еще один экземпляр Data(), я пробовал сохранить как public свойство в $data, но т.к. создается новый экземпляр, это не работает.
Аноним 30/10/16 Вск 18:47:47 #58 №866461 
14778424672470.png
14778424672481.png
Есть простая страница с формой http://pastebin.com/aH2HwTeY

Есть скрипт, который отправляет два поля email и password на мыло, должен отправлять http://pastebin.com/LZQGvqNU

Отправка мыла на почту работает, если через терминал запустить скрипт. На скрине структура проекта.

После субмита через кнопку в test.html, вылетает ошибка на скрине-2.

Я особо в пхп не шарю. Больше по джаве
Аноним 30/10/16 Вск 18:54:01 #59 №866468 
>>866461

а настраивать сервер умеешь? что у тебя написано в атрибуте action в начале формы?
Аноним 30/10/16 Вск 19:03:44 #60 №866477 
>>866468
не обратил внимание на ссылки, проблема в настройке сервера, походу твой сервер настроен так, что не может видеть тот файлик, глянь в настройках сервера либо в .htacess.

либо же у тебя где-то есть файлик который обрабатывает входящие запросы и соответственно отдает нужные вьюшки, а твою ссылку обработать не может
Аноним 30/10/16 Вск 19:04:07 #61 №866478 
>>866477
не вьюшку, а foo.php
Аноним 30/10/16 Вск 19:46:08 #62 №866505 
>>866478
Запускаю через xampp, посмотрел его конф файл, ничего убедительного не нашел.
Каким способом можно еще отправить инфу на мыло?
Аноним 30/10/16 Вск 21:09:42 #63 №866529 
>>866505
ручным

хранить скрипт и форму в одном файле
Аноним 30/10/16 Вск 21:12:02 #64 №866532 
>>866505
да и блять по папкам твоего приложения видно же, что запросы чем-то обрабатываются, у тебя вьюхи в отдельной папке лежат, ты же когда заходишь на сайт не пишешь
http://localhost/view/index.html

так что в эту сторону и копай, разберись для начала как работает твой код
Аноним 30/10/16 Вск 23:38:19 #65 №866631 
>>866461

Это ошибка Апача, а не PHP. Можешь посмотреть в логе ошибок полный путь к файлу, который он не может найти.

Если ты не разбираешься в конфигах Апача и PHP, то даже если ты исправишь проблему, все равно твой скрипт будет скорее всего кривой и глючный, может быть с уязвимостями, открывающими доступ к серверу. Не надо браться за то, что не умеешь.
Аноним 30/10/16 Вск 23:40:27 #66 №866633 
Я ньюфажина лютая, поэтому ответьте на вопрос, как задать диапазон числе для $random?
Аноним 30/10/16 Вск 23:55:24 #67 №866636 
>>866633
mt_rand(от числа, до числа)
Аноним 31/10/16 Пнд 00:02:10 #68 №866640 
Анончики, помогите написать инъекцию, когда попадает 'test', выдает следующее

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'test'')' at line 1
Аноним 31/10/16 Пнд 04:51:29 #69 №866756 
14778786893200.jpg
>Решил 39 задачь и все дополнительные.
>Оп сказал что только 6 правильно
Аноним 31/10/16 Пнд 06:29:50 #70 №866771 
>>866666
Аноним 31/10/16 Пнд 07:42:44 #71 №866783 
>>866756

А ты думаешь, все остальные с первого раза все правильно делают? Если бы каждый после неправильно решенной задачи постил по лягушке, наш тред бы давно уже перенесли в /zoo/
Аноним 31/10/16 Пнд 07:51:46 #72 №866786 
Привет, объясните пожалуйста одно из условий 5ой задачи по JS (остальные все выполнил)
http://dkab.github.io/jasmine-tests/?spec=6
"должна подставлять лишние аргументы в конец списка: partialAny(fn, 1)(2, 3) -> [1, 2, 3]"

Как должен выглядеть массив аргументов на примере исходных данных:
partialAny(test, 1, undefined, 3)(5)

Мое решение:
https://jsfiddle.net/soybo52k/
Аноним 31/10/16 Пнд 07:52:46 #73 №866787 
>>866786
6ой задачи, быстрофикс
Аноним 31/10/16 Пнд 08:18:53 #74 №866790 
>>866786

> Как должен выглядеть массив аргументов на примере исходных данных:
partialAny(test, 1, undefined, 3)(5)

[1, 5, 3] так как 5 подставляется вместо udefined
Аноним 31/10/16 Пнд 08:38:22 #75 №866791 
>>866790
мое решение так и делает, подставляет 5 на место undefined, а что такое "лишние аргументы" в данном контексте?
Аноним 31/10/16 Пнд 08:45:24 #76 №866793 
>>866790

Я не могу понять ОДНО из условий в проверке робота.

Результат проверки роботом 6ой задачи (решение: https://jsfiddle.net/soybo52k/)

Функция partialAny(fn, foo, bar...)
дожна возвращать функцию OK
должна использовать строгое сравнение с undefined (null или 0 не должен восприниматься как undefined) OK

Возвращаемая функция
должна подставлять переданный аргумент вместо undefined: partialAny(fn, 5, undefined, 10)(1) -> [5, 1, 10] OK
должна оставлять undefined если аргумент не передан: partialAny(fn, 5, undefined, 10)() -> [5, undefined, 10] OK
должна подставлять несколько аргументов в partialAny(fn, a, undefined, undefined, b) OK
должна подставлять undefined если аргумент не передан в partialAny(fn, a, undefined, undefined, b) OK

должна подставлять лишние аргументы в конец списка: partialAny(fn, 1)(2, 3) -> [1, 2, 3] NOT OK

не должна передавать лишние аргументы внутренней функции: partialAny(fn, 1, undefined, 3, undefined)(2) -> [1, 2, 3, undefined] OK
может вызываться несколько раз и результаты во второй раз не зависят от первого OK


Вроде бы тут нет лишних аргументов, а если они были бы, то я должне их добавить в конец списка? Но следующее условие говорит, что я не должен их передавать во внутреннюю функцию, значит, затем я должен удалить их из списка, так?
Аноним 31/10/16 Пнд 09:10:18 #77 №866795 
>>866791

Это когда передано больше аргументов чем есть undefined в шаблоне:

partialAny(1, undefined, 2)(3, 4, 5 ,6) -> [1, 3, 2, 4, 5, 6]
Аноним 31/10/16 Пнд 09:11:21 #78 №866796 
>>866793

(2, 3) лишние так как в первых скобках нет ни одного undefined и лишние аргументы подставляются конец списка.
Аноним 31/10/16 Пнд 09:35:01 #79 №866803 
>>866532
Все работает на express-e. Закинул скрипт к папке во view, просипал форме action="foo.php"
Теперь уже Cannot POST /foo.php

Я бы с радостью не занимался этим дерьмом, но лаба требует
Аноним 31/10/16 Пнд 11:53:45 #80 №866907 
>>864640 (OP)
Сап помогач, я сам джавист потому реквестирую вашей помощи, третий час бьюсь в истерике, суть такова: надо скомпилить протобаф.

В идеале если раскажете как его потом POSTом отправить.

Есть сервер на джаве и клиент на пыхе. они должны обмениваться протобафами. С джавой проблем нет, а как эту ебатеку скомпилдить на пхп для меня высшее колдунство. Помоги анон, волосы седеют.
Аноним 31/10/16 Пнд 12:04:07 #81 №866928 
>>866907
>Есть сервер на джаве и клиент на пыхе.
Очень смешно.
Аноним 31/10/16 Пнд 12:15:04 #82 №866949 
>>866928
Это условные названия, есть два сервака, один на джаве другой на пыхе. Надо обмен протобафами устроить. Нужна помощь по пхп части, кто в теме, пожалуйста.

Сам протобаф простоейший

package text.protobuf;

message Text{
required string text = 1;
}

Надо только его скомпилить, а дял этого надо скомпилить модуль пхп, и куда-то его потом подключить или положить, и это какой-то особый пиздец.
someApprentice 31/10/16 Пнд 12:35:02 #83 №866971 
https://github.com/codedokode/pasta/blob/master/html/html.md#Главное-задание-на-верстку-макета
https://github.com/someApprentice/maintaskforlayout
https://someapprentice.github.io/maintaskforlayout/
https://www.browserstack.com/screenshots/a67572898943c3deb293b501f133cf43189a2946 (актуально до коммита с css-спрайтом увы, больше 100 изоброжений нельзя)

>кнопки и ссылки должны реагировать на нажатие и наведение мыши
А как узнать как они должны выглядеть?

>тег <img> используется только для картинок в портфолио
>используй псевдоэлементы, чтобы уменьшить объем HTML, например для значка телефона внизу
А почему нельзя использовать тег img? Так бы можно было бы вывести все иконки в старых браузерах.

>здесь используются внешние шрифты, и довольно тяжелые. Если ты можешь уменьшить их объем, это будет плюсом
Не разу не работал со шрифтами. Можно подсказку как это сделать? Мне приходилось преобразовывать формат шрифтов для старых браузеров, это оно и есть?
Аноним 31/10/16 Пнд 13:52:16 #84 №867039 
>>866971

Там обычно и не требуется делать скриншоты для всех версий браузеров. Самый проблемный тут ИЕ, потому для него стоит сделать по скрншоту для каждой версии. Для других браузеров хватит последней версии + при желании какую-нибудь древнюю. Плюс мобльные браузеры.

Тут важно понимать, что браузерных движков не так и много:

- trident (в IE)
- presto (старая Опера, почти никем не используется)
- gecko (firefox)
- webkit (Хром, новая Опера, Яндекс браузер, мейл ру браузер, сафари, мобильные браузеры)
- blink, форк вебкита, использующийся по моему в новых версиях браузеров, ранее работавших на вебките

Если стандарты соблюдать, то с gecko и вебкитом проблем практически нет, если за новыми фичами CSS3 не гнаться, то все будет работать даже в первом Хроме.

> А почему нельзя использовать тег img? Так бы можно было бы вывести все иконки в старых браузерах.
Псевдоэлементы не работают в старых браузерах? По моему разве что в ИЕ7 и ниже ( https://css-tricks.com/browser-support-pseudo-elements/ )

Если нужна поддержка ИЕ7 можно вместо псевдоэлементов использовать например спаны с background-image. Если нужен еще ИЕ6 то надо отказаться от полупрозрачных PNG. Но если подумать, это очень древние браузеры и в принципе иконки не настолько критичный элемент, чтобы ради них заморачиваться.

img не годится так как его принято использовать для картинок и иллюстраций, являющихся контентом сайта. Иконки - это оформление и они не должны использовать тег img. Псевдоэлементы я рекомендую чтобы не раздувать HTML сохранять его осмысленным.

> Не разу не работал со шрифтами. Можно подсказку как это сделать? Мне приходилось преобразовывать формат шрифтов для старых браузеров, это оно и есть?
Новые форматы вроде woff/woff2 действительно поддерживают сжатие и позволяют уменьшить объем. Но более радикальный способ - выкинуть ненужные символы. Условно говоря, если твой сайт на английском, зачем тебе кириллица или хинди или математическеи символы? Если взять например шрифт roboto: https://fonts.google.com/specimen/Roboto (какой они сделали ужасный интерфейс, старый нематериальный веб-1.0 был в 100 раз лучше) то в нем много разных символов, и не все они нужны.

Если использовать конвертер на fontsquirrel, то там можно указать диапазоны символов, которые нужны.

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

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

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

Кстати, в твоем случае - у тебя один шрифт используется только ради логотипа. Оцени, сколько он добавляет к весу страницу и что будет если заменить его на SVG/PNG. (тут конечно свои минусы - чтобы поддерживать ретину, надо закладывать PNG с повышенным качеством, также поисковые роботы не прочитают текст в виде картинки).

При нажатии на кнопки all/graphic/illustration часть работ должна скрываться.

Телефон в подвале должен быть кликабельным с помощью tel: ссылки, адрес - вести на любой картографический сервис.

надо бы сделать адаптивную версию для узких экранов.

У тебя стоит <meta name="viewport" content="width=device-width"> но фактически адаптивности там ноль. Зачем было ставить вводящий браузер в заблуждение тег?

meta charset не прописан.

> <i>
Сейчас для смыслового выделения фразы используют em, а тег i получил какое-то другое назначение в HTML5.

> PORTFOLIO
Текст в HTML надо писать в нормальном регистре. Верхний регистр делается через CSS, так как это часть оформления.

> <a name="portfolio">
Чтобы сделать якорь, лучше использовать атрибут id - он вроде даже в старых ИЕ работает. Тег a для этого использовать - устаревший подход.

> <img src="img\home
Почему слеш обратный? В веб используют прямой, как в линуксе.

> <li><a class="rss" href=""></a></li>
Плохо что ссылка пустая. Как поисковый бот или программа чтения текста воспримет такую ссылку?

Тебе надо открыть HTML и почитать его, и такие нелогичности сразу станут видны.

В остальном HTML код хорош. Никаких лишних тегов, это хорошо.

Для ссылок на соцсети надо сделать реакцию на наведение.

Шрифты ты определил неправильно. Ты объявляешь щрифт LatoBlack:

> @font-face {
> font-family: LatoBlack;
Но это просто шрифт lato в жирном начертании. Все начертания шрифта Lato надо определить под одним именем, просто указать их вес и курсивность.

А в твоем варианте если ты сделаешь абзац с текстом Lato, а в нем strong, то браузер не догадается использовать LatoBlack так как для него это другой шрифт.

Их форматов - я бы добавил как минимум woff, если он весит меньше других. Найди где-нибудь список, какие браузеры какие форматы поддерживают.

> font-family: 'Times New Roman', Arial, Helvetica, sans-serif;
Бредовый список. Times New Roman - шрифт с засечками, Arial и sans-serif - без, они едва ли взаимоменяемы.

> a, a:visited {
> color: #d9d9d9;
не надо отключать выделение посещенных ссылок на всем сайте, так как это полезная функция. Отключи только в тех местах, где тебе надо.

Далее, тебе надо проработать базовые стили CSS. Сделай новый файл с пустым body и впиши в него простой HTML без классов, с тегами вроде h1, h2, ul, li, p, a, img, blockquote (если нет фантазии или лень писать, скопируй с http://motherfuckingwebsite.com/ ). У тебя этот текст выводится бледно-серым на белом фоне - это значит, базовые стили не продуманы совсем. Ты написал не базовый CSS для всего сайта, а стили для единственной страницы и при добавлении новых страниц твой ксс придется значительно переделывать.

Почитай про назнаечние тегов в HTML5.Теги i и b в старом значении (задание начертания шрифта больше не используютя так как офомление должно задаваться в ксс, а не в HTML. Эти теги не соответствуют принципам HTML5).

> font-family: ReklameScriptRegularDEMO;
Не задан фоллбек (запасной) шрифт.

> .services .content div {
Неудачное на мой взгляд правило, слишком широкого действия. Представь завтра в этот блок добавят новый див и твое правило применится к нему, что заставит переделывать верстку, тратить время. Надо делать правила точечного действия, которые действуют только на нужные элементы.

В данном случае можно либо добавить > либо добавить класс на див.

Вообще, по поводу выбора селекторов, я советую почитать про подход в БЭМ. Он очень практичный и как раз предусматривает поддержку и изменение верстки в будущем.

> .tristiquet::before {
> .fermentum::before {
> .elitultricies::before {

Слишком много копипасты. Там различается только позиция в спрайте.

> .portfolio .content .works :nth-child(4n) {
Это не будет работать с адаптивностью скорее всего, так как на узком экране картинок меньше.

> @media (max-width: 1110px) {
> body {
> width: 1110px;
Это так хитро записанный min-width? Он противоречит тегу meta viewport который говорит о поддержке маленьких экранов. А ее нет.

Для картинок ты выбрал PNG. Он дает хорошее каечство, но размер.... вот это вот https://someapprentice.github.io/maintaskforlayout/img/home_0003s_0001s_0022_Layer-1.png весит 130 Кб. не жирно ли? на некоторых сайтах всю страницу можно в 130 Кб уложить. Рассмотри другие форматы.

Аноним 31/10/16 Пнд 13:53:24 #85 №867043 
>>866971

А ты не хочешь голову поломать над дополнителным заданием? Вот оно:

---------

Подбери (гуглить и использовать готовое можно) способ подключения SVG картинки, работающий максимально кросбраузерно. Рассмотри подключение через теги img, object и через backgorund-image. Проверь, работает ли автоматическое определение размеров картинки или их надо указывать.

----------

SVG довольно интересная штука. С одной стороны, у него много преимуществ (поддержка дисплеев с произвольным разрешением), с другой стороны проблем у него не меньше. Ты берешь, рисуешь картинку в inkscape и внезапно оказывается что в части браузеров не поддерживается часть фич SVG. Или что ее нельзя использовать в качестве фоновой. Я изучал и так, и эдак, и решил что проще использовать SVG только в процессе разработки, а в браузер отдавать сгенерированный из него PNG.
Аноним 31/10/16 Пнд 14:06:13 #86 №867053 
>>866971

про HTML5 теги:

- официальный стандарт (англ), самый подробный и авторитетный источник: https://www.w3.org/TR/html5/Overview.html#contents пункт 4
- https://developer.mozilla.org/en-US/docs/Web/HTML/Element

ссылки на русском:

- http://htmlbook.ru/samhtml5/sintaksis-html5
- http://htmlbook.ru/samlayout/verstka-na-html5/novye-tegi
- http://htmlbook.ru/html5

Аноним 31/10/16 Пнд 16:00:32 #87 №867121 
>>867039
>Там обычно и не требуется делать скриншоты для всех версий браузеров. Самый проблемный тут ИЕ, потому для него стоит сделать по скрншоту для каждой версии. Для других браузеров хватит последней версии + при желании какую-нибудь древнюю. Плюс мобльные браузеры.
Я не пользуюсь этим сайтом, у меня есть инструменты разроботчика + имуляция ie. Я просто несколько раз переделывал перед тем как скинуть в тред.


>Псевдоэлементы не работают в старых браузерах?
Я имел ввиду что нельзя воспользоваться нельзя воспользоваться такими свойствами как content и background: url, которые по версии caniuse не доступны с 8 версии.

>Если нужен еще ИЕ6 то надо отказаться от полупрозрачных PNG.
А можно пример что нужно написать? У меня не получилось вывести изоброжение с помощью background-image: url(img.jpg).

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

>> font-family: 'Times New Roman', Arial, Helvetica, sans-serif;
>Бредовый список. Times New Roman - шрифт с засечками, Arial и sans-serif - без, они едва ли взаимоменяемы.
Я не знаю чем различаются разные шрифты. Теперь буду замечать.


>надо бы сделать адаптивную версию для узких экранов.
Как она должа выглядеть? Я старался сделать чтобы для экранов меньше 1110px (размер контной части) всё выглядело точно так же, за исключением резиновых отступов.

>У тебя стоит <meta name="viewport" content="width=device-width"> но фактически адаптивности там ноль. Зачем было ставить вводящий браузер в заблуждение тег?
Должны размеры шрифтов поменяться.

>> @media (max-width: 1110px) {
>> body {
>> width: 1110px;
>Это так хитро записанный min-width? Он противоречит тегу meta viewport который говорит о поддержке маленьких экранов. А ее нет.
На самом деле всё наманого хуже. Я совсем не понял как работают media features и не нашел описаний атрибута content для тэга viewport А хотелось бы знать как работают все его свойства.
Например, что указывает max-width в этом поле? Интуиция мне подскзывает что это максимальная ширина окна, но как оно определяется? Допустим моё окно будет 1000px, почему правило max-wdith: 1110px срабатывает? Как высчиталось 1110px из 1000px? Почему не 9999px?

Пока я приходил к этому решению, я натыкался на некоторые баги, и скорее это решение просто грязный хак.

>>867043
>А ты не хочешь голову поломать над дополнителным заданием?
Принято, но позже. Сначало нужно хотя бы js сделать.
Аноним 31/10/16 Пнд 19:44:13 #88 №867314 
>>867121

Имей в виду, что эмуляция IE (через панель инструментов F12 или сторонние программы) не совсем полноценно повторяет все особенности той или иной версии. ИЕ так глубоко встроен в систему, что эмулировать все баги точно не получается.

То есть пользоваться этим можно, но надо понимать, что могут быть какие-то тонкие отличия от настоящего браузера.

Если же ты используешь виртуальные машины с ИЕ то там все ок.

background: url работает даже в Ие6. Вот псевдоэлементы, да, есть только начиная с ИЕ8. Но тут получается такой выбор:

- замусоривать верстку, добавляя спаны, чтобы работало в ИЕ6
- решить, что сайтом можно пользоваться и без этих иконок в ИЕ6-7, и оставить псевдоэлементы

> А можно пример что нужно написать? У меня не получилось вывести изоброжение с помощью background-image: url(img.jpg).
ИЕ6 в полупрозрачных (то есть с альфа-каналом) картинках формата PNG делает полупрозрачные пиксели черными. Изображения PNG8 с палитрой из 256-цветов и с прозрачностью без полупрозрачности работают нормально.

Изучи-ка особенности графических форматов, а то нам трудно будет понять, о чем речь, а тебе трудно решить, какой формат когда лучше использовать.

- https://ru.wikipedia.org/wiki/PNG
- https://ru.wikipedia.org/wiki/JPEG
- https://ru.wikipedia.org/wiki/GIF
- https://ru.wikipedia.org/wiki/SVG
- http://web-design-courses.narod.ru/graphics.html
- https://htmlacademy.ru/blog/113-image-formats
- https://www.artlebedev.ru/tools/technogrette/img/png-1/
- https://habrahabr.ru/post/45242/

> В нашем шаблоне есть иконки которые являются ссылками на контакты. По моему это важно выводить.
Это соцсети? Они да, должны быть видны. Но там ведь и не нужны вроде бы псевдоэлементы.

> Как она должа выглядеть? Я старался сделать чтобы для экранов меньше 1110px (размер контной части) всё выглядело точно так же, за исключением резиновых отступов.
В отладчике Хрома (да и фаерфокса тоже по моему) есть кнопка "тестирование адаптивной верстки". Можно нажать ее и походить по разным сайтам, посмотреть.

https://moonback.ru/page/check-adaptive

Или можно сделать узкое окно браузера - будет почти то же самое.

Также, можно погуглить статьи вроде "лучшие примеры адаптивной верстки" и зайти на упомянутые там сайты и опять же посмотреть.

Википедию посмотри. Хабр (m.habrahabr.ru). Ютуб. Яндекс. Любые известные сайты.

Проблема с обычным сайтом в том, что он широкий (рендерится на 800-1000px) и на мобильном устройстве отображается в сильно уменьшенном масштабе. А если пользователь тапом приближает абзац текста, то абзац уходит за край экрана и надо его таскать вправо-влево, чтобы прочесть. Очень неудобно. Потому делают дополнительно верстку под ширину устройства (320-500px). Соответственно, блок с картинками скорее всего будет выводиться в 1-2 столбика. Размер текста, заголовков и отступов иногда также меняют чтобы не было больших пустых пространств (экран смартфона не резиновый) и смотрелось гармонично.

Ну и соответственно весь сайт обычно делается в одну колонку, а не в несколько. Все располагается вертикально. Иногда часть информации скрывают, но это не лучшая идея.

Чтобы сказать мобильным браузерам о том, что сайт для них адаптирован, используют тег meta viewport: http://frontender.com.ua/mobile-web/wtf-viewport/

> Например, что указывает max-width в этом поле?
@media (max-width: 1110px) значит что стили в этом блоке применяются только если ширина окна не более 1110 px.

- https://developer.mozilla.org/en-US/docs/Web/CSS/Media_Queries/Using_media_queries
- https://developer.mozilla.org/en-US/docs/Web/CSS/@media
- http://htmlbook.ru/css/value/media
- http://htmlbook.ru/css/media

> Допустим моё окно будет 1000px, почему правило max-wdith: 1110px срабатывает? Как высчиталось 1110px из 1000px? Почему не 9999px?
Так как 1000px меньше чем 1110 то правила в блоке @media применяются к странице. Если окно станет шире 1110, то они перестанут применяться.

И еще одна вещь, про которую надо хотя бы почитать. Это ретина-дисплеи, то есть экраны с повышенной плотностью пикселей. Условно говоря на смартфоне может быть ширина экрана 720px. Но если вывести на нее сайт такой же ширины, то текст будет мелкий и нечитаемый. Потому браузер рендерит страницу на ширине 360px но в увеличенном масштабе. Если при этом на странице обычные картинки,то они будут увеличены и выглядеть не очень красиво. А если использовать векторный формат или картинки с двойной плотностью пикселей, то другое дело.

Погуглить можно атрибут srcset у img, а также примеры кода отсюда: https://css-tricks.com/snippets/css/retina-display-media-query/

Ну и еще ссылка, таблица размеров экранов: http://mydevice.io/devices/
Студенты Аноним 31/10/16 Пнд 20:05:02 #89 №867331 
14779335021280.webm
А я, тем временем, продолжаю неспешно постить сюда свой говнокод.
https://github.com/anotherCodeMunkey/studentsList
Аноним 31/10/16 Пнд 20:41:33 #90 №867356 
Zend Studio - норм IDE для нуфага? Нетбинс и пхпшторм моя некропека не тянет, а использовать редакторы стало геморно когда я начал использовать ООП и пространства имен.
Аноним 31/10/16 Пнд 20:56:41 #91 №867362 
Напомню себе, что надо бы проверить https://github.com/never3ver/students_list из поста >>862816

Аноним 31/10/16 Пнд 21:57:36 #92 №867390 
Напомню, что надо проверить https://github.com/ghp26/Students из >>863496

Аноним 31/10/16 Пнд 22:20:54 #93 №867409 
>>866756
Всё нормально. Я задачу на студентов за месяц сделал. И 5 месяцев доделываю конечно, делая параллельно другую задачу
Аноним 31/10/16 Пнд 23:04:17 #94 №867437 
В природе существуют Java to JS/PHP трансляторы/конверторы? Очень нннада переписать код для веба, а жабки я не знаю.
Аноним 31/10/16 Пнд 23:37:35 #95 №867451 
Какой сейчас модный редактор для php на мак?
Аноним 01/11/16 Втр 00:22:49 #96 №867470 
>>867437
Что-то существует, но вряд ли это пригодные для реального использования вещи.
Лучше JS выучить.
Аноним 01/11/16 Втр 02:27:44 #97 №867533 
Привет анончики! делаю ТЗ в конторку и вот столкнулся с проблемой. нужно организовать фильтра для выборки из БД

4. При выводе данных добавить возможность отфильтровать сотрудников по отделу, должности или типу. (Пользователь может одновременно выбрать две и более критерии фильтрации)

5. Так же при выводе данных необходимо учесть возможность сортировки по дате рождения или по количеству месячного оклада.

Так вот. базу спроектировал и заполнил. запросы для вывода данных понаписывал - все работает четенько, только вопрос в том как это теперь все упаковать? Ведь пользователь может комбинировать запросы как угодно, и мне нужно сделать все гибко.
Может шарит кто статьи какие-то или прост может подсказать - буду очень благодарен.
Аноним 01/11/16 Втр 02:34:59 #98 №867536 
>>867533
>добавить возможность отфильтровать сотрудников по отделу
where otdel like ITdept and igorDapt
>учесть возможность сортировки по дате рождения
Sort by Birsday
Sort by ZORPLATA
Аноним 01/11/16 Втр 03:26:31 #99 №867561 
>>867533
$query = 'SELECT * FROM table WHERE 1';

$sortby = array()
if($_POST['sort_birthday']){
$sortby[] = 'birthday';
}
if($_POST['sort_zarplata']){
$sortby[] = 'zarplata';
}
if(!empty($sortby)){
$query .= ' SORT BY '.implode(',', $sortby);
}

Вот типа такого. Без PDO, прости уж, но, думаю, смысл понятен.
Аноним 01/11/16 Втр 03:27:17 #100 №867562 
>>867561
ORDER BY конечно же.
Аноним 01/11/16 Втр 11:57:36 #101 №867666 
>>864640 (OP)
хуй
Аноним 01/11/16 Втр 12:35:22 #102 №867687 
>>867533

Для построения запросов по частям есть паттерн Query Builder.

У Фаулера (там не совсем Query Builder, а Builder вообще): http://martinfowler.com/bliki/ExpressionBuilder.html

У меня: https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md#query-builder

В простом маленьком приложении можно просто руками собрать запрос из частей.
Аноним 01/11/16 Втр 12:48:44 #103 №867694 
14779937242850.jpg
>>867536
>>867561
>>867687

Спасибо няшки!
Аноним 01/11/16 Втр 13:34:13 #104 №867725 
>>867470
Не js, а джаву тогда уж, С джавы на пхп/жс
>>867437
Бамп
Аноним 01/11/16 Втр 14:15:28 #105 №867756 
В старом треде я дал ответы на все вопросы и проверил все задачи. В частности:

- >>867751 - по сложному решению задачи на банкомат с комментариями

Если я кого-то пропустил или забыл - напомните о себе в этом, новом треде.
Аноним 01/11/16 Втр 14:34:21 #106 №867778 
>>867451
xcode же.
Аноним 01/11/16 Втр 14:36:49 #107 №867779 
Аноны. У кого-то я видел в регулярке для проверки email предположение, что домен верхнего уровня (то что идет после последней точки, например .ru) занимает от 2 до 6 символов. Это давно уже неактуально, не ставьте таких огранчиений.

Обратил внимание, что скайп не выделяет ссылки если в домене верхнего уровня много символов, например как в http://arzamas.academy/materials/994
Аноним 01/11/16 Втр 14:51:00 #108 №867788 
>>867779
вот нормальный регэкс для емэйла:
(?:(?:\r\n)?[ \t])(?:(?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))
"(?:(?:
\r\n)?[ \t]))(?:\.(?:(?:\r\n)?[ \t])(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(
?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[
\t]))"(?:(?:\r\n)?[ \t])))@(?:(?:\r\n)?[ \t])(?:[^()<>@,;:\\".\[\] \000-\0
31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)\
](?:(?:\r\n)?[ \t])
)(?:\.(?:(?:\r\n)?[ \t])(?:[^()<>@,;:\\".\[\] \000-\031]+
(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)
\](?:
(?:\r\n)?[ \t])))|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))"(?:(?:\r\n)
?[ \t])
)\<(?:(?:\r\n)?[ \t])(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\
r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)\](?:(?:\r\n)?[
\t])
)(?:\.(?:(?:\r\n)?[ \t])(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)
?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)
\](?:(?:\r\n)?[ \t]
)))(?:,@(?:(?:\r\n)?[ \t])(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[
\t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)
\](?:(?:\r\n)?[ \t])
)(?:\.(?:(?:\r\n)?[ \t])
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)\](?:(?:\r\n)?[ \t]))))
:(?:(?:\r\n)?[ \t]))?(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+
|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))
"(?:(?:\r
\n)?[ \t]))(?:\.(?:(?:\r\n)?[ \t])(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:
\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t
]))"(?:(?:\r\n)?[ \t])))@(?:(?:\r\n)?[ \t])(?:[^()<>@,;:\\".\[\] \000-\031
]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)\](
?:(?:\r\n)?[ \t])
)(?:\.(?:(?:\r\n)?[ \t])(?:[^()<>@,;:\\".\[\] \000-\031]+(?
:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)
\](?:(?
:\r\n)?[ \t])))\>(?:(?:\r\n)?[ \t]))|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?
:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?
[ \t]))
"(?:(?:\r\n)?[ \t])):(?:(?:\r\n)?[ \t])(?:(?:(?:[^()<>@,;:\\".\[\]
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|
\\.|(?:(?:\r\n)?[ \t]))
"(?:(?:\r\n)?[ \t]))(?:\.(?:(?:\r\n)?[ \t])(?:[^()<>
@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"
(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))"(?:(?:\r\n)?[ \t])))@(?:(?:\r\n)?[ \t]
)
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|\[([^\[\]\r\\]|\\.)\](?:(?:\r\n)?[ \t]))(?:\.(?:(?:\r\n)?[ \t])(?
:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[
\]]))|\[([^\[\]\r\\]|\\.)
\](?:(?:\r\n)?[ \t])))|(?:[^()<>@,;:\\".\[\] \000-
\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(
?:(?:\r\n)?[ \t]))"(?:(?:\r\n)?[ \t]))\<(?:(?:\r\n)?[ \t])(?:@(?:[^()<>@,;
:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([
^\[\]\r\\]|\\.)\](?:(?:\r\n)?[ \t]))(?:\.(?:(?:\r\n)?[ \t])(?:[^()<>@,;:\\"
.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\
]\r\\]|\\.)
\](?:(?:\r\n)?[ \t])))(?:,@(?:(?:\r\n)?[ \t])(?:[^()<>@,;:\\".\
[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\
r\\]|\\.)
\](?:(?:\r\n)?[ \t]))(?:\.(?:(?:\r\n)?[ \t])(?:[^()<>@,;:\\".\[\]
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]
|\\.)\](?:(?:\r\n)?[ \t])))):(?:(?:\r\n)?[ \t]))?(?:[^()<>@,;:\\".\[\] \0
00-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\
.|(?:(?:\r\n)?[ \t]))
"(?:(?:\r\n)?[ \t]))(?:\.(?:(?:\r\n)?[ \t])(?:[^()<>@,
;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?
:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))"(?:(?:\r\n)?[ \t])))@(?:(?:\r\n)?[ \t])
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".
\[\]]))|\[([^\[\]\r\\]|\\.)\](?:(?:\r\n)?[ \t]))(?:\.(?:(?:\r\n)?[ \t])(?:[
^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]
]))|\[([^\[\]\r\\]|\\.)
\](?:(?:\r\n)?[ \t])))\>(?:(?:\r\n)?[ \t]))(?:,\s(
?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))"(?:(?:\r\n)?[ \t]))(?:\.(?:(
?:\r\n)?[ \t])(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[
\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))
"(?:(?:\r\n)?[ \t
])))@(?:(?:\r\n)?[ \t])(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t
])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)
\](?:(?:\r\n)?[ \t]))(?
:\.(?:(?:\r\n)?[ \t])
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|
\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)\](?:(?:\r\n)?[ \t])))|(?:
[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\
]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))
"(?:(?:\r\n)?[ \t]))\<(?:(?:\r\n)
?[ \t])(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["
()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)
\](?:(?:\r\n)?[ \t]))(?:\.(?:(?:\r\n)
?[ \t])
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>
@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)\](?:(?:\r\n)?[ \t])))(?:,@(?:(?:\r\n)?[
\t])
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,
;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)\](?:(?:\r\n)?[ \t]))(?:\.(?:(?:\r\n)?[ \t]
)(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|\[([^\[\]\r\\]|\\.)
\](?:(?:\r\n)?[ \t])))):(?:(?:\r\n)?[ \t]))?
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".
\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))"(?:(?:\r\n)?[ \t]))(?:\.(?:(?:
\r\n)?[ \t])(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\[
"()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))
"(?:(?:\r\n)?[ \t])
))@(?:(?:\r\n)?[ \t])(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])
+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)
\](?:(?:\r\n)?[ \t]))(?:\
.(?:(?:\r\n)?[ \t])
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)\](?:(?:\r\n)?[ \t])))\>(?:(
?:\r\n)?[ \t])
)))?;\s)
Аноним 01/11/16 Втр 14:55:42 #109 №867791 
14780013421380.jpg
>>867788
Аноним 01/11/16 Втр 15:08:45 #110 №867797 
>>867791
RFC же, братиш
Аноним 01/11/16 Втр 16:13:50 #111 №867832 
14780060306350.jpg
В самой первой задачке по html/css надо использовать calc? Это типа проще, чем с флоатом?
Аноним 01/11/16 Втр 17:24:49 #112 №867890 
Аноны, подскажите к чему сначала приступить, JS или PHP? Вкатился вот прям совсем недавно, начинал с html и css. Спасибо.
Аноним 01/11/16 Втр 17:55:31 #113 №867910 
>>867832

Не надо ни calc, ни float. Надо лишь внимательно изучить как работает width и margin при display: block.

>>867890

JS нет смысла изучать если не знаешь HTML/CSS.
Аноним 01/11/16 Втр 17:55:47 #114 №867912 
ОП проверь айфон в кредит http://ideone.com/qe8F1j
Вроде то пальто, но с твоим ответом не сходится
Аноним 01/11/16 Втр 17:55:55 #115 №867914 
>>867890

А так, можешь начать с JS. У нас есть уроки по нему в ОП посте.
Аноним 01/11/16 Втр 17:57:49 #116 №867917 
>>867912

Решение неправильное. Попробуй на бумаге рассчитать кредит для суммы в 4000, а потом сравни с тем, что считает программа.

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

(( $creditBalance * $percent ) + $servicePayment повторяется 2 раза, нехорошо.
Аноним 01/11/16 Втр 21:39:47 #117 №868066 
В природе существуют Java to JS/PHP трансляторы/конверторы? Очень нннада переписать код с жабки на пыхо-жс, а жабки-то я и не знаю.
>GWT, Vaadin, JSweet
Что из этого действительно может сгенерить код в js + node или в js + php из джава-кода, использующего JPA и JSP?
Аноним 01/11/16 Втр 21:57:59 #118 №868081 
>>868066

Проще изучить основы java, она во многом на php похожа.
Аноним 01/11/16 Втр 22:03:34 #119 №868082 
>>867910
>>867914
Спасибо за ответ, анон. HTML/CSS, вроде, норм освоил.
Аноним 01/11/16 Втр 23:45:00 #120 №868128 
>>867914
Ох, начать программировать с JS...
Туда нужно идти с понимаем ООП и базовых структур данных, иначе будет каша в голове, гроб, кладбище.
Аноним 01/11/16 Втр 23:53:51 #121 №868132 
>>868128

Тогда надо изучить сначала пхп, у нас в учебнике есть урок по ООП для начинающих.
Аноним 02/11/16 Срд 01:24:24 #122 №868179 
>>867652
Это мне 5 вариантов кода писать? 1 для идеон, второй чтобы у меня работал в браузере, третий чтобы на гитхабе выложить закоментированный, четвёртый себе сохренить со всеми дампами м echo тестовыми...
Аноним 02/11/16 Срд 02:38:06 #123 №868197 
>>868179

тебе же написали выше про нужный header()
Аноним 02/11/16 Срд 02:45:43 #124 №868199 
>>868197
Чё?
Аноним 02/11/16 Срд 02:51:03 #125 №868200 
>>868197
Ты либо не мне ответил, либо обьясни как Header влияет на отображение пробелов при финальном отображении в браузере? Например хром видит что у меня 10 пробелом и символ и отображает это как один пробел. В результате всё форматирование отваливается.
Аноним 02/11/16 Срд 03:03:44 #126 №868201 
>>867910
> Надо лишь внимательно
Но там написано, что и display нинужен.
Аноним 02/11/16 Срд 03:19:31 #127 №868203 
>>868200

Пост >>867750
Аноним 02/11/16 Срд 03:33:37 #128 №868204 
>>868203
Блин, был же в коде, нет посветовали "Не пихай его куда попало, зачем ты это делаешь. Смысла от него нет."
Аноним 02/11/16 Срд 06:02:27 #129 №868218 
Интересный пост про ручное тестирование: https://m.habrahabr.ru/post/314140/

Автоматизированное тестирование - это по сути примерно то же самое, только выполняемое скриптом.

У нас есть обзорный урок по автоматизированному тестированию: https://gist.github.com/codedokode/a455bde7d0748c0a351a
Аноним 02/11/16 Срд 06:16:25 #130 №868219 
>>868201
А, ну да, оно там по умолчанию. Но всё равно ничего не выходит.
Если через паддинг родительского элемента задавать тот самый отступ в 10px, то он сам, естественно, раздвигается. А это, вроде, недопустимо, если судить по картинке.
Аноним 02/11/16 Срд 06:57:39 #131 №868223 
>>868219

Давай тогда считать 34% и 66% от внутренней ширины контейнера после вычета паддинга.

Проще говоря можно желтому блоку просто поставить width 66%.
Аноним 02/11/16 Срд 14:37:51 #132 №868436 
Проверьте, пожалуйста.
https://github.com/anonymous011010/studentslist
Аноним 02/11/16 Срд 15:01:35 #133 №868459 
Почему пхп лучше перла?
Их вообще можно сравнивать?
Аноним 02/11/16 Срд 15:30:16 #134 №868478 
>>868459
Потому что PHP активно развивается и несоизмеримо популярнее.
Аноним 02/11/16 Срд 15:32:54 #135 №868481 
>>868478
К примеру, книги Донцовой активно развиваются и несоизмеримо популярнее какой-нибудь условной классики. Но они от этого не лучше.
Аноним 02/11/16 Срд 15:57:15 #136 №868495 
>>868481
Я бы не стал проводить подобную аналогию.
Популярность для языка значит, что у языка есть комьюнити, библиотеки, фреймворки и тд.
А еще с ним намного проще найти работу.
Аноним 02/11/16 Срд 15:58:57 #137 №868497 
>>868495
Ладно, ты, пожалуй, прав
Аноним 02/11/16 Срд 22:58:07 #138 №868763 
Хорошо друзья. Хорошо. Теперь я понимаю что такое роутер, как он работает. Я бы даже смог написать свой, возникни вдруг такая необходимость.
Но я все еще не понимаю, НАХУЙ ОН НУЖЕН БЛЯДЬ?!
Аноним 02/11/16 Срд 23:02:55 #139 №868766 
>>868763
Объясни мне, плиз, своими словами.
Аноним 02/11/16 Срд 23:27:35 #140 №868786 
>>868763
У тебя есть многостраничный проект, к примеру блог какой-нибудь или инет магазин. Человек зашел на главную, потом решил кликнуть на список постов/категорий/товаров, соответственно ссылка уже не "/", а к примеру index.php?route=category или "/category" смотря какие у тебя правила формирования линка, когда роутер обработает такую ссылку он передаст управление в контроллер категории, который отработает и вернет тебе представление категории. Зашел человек в товар/пост, "/product" "index.php?route=product&product_id=22" и роутер передал управление в контроллер продукта с гет параметром product_id = 22. Контроллер отработал и вернул представление продукта. Видимо ты ещё не работал с многостраничными приложениями. Советую всё же изучить уроки из ОП-поста, особенно MVC и задачу на студентов. там как раз и роутинг разберешь.
Аноним 02/11/16 Срд 23:49:37 #141 №868803 
>>868763

А как ты без роутера определишь, какой контроллер должен обрабатывать запрос вроде /news/latest или /id12345?
Аноним 03/11/16 Чтв 01:54:13 #142 №868847 
>>868427

> Я не глупый, шарю в опп, но хоть убей не пойму что они от меня хотят.

Написано же, что хотят: "создать 2 базовых класса". Если ты не разбираешься в ООП, то открой учебник из ОП-поста, там есть глава по ООП.

> типа при выводе всех сотрудников определять тип сотрудника и переводить его в нужный объект, который просто пересчитает его зп и закинет все параметры в свойства
У тебя массиво-ориентированное мышление. Такой подход при разработке больших приложений приводит к некачественному трудночитаемому коду с большим числом ошибок.

ООП подразумевает что сотрудник представлен в виде объекта все время, а не только когда тебе надо что-то вывести.

Начни с чтения урока. Если тебе не нравится урок, в ОП посте есть 2 книги, в которых тоже есть подробный раздел про ООП.
Аноним 03/11/16 Чтв 02:33:40 #143 №868851 
sup аноны.
я тот анон, что просил у вас помощи по фильтрам. В общем я уже подошел к концу своего тз и опять прочитав задания понял, что нихуя не понял что от меня хотят собственно вот:

Создать два базовых класса описывающих сотрудника с почасовой оплатой, второй, описывающий сотрудника с месячной ставкой. Вычисление оплаты труда для сотрудников с почасовой оплатой будет иметь следующую формулу: количество часов * сумму за один час. Для сотрудников со ставкой метод расчета возвращает месячную ставку. Реализовать следующую функциональность:

ну собственно дальше функциональность всю запилил, что они хотели.
Я не глупый, шарю в опп, но хоть убей не пойму что они от меня хотят.
как именно описать сотрудника?, типа при выводе всех сотрудников определять тип сотрудника и переводить его в нужный объект, который просто пересчитает его зп и закинет все параметры в свойства. По типу метода фабрики.
В общем кто из более опытных анонов понял в чем дела, прошу объяснить.
Аноним 03/11/16 Чтв 05:07:35 #144 №868876 
Аноны, как парсить битый JSON? Надо получить всего 2 параметра, но никак немогу. По любому поводу мне выдаётся ошибка конвертации обьекта в стринг. Второй день бьюсь.

JSON беру отсюда.
https://en.wikipedia.org/w/api.php?action=query&titles=Main%20Page&prop=revisions&rvprop=content&format=json
Аноним 03/11/16 Чтв 05:40:44 #145 №868883 
>>865852
>как куки (а следовательно и сессии) общие для всех вкладок в браузере
С этого места поподробней.
Аноним 03/11/16 Чтв 05:42:26 #146 №868884 
>>865956
>Проблема с глобальными переменныим в том, что код превратится в нечитаемую лапшу. Трудно будет понять откуда берутся и куда передаются данные.
Для таких кейсов стоит реализовать сервис, в котором можно спрятать логику получения нужного значения.
Аноним 03/11/16 Чтв 05:53:08 #147 №868886 
14781415887430.jpg
>>868876
Он не битый, чем ты его парсишь?
Аноним 03/11/16 Чтв 05:58:04 #148 №868887 
>>868886
$wikiData= json_decode($data, true);
А дальше с переменной работаю как с массивом, но мне выдаёт ошибку.

Алсо пробовал echo myarray[query][pages] Выдаёт array. Что я делаю не так?
Аноним 03/11/16 Чтв 06:06:16 #149 №868889 
>>868851
Какой нахуй метод фабрики. Тебе рузкем по белому написано - "Создать два базовых класса".
Возьми да и создай.
Аноним 03/11/16 Чтв 06:09:53 #150 №868890 
>>868887
>выдаёт ошибку
Какую?
>Выдаёт array. Что я делаю не так?
Так там и есть array же, дурик. Этот... ассоциативный.
Аноним 03/11/16 Чтв 06:14:36 #151 №868893 
>>868887

С JSON никаких проблем нет. Проблемы с плохим знанием языка PHP. Рекомендую для начала хотя бы внимательно прочесть мануал по json_encode.

Код, который ты привел, неправильный. Рекомендую почитать про работу с массивами.

>>868884

Ему там по моему просто переменную во view надо было передать, тут ничего усложнять не требуется.
Аноним 03/11/16 Чтв 06:14:42 #152 №868894 
>>868890
И как в нём получить pageid? Если там стоит 1558034, а php не воспринимает его как индекс массива.
Аноним 03/11/16 Чтв 06:17:50 #153 №868896 
>>868893
Зачем мне encode? Я хочу расшифровать JSON а не заново его зашифровать же.
Аноним 03/11/16 Чтв 06:22:35 #154 №868898 
>>868893
Код который я привёл даже не мой, взял из статьи json_decode.

Пробовал работать как с массивом через foreach, мне выдаёт ошибку что не могу обращаться к обьекту как к массиву.
Аноним 03/11/16 Чтв 06:32:54 #155 №868899 
>>868894
Не 1558034, а 15580374
Аноним 03/11/16 Чтв 06:34:15 #156 №868900 
14781440555770.jpg
>>868890
>Какую?
Аноним 03/11/16 Чтв 06:34:46 #157 №868901 
>>868898
И выучи уже var_dump() и print_r().
Аноним 03/11/16 Чтв 06:36:08 #158 №868902 
>>868901
Я вижу и var_dump() и print_r(). Дальше что?
Аноним 03/11/16 Чтв 06:37:00 #159 №868903 
>>868900
Ну я хз,
$json = file_get_contents('https://en.wikipedia.org/w/api.php?action=query&titles=Main%20Page&prop=revisions&rvprop=content&format=json');
$arr = json_decode($js, true);
print_r($arr);
У меня ошибок нет.
Аноним 03/11/16 Чтв 06:38:28 #160 №868904 
>>868903
Да блин, мне надо ЭЛЕМЕНТ массива вывести, и вот когда я обращаюсь к массиву как к массиву, он ВНЕЗАПНО говорит что массив у меня не массив, а обьект.
Аноним 03/11/16 Чтв 06:47:14 #161 №868908 
>>868904
Тащи сюда свой код смердящий уже.
Аноним 03/11/16 Чтв 06:58:50 #162 №868911 
>>868904

Твой вопрос был про битый JSON. Выяснилось что ничего битого в нем нет, просто ты не хочешь изучать PHP и читать мануал, а хочешь переставлять строчки, в надежде что само заработает. Недальновидный подход.

И не превращайте тред в чат пожалуйста, пишите 1 большое сообщение, а не 10 сообщений по одному предложению.
Аноним 03/11/16 Чтв 07:11:43 #163 №868914 
>>868908
начал оформлять всё на IDEone и всё заработало. Даже не подозреваю что я сделал. Вообще тот же код.
>>868911
Поле Revisions графа * обрати внимание на неё. Некоторые парсеры его отказываются из JSON декодировать. И получается что они декодируют всё до и всё после.
Аноним 03/11/16 Чтв 07:50:06 #164 №868917 
кто-нибудь скажет мне почему людей, изучающих/программирующих на рнр принижают?
Аноним 03/11/16 Чтв 09:43:31 #165 №868945 
>>868917
Потому, что кругом полно ебанатов с комплексами, которые нуждаются в том, чтобы унижать других. Не слушай юродивых, язык хуярит уже лет 15 и будет хуярить дальше как основной для веба. В нем есть почти что полноценное ооп, и всё что есть в современных яп. И вобше , плохих или хороших технологий нет, все зависит от разработчика и его уровня. Гавно можно клепать и на джаве или с и на прочих охуенных языках. Если что тыкай еблом в фесбук, контакт и хуеву тучу сайтов и пусть тебе объеснят почему эти гиганты успешно рвботают на php а не на их пиздатой джаве
Аноним 03/11/16 Чтв 17:08:19 #166 №869152 
14781820992700.png
Аноним 03/11/16 Чтв 18:04:40 #167 №869189 
>>867788
/.+@.+\..+/i
Аноним 03/11/16 Чтв 18:30:55 #168 №869201 
>>869189
Твоя регулярка считает, что имейл @@@@@@.@@ валиден: https://regex101.com/r/0fNSM5/1
Аноним 03/11/16 Чтв 19:07:27 #169 №869215 
>>868917
В пхп низкий порог входа, а потому дофига гавнокода

Сейчас работаю над проектом, что параллельно со мной ведет 42х летний самоучка, уверяющий про свой 3х летний опыт. Думаю молодость он провел веселую, увлекаясь тяжелыми наркотиками, потому что такие шедевры он пишет - это пиздец. Я нахожусь в состоянии близком к восторгу, пытаясь осознать масштабы его безумия, и животной истерики сразу. Ну и в отделе давно подшучивают, что когда он совсем съедет, то ссылки на репозитории с его кодом приобщат к истории болезни.
Аноним 03/11/16 Чтв 19:17:29 #170 №869219 
14781898497020.jpg
Пикрелейтед в треде.

>>867788
>>867779
Для проверки email'ов есть встроенная функция filter_var:filter_var('[email protected]', FILTER_VALIDATE_EMAIL);

Писать регулярки это все равно что в 2016 году самопальные очереди email-рассылок на пхп делать, лол

>>868917
У языка дурная слава за счет того, что большая часть наших собратьев некомпетентные говноеды и разработка на пхп было про говномес с HTML либо MVC. С другой стороны, тебе ничто не мешает не быть говноедом, знать по настоящему ООА/П с принципами SOLID, GRASP и DDD, разрабатывать REST API на каком-нибудь Zend Expressive и когда ты зарабыватаешь > 250k на PHP в месяц как я, тебе уже решительно похуй на то, какое там мнение про твой стек технологий имеет рандомный скам.

На данный момент стек PHP становится нишевым, а роль некомпетентных долбоебов сейчас играет толпа nodejs-дебилов, а адекватные PHP-разработчики на рынке труда внезапно все поразобраны, так что новые адекватные няши расходятся как горячие пирожки

>>867533
Почему ты просто не использовал Doctrine 2?
Аноним 03/11/16 Чтв 19:34:58 #171 №869226 
>>869219
> функция filter_var
Только она не может в кириллические домены.

Ну и раз уж зашёл, расскажи, если не сложно, как докатился до своего состояния, что было наиболее полезным на пути становления тебя как толковго PHP программиста и вообще что можешь посоветовать ботающему молодняку.
Аноним 03/11/16 Чтв 20:09:12 #172 №869248 
14781929527910.jpg
>>869226
>
>Только она не может в кириллические домены.
Тогда надо ебаться с конвертацией доменной части в пуникод, да. Но thx за инфу.

> Ну и раз уж зашёл, расскажи, если не сложно, как докатился до своего состояния, что было наиболее полезным на пути становления тебя как толковго PHP программиста и вообще что можешь посоветовать ботающему молодняку.

Во-первых, как это ни банально, но перестать пытаться реализовывать очередные велосипеды. Все, что так или иначе относится к инфраструктуре проекта, почти всегда уже написано и готово к использованию, то есть не надо страдать хуйней вроде "а чему бы свою ORM не написать эт же будет быстрее". И вообще приучить себя к мысле, что при любых мало-мальских сомнениях или незнании нужно открывать гугл со стековерфлоу, гугл почти никогда хуйни не посоветует.

Во-вторых, серьезно инвестигейтить в ООА/П, в знание принципов SOLID, DDD, GRASP, читать соотвествующие ресурсы и умных ребят вроде Сергея Теплякова. Читать дохуя книг обо всем и вся, о чистом коде, об ооа/п, всякие там дедлайны и прочее – чем больше кругозор, чем больше ты всего знаешь, тем более ценным разработчиком ты являешься. Работать с персонажами "я фронтенд-разработчик но верстать я не умею" очень сложно

В-третьих, поработать в серьезных, желательно богатых на бизнес-логику проектах. Корпоративные ERP, CRM = годно, пилить сайты на симфонипараше или интернет-магазина на магенто = fail

В чертвертых опыт и знание огромного количества инструментов. Больше знаешь = больше пользы. "Чистые бэкендщики" полезны в крупных ИТ-конторах, но большая часть бабла лежит не в ИТ-сфере и там гораздо полезнее фуллстекщики.

Что касается меня, то хз. С 14 лет пишу на пхп, вот 25 и теперь по два-три одновременно работаю, то есть по каждому проекту получается средние деньги, но оба вместе дают мне очень вкусные цифры
Аноним 03/11/16 Чтв 21:54:21 #173 №869361 
сап, аноны. пишу сейчас роутер (так для тренировки) и вот словил проблему на ошибке 404.
.htaccess все запросы перенаправляет на index, после я забираю урл и проверяю его, чуть что выкидываю 404. И вот самой главной целью- это передать заголовки в которых ответ 404, но интерпретатор не пускает- говорит, что заголовки уже переданы, но по сути я еще ничего не выводил в html, только инклудил один файл, в котором класс валидатора. Да без инклуда заголовки передает. без BOM сохранял
Аноним 03/11/16 Чтв 22:12:41 #174 №869375 
14782003617360.png
>>869361
Либо BOM все-таки есть, либо ты сделал какой-нибудь пробел перед <?php
Попробуй в PHPStorm поискать по регулярке: ^(.+)\<\?php
Аноним 03/11/16 Чтв 22:16:37 #175 №869378 
>>869375
<?php
include 'Validator.php';
#print_r($_REQUEST['url_qery']);
if ( Validator::url_query_validate($_REQUEST['url_qery']) === false ) {
header("Location: http://localhost/error404.php");
} else {
echo ($_REQUEST['url_qery']);
}
Аноним 03/11/16 Чтв 22:17:36 #176 №869379 
>>869375
выглядит это так вот. тут я уже делаю редирект, на файл в котором меняю заголовки на 404 , но все так же не работает
Аноним 03/11/16 Чтв 22:21:06 #177 №869381 
>>866034
Сколько времени даётся на эту задачу?
Аноним 03/11/16 Чтв 22:25:16 #178 №869385 
>>869375
Сейчас все сработало, но когда проверяю заголовки, мне все равно выдает ответ 200, хоть я задал 404
Аноним 03/11/16 Чтв 22:26:21 #179 №869386 
>>869385
часа два
Аноним 03/11/16 Чтв 22:27:13 #180 №869387 
>>869381
обосрался
>>869386
Аноним 03/11/16 Чтв 23:04:00 #181 №869407 
Анон, что почитать по хедерам (заголовкам), ответам и прочей хрени? Мне кажется, что я не совсем понимаю, что происходит.
Аноним 03/11/16 Чтв 23:20:12 #182 №869417 
>>869248
>В-третьих, поработать в серьезных, желательно богатых на бизнес-логику проектах. Корпоративные ERP, CRM = годно, пилить сайты на симфонипараше или интернет-магазина на магенто = fail
Не понял, поясни за симфонипарашу. Хочешь сказать на фреймворках писать хуёво, или у тебя претензии только к симфони?
Аноним 03/11/16 Чтв 23:26:10 #183 №869424 
>>869407
в самом мануале есть про заголовки , там еще ссылка на больше инфы, и еще почитай про http протокол
Аноним 04/11/16 Птн 01:27:11 #184 №869480 
>>869407

Тебе надо почитать про протокол HTTP. В Википедии есть кое-какая инфа, также погугли статьи и уроки по теме, также есть недописанный урок от ОПа:

- https://github.com/codedokode/pasta/blob/master/network/http.md
- https://github.com/codedokode/pasta/blob/master/network/urls.md

>>869417

Я тоже не понял чем ему Симфони не нравится.

>>869379

Тебе надо прочитать уроки по HTTP выше. Ты умеешь просматривать заголовки, например в отладчике браузера или сделав запрос курлом вручную?

Посмотри что приходит в ответе.

В твоем коде как минимум 2 ошибки:

- после header Location ты не завершаешь скрипт
- ты не понимаешь как работает редирект. header Location выставляет код ответа 3xx вместо нужного.

То есть ты вместо "страница не найдена" говоришь браузеру "страница переехала по другому адресу".

Вообще, я почему-то часто вижу вот это, что люди вместо отдачи страницы ошибки редиректят на нее. Вы все что ли по видеокурсам учились?

Алсо, название плохое - Validator - надо было написать конкретнее, что это за валидатор. Алсо статические методы это не ООП.

В общем, я тебе советую поставить курл (не расширение к PHP, а утилиту командной строки) и например с помощью curl -v 'http://localhost/test' запрашивать страницу и смотреть заголовки.

Либо можно поставить wget и сделать wget -d 'http://...' -O - (не перепутай пробелы).

Либо какую-нибудь программу для отправки HTTP запросов с GUI.
Аноним 04/11/16 Птн 01:47:37 #185 №869482 
>>869248

Кстати про кириллические домены написано в документации по FILTER_VALIDATE_URL, и не написано в части про email. Вообще, у меня там сложилось ощущение что для них поддержка кириллицы не выглядит очень важной и многие функции ее не поддерживают. Это конечно слабое место пхп.

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

>>869219

Доктрина там по моему к вопросу прямого отношения не имеет. Ты бы мог упомянуть Query Builder.

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

>>869201

Зато она простая для понимания. В конце концов, основная цель валидации ведь отслеживать случайные, а не намеренные ошибки. Вот я например могу сказать что люди часто делают такие ошибки:

[email protected]
ivan.ivanov @example.com

Надо отслеживать именно их. А если пользователь хочет ввести несуществующий или чужой емайл намеренно, он это и с гигантской регуляркой сможет сделать.

>>869189

Вместо точки лучше \S или даже "не пробел и не @"

Аноним 04/11/16 Птн 01:49:40 #186 №869484 
>>869152

Ох, а переносы строк-то поломались. header() забыл волшебный?

>>868914

"некоторые парсеры" ведь json_decode не включают - он звездочку ведь нормально декодирует.

>>868904

Значит у тебя действительно объект потому что ты так и не прочел мануал.
Аноним 04/11/16 Птн 10:22:19 #187 №869577 
>>846554
>>Метаданные о файле наверно стоит хранить в БД, чтобы не дергать файл при каждом просмотре страницы. Особенно если у нас файлы хранятся на отдельном сервере.

Для одного типа файлов будут одни поля, для другого другие. Как это организовать, чтобы не было избыточности?
Аноним 04/11/16 Птн 11:13:17 #188 №869587 
>>869577

Можно было бы заморочиться и сделать что-то EAV но в данном случае проще всего засунуть в ячейку таблицы JSON с информацией.

Разумеется вся работа с информацией о файле не должна быть в виде массиво-ориентированного кода, стоит инкапсулировать все это внутри класса.
Аноним 04/11/16 Птн 11:50:09 #189 №869598 
>>869587
ок, понял

> https://github.com/TheSidSpears/FileHosting/blob/master/public/js/helper.js#L5
> Вместо этого удобнее просто перемещать единственную форму, чем сощздавать каждый раз новую

Что-то у меня трудности с пониманием, как это реализовать
Аноним 04/11/16 Птн 12:24:14 #190 №869604 
>>869482
>Зато она простая для понимания. В конце концов, основная цель валидации ведь отслеживать случайные, а не намеренные ошибки. Вот я например могу сказать что люди часто делают такие ошибки:
>
>[email protected]
>ivan.ivanov @example.com
>
>Надо отслеживать именно их. А если пользователь хочет ввести несуществующий или чужой емайл намеренно, он это и с гигантской регуляркой сможет сделать.
Верно, тем более настоящей валидацией существующего емейла должна быть ссылка активации в письме.
Аноним 04/11/16 Птн 13:06:14 #191 №869625 
>>869598

Ты DOM в яваскрипте изучал? appendChild и insertBefore забирают узел у старого родителя и добавляют новому.

Аноним 04/11/16 Птн 14:53:13 #192 №869671 
14782603932870.jpg
Аноны, объясните в задачке навигатор пикрелейтед. Ведь в константы можно сразу вписать значения массива ниже, и не использовать массив совсем. Или может весь смысл в том, чтобы написать функцию принимающую значения констант, а отдающую значения массива? Или может существует ещё что-то о чем я не знаю, и для чего это нужно?
Аноним 04/11/16 Птн 16:34:50 #193 №869729 
Уютный тредик, открытый в браузере, отъедает память сотнями мегабайт и тормозит? Кажется, я нашел решение. Отключите "Автоматически следить за ...", отключите Топ тредов, и может еще несколько настроек, и вкладка с мейлручем перестает отъедать память. Посмотрим, конечно, еще пару дней, сколько там набежит.
Аноним 04/11/16 Птн 16:50:08 #194 №869735 
14782674090450.png
Аноны, объясните в чем беда. Только начал изучать программирование. Поставил Denwer, решил проверить, как выглядит решенная задачка в браузере, а он мне выдал пикрелейтед. Пробовал поменять в настройках браузера кодировку с Windows-1251 на UTF-8, но это не помогло. Если что , пользуюсь яндекс браузером. На ideone все работает
Аноним 04/11/16 Птн 16:52:36 #195 №869736 
>>869735
Файл там надо сохранять без BOM, что-то такое.
Посмотри в настройках при сохранении файла, такое есть в IDE.
Аноним 04/11/16 Птн 17:09:01 #196 №869737 
>>869735

Нужен header с Content-Type: text/plain; charset=utf-8
Аноним 04/11/16 Птн 17:37:53 #197 №869749 
>>869736
Отключил через File>Remove BOM в PhpStorm не помогло >>869737
Если я тебя правильно понял, я должен прописать в начале кода: $header = 'Content-type: text/html; charset=UTF-8'; ?
Если я правильно все сделал, то это тоже не помогает
Аноним 04/11/16 Птн 18:02:48 #198 №869760 
>>869749
Попробуй тот же файл создать в Блокноте.
У меня такое было при первой установке Шторма.
Аноним 04/11/16 Птн 18:25:41 #199 №869774 
14782731417400.png
14782731417421.png
https://www.codewars.com/kata/duplicate-encoder/train ну и хули ему надо от меня? Тесты в run examples проходит, а те которые в run suit нет.
Аноним 04/11/16 Птн 18:46:03 #200 №869787 
>>869774
> Тесты в run examples проходит, а те которые в run suit нет.
Первый раунд тестов для тебя, ты их изменяешь и тут же в браузере всё тестишь. Там хоть assert 1 == 1 пиши, всё будет зелёненьким.

> ну и хули ему надо от меня?
Неправильно расставлены скобки. Но непонятно для какого слова. У меня тоже такое бывало, что непонятно какие тесты падают. Можно заглянуть в Discourse задачи, если проблема не только у тебя одного, то ты там найдёшь решение. Конкретно в твоём случае всё не так плохо, написано "should ignore case". Попробуй кодировать слова вроде WoRdD, wORDd и посмотри, правильно ли кодирует твоя программа.

Конкретно твоё решение слишком мудрёное, я без регулярок сделал.
Аноним 04/11/16 Птн 18:55:18 #201 №869789 
>>869787
Хм, strtolower помог, хотя там вроде все кейс инсенситив.
Аноним 04/11/16 Птн 20:07:51 #202 №869822 
>>868786
>>868803
У меня в задаче про студентов в шаблонах были прописанны ссылки на контролеры(../registeration.php). Никаких недостатков этого подхода я не заметил, поэтому и спрашиваю. Зачем?
>>868766
Лучше чем здесь я бы не сказал>>868786

Аноним 04/11/16 Птн 20:13:01 #203 №869823 
14782795815050.jpg
Ну доблае утличка, поучим ваши пыхыпы
Аноним 04/11/16 Птн 22:56:36 #204 №869877 
14782893965010.jpg
Как тут код узнал что именно где пишется дата, а где - ивент? Цикл идет, задается в теле цикла значение, что будет первым, а что нет. Понятно. Но где именно обозначение что индекс массива - это дата, а значение - ивент?

Только не гоните ссаными тряпками, я вот не понял действительно. Как работает вообще цикл с массивом?
Аноним 04/11/16 Птн 23:29:25 #205 №869895 
>>869877
В foreach().
foreach($что_перебирает as $индекс=>$значение)
Поскольку массив ассоцитивный, то в роли $индекса дата.

Есть краткая форма foreach($что_перебирает as $значение)
Аноним 05/11/16 Суб 00:27:08 #206 №869918 
>>869877
Когда объявляешь массив задаешь что будет у него ключем, а что значением.
$someShit = array(
'key' = > value,
'key2' => value2;
);
Аноним 05/11/16 Суб 00:27:46 #207 №869919 
>>869822

Так в твоем случае роутером просто служил Апач. Но иногда хочется более красивые и дружественные к поисковикам УРЛ чем news.php?action=view&id=1234

>>869877

foreach ($array as $key => $value)

$key - ключ текущего элемента
$value - значение

> Но где именно обозначение что индекс массива - это дата, а значение - ивент?
Потому что одна переменная стоит слева от стрелки, а другая справа. Слева стоит ключ, справа значение. Мануал в помощь http://php.net/manual/ru/control-structures.foreach.php

Вообще, ты правильно делаешь, что задаешь такие вопросы, по ним становится понятно что стоит поменять или добавить в уроке.
Аноним 05/11/16 Суб 00:31:44 #208 №869922 
>>869749

Нет, надо выдать HTTP заголовок Content-Type с помощью функции header(): http://php.net/manual/ru/function.header.php

Вот почитай немного про HTTP:

https://github.com/codedokode/pasta/blob/master/soft/web-server.md
https://github.com/codedokode/pasta/blob/master/network/http.md

Чтобы браузер понял, в какой кодировке страница, ему надо об этом сказать. Либо с помощью опции в заголовке Content-Type либо с помощью HTML-тега meta charset.
Аноним 05/11/16 Суб 06:14:48 #209 №870030 
>>869760
Спасибо, это помогло. А в чем проблема со Штормом была не знаешь?
>>869922
Спасибо
Аноним 05/11/16 Суб 07:06:55 #210 №870039 
итт мне помогут абстракцию построить на жаве?
Аноним 05/11/16 Суб 12:44:15 #211 №870189 
>>870030
Да вот почему-то Шторм изначально делает какие-то кривые файлы.
Я сам возился три часа и орал в треде, пока анон не надоумил поменять файл с BOM на без него.
И с HTML простым там тоже может быть проблема, имей это в виду.
Но при этом у меня сейчас выходят нормальные файлы .php, уже и не вспомню, что именно сделал для этого. Может, по умолчанию поставил без BOM и в UTF-8, даже скорее всего.
Аноним 05/11/16 Суб 15:13:01 #212 №870242 
Сап, у меня тут маленький бугурт возник. Отправил свой код с тестовым. Там проверяющий сделал несколько мелких справедливых правок. Но что меня удивило, что он все мои двойные кавычки сменил на одинарные и записал это как мой недостаток, мол одинарные кавычки это тру, а двойные кавычки - это плохой тон в программировании. Это вообще нормально? Просто я вообще никогда не слышал что между ними есть хоть какая-то разница. Also в двойных кавычках есть профит в том, что внутри них моно писать одинарные, что даёт профиты в скорости написания кода. Есть тут кто сможет мне объяснить?
Аноним 05/11/16 Суб 15:14:08 #213 №870243 
>>870242
>двойные кавычки - это плохой тон в программировани
Если он так и сказал то он сказочный долбоеб.
Аноним 05/11/16 Суб 15:19:49 #214 №870246 
>>870243
Я PSR-2 сейчас листаю, там вроде ничего такого нет, именно про кавычки, или поправьте меня пожалуйста если я неправ. Что-то прямо смущает меня этот коментарий. Всё-таки я ньюфаг с опытом в 2 месяца, могу ошибаться.
Аноним 05/11/16 Суб 15:27:20 #215 №870252 
14783488407260.jpg
>>870246
>>870242
Это должно быть в шапке.
Аноним 05/11/16 Суб 15:42:05 #216 №870260 
>>870039

Если это вопрос в общем по ООП, а не по особенностям его реализации в Яве.

>>870242

Если в PSR ничего про кавычки не написано, то это лишь его личные предпочтения.
Аноним 05/11/16 Суб 15:49:23 #217 №870263 
>>870260
>Если это вопрос в общем по ООП, а не по особенностям его реализации в Яве.
https://bitbucket.org/user723142/video_organizer/src/a4d6c6847e5b3b556ea73d206cab54676f396064/src/main/java/hello/Reindexator.java?at=master&fileviewer=file-view-default

есть программа которая берёт файлы из диска и из бд.
те файлы которые есть в бд но нет на диске она удаляет из бд.
те файлы которые есть на диске но нет в бд она добавляет в бд.

мне нужно сделать не так топорно как сейчас, а в виде абстракций.

в частности, мне нужно сделать ПРАВИЛА для добавения.

то есть допустим я захочу добавлять файлы размер которых больше 10МБ

чтобы не писать всякие ИФ или условия, а чтобы создал indexatorSizeRule, установил там всё, и чтобы индексатор видел это правило.

то есть, мне нужно какая-то абстрактная конструкция. понимаешь? вот эта вся ооп магия.

как это сделать?
Аноним 05/11/16 Суб 16:06:27 #218 №870276 
>>870263

Обоснуй причину, почему ты хочешь сделать правила в виде объектов? Ты пишешь универсальную библиотеку синхронизации файлов, которую будут расширять другие люди? Тебе надо строить сложные конструкции из правил?

Даже в этом случае на мой взгляд предпочтительнее сделать объект-компаратор, получающий информацию о 2 файлах и принимающий решение, что с ними делать.

Не надо слепо стараться все вынести в отдельные объекты. Надо применять инженерный подход, то есть ответить на вопрос: в чем преимущества подхода A перед B? Чем отдельный класс-компаратор лучше просто заложенного в коде if или приватного метода? Я например думаю, что приватный метод сделать проще и это его преимущество.

Также, мне не очень нравится интерфейс твоего объекта, вот эти вот методы setFilesFromDb, setFilesFromFilesystem. Ты по моему имитируешь тут передачу аргументов функции через сеттеры. Не проще просто написать

reindex(filesFromDb, filesFromFilesystem) ?

В твоем коде например можно вызвать run() , не задав файлы, а в моем примере - нельзя. В твоем коде надо сначала разбираться, какие методы в каком порядке вызывать.

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

В общем, я тебе советую сделать сравнение через компаратор либо в виде приватного метода либо в виде интерфейса, если нужна расширяемость и возможность задавать произвольные правила.
Аноним 05/11/16 Суб 16:16:56 #219 №870287 
>>865582

Да, можно. Но если форма имеет тип method="GET" то они будут переписаны данными формы, если POST то ок.

>>864755

Чтобы сделать обновление части страницы через аякс, советую сделать так. На клиенте при клике по ссылке делать запрос с добавлением параметра, например /some/page?noHeader=1

В приложении дописать костыль, который будет убирать header/footer при наличии параметра. В Юи есть такая штука как layout, она отвечает за вывод шапки/подвала. Надо в ней разобраться и доработать чтобы она могла ее не выводить.

>>865009

Стоит как минимум прочесть комментарии к задаче про студентов. МОжно делать блог вместо задачи про студентов, но следуя всем описанным там рекомендациям, иначе ты навелосипедишь не самый качественный код. И конечно советую показывать на проверку.

>>865014

Суть решения примерно одинаковая, просто в первом варианте используется готовая функция.

>>865015

Фулстек конечно.
Аноним 05/11/16 Суб 16:18:53 #220 №870291 
>>870276
>Обоснуй причину, почему ты хочешь сделать правила в виде объектов?
я хуёвый погромист и хочу дома попердолить что-нибудь посложнее тупых методов

>объект-компаратор
не понимаю что он должен из себя представлять.
отдельный класс, и там куча методов?

>Если у тебя десятки миллионов или больше файлов
нет, количество файлов небольшое, не нужно это учитывать
Аноним 05/11/16 Суб 16:22:37 #221 №870295 
>>870287
>Фулстек конечно.
Странно, я вот недавно начал работать фуллстек девом, и я ощущаю себя эдаким jack of all trades, master of none. Я думал нужно стремиться к чему-то одному, а фуллстек оставлять тем, кто только начинает свой путь разработки и еще не является профессионалом в какой-то конкретной области.
Аноним 05/11/16 Суб 16:24:37 #222 №870297 
>>870295
я мимо, если что
настоящие фулстек девелоперы - это гении кодинка.

в остальном это просто макаки, которые занимаются всем и сразу и нихуя толком не умеют.

так что смотри по себе. если слишком сложно для тебя - выбери направление уже.
Аноним 05/11/16 Суб 18:25:31 #223 №870388 
>>870291

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

Если у тебя нет веских аргументов, то проверку условий можно сделать обычным ифом.

Если ты хочешь попрактиковаться в паттернах, выбери задачу, где их использование будет уместно. Например, напиши свой ORM.

Алсо, почитай эту статью: https://habrahabr.ru/post/153225/

> не понимаю что он должен из себя представлять.
> отдельный класс, и там куча методов?
Насколько я понимаю, твой класс проходит по списку файлов на диске и в базе, сопоставляет их и для каждого принимает решение, что с ним делать: добваить в базу, обновить существующую запись, удалить. Если бы ты хотел сделать универсальный класс, ты бы мог абстрагировать правила сравнения с помощью класса-компаратора.

Ты вещь Яву знаешь, должен знать что при сортировке можно использовать компаратор в виде класса либо лямбды: http://stackoverflow.com/questions/14154127/collections-sortlistt-comparator-super-t-method-example/14154185#14154185

я предлагал что-то похожее, но сейчас вижу что тебе это не нужно. Просто впиши нужные условия прямо в класс.
Аноним 05/11/16 Суб 18:28:01 #224 №870390 
>>870291

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

Декомпозиция (разделение логики на классы) используется либо когда кода становится много и он становится сложным, либо когда код выносится в библиотеку, функциональность которой будут модифицировать другие люди.
Аноним 05/11/16 Суб 18:37:35 #225 №870399 
>>870388
>Если у тебя нет веских аргументов
мой веский аргумент - я хочу практиковаться в этих паттернах и абстракциях, но я не вижу смысла городить какой-то ёба-проект в стол ради этого.

этой программой я пользуюсь, почему бы здесь не сделать это.
Аноним 05/11/16 Суб 18:39:15 #226 №870402 
>>870388
>Насколько я понимаю, твой класс проходит по списку файлов на диске и в базе, сопоставляет их и для каждого принимает решение, что с ним делать: добваить в базу, обновить существующую запись, удалить
нет, сначала есть 2 списка - файлы в бд и файлы на диске

затем вызываются методы по очереди
setFilesToInsert(filesFromFilesystem, filesFromDbMap);
setFilesToDelete(filesFromDb, filesFromFsMap);

я так и не понял куда тут должен встать компаратор.

как сделать это красиво и абстрактно?
плес не надо больше про ТЕБЕ НЕ НУЖНА СЛОЖНОСТЬ. нужна, в этом и смысл
Аноним 05/11/16 Суб 18:44:40 #227 №870405 
>>870399

Зачем практиковаться в написании переусложненного кода? Я тебе уже написал, если ты хочешь изучать паттерны, открой любой сложный фреймворк или ORM (Spring, Hibernate, код аднроида) и изучай. Это даст тебе намного больше пользы чем прикручивание паттернов туда, где они не нужны.

>>870402

У тебя какой-то странный алгоритм. Я бы сделал так:

- для каждого файла с диска filefromDisk {
- находим fileInDb = соответстующий ему файл в БД или null
- сравниваем fileInDb и FileFromDisk и решаем, что с ним делать
- помещаем fileFromDIsk в нужный список (на вставку, обновление итд)
}

Я могу только рассказать, как сделать код лучше. Рассказать, как его переусложнить, я не могу.
Аноним 05/11/16 Суб 18:47:11 #228 №870408 
>>870405
>если ты хочешь изучать паттерны, открой любой сложный фреймворк или ORM
я не понимаю сложные абстракции когда читаю их

я полтора года работаю в жава-интерпрайсе на сложном фраемворке и нихуя не понимаю в нём вообще
Аноним 05/11/16 Суб 18:53:55 #229 №870413 
>>870408

Можешь задать вопрос в этом треде, главное правильно его сформулируй и дай ссылки на примеры кода. Может, я смогу разобраться. Ну или ссылку мануал дам.
Аноним 05/11/16 Суб 18:55:56 #230 №870415 
>>870413
это бот написал?
Аноним 05/11/16 Суб 19:34:54 #231 №870456 
>>870415

ОП

>>865019

Надо изучить сам гит прежде чем изучать работу с ним в phpstorm, я думаю, мысль была такая.

>>865020

Вообще, это может только повредить так как перемножение - точная операция (если мы остаемся пределах диапазона int), а взятие логарифма - операция с потерей точности.

>>865339

Спасибо за полезный отзыв. Пусть другие аноны прочитают и увидят, что наш тред дает реальные результаты.

Главное, продолжай учиться дальше.

>>865344

У них своеобразное понимание MVC. В той же Симфони папки Model нет так как к модели там относится почти все, кроме вью и контроллеров.

>>865364

Наверно pug-cli его как-то вызывает или использует?

>>865424

Ты уверен, что не работает? Сдампь содержимое массива до и после array_push и покажи, что после добавления массив остается точно таким же. Я думаю, причина в чем-то другом.

>>865574

>> а почему это делается не через класс авторизации?
> А зачем?
Чтобы не копипастить код, когда тебе понадобится получить залогиненного пользователя в другом месте. И чтобы разделить код на отдельные части, а не писать все длинной портянкой. Обычно каждый класс занимается своим делом, соответственно получение текущего пользвоателя логично поручить классу авторизации.

>>865574

> Лучше всё вручную передавать?
Я думаю, лучше делать проверку или список полей где-то в контроллере. Чтобы сразу было видно, что значения 100% проверяются.

В случае, если бы ты использовал фреймворк, там есть объект формы и он гарантирует что из POST берутся только заданные в форме поля.

>>865628

>Все url'ы рабочие
Это они сейчас рабочие, а если ты завтра добавишь УРЛ вроде /student/123/profile то перестанут работать. Лучше бы использовать УРЛ от корня сайта, вроде '/register' вместо относительных 'register'.

> Звучит прикольно, но как это реализовать? Погуглил, суть ясна, но сложно представляю с чего начать.

=== для объектов проверяет, это один и тот же объект или разные.

Некоторые ORM, например, Doctrine, умеют автоматически искать и сохранять в базу изменения в ранее загруженных объектах. Эти же ORM гарантируют что одной записи в БД всегда соответствует один и тот же объект - если 2 раза запросить из базы одного и того же пользоватля, то во второй раз обращения к БД не будет, а будет возвращен ранее загруженный объект. Если бы это правило не соблюдалось, и записи могли бы соответствовать 2 разных объекта, то было бы непонятно, в каком из них актуальные данные.
Аноним 05/11/16 Суб 19:41:50 #232 №870459 
>>865628

> Звучит прикольно, но как это реализовать?
Это паттерн Identity Map. Тебе придется сделать класс, хранящий ранее загруженные сущности и настроить его взаимодействие с Data Mapper. Не уверен, что стоит с этим заморачиваться в простом приложении, проще взять доктрину, которая уже умеет это делать.

В доктрине Identity Map - это массив внутри класса UnitOfWork: https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/UnitOfWork.php#L100

Аноним 05/11/16 Суб 22:11:49 #233 №870547 
Вкатываюсь в тред, чтобы отписаться о своей стори. Гуманитарий, 25-лвл. В начале года усиленно занимался по учебнику ОПа, старательно проходя все задания (был уровень нуль нулём). Почти доделал студентов, активно писал в тредах и буквально жил тут у вас.

Потом как-то забил на довольно-таки долгое время(проблемы ИРЛ), не трогал пограминг до начала сентября почти. Вот пару месяцев назад вновь вспомнил и попытался восстановить в памяти всё. Довольно трудно было, но всё же мне это удалось. Начал искать работку, на удивление, ОПовский учебник мне охуенно помог(рили, прям всё-всё оттуда) и уже через пару собеседований мне перезвонили из одной конторы и вот уже полтора месяца я джуниор php-программист с окладом в 40 деревянных для ДС мало, но всё же.

На работе пишем на php(правда без ООП почти) + js(jquery) + css/html ну и на битриксе, как я понял, он оче у нас в рф популярен

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

так что, корзинки, не теряйте надежд, забейте на возраст и вышку, и желательно не брать перерывов, а сразу идти искать работу, даже до студентов
Аноним 05/11/16 Суб 22:14:03 #234 №870550 
>>870547
>а сразу идти искать работу, даже до студентов
всё хуйня, работаю больше 2х лет, зп 30к

тот кто не может в кодинг не сможет норм зарабатывать даже после всех учебников
Аноним 05/11/16 Суб 22:58:07 #235 №870565 
>>870550
>работаю больше 2х лет, зп 30к
Какой город, чем конкретно занимаетесь на работе? Почему не растёшь?
Аноним 05/11/16 Суб 23:06:19 #236 №870567 
>>870565
тольятти, багофикс и написание фичей для огромного интерпрайс фраемворка

>Почему не растёшь?
>>870408
Аноним 05/11/16 Суб 23:24:00 #237 №870583 
>>870547
Я в 21 лвл на последнем укурсе пошёл работать, брали везде, толком нихуя не знал.
Отработал в 3ёх конторах по неделе, не выдерживал из-за социофобии. Сейчас уже почти год сижу дома, хуй знает что делать.
Реален хоть какой-т офриланс для программиста? Куда деваться? Батя предлагает лечь в больничку навсегда
Аноним 05/11/16 Суб 23:28:16 #238 №870587 
>>870583
ты блять еблан какой-то

какая социофобия если ты в вузе был.
иди к психотерапевту, ложись в больницу. даун пиздец я ебал
Аноним 05/11/16 Суб 23:31:29 #239 №870590 
>>870587
Социофобия начала развиваться на 3-4 курсе, тогда я ещё мог себя хоть как-то контролировать и терпеть. Потом уже контроль был утрачен практически полностью.
Побороть я не смог. Работать в обществе не могу. В больничку тоже не хочу.
Аноним 05/11/16 Суб 23:33:22 #240 №870592 
>>870590
>не хочу
а кто диагноз поставил?
Аноним 05/11/16 Суб 23:56:26 #241 №870601 
>>870592
Первый раз психиатр в военкомате, второй раз в районной больнице. Диагноз там из 3ёх вещей состоит - социофобия, на её фоне какая-то там депрессия развилась плюс ещё подозрение на какое-то там расстройство. Я это точно не помню.
Ну и само собой. когда у тебя едет крыша, то как-то сложно это не заметить. Даже некоторые шизофреники понимают. что они больные.
Аноним 05/11/16 Суб 23:57:00 #242 №870603 
>>870408
>жава-интерпрайс
>сложный фреймворк
Охуеть теперь. Ты в AbstractEntityDao не въехал или в AbstractCrudService?
Аноним 06/11/16 Вск 01:39:32 #243 №870641 
>>870601
как можно не хотеть вылечится то?
вот болит у тебя зуб - ты же не сидишь дома подыхая - ты идёшь и лечишь.

а тут год сидеть дома? нахуя? родители твои куда смотрят? ты же жизнь проёбываешь свою. год без работы - тебя уже и не примут работать никуда, ты же всё забыл с вуза
Аноним 06/11/16 Вск 01:39:36 #244 №870642 
Друзья, помогите. Срочно по работе приспичило написать веб-сервис, пхп изучаю параллельно.
Встала проблема. Есть одна страница, на ней таблица, где есть поле "количество" и кнопки - и +. Пользователь по ним жмакает, кол-во меняется. Сделал на jquery, все отлично. Теперь мне надо на этой странице жмакнуть на кнопку "сгенерачить" и открыть таким образом другую страницу, где я выведу то, что там наотмечал пользователь. Как собрать инфу со страницы и собрать в массив, я понял. Как передать массив? json или не json? Или как-то по-другому? Еще не догоняю немного про get и post. Я хочу в итоге получать короткую ссылку вида site.ru/ier234kj или site.ru/dks0992ww в зависимости от того, что там в массиве, чтобы сгенераченной страницей можно было поделиться с товарищем, а не заставлять его тыкать те же плюсики-минусики. Это значит, мне нужно передавать через get? Там вроде ограничение на кол-во данных, а у меня большой массив.
Аноним 06/11/16 Вск 02:02:26 #245 №870658 
>>870642

Надо сделать обычную форму и отправлять данные методом POST, после успешной обработки которых можно редиректить на короткую ссылку. Читай урок про формы https://github.com/codedokode/pasta/blob/master/forms.md

>>870641

Это уже совсем оффтопик, но по моему ты переоцениваешь возможности медицины. Мозги вправлять пока не научились, в лучшем случае колют какие-нибудь вещества, повышающие активность или наоборот отупляющие человека

>>870583

Реален, почему нет.

>>870547

Не останавливайся в развитии, изучай ООП, фреймворки. Иначе тебя отправят на свалку как только Битрикс потеряет популярность.
Аноним 06/11/16 Вск 02:06:36 #246 №870659 
>>870658
>Мозги вправлять пока не научились
манямир
Аноним 06/11/16 Вск 02:20:09 #247 №870665 
>>870658
>Реален, почему нет.
На чём сделать упор? Какие самые распространённые днищезадания на фрилансе?

Аноним 06/11/16 Вск 02:25:04 #248 №870667 
>>870665

Зайди на фриланс-сайты и проанализируй. Но лучше поискать на сайтах поиска работу, на которой можно работать удаленно. на фрилансе ты будешь половину времени тратить на поиск и переговоры с заказчиками, и это время никто не оплатит.
Аноним 06/11/16 Вск 02:30:01 #249 №870669 
>>870567
я думал ты спрашиваешь чтобы помочь чем-то((((
Аноним 06/11/16 Вск 12:09:22 #250 №870758 
14784233622050.jpg
> пикча
> $VAR_DUMP
Ору
Аноним 06/11/16 Вск 13:49:02 #251 №870799 
Не могу сделать задачу со школьником и айфоном. Не могу понять последовательность, куда проверку сувать и что с чем проверять.
Аноним 06/11/16 Вск 13:55:30 #252 №870803 
>>853691
>5) Напиши на php простой echo-сервер, который слушает порт, принимает соединение и отсылает каждую принятую строчку обратно.
Как-то так http://ideone.com/UgSyOM

>6) Напиши простой HTTP-клиент на php, скачивающий файл по указанной ссылке
Не уверен, что я правильно понял задание http://ideone.com/rkE6MM
Аноним 06/11/16 Вск 15:29:28 #253 №870858 
Я тут начал делать студентов. В принципе все понятно, только не знаю как реализовать архитектуру по людски. А именно, как правильно распределять контроллеры? Вот тут короче решил проблема максимально просто, но как по мне тупо. Есть .htacces который перенаправляет все на индекс.пхп в корне сайта. В нем этот код http://ideone.com/dSXrX3 т.е. если есть кука включается главный контроллер(в нем список студентов), если нет - идет форма регистрации и кука устнавливается. Так же не следует делать, да?
Аноним 06/11/16 Вск 15:38:07 #254 №870861 
>>870803
и http Сервер в догонку
http://ideone.com/laepMn
sageАноним 06/11/16 Вск 16:08:43 #255 №870870 
>>870861
Странные ты штуки пишешь на пхп. Для таких вот вещей существует хотя бы го.
Аноним 06/11/16 Вск 16:10:33 #256 №870875 
>>870799
Ссылку на идеоне, где пробовал, давай.
Аноним 06/11/16 Вск 16:16:41 #257 №870882 
>>870870
Для каких? Я же не собираюсь этот хттп сервер использовать где-то, просто в целях ознакомления написал. А вообще хотелось бы какой-нибудь десктопный язык знать несложный, чтобы можно было какие-нибудь штуки полезные для ОС писать, я вот подумываю о Питоне.
Аноним 06/11/16 Вск 16:31:14 #258 №870893 
http://ideone.com/9rWhLN

что скажите про этот код в контексте уместности? Вообще не понимаю как мне преодолеть пропасть от "я выучил ООП-примитивы и понятия" до "я уверенно пишу на ООП и знаю что где к месту"?
sageАноним 06/11/16 Вск 16:31:27 #259 №870894 
>>870882
>Я же не собираюсь этот хттп сервер использовать где-то, просто в целях ознакомления написал.
Ну так можно же было знакомиться сразу с тем, с чем удобнее работать.
>я вот подумываю о Питоне
Скриптопараша.
Аноним 06/11/16 Вск 16:34:39 #260 №870896 
>>870870
Гуглоподелка же, загнётся лет через 5, как вообще всё что гугл делал.
Аноним 06/11/16 Вск 16:35:00 #261 №870897 
>>870894
>Ну так можно же было знакомиться сразу с тем, с чем удобнее работать.
Ну так мне и удобнее на пхп работать.
>Скриптопараша.
Поясни. И что не скриптопараша? inb4: GO
Аноним 06/11/16 Вск 16:44:46 #262 №870903 
>>870896
Ты прав. Давай всё писать на яве.
мимоявист
Аноним 06/11/16 Вск 17:24:55 #263 №870925 
Аноны, как вы определяете семейство шрифтов?

Вот есть семейство шрифт Open Sans, который я скачал с Google Fonts, и в архиве находятся шрифты OpenSans-Regular\Bold\Italic\etc. Как определить через @font-face __всё__ семейство?

@font-face {
font-family: "Open Sans";
src: url(Open_Sans/OpenSans-Regular.ttf) format("ttf");
font-weight: normal;
font-style: normal;
}

А дальше что? Каждый шрифт нужно так прописать?
Аноним 06/11/16 Вск 18:28:55 #264 №870972 
>>870875
Вот, внимательно прочитал обьяснение под спойлером.
http://ideone.com/sx9xHt
Slack канал 06/11/16 Вск 18:45:00 #265 №870991 
Сделал Slack канал дабы тут не разводился срачи , призываю всех анонов , скидывайте свои фейк мыльцо суда [email protected] дам инвайт
Аноним 06/11/16 Вск 18:49:35 #266 №870992 
>>870991
уже есть конфа нахуя плодить
вообещ бесит, раньше все в треде сидели, тепер ьвсе по конфам и другим разделам разбежались
Аноним 06/11/16 Вск 18:54:06 #267 №870993 
>>870992
ок дай ссылку пожалуйста )
Аноним 06/11/16 Вск 18:57:01 #268 №870996 
>>870993
там мертво всё равно, ссылка в жс треде в оппосте
общая конференция /пр с разделами
Аноним 06/11/16 Вск 19:08:05 #269 №871005 
>>870992
>уже есть конфа нахуя плодить
А этим дебилам лишь бы конфу создать. Я такое не только здесь наблюдаю.
Аноним 06/11/16 Вск 19:12:48 #270 №871011 
>>871005
>>870992
всё просто, дети мои
все эти конфы - неудобная моча
и каждый пилит там где ему удобнее

предлагаю здешним долбоёбам запилить свою эталонную конфу для всего двача

есть_14_стандартов.пнг
Аноним 06/11/16 Вск 19:40:11 #271 №871028 
http://ideone.com/UbxHCW

Как улучшить код?
Аноним 06/11/16 Вск 21:18:09 #272 №871107 
>>871028
Удалить хеллоуворлд и написать что-нибудь полезное.
Аноним 06/11/16 Вск 22:10:42 #273 №871145 
Кажется, до меня доходит, почему в npm так много пакетов.
preg_quote в JS нет (!), свопнуть ключи и значения ассоциативного массива нельзя (array_flip в PHP), нельзя заменить в строке символы, используя карту (strtr в PHP). Нельзя из коробки, нужно велосипедить/копипастить/тыкать npm install.
Или у меня PHP головного мозга?
Аноним 06/11/16 Вск 22:48:35 #274 №871158 
>>871145
>Кажется, до меня доходит, почему в npm так много пакетов.
Только потому что там пакеты создают ради функций уровня isObject и isNull.
Назырбек Абрамович 06/11/16 Вск 23:23:44 #275 №871181 
Сап, двачеры.
Кто из вас шарит в CodeIgniter?
Нужны маны, для средняка (обучил тока модели, лэйаут и работа с mariadb).
Аноним 06/11/16 Вск 23:41:40 #276 №871206 
>>870858
Рассудите меня позязь
Аноним 06/11/16 Вск 23:44:05 #277 №871212 
>>870858
ах ты ебанный шакал
Аноним 07/11/16 Пнд 01:23:13 #278 №871281 
>>870903
У меня для тебя плохие новости. Ява умерла 2 года назад. Её главная фича была в кросплатвформенности, а она как раз и отвалилась в 2014. А если нет кросплатформенностиЮ то и ява ненужна.
Аноним 07/11/16 Пнд 01:26:34 #279 №871284 
14784711948580.jpg
>>871281
блять чо несёт...
Аноним 07/11/16 Пнд 01:38:50 #280 №871287 
>>871284
Какой ты соня, тебя даже вчерашний шторм не разбудил. Всех подзадолбало что Оракл подаёт в суд на всё что движется и уже два года как все отказываются от Java. Эпл так вообще по дефолту 1.6 поддерживает. Такие дела.
Аноним 07/11/16 Пнд 01:40:36 #281 №871290 
>>871287
>уже два года как все отказываются от Java
ммм, ну если тебе в интернете так сказали...
Аноним 07/11/16 Пнд 01:44:16 #282 №871296 
>>871290
Оракл даже в гугл на андроид подали, что там всё на джаве.

Мимо
Аноним 07/11/16 Пнд 01:46:01 #283 №871300 
>>871296
эх, щас бы от пхп-обезьян услышать о том что жава умирает...
Аноним 07/11/16 Пнд 01:46:56 #284 №871303 
>>871290
2010 год
https://habrahabr.ru/post/106963/
Напомню что с тех пор у них ObjectiveC а теперь и Swift
https://tproger.ru/news/oracle-seeks-93-billion-for-googles-use-of-java-in-android/
Тут вообще пушка, 9 миллиардов на ровном месте хотят отсудить.
Аноним 07/11/16 Пнд 01:52:52 #285 №871307 
>>871300
Ты бы ещё сказал что Delphi не помирает, лол. Очнись, большинство разрабов на жабе были только плагодаря андройду. Который судя по всему перекатится на какой-нибудь Go.
Аноним 07/11/16 Пнд 01:56:04 #286 №871312 
14784729649290.png
>>871307
>2010
>Это последний гвоздь в гроб Java

>2016
>пикрилатед

эх, щас бы пхп-обезьянам объяснить что они обосрались
Аноним 07/11/16 Пнд 02:07:33 #287 №871315 
>>871312
Мы ведём дискуссию в разных плоскостях, а ты даже этого не понимаешь. Не вижу больше смысла продолжать с тобой разговор.
Аноним 07/11/16 Пнд 02:22:53 #288 №871319 
>>871315
Ох уж эти любители хоронить яву. Сливаются одними и теми же фразами уже десять лет.
Аноним 07/11/16 Пнд 02:27:01 #289 №871320 
>>871312
А чё за скрин, откуда?
Аноним 07/11/16 Пнд 02:29:47 #290 №871321 
>>869226
>Только она не может в кириллические домены.
А где-то в природе существуют киррилические мэйлы?
Аноним 07/11/16 Пнд 02:41:02 #291 №871324 
>>871321
К сожалению да. Правда у них у всех есть не очень осмысленная версия латиницей.
Аноним 07/11/16 Пнд 02:41:04 #292 №871325 
http://githut.info/
Просто оставлю это здесь.
Аноним 07/11/16 Пнд 02:44:56 #293 №871326 
>>871319
да все знают с явы так быстро не соскочить , даже если гугл откажется от ведра , ява будет в интерпрайзе , суть в том что , среднему и малому бизнесу ява не нужна ибо жрёт рам как не в себя
Аноним 07/11/16 Пнд 02:48:48 #294 №871329 
>>871326
да все знают с делфи так быстро не соскочить , даже если Борланд откажется от Delphi7, Delphi будет в интерпрайзе , суть в том что , среднему и малому бизнесу Delphi не нужна ибо жрёт рам как не в себя
ой, сейчас вроде ведь не 2007 год.
Аноним 07/11/16 Пнд 03:03:23 #295 №871333 
>>871325
В общем-то ничего удивительного. У JS нет альтернативе в веб фронтенде, да и кодеров на нем благодаря простоте побольше. А ява как жрала свой энтерпрайс, так и жрет.

>>871329
>ой, сейчас вроде ведь не 2007 год.
Ну как, вы же и в 2007 яву хоронили. А уже без пяти минут 2017. Подумай на досуге, почему ява успешна и какие у неё альтернативы.
Аноним 07/11/16 Пнд 03:21:22 #296 №871334 
>>871333
Ну так и в 2007 про делфи все говорили что непомрёт.
>почему ява успешна
Кросплатформенность во все поля. И маниакальные желания джава разрабов переписать всё на Java.
>какие у неё альтернативы.
С\ С++ сейчас они даже двигают в сторону веба.
>вы же и в 2007 яву хоронили.
Тогда это был язык для аплетов под банк клиенты. Алсо это были последние годы Sun, до того как их купили оракловцы. И все предрекали смерть именно поэтому.
Аноним 07/11/16 Пнд 03:48:36 #297 №871338 
Начал сейчас читать про анонимные функции и постоянно слышу какие-то восхищения о том что "Наконец-то они появились в PHP, так долго ждали, так долго хотели и вот, новые возможности!!!". И как-то я вообще не понимаю в чём профит то? Ну вот была у нас классическая функция, теперь у нас тоже самое, только с немного другим вызовом. А посему вопрос. Хоть кто-ниюудь на практике сталкивался именно с использованием анонимной функции? Не для того чтобы её использовать, а чтобы что-то сделать, без чего не обойтись.
Аноним 07/11/16 Пнд 04:10:44 #298 №871342 
>>870870

Оп сейчас пишет небольшую утилиту на Го и там много неудачных решений. Отовсюду лезут сишные корни, указатели, нет классов, нет коллекций, нет даже функции вроде in_array, и попробуй найти, как в Го сделать exec (подсказываю: правильный ответ сильно зависит от версии Го, в той что в дебиане, придется вручную побайтово упаковывать параметры для сисколла execve) или fork (fork в Го делать нельзя).

Также там есть дебильное правило, что видимость поля струткуры определяется регистром буквы. Выглядит ужасно и очень неудобно когда эту видимость надо менять.

Они не используют libc если я не путаю, и из-за этого многие полезные функции недоступны, надо вручную вызвать сисколлы. Кстати, часть библиотеки, отвечающая за них, постоянно меняется.

Нет генериков. Хочешь автоматически разбирать параметры конфига и командной строки разных типов - обращайся к рефлекшену с runtime panic.

Вообще, после ООП в PHP тяжело воспринимать код на Го - всюду глобальные переменные и глобальное состояние. Ну например встроенная библиотека flag для разбора аргументов командной строки ориентирована на ручной кодинг и автоматизировать ее (например чтобы аргументы командной строки не были прописаны вручную в коде, брались из структуры настроек) очень непросто и приходится всюду ставить костыли. Проще наверно форкнуть и переделать модуль flag.

В моей утилите 80% кода занимает именно разбор аргументов и конфига, и только 20% - код, ради которого она писалась (несколько системных вызовов и libseccomp).

Мне кажется, восторженные отзывы про Го пишут либо те, кто в нем только не разобрался, либо те, кто другие языки не видел.
Аноним 07/11/16 Пнд 04:12:58 #299 №871343 
>>870870

И еще нет никакой логики в организации кода. Люди просто раскидыают функции и переменные по файлам как хотят, и понять ничего невозможно. Видимо бывшие сишники пишут. Не представляю чтобы Ява разработчик например такой бардак в коде устроил.

Нет пакетного менеджера, и дурацкая схема организации папок по умолчанию.
Аноним 07/11/16 Пнд 04:19:31 #300 №871344 
>>871338

Изучи функции usort, array_map, array_filter - там они полезны. Ну например в сортировке функция-компаратор определяет порядок сортировки. Или можно написать функцию, которая из списка объектов отбирает часть по заданному в анонимной функции критерию.
Аноним 07/11/16 Пнд 04:23:26 #301 №871345 
>>871344
>например в сортировке функция-компаратор определяет порядок сортировки.
А рекурсивный вызов функции из тела функции тут непоможет? Или почему тут именно анонимная нужна?
Аноним 07/11/16 Пнд 04:38:14 #302 №871348 
>>871345

Посмотри мануал по usort. Попробуй сделать пример с ее использованием. Рекурсия здесь вообще не при чем.
Аноним 07/11/16 Пнд 04:52:52 #303 №871350 
>>871348
Спасибо няша, так и сделаю.
Аноним 07/11/16 Пнд 07:20:02 #304 №871369 
>>870893
Бамп, хоть кто-нибудь может высказаться?
Аноним 07/11/16 Пнд 08:35:13 #305 №871377 
>>871307
>большинство разрабов на жабе были только плагодаря андройду
>Не вижу больше смысла продолжать с тобой разговор.

>пруфаю рейтингом умирающего языка
>КОКОКО
>Не вижу больше смысла продолжать с тобой разговор.
Аноним 07/11/16 Пнд 08:42:41 #306 №871380 
>>871377
>пруфаю рейтингом умирающего языка
Это не рейтинг языка, прочитай описание.
Аноним 07/11/16 Пнд 08:44:20 #307 №871381 
>>871380
>The TIOBE Programming Community index is an indicator of the popularity of programming languages
так и представляю что ты такой ОЙ, Я БЫЛ НЕ ПРАВ

хотя нет, я же на дваче в пхп-треде
Аноним 07/11/16 Пнд 08:47:40 #308 №871383 
>>871377
>Google судится с Oracle по поводу Java
>Apple отказались от Java

>Я покажу что на рынке очень много Java программистов это значит язык востребован

Тоесть ты даже непонимаешь где обосрался?
Аноним 07/11/16 Пнд 08:48:38 #309 №871384 
>>871381
А теперь такой идёшь, и читаешь описание к графику.
Satosi 07/11/16 Пнд 09:48:03 #310 №871390 
14785012835410.jpg
>>864640 (OP)
Привет. Разбираю ответы опа, исправляю старый код. Не знаю как тут принято выкладывать исправления, но в общем так вот.

Игра в кости
> elseif ($sumManThrow = $sumAIThrow) {
>тут можно было не писать условие, а просто написать else.
Исправлено.
http://ideone.com/hs55ma

Миллион в банке
> $starterMoney+($starterMoney(10/100));
>Тут вместо числа 10 стоило использовать переменную $percent.
Исправлено
http://ideone.com/ujbtNY

Школьник и кредит на айфон
>Вообще, тут переменная $oversum лишняя и ее можно убрать. Также, хорошо бы избавиться от if/else где почти 2 одинаковых копии кода.
Сделал предварительный обсчёт $oversum и убрал всё что обсчитывалось в ней из if\else
Дальше не понимаю как улучшать.
Исправил
http://ideone.com/p494L2

Ответ на любой вопрос
> $random=array_rand ($answers, 2);
> не очень понятно, зачем брать 2 случайных ответа, но работает в общем верно.
Исправил
http://ideone.com/oKdt3x

Шифр
>Верно, хотя у тебя при расшифровке точка превращается в твердый знак.
Да я как-бы почти срзу сделал вот так. Надеюсь это считается как правильное решение тоже.
http://ideone.com/nZQDpf

Лев Толстой
>Вот тут не очень удачно: $rndWord1=mt_rand(0,3); - надо вручную считать число слов в массиве и пересчитывать при изменении. Лучше без этого.
>Также, тут можно было сделать массив вариантов и пройтись по нему циклом:

>$structure = [$word1, $word2, $word3, ["\n"], ...];
Ох... надеюсь я тебя правильно понял
http://ideone.com/PWMgWZ

Айпады.
Тут была куча недочётов то именования переменных, до неправильного подсчёта. Тот случай когда у себя поправил, а выложить забыл.
http://ideone.com/7Hc2oC

Задача на автономера.
> (А|В|Е|К|М|Н|О|Р|С|Т|У|Х)
>Удобнее использовать тут символьные классы: [АВЕКМНО...]
Вообще не догадывался что так можно, спасибо!
> for ($i=0;$i<$arCount;$i++){
>тут лучше foreach
Исправил.
http://ideone.com/fMXK7v

Спасибо тебе ОП, за твои уроки. Я и сам уже начал понемного понимать как и где что улучшить в старом коде, ты лучший!
Аноним 07/11/16 Пнд 10:30:12 #311 №871402 
>>871342
>Отовсюду лезут сишные корни
Ну ты неверно рассматриваешь го. Это же и есть сишка, только чуть захипстованная. Ты же не жалуешься на отсутствие вменяемого мультитретинга в пхп. Вот и там не нужны эти ваши дженерики (хоть и хочется).
Аноним 07/11/16 Пнд 14:45:05 #312 №871506 
>>871402
>Ты же не жалуешься на отсутствие вменяемого мультитретинга в пхп
Я вот жалуюсь что на PHP нет вменяемого 3d рендерера.
Аноним 07/11/16 Пнд 16:58:31 #313 №871598 
Приветствую.
Хотел задать несколько вопросов. По большей части про css, вы же не против?
Первое. Как выровнять основное содержимое сайта по центру, без задания фиксированной ширины страницы, например, когда задаешь значение в процентах.
Второе. Как можно полностью убрать элемент со страницы? Не спрятать его, а именно чтобы его не было
Спасибо.
Аноним 07/11/16 Пнд 17:36:19 #314 №871619 
>>871598
http://codepen.io/anon/pen/JbogNo
margin слева и справа;
display: none, чтобы спрятать обьект и занимать им место.
Аноним 07/11/16 Пнд 18:11:51 #315 №871637 
>>871343
> Нет пакетного менеджера
Гугли glide, мне хватает.
> И еще нет никакой логики в организации кода.
За этим сам следи. Вообще странно на это жаловаться в треде php.
Аноним 07/11/16 Пнд 19:49:24 #316 №871688 
Зачем нужны магические методы __get и __set, ведь если их определить, то по сути свойства станут публичными – какой смысл в их private? И не проще ли тогда их сразу как public объявить?
Аноним 07/11/16 Пнд 20:47:20 #317 №871733 
>>871688
Ты мало видимо читал их. Они нужны что бы тебе не динамически всякую хуиту не прописывали в объекты, если ты того не хочешь. Или если хочешь, но так что бы это все управляемо было.
Аноним 07/11/16 Пнд 22:27:10 #318 №871819 
14785468309860.jpg
14785468309891.jpg
14785468309912.jpg
14785468309953.jpg
Вместо бессмысленных объяснений...
У меня после прочтения в голове лишь щелкнуло в своё время что-то в духе: так вот оно как! Буду знать.
Аноним 07/11/16 Пнд 22:28:26 #319 №871823 
14785469062120.jpg
14785469062151.jpg
Аноним 07/11/16 Пнд 22:31:05 #320 №871829 
>>871619
>>871598

visibility: hidden - что бы спрятать объект и занимать им место,
>display: none
что бы убрать совсем
sageАноним 07/11/16 Пнд 23:12:24 #321 №871884 
>>871688
Это просто синтакический сахар.
Представь что у тебя 10 приватных методов, каждому из них нужен геттер и сеттрер. У тебя будет 20 методов в класе, ололо.

А эти меджик методы автоматически их за тебя создают.
Аноним 07/11/16 Пнд 23:17:31 #322 №871890 
>>871819
>>871823
Откуда, из какой книги? На О'Рейли похоже.
Аноним 07/11/16 Пнд 23:30:00 #323 №871911 
Скорее всего Мэт Занстра.
Аноним 07/11/16 Пнд 23:30:26 #324 №871914 
>>871890
>>871911
Аноним 08/11/16 Втр 08:23:08 #325 №872039 
>>871688
> И не проще ли тогда их сразу как public объявить?
Нет, а если я хочу проверять, что свойству в качестве значения выставляется именно строка, а не число? Публичному полю можно присвоить всё, что угодно. В сеттере же можно делать проверки/валидацию.
Аноним 08/11/16 Втр 08:34:25 #326 №872042 
Что делать если при запуске скрипта из консоли он выдает синтакс эрор?

При этом скрипт как я полагаю даже не начинается, просто ругается на те классы, которые консольно никак не дергаются, а просто находятся в этом же проекте.

Через веб приложение работает, а вот через консоль и кроном соответственно некоторый функционал не хочет вызываться, падая вот так.
Аноним 08/11/16 Втр 08:35:43 #327 №872043 
>>864640 (OP)
Ребятки! А возможно ли в регулярное выражение засунуть переменную? Вот допустим есть у меня функция, я в эту функцию передаю переменную:
$str = 'ня',
и я хочу найти все слова содержащие "ня". как написать регулярное выражение тогда?
"/w($key)w/u" не работает.
Аноним 08/11/16 Втр 08:44:42 #328 №872046 
>>872043
'/w($str)w/u' конечно же
https://github.com/never3ver/studentslist Аноним 08/11/16 Втр 09:10:01 #329 №872056 
>>867362
>>862816

https://github.com/never3ver/students_list

Тут в посте была пара комментариев, может ты не видел: >>867397

Код из autoload.php возможно стоит включить прямо в init.php, а то у нас тут 2 инициализационных файла получается.

https://github.com/never3ver/students_list/blob/master/public/regedit.php#L32
> if ($authorizer->isStudentInDatabase()) {
Тут наверно логичнее было поставить проверку, что у student есть id, если есть то надо делать UPDATE. Но это впрочем мелочь.

https://github.com/never3ver/students_list/blob/master/public/regedit.php#L37
> $authorizer->SignIn($student);
> $gateway->addStudent($student);
Нелогичный порядок действий: студент еще не внесен в базу, а ты уже выставляешь авторизационные куки.

https://github.com/never3ver/students_list/blob/master/app/StudentValidator.php#L20
Это выражение пропустит больше 5 символов.

https://github.com/never3ver/students_list/blob/master/app/StudentValidator.php#L20
> а-яА-ЯЁ
Почему-то маленькая ё не разрешена.

> filter_var($student->email, FILTER_VALIDATE_EMAIL)
Имей в виду, что он не пропускает кириллические домены вроде ivan@пример.рф

> preg_match("/^(19|20)[0-9]{2}/
эта регулярка пропускает что угодно, лишь бы оно начиналось с цифр.

> if ($result > 0) {
> return FALSE;
Проще писать return $result == 0; (меньше нуля результат COUNT быть не может)

https://github.com/never3ver/students_list/blob/master/templates/editForm.html#L90
Тут у радиокнопки local всегда стоит checked, даже если в $student local == NOT_LOCAL

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

В форме поиска можно было бы использовать required

https://github.com/never3ver/students_list/blob/master/templates/parts/pagination.html
Тут логику выбора номеров страниц и генерацию ссылок можно было бы переложить на класс Pager, а в шаблоне оставить только их вывод.

> редактировать мои/ваши данные
Немного сбивает с толку. Если "мои" употреблено рядом с "ваши", то появляется ощущение что тут как минимум 2 разных человека - пользователь и наверно автор программы.

Если результатов поиска нет, лучше так и писать, а не показывать заголовок таблицы. Если пользователей нет, тоже лучше так и написать и предложить зарегистрироваться.

Нет надписи "показаны результаты поиска по слову...". При поиске введенное слово не отображается в поле ввода после отправки формы.

Баг с вводом года 1900 так и не исправлен.

В общем, надо поработать на багами. Когда будешь сдавать на проверку, напомни, что у тебя все почти готово и все замечания исправлены.
Аноним 08/11/16 Втр 10:04:34 #330 №872080 
>>872043
>>872046
Вопрос снимается. Разобрался
https://github.com/ghp26/Students/ Аноним 08/11/16 Втр 10:21:17 #331 №872086 
>>867390
>>863496

https://github.com/ghp26/Students/

Ты пока ничего не ответил на пост >>867398

По коду:

папки .idea и vendor надо добавить в .gitignore. Их не должно быть в репозитории. Идея в том, что каждый скачавший твой проект запускает композер и устанавливает нужные зависимости сам.

> https://github.com/ghp26/Students/blob/master/dump.sql
В дампе не надо писать команды создания БД, только таблиц. Так как у меня может быть другое название БД.

> enum('муж','жен')
Обычно используют латинницу. Это ведь все равно идентификатор, а не строка для вывода на экран. В PHP коде в модели студента создаются константы для этих идентификаторов.

> `birth` date
Там ведь вроде только год нужен был, или ты дату вводишь?

> `hash` varchar(100) NOT NULL,
Нужно бы добавить комментарий к этой колонке, что там хранится и зачем.

В таблице надо проставить уникальные ключи для колонок, значения которых не повторяются.

Вместо include я бы советовал настроить автозагрузку через композер.

> https://github.com/ghp26/Students/blob/master/public/search.php#L8
> $_POST['searchValue']
Для поиска принято использоать GET, так как при поиске состояние сервера не меняется и мы можем поделиться ссылкой на результаты поиска.

Также, надо понимать, что любые внешние переменные могут отстуствовать. Стоит проверять, что d POST есть элемент searchValue, прежде чем обращаться к нему.

Насчет поиска и показа списка студентов - по моему, это довольно-таки похожие задачи и обычно их делают одним контроллером.

> https://github.com/ghp26/Students/blob/master/public/register.php#L4
> //include "src/DBGateway.php"; инклудиться в валидаторе
Вот это верный путь сделать ошибку. Завтра кто-нибудь уберет инклюд из валидатора, и код перестанет работать. Лучше использовать require_once, который подключает файл только 1 раз. А еще лучше - автозагрузку.

Далее, в этом файле https://github.com/ghp26/Students/blob/master/public/register.php у тебя кроме обработки формы идет низкоуровневая возня с куками. Лучше выделить код в отдельный класс, отвечающий за авторизацию, а в контроллере только вызывать методы вроде "получить текущего пользователя", "залогинить пользователя" и тд.

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

> $_POST[email]
Строку надо писать в кавычках.

> if (!$_COOKIE["MuhosranskUniversity"]) {
Название куки должно отражать ее назначение.

> header("location: index.php");
После выдачи заголовка у тебя скрипт не завершается, а продолжает работать.

В register.php у тебя 3 вызова $displayer. Получается слишком запутанная логика и легко пропустить какую-то ветку и ничего не вывести. Предлагаю упростить код, оставив единственный вызов внизу файла.

В шаблоне шапка и подвал страницы (<head>) скопипащена в оба файла. Не надо копипастить, надо вынести ее в отдельный файл.

https://github.com/ghp26/Students/blob/master/public/tpl/profile.html#L63
> <input name="local" type="radio" value="Местный" checked> Местный
Тут почему-то checked стоит всегда, независимо от значения в переменной local.

https://github.com/ghp26/Students/blob/master/src/Displayer.php#L5
Тут лучше применить Dependency Injection ( https://github.com/codedokode/pasta/blob/master/arch/di.md ), то есть передавать объект твига через конструктор. задача Displayer ведь отображать страницу, а не искать, где расположен твиг.

Для подключения твига не надо вручную делать require, достаточно где-то в начале скрипта приинклудить vendor/autoload.php и все библиотеки из композера будут подключаться сами.

https://github.com/ghp26/Students/blob/master/src/Displayer.php#L22
View в MVC не должен работать с куками, это задача контроллера. Ты нарушаешь правило разделения кода на отдельные части.

Смысл класса Displayer не очень понятен. Не проще ли из контроллера сразу вызывать твиг?

> https://github.com/ghp26/Students/blob/master/src/Displayer.php#L46
> 'name' => $profileData['name'],
> 'surname' => $profileData['surname'],
> 'sex' => $profileData['sex'],
Удобнее не передавать поля по одному, а передать весь массив. А еще правильнее использовать ООП, и передавать модель Abiturient.

> foreach ($errorsArray as $key => $value) {//в $errorsArray будет единственное значение
> $errorKey = $key;
> $errorMessage = $value;
> }
Не очень понятен смысл этого действия. Чтобы взять последний элемент, кстати, можно сделать $value = end($array); $key = key($array), почитай мануал по этим функциям.

> print_r($errorKey);
забыл отладочный код

https://github.com/ghp26/Students/blob/master/src/Abiturient.php#L15
> public function __construct($values)
не очень удобно, что нельзя создать пустого студента и заполнять постепенно, а надо передать все поля сразу. Часто необходимо именно создать модель с значениями по умолчанию.

https://github.com/ghp26/Students/blob/master/src/DBGateway.php
Если ты захочешь создать еще одну-две таблицы, ты будешь код работы с ними тоже писать в этот класс? Обычно для каждой таблицы делают свой Gateway и соответственно отражают это в названии класса.

Объект PDO лучше передавать с использованием DI.

https://github.com/ghp26/Students/blob/master/src/DBGateway.php#L29
> require_once "Abiturient.php";
Все require должны быть в начале файла, а не раскиданы по коду, а еще лучше настроить автозагрузку.

В общем, почитай внимательно комментарии к задаче, тут много чего требуется доработать.

https://github.com/ghp26/Students/blob/master/src/DBGateway.php#L50
Тут лишний prepare()

https://github.com/ghp26/Students/blob/master/src/DBGateway.php#L69
Почему-то тут возвращается null, а не false.

https://github.com/ghp26/Students/blob/master/src/Validator.php
Класс правильнее назвать AbiturientValidator.

https://github.com/ghp26/Students/blob/master/src/Validator.php#L14
Иф надо писать в 3 строчки, а не в одну длинную.

Вместо iconv_strlen можно использовать mb_strlen, а кодировку указать один раз в начале через mb_internal_encoding.

> А-Яа-я
ё в юникоде находится отдельно, не между буквами а и я и ее тоже надо указывать отдельно.

> А-Яа-я1-9
0 не разрешен?

Фамилии могут содержать пробел, например "фон Браун".

https://github.com/ghp26/Students/blob/master/src/Validator.php#L38
А для зарегистрированных студентов при редактировании уникальность емайл не проверяется?
Аноним 08/11/16 Втр 10:28:22 #332 №872089 
>>872043

Можно собрать выражение по частям, это же обычная строка. Не забудь обработать свою переменную через preg_quote, чтобы заэкранировать спецсимволы в ней, чтобы они тоже искались правильно.

>>872042

Надо найти и исправить ошибку. Там ведь номер строки написан наверно.

>>871688

Они нужны чтобы обрабатывать обращения к свойствам программно, создать видимость что у объекта есть свойства которых на самом деле нет. Это обычно в библиотеках и фреймворках используется.

Ну например можно сделать чтобы при обращении к $obj->name вызывался бы метод getName().

Или если например есть старый код, который пишет данные в свойства, а мы хотим перехватывать эти обращения и проверять данные.

Магическими методами лучше не злоупотреблять, так как они затрудняют понимание кода.

> Зачем нужны магические методы __get и __set, ведь если их определить, то по сути свойства станут публичными – какой смысл в их private?
Их можно использовать по-разному. Не только как ты написал. Или можно добавить какие-то проверки перед записью данных в свойство.

Аноним 08/11/16 Втр 10:39:14 #333 №872095 
>>871637

> Гугли glide, мне хватает.
Только там еще десяток есть. Где гарантия что в итоге все не пересядут на что-нибудь другое?

А так, надо будет попробовать. Если бы ее не установка через shell скрипт, который что-то непонятно куда скачивает и распаковывает. Прямо как пользователь винды себя чувствуешь.

А встроенный go get просто скачивает пакет непонятно какой версии непонятно куда и непонятно как это интегрировать в обычный проект с гитхаба.

>> И еще нет никакой логики в организации кода.
> За этим сам следи. Вообще странно на это жаловаться в треде php
В пхп как раз с этим все в порядке: PSR-4, каждый класс в своем файле. После этого лапшу из хаотично разбросанных функций начинающихся то с маленькой, то с большой буквы, тяжело воспринимать.

>>871598

Задать max-width и margin auto. Вообще, эта особенность блоков - это основы CSS, которые изучаются в самом начале. если ты это не знаешь, возможно тебе стоит подучить CSS и пройти наши задачки на CSS из ОП поста. Тогда верстка не будет для тебя представлять особой сложности.

Аноним 08/11/16 Втр 12:05:46 #334 №872130 
>>872095
> Где гарантия что в итоге все не пересядут на что-нибудь другое?
Это не js, да и функционал в целом опирается на заложенный в самом языке. В целом сама идеология говорит что каждая новая версия пакета должна быть обратно совместна со следующей, но от дураков защиты нет.
> В пхп как раз с этим все в порядке: PSR-4, каждый класс в своем файле.
Счастливый человек. Я php начал с 4 ещё на поддержке проекта говнокодеров, вот это ад во плоти.

В целом хочу сказать что от го многого ждать не стоит, это не сильвер булет и во многом на php удобней писать средние и даже большие проекты. Но когда нужен маленький и быстрый сервис, с высокой отказоустойчивостью го почти нет равных.
Аноним 08/11/16 Втр 12:14:30 #335 №872136 
>>871829
Все, понял в чем была проблема. Я просто не уточнил в начале, мне надо было эти параметры задать через @media и вышло так, что display: none не работал из-за того, что уже задан дисплей у блока, которому я хотел задать значение.
>>872095
>Задать max-width и margin auto
Не, не, это я знаю, я спрашивал о том, можно ли задать width или max-width в процентах, а потом его выровнять, пример выше работает только с шириной в пикселах.
> возможно тебе стоит подучить CSS и пройти наши задачки на CSS из ОП поста
Спасибо, гляну что здесь у вас.


Аноним 08/11/16 Втр 14:08:10 #336 №872165 
>>871390

> Игра в кости
> http://ideone.com/hs55ma
Все верно.

> Миллион в банке
Верно.

> Школьник и кредит на айфон
> $worthMoney = $worthMoney + $mounthlyPayment;
> echo $i . " платёж. Выплачено " . $worthMoney
> $worthMoney = $worthMoney + $oversum;
> echo "Последний " . $i . " платёж. Выплачено " . $worthMoney .
Это почти одинаковый код. Попробуй избавиться от повторов строчек.


> } elseif ($oversum <= 5000) {
Можно просто else, условие не требуется.


> Ответ на любой вопрос
Верно.

> Шифр
О, хорошо сделано.

> Лев Толстой
> http://ideone.com/PWMgWZ
> if (is_array($someword) == true) {
Можно просто if (is_array($someword)) так как if по сути приводит значение в скобках к true или false и в зависимости от этого выбирает, выполнять ли код. Оператор == сам возвращает true/false и соответственно проверка вроде == true по сути возвращает то же самое значение. Смотри мануал http://php.net/manual/ru/language.types.boolean.php

Ты забыл еще букву "Я", но в остальном, решено верно.

> Айпады.

Число 5000 встречается много раз в коде, должно быть только в одном месте.
Код в ветках ифа почти одинаковый, хорошо бы избавиться от дублей.

> } elseif ($debt < 0) {
> // echo "Что-то пошло не так.";
Ну так тут exit надо писать, если уверен что твой код правильный и это никогда не сработает.

> Задача на автономера.

> [АВЕКМНОРСТУХ]|[A-Z]
Это можно объединить в один символьный класс. Перечитай-ка мануал http://php.net/manual/ru/regexp.reference.character-classes.php

Слишком длинный номер считается почему-то верным: http://ideone.com/szMHz6
Аноним 08/11/16 Втр 14:11:58 #337 №872167 
>>872136

Центрирование блока через margin auto работает с шириной, заданной в любых единицах.

>>872130

Я не вижу особых причин, почему код на Го будет при прочих равных лучше кода на PHP. Да, там есть система типов, это плюс, но нет классов и стандартов, а значит будет типичный сишный бардак.

> Это не js, да и функционал в целом опирается на заложенный в самом языке
Вообще-то менеджеров пакетов там не меньше 10: https://github.com/golang/go/wiki/PackageManagementTools

> когда нужен маленький и быстрый сервис,
Но все приходится писать руками. Я вот обертку для вызова execve буду писать.

Аноним 08/11/16 Втр 15:32:45 #338 №872209 
>>872167
> Я не вижу особых причин, почему код на Го будет при прочих равных лучше кода на PHP.
Он не лучше, он другой. Нужен онлайн магазинчик - php, нужен чатик для обратной связи или нужно заткнуть высоконагруженную часть - go.

> нет классов и стандартов
Структуры и интерфейсы. Стандарты вообще самые жёсткие из всех языков пожалуй, но опять же они отличаются от php.

> Вообще-то менеджеров пакетов там не меньше 10
Лучшие из них основываются на работе компилятора go с vendor. На пакетном менеджере по сути только хранение версий.

> Но все приходится писать руками.
По этому я и не говорю что go подходит для написания больших программ.

Я вот пишу парсер сайта и мне нравится что я могу запустить сразу 500 корутин и особо не волноваться.
Аноним 08/11/16 Втр 15:50:08 #339 №872217 
>>871377
>>871380

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

>>871369
>>870893

Классы IncomingDamage и FilteredDamage не имеют никакого смысла. Чем IncomingDamage отличается от Damage? Ради чего здесь применено наследование? Какие это выгоды нам дает?

Я вижу только неудобства из-за того, что например какая-то функция приниамет на вход один вид Damage, а у нас есть другой, и надо их преобразовать. Например, функция filterDamage() вынуждена создавать новый объект. Причем она копирует только 2 вида урона, все остальные данные теряются. Если ты даже напишешь копирование всех видов урона, все равно, в будущем добавят новый вид урона и он будет теряться.

Соответственно, если оставить только класс Damage, код упрощается.

Также, я бы еще может убрал метод getTotalDamage, так как наверняка на разных персонажей разные виды урона действуют по-разному и их нельзя складывать.

В классе Armor я бы добавил конструктор, чтобы нельзя было создать защиту, не указав какие-то важные характеристики.

> $this->$elementResist
Доллар лишний. Или это специально? Тогда это плохая идея так как внешний код должен знать подробности внутреннего устройства класса (названия приватных полей), да вдобавок еще нет проверки, а есть ли такое поле вообще.

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

class Armor {
public function setArmor($armor);
public function getArmor();
public function setElementalResist($elementResist, $resist);
public function getElementalResist($elementResist);
public function getElementDamageReduction($elementResist);
public function filterIncomeDamage(Damage $damage);
}

Вот по этому описанию ты должен как-то догадаться, как использовать объект. Не очень понятно, если честно. Например, невозможно понять, что хранится в $elementResist.

Если ты хочешь обощенно работать с разными видами защиты, тебе надо сделать массив и константы для обозначения их видов:

$type = Damage::TYPE_FIRE;
$this->resist[$type] = ...

Ты же по сути из объект пытаешься использовать как массив.

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

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

Соответственно ты не должен стремиться использовать все паттерны проектирования в своем коде, а должен ответить на вопрос, зачем это нужно? какая от этого выгода? легко ли понять мой код? легко ли использовать? защищен ли он от ошибок?

Учиться можно, решая задачки, а также изучая код фреймворков вроде Симфони, где активно используется ООП.

Погуглить можно термин SOLID. Также, есть такая интересная статья: https://habrahabr.ru/post/153225/

Не хочешь задачку на ООП?

Во-первых, у нас в учебнике из ОП поста в главе "ООП" есть задачка "кошки-мышки". Можешь для начала ее решить. Далее, есть такая задача:

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

Система должна быть расширяемой, то есть должна быть возможность добавлять новые виды правил и проверок. Желательно, чтобы классы были переиспользуемыми, например, если есть код для проверки email на правильность, то нужно чтобы им можно было пользоваться и без формы. Правила валидации могут затрагивать несколько полей (ну например, проверка что 2 поля с паролем совпадают).
Аноним 08/11/16 Втр 15:50:57 #340 №872219 
>>871321

http://письмо.рф

А почему нет? Чем кириллица хуже других алфавитов?

>>871181

Официальный мануал смотрел? Я бы не советовал кодеигнайтер, он старый, плохо поддерживаемый, и я бы сказал, очень своеобразный.

>>871158

Это не так и плохо, наверно. Я бы jQuery с удовольствием на модули распилил.

>>871028

В общем-то код нормальный. Чуть оптимизировать можно, сделав шаблон стиха вроде массива

[$word1, $word2, ...]

И затем пройтись по этому массиву циклом, выбирая слова.

>>870991

На майлинаторе любой может просмотреть все входящие емайлы: https://www.mailinator.com/inbox2.jsp?public_to=2chphp#/#public_maildirdiv

Не отправляйте письма на такие адреса

>>870972

> if ($creditBalance <= $monthlyPayment) {
> $monthlyPayment = $creditBalance;
Это можно заменить на min/max.

> $creditBalance = $creditBalance - $monthlyPayment;
Тут можно использовать -=.

А так, все верно.
Аноним 08/11/16 Втр 15:51:30 #341 №872220 
>>870925

Откроем мануал (увы, англ): https://developer.mozilla.org/ru/docs/Web/CSS/@font-face
Или стандарт (тоже англ): https://www.w3.org/TR/css-fonts-3/#font-face-rule
Ну или на русском: http://htmlbook.ru/css/font-face

Соответственно, если у шрифта несколько начертаний, то надо на каждое начертание сделать @font-face с одинаковым font-family, но разными font-weight, font-style и разумеется src.

Также, надо учесть что разные браузеры поддерживают разные форматы, и указать ссылки для нескольких форматов. Также, старый ИЕ не поддерживает несколько форматов, потому для него надо указать ссылку хитрым костылем. есть готовый образец под названием Mo Bulletproof Font-face syntax: https://habrahabr.ru/post/113136/

Поддержка разных форматов:

- http://caniuse.com/#feat=woff
- http://caniuse.com/#feat=ttf
- https://developer.mozilla.org/en-US/docs/Web/Guide/WOFF
- http://transfonter.org/formats

Проанализировав матрицу поддержки форматов шрифтов браузерами, выбери комбинацию, дающую наибольший охват. Сконвертировать шрифты можно на fontsquirrel.

Сделай тестовый файлик (с разными буквами и начертаниями), выложи куда-ниудь и на сервисе вроде https://www.browserstack.com/screenshots или https://developer.microsoft.com/en-us/microsoft-edge/tools/screenshots/ можешь проверить отображение в разных браузерах.

>>870882

Питон не десктопный язык. Я бы советовал C#, он хорош, но по факту только под винду (я знаю про кроссплатформенность, но WPF никто не портировал). Либо, если ты хочешь кроссплатформенности, а производительность не очень важна, то HTML/CSS/JS упакованные с помощью программы вроде Electron. Работает кроссплатформенно, высокая скорость разработки, но память будет кушать как браузер.

Вообще, после HTML интерфейсы делать на чем-то другом - сплошная боль и трата времени.

>>870861

> set_time_limit(0);
> ob_implicit_flush();
В консоли не нужно.

Обработка ошибок сделана неправильно. Если сокет создать не удалось, пытаться его забиндить уже смысла нет. Надо завершать программу.

socket_write использован некорректно. Открой мануал: http://php.net/manual/ru/function.socket-write.php

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

Тебе надо обязательно читать мануал по всем использованным функциям, иначе ты не будешь знать особенностей их работы. Сетевые функции чтения и записи, как правило работают так: ты можешь указать любой объем передаваемых или принимаемых данных, но по факту они возвращают выполнение после отправки/получения одного пакета. Если твои данные не влезли в один пакет - ты должен снова вызывать socket_write с остатком данных. И разумеется, любая сетевая операция может дать еще 2 исхода:

- ошибку
- EOF, например получатель мог закрыть соединение до передачи/получения всех данных, в этом случае функция возвращает 0 и ты можешь проверить вроде бы через feof(), открыто ли еще соединение.

Ты не проверяешь результат socket_write. И кстати, socket_close тоже может дать ошибку.

Также, твой HTTP сервер не читает запрос от браузера. Сделай-ка чтобы в ответе он передавал полученный запрос, чтобы ты в браузере видел его. Сразу предупрежу, что придется помучаться, так как с первого раза скорее всего запрос будет просто подвисать. Если у тебя есть возможность например отправлять запрос курлом (утилитой), и видеть, на каком месте подвисает, или Wireshark перехватывать трафик, это поможет в отладке.

>>870858

Архитектура MVC: например, скрипты-контроллеры, шаблоны, и остальные классы образующие модель: классы работы с БД, классы валидации данных. Плюс какие-то дополнительные классы вроде класса с вспомогательными функциями, класса авторизации, защиты от CSRF.

> если есть кука включается главный контроллер(в нем список студентов), если нет - идет форма регистрации и кука устнавливается. Так же не следует делать, да?
Лучше делать роутинг с проверкой УРЛ, то есть взять текущий УРЛ из REQUEST_URI и проверять:

если (УРЛ == '/register') вызвать контроллер регистрации
если (УРЛ == /) вызвать контроллер списка студентов
иначе выдать 404 ошибку

>>870803

> простой echo-сервер,
При ошибке создания сокета надо завершать скрипт.

Не проверяется результат вызова socket_write, не реализована проверка числа отправленных байт и доотправка данных.

При чтении ты предполагаешь что все данные придут одним пакетом. Это не гарантируется. Ты можешь для теста сделать клиент, который шлет по 1 байту за раз, и увидеть что твой код увидит только первый байт.

> socket_read($msgsock, 2048, PHP_NORMAL_READ

Эта функция может вернуть:

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

Также, 2048 это лишь ограничение на объекм полученных данных, вернуть она мжет и меньше, хоть 1 байт.

> if (!$buf = trim($buf)) {
Во-первых, не стоит совмещать присваивание и иф. Во-вторых, if (!) сработает если в $buf будет строка "0".

> Напиши простой HTTP-клиент на php
> Не уверен, что я правильно понял задание
надо написать его на сокетах, а не на курле. Самому сформировать HTTP-запрос. Хотя написание на курле - тоже полезная практика.

Записывать пришедшие данные в фал желательно поточно, по мере скачивания. Если можешь, сделай поддержку gzip сжатия в ответе.

>>870799

Вот тут вариант кода хороший: >>870972
Аноним 08/11/16 Втр 19:25:48 #342 №872391 
Выручайте пыханы. Поставил силекс через композер. Пытаюсь запустить вот этот код:
require '../vendor/autoload.php';

$app = new Silex\Application();

$app->get('/hello/{name}', function($name) use($app) {
return 'Hello '.$app->escape($name);
});

$app->run();
Но силекс в браузере пишет: Sorry, the page you are looking for could not be found.
Работаю с nginx, то же происходит и со слимом. Гуглил, но пока ничего внятного по этому вопросу не нашел.
Аноним 08/11/16 Втр 19:31:37 #343 №872397 
>>872391
> Но силекс в браузере пишет
А какой путь ты запрашиваешь в браузере? Попробуй hello/name
Аноним 08/11/16 Втр 19:43:58 #344 №872401 
>>872397
Пиздос, как я так мог затупить. Заработало.
Аноним 08/11/16 Втр 20:29:30 #345 №872430 
14786261704110.jpg
Оп, у тебя в учебники по js (https://gist.github.com/codedokode/ce30e7a036f18f416ae0#%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%BA%D0%B8-%D0%BD%D0%B0-js) в 14 задаче в строке...

var с = new Date(2014, 1, 1);

..."с" русская.

мимонаблюдательный на js задачах.

Аноним 08/11/16 Втр 20:29:55 #346 №872431 
>>872430
в 15ой. фикс
Аноним 08/11/16 Втр 20:41:43 #347 №872440 
>>872430
Ну и посмотри 15ую, решение получилось короткое, что подозрительно. http://ideone.com/ztZNiF . 16ая судя твоему примечанию очень сложная? Отложить ее после DOM задачек?
Аноним 08/11/16 Втр 21:33:47 #348 №872472 
14786300274760.png
Ребята, помогите туповатому товарищу.
Может кто просто выделить начало и конец класса
который отвечает за рекламу автомобильных подушек?

view-source:https://vk.com/smcat
Аноним 08/11/16 Втр 22:56:07 #349 №872549 
всем привет. начал изучать php и всю телегу, поэтому нубский-нубский вопрос: если мы где-то определили строковую переменную вида там $a = '$b + $c' (или просто $a = '2 + 3)', есть какой-то очевидный (правильный, короткий и т.д.) способ эту переменную выполнить как код?
Аноним 08/11/16 Втр 23:00:16 #350 №872557 
>>872549
eval()
Аноним 08/11/16 Втр 23:05:57 #351 №872559 
>>872557
сенкс
Аноним 08/11/16 Втр 23:31:11 #352 №872580 
>>872472
Запихни это куда-нибудь сюда: http://www.freeformatter.com/html-formatter.html
Или поищи аналогичные сервисы.
Satosi 09/11/16 Срд 06:28:43 #353 №872641 
14786621237410.jpg
14786621237421.jpg
>>872165
Новый пак исправлений.
> Школьник и кредит на айфон
>Это почти одинаковый код. Попробуй избавиться от повторов строчек.
Избавился
>Можно просто else, условие не требуется.
Исправил.
http://ideone.com/yb1bfA

>Ты забыл еще букву "Я", но в остальном, решено верно.
Есть такое решение, но мне оно ужасно не нравится. Новый массив строк и снова код менять.
http://ideone.com/X8kp2g
Есть ещё такое, гораздо "эластичнее".
http://ideone.com/FV1P5O

Ну и к айпадам применил модификации.
http://ideone.com/dMpAgx

Обьединил в один класс.
>Слишком длинный номер считается почему-то верным:
Очень странно пикрил говорит что нет, или ты про другой?
http://ideone.com/P2kkv1

Спасибо за ссылки, ты лучше всех!
Аноним 09/11/16 Срд 08:00:03 #354 №872651 
14786676034290.jpg
Ору
> ламеры собираемся говнокодить
На сосаче учиться делать сайты.
Типа кул кодеры тут. Шли бы и зарабатывали на этом как я.
Аноним 09/11/16 Срд 08:00:47 #355 №872652 
>>864640 (OP)
Говнокодеры собрались-.-
Аноним 09/11/16 Срд 08:15:18 #356 №872655 
>>872641

Посмотри код по моей ссылке http://ideone.com/szMHz6

Там есть номер a111abcdefghijklm и он проходит проверку.

Аноним 09/11/16 Срд 08:19:41 #357 №872656 
>>869823
Почему скрипт должен быть заключен в <?php?>
Почему именно в это? Раз мы пишем на php, то понятно что это php.
И как оно расшифровывается? В моем учебнике указывается Hypertext Preprocessor, но если сократить то выйдет только hp
Аноним 09/11/16 Срд 08:28:47 #358 №872658 
>>872656

Почитай мануал http://php.net/manual/ru/language.basic-syntax.phpmode.php

То, что не заключено в <?php просто выводится как есть. Этот синтаксис позволяет делать например HTML шаблоны с вставками PHP кода.

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

> И как оно расшифровывается?
PHP = PHP Hypertext Processor. рекурсивный акроним. Первоначально имелось в виду Personal Home Page.
Satosi 09/11/16 Срд 10:01:34 #359 №872683 
14786748944360.jpg
>>872641
Из старого треда ответы.

Нормеа телефонов
> (^ ?8|^\+ ?7)
>^ можно вынести за скобки

> echo " ".phoneNumberCheck($correctNumbers[$i])." \n ";
>Но функция phoneNumberCheck() ничего не возвращает, а ты пытаешься ее результат вклеить в строку.

>Работает правильно.
Теперь функция возвращает строку.
http://ideone.com/WObMMl
Аноним 09/11/16 Срд 10:41:50 #360 №872690 
14786773105230.jpg
>>872655
Насколько я понял нужно так
http://ideone.com/Hrpkvw

Да, не заметил нового элемента в начале масссива.
Аноним 09/11/16 Срд 11:36:51 #361 №872708 
>>872217
Спасибо большое за такой развернутый ответ. Ну я просто новичек, и когда у тебя 0 опыта, перед тобой постоянно всплывают выборы в которых ты понятия не имеешь как лучше поступить, сделать так или иначе, создавать еще 1 класс или обойтись одним, делать ли метод тут или там и прочее. В общем вот примерно какая была у меня логика:
>Классы IncomingDamage и FilteredDamage не имеют никакого смысла. Чем IncomingDamage отличается от Damage? Ради чего здесь применено наследование? Какие это выгоды нам дает?
Ну я подумал, что IncomingDamage будет передаваться именно в Armor, что бы та его обрабатывала, а FilteredDamage уже например существу, что бы непосредственно снижать его здоровье.

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

>акже, я бы еще может убрал метод getTotalDamage, так как наверняка на разных персонажей разные виды урона действуют по-разному и их нельзя складывать.
Конечно по разному, в зависимости от защиты и прочих резистов. Но суть в том, что урон хоть и может быть смешанным аля ОГНЕННАЯ СТРЕЛА (физик + фаер), то у существа в итоге нужно отнять какое-то фиксированное количество жизней. Для этого и нужен метод, что бы собственно после всех резистов взять этот тотал дамаг и отнять из хп.

>Доллар лишний. Или это специально? Тогда это плохая идея так как внешний код должен знать подробности внутреннего устройства класса (названия приватных полей), да вдобавок еще нет проверки, а есть ли такое поле вообще.
Я подумаю. Просто я столкнулся с тем, что выше писал в треде вот этот господин >>871884 и придется для каждого резиста писать по 2 метода только что бы БЛЮСТИ ИНКАПСУЛЯЦИЮ, хз кароче как пока с этим разобраться. Если расширять в перспективе еще 1 резистом, то и так придется ВСЕ методы переписывать которые обрабатывают входящий урон и прочее. Хоть резисты блин в массиве храни, что бы можно было форичем обходить их. Ну или как-то так :(

Аноним 09/11/16 Срд 12:28:11 #362 №872732 
Что в MVC должно обрабатывать данные в POST/GET массивах?
Аноним 09/11/16 Срд 13:32:44 #363 №872766 
>>872732
Контроллеры
Аноним 09/11/16 Срд 15:10:39 #364 №872825 
14786934398760.jpg
14786934398771.jpg
Анончики, хожу за бесплатно на практику с возможностью трудоустройства.

В принципе, почему бы и нет, так бы все равно дома сидел, поначалу дали пару полезных заданий учебных, я их кое как сделал, теперь дали подправить в коммперционном проекте 2009 года, код пикрелейтед, написанный на первом зенде, все такое старинное, что просто пиздец.

Шо делать, анончики? Терпеть или сьебывать оттуда? Я хожу туда, чтобы учиться и развиваться, а не ковыряться в говне.
Аноним 09/11/16 Срд 15:24:20 #365 №872833 
14786942603960.jpg
Требуется помощь в составлении правильного SQL-запроса. Ситуация такова: есть 2 таблицы:

1) поля 'uid' (INT) и 'quantity' (DECIMAL 9,2)
2) поля 'id' (INT AUTOINCREMENT) , 'quantity' (DECIMAL 9,2) , 'uid' (INT)

Первая хранит расходы, вторая - поступления.

Поле 'uid' - это номер из внутреннего учета (для бухгалтерии). Он уникален для каждой уникальной вещи (например вот этот стул и ни какой другой). 'quantity' соответственно количество поступления и расхода.

Нужно составить выражение, при котором будет подсчитываться баланс, то есть количество всех прибывших вещей за вычетом ушедших.

Пока что родить смог только нечто подобное:

SELECT DISTINCT `uid`, ((SELECT SUM(`quantity`) FROM `incomes` WHERE `uid` = `uid`) - (SELECT SUM(`quantity`) FROM `demands` WHERE `uid` = `uid`)) AS `balance` FROM `incomes`;

Этот запрос на выходе дает таблицу из уникальных 'uid' и вторым полем по идее должен давать баланс, но там всегда одно число. Проблема, возможно, там где выделено жирным, а может и во всем запросе. Как не пытался сформулировать вопрос для гугла - выдает не то, даже близко нет.
Аноним 09/11/16 Срд 15:36:40 #366 №872844 
>>872825
>коммперционном проекте 2009 года, код пикрелейтед, написанный на первом зенде, все такое старинное

Да у вас код практический свежий.

Вот я работаю часто с кодом из 2003-4 года выпуска, и кто-что почему запиливал не ясно.
Аноним 09/11/16 Срд 15:42:24 #367 №872849 
>>872833
я не знаю что там за данные, и проверить не начем, но я бы налабал бы чтонить в стиле таком:

select prihod.uid, SUM(prihod.quantity)-SUM(uhod.quantity) as balance
from prihod
join uhod
on prihod.uid = uhod.uid
Group by 1
Аноним 09/11/16 Срд 15:53:47 #368 №872857 
http://ideone.com/5BLqZl - такое может сойти за нормальную автозагрузку?
Аноним 09/11/16 Срд 16:19:08 #369 №872874 
>>872857
если ты все классы хранишь в корне проекта не рассфасовываешь по папкам, то да.

Только еще правильно путь укажи, на компе же у тебя не найдет файла по адресу "/Class.php"

http://ideone.com/hYnPIL
Аноним 09/11/16 Срд 16:21:39 #370 №872879 
>>872844
оно того стоит, анон? это же путь вникуда
Аноним 09/11/16 Срд 16:24:24 #371 №872884 
>>872874
Не совсем понял о чем ты. Сама функци лежит в autoload.php, в корне ее подключаю. Вроде все находит.
Аноним 09/11/16 Срд 16:30:13 #372 №872893 
14786982131700.png
>>872884
Забыл пик.
Аноним 09/11/16 Срд 16:34:14 #373 №872900 
>>872580
Спасибо попробую.
Аноним 09/11/16 Срд 17:08:12 #374 №872943 
>>872884

не знал, что ты юзаешь неймспейсы, тогда все окей.

в добавок скажу, что подключения разных автолоадеров и конфигов должны находиться в отдельном файле от создания классов и функций и тому подобного, в стандартах это описано
Аноним 09/11/16 Срд 17:54:57 #375 №872991 
>>872943
>в добавок скажу, что подключения разных автолоадеров и конфигов должны находиться в отдельном файле от создания классов и функций
Это как? Т.е. >>872893 как тут я сделал нельзя? Как тогда правильно сделать?
Аноним 09/11/16 Срд 18:19:41 #376 №873019 
>>872857

У тебя куча ошибок.

> spl_autoload_register(autoload);
Строки надо заключать в кавычки.

> require_once '/' . $class . '.php';
это абсолютный путь, то есть он отсчитывается от корня диска. Маловероятно что все файлы будут лежать там. Особенно если речь про Линукс, где дисков нет и корень у файловой системы один.

Плюс, имя класса может быть с нейспейсами и бексешами. Это ты не учел.

Также, класс может отсутствовать. Ну например если написать

if (class_exists("ZZZZZ"))

С именем несуществующего класса то это вызовет ошибку при попытке подключить файл ZZZZZ.php

А вообще, надо не изобретать велосипеды, а прочитать мой урок про PSR-4 https://github.com/codedokode/pasta/blob/master/php/autoload.md

>>872943

Не окей, смотри выше.

> в добавок скажу, что подключения разных автолоадеров и конфигов должны находиться в отдельном файле от создания классов и функций и тому подобного, в стандартах это описано
Можно ссылку?

>>872849

Неправльно сделан джойн. Джойн это горизонтальное соединение таблиц, а тут нужно скорее вертикальное через UNION.

>>872833

Скорее всего тебе нужен юнион. Хотя я толком не понял условия задачи, например если uid это идентификатор одной вещи, то зачем там поле с количеством если уникальная вещь может быть только одна?

Я бы тебе советовал посмотреть наши задачки по SQL из ОП поста, чтобы лучше в нем разбираться. Или почитать любой учебник по SQL. Тут нельзя наугад переставлять запросы в надежде что заработает.

Аноним 09/11/16 Срд 18:24:41 #377 №873025 
>>872708

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

Это неправильный подход. Если делать как ты предлагаешь, то потом кто-то добавит новый вид урона в класс Damage и не обновит класс Armor потому что не знает что его надо обновить.

Правильно либо не пересоздавать объект либо сделать в самом Damage функцию для создания новой версии объекта.

Ты должен писать код в расчете на обычных людей, а не на то, что твой код будут поддерживать гении-вундеркинды с способностью к телепатии.

> Для этого и нужен метод, что бы собственно после всех резистов взять этот тотал дамаг и отнять из хп.
Вообще, у разных существ может быть разная восприимчивость к видам урона, логичнее сделать у существа метод "принять урон", а не закладывать что он всегда складывается.

> Если расширять в перспективе еще 1 резистом, то и так придется ВСЕ методы переписывать которые обрабатывают входящий урон и прочее. Хоть резисты блин в массиве храни, что бы можно было форичем обходить их. Ну или как-то так :(
Я тебе выше и написал, что можно хранить виды дамаджа в массиве.
Аноним 09/11/16 Срд 18:35:04 #378 №873030 
>>872690

> foreach ($autonombers as &$value) {
зачем тут & ?

> [АВЕКМНОРСТУХ|A-Z]
Тебе надо перечитать про символьные классы. Если ты ставишь вертикальную черту после X, почему не ставишь ее между остальными буквами?

В квадратных скобках вертикальная черта обозначает саму себя.

Круглые скобки там не нужны.

Имя функции принято начинать с глагола: checkNumber

>>872683

> ^\+ ?7

^ тут лишнее

Решено верно.

>>872641

> Школьник и кредит на айфон

Можно упростить дальше, а именно:

- убрать else
- убрать $credit = 0; $worthMoney += $oversum;
- использовать min/max для расчета суммы месячного платежа

> Лев Толстой
> if ($i==9) { // плохое решение если добавить массивы, но как по другому отследить последнюю строку я не знаю
Букву Я можно просто положить в массив со структурой стиха.

> Есть ещё такое, гораздо "эластичнее".
Так и надо делать.

> Ну и к айпадам применил модификации.
Тоже можно упростить как и айфоны.

Аноним 09/11/16 Срд 18:40:45 #379 №873037 
>>872549

Есть eval, но это общем плохая идея и скорее всего он тебе не нужен.

>>872440

Решено верно.

> 16ая судя твоему примечанию очень сложная? Отложить ее после DOM задачек?
Не, лучше решить, а то ты и задачки дальше не решишь.

>>872430

Исправил. Уверен, твоя наблюдательность тебе сослужит хорошую службу.

Аноним 09/11/16 Срд 19:07:26 #380 №873056 
Аноны у меня паника,с профой из вузика проблемы,поэтому хочу вкатиться в пхп,если начать по гуиду Оп то на джуна возьмут?
Аноним 09/11/16 Срд 19:12:28 #381 №873061 
14787079489790.jpg
>>873056
На, уважяемьiй.
Аноним 09/11/16 Срд 19:13:57 #382 №873063 
14787080376380.jpg
>>873061
Аноним 09/11/16 Срд 19:56:14 #383 №873084 
Посоны, объясните! ковыряю yii2/ миграции. И вот что тут нашел {{%user}}
что это за хуйня? видал такое и раньше, но не придал значение. Предполагаю что это переменная или ссылка на нее, но почему так, чтоб я не понял?
реквестую объяснения или хоть где почитать про такое явление.
Аноним 09/11/16 Срд 19:58:30 #384 №873085 
>>873019
>Тут нельзя наугад переставлять запросы в надежде что заработает.

Вот это я уже ощутил. Буду больше читать тогда.

uid это идентификатор ти'па вещи, которой может быть много (например, "молоко простоквашино 2,5% жирности 0,5мл" - обозначает только определенный уникальный продукт, которых может быть quantity - много-много штук, постепенно прибывающих и убывающих). Итоговый результат селекта должен как раз выводить пару 'тип предмета' - 'остаток', и состоять по логике из уникальных первых значений. Короче, я не могу даже здесь объяснить, аргх.
Аноним 09/11/16 Срд 21:03:10 #385 №873119 
14787145910460.png
Что в css прописать, чтобы div изменял высоту в зависимости от кол-ва контента?
Аноним 09/11/16 Срд 21:08:54 #386 №873122 
>>873119
height: auto;
overflow: auto
word-wrap: break-word;
Аноним 09/11/16 Срд 21:26:34 #387 №873130 
Автор сайта из шапки большой молодец

Помогите макаке передать из js в php (в новый файл php) - гетом или постом.

Что я делаю не так? Я 3 день бьюсь, пожалуйста, помогите!
http://ideone.com/HNVYLP

Нагугливаю сплошной ajax, jquery - но нихуя не нашел нужного примера. Может я не так ищу? МНе всего лишь нужно передать переменные из js в php.
Аноним 09/11/16 Срд 22:22:27 #388 №873175 
>>873130
Давай я тебя научу:
1. ОТкрываешь свою страничку с JS скриптом в браузере.
2. Нажимаешь F12, идешь на вкладку Net/Network/Сеть
3. Обновляешь страничку.
4. Смотришь на появившиеся запросы - ищешь свой.
5. Если не нашел - идешь на вкладку Console/Консоль и смотришь ошибку.
6. Если нашел, но PHP не работает - ставишь первой строкой своего скрипта print_r($_POST)
7. Смотришь, что PHP получил.
8. Думаешь
9. ???
10. ПРОФИТ
Аноним 09/11/16 Срд 22:35:10 #389 №873190 
>>873019
>Можно ссылку?
http://www.php-fig.org/psr/psr-1/#2-3-side-effects

держи
Аноним 09/11/16 Срд 22:41:53 #390 №873199 
14787205131920.png
14787205131931.png
Где я обосрался на 60 копеек?
Аноним 09/11/16 Срд 22:43:42 #391 №873203 
>>873199
Там так и должно быть.
Аноним 09/11/16 Срд 22:47:41 #392 №873206 
>>873203
Ок, спасибо.
Аноним 10/11/16 Чтв 02:04:03 #393 №873305 
14787326438550.png
>>872833
Апдейтед: работает вот так, но хотелось бы получать такой результат сразу в SQL!
Аноним 10/11/16 Чтв 07:23:13 #394 №873330 
>>873305
Тебя заинтересуют PostgreSQL и оконные функции.
Аноним 10/11/16 Чтв 08:44:28 #395 №873342 
Если сюда, то сюда, если нет то извиняйте: для юникс (линукс)-подобных для верстки html/css подскажите годноту по программам. В идеале отображение html кода и css кода сразу (т.е либо 2 окна либо удобное переключение между ими).
Аноним 10/11/16 Чтв 08:51:55 #396 №873344 
>>873342

тебе нужен какой-нибудь тайловый менеджер (например, i3) и текстовый редактор с плагинами (..., sublime)
Аноним 10/11/16 Чтв 08:55:39 #397 №873347 
>>873342
http://brackets.io/
алсо рекомендую Atom, на него дофига плагинов
Аноним 10/11/16 Чтв 10:03:43 #398 №873359 
>>873330

Это тут вообще не при чем. Стандартного SQL достаточно.

>>873305

Тогда изучи SQL. Там решение очень простое.

>>873199

Переменные надо было назвать получше. Параметры задачи (5000, 0.03 итд) лучше указывать в начале задачи как переменные, чтобы их было легко поменять и чтобы было понятно, что это за числа. У тебя ничего не понять.

>>873190

А, ну логично, файл либо содержит классы/функции, либо исполняемый код.

>>873130

Тебе надо не гуглить, а изучить яваскрипт, основы HTTP и jQuery. (в ОП посте кстати есть задачки). Гугление не поможет так как вряд ли кто-то специально для твоей задачи решение напишет.

>>873084

Посмотри сначала оф. документацию по миграциям, а потом код в Юи который за них отвечает.

Если ты это в каком-то проекте увидел, может это не особенность Юи, а что-то самописное?
Аноним 10/11/16 Чтв 10:47:25 #399 №873376 
>>873359
>простое
да чтоб тебя...
Аноним 10/11/16 Чтв 11:36:02 #400 №873383 
>>873342
vim
Аноним 10/11/16 Чтв 12:13:06 #401 №873395 
ОП, ты советовал написать тесты на файлообменник, возник вопрос, на какие методы нужно писать тесты? На геттеры и сеттеры свойств модели не надо же? Надо только на методы которые внутри себя совершают какие-то действия? С phpunit немного разобрался, но не могу уяснить для себя когда это нужно применять. В туториалах рассматриваются примеры с арифметическими действиями или заполнением массива, такие вещи тоже нужно тестировать?
Аноним 10/11/16 Чтв 12:49:20 #402 №873411 
>>873395

А зачем вообще писать тесты? Очевидно, чтобы иметь возможность быстро проверить: работает ли кусок кода корректно или нет.

Ну например, мы поручаем начинающему разработчику Васе добавить какую-то фичу или провести рефакторинг и можем проверить, все ли в порядке после его вмешательства.

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

Также, надо понимать, что написание тестов не бесплатно - на них надо тратить время.

Исходя из этого, понятно, что в первую очередь мы заинтересованы в написании тестов на сложный код, который легко сломать. А тесты на сеттеры ... ну конечно теоретически там можно что-то сломать, но это надо уже специально вредительством заниматься.

> В туториалах рассматриваются примеры с арифметическими действиями
Это просто для примера. Они тестируют функцию сложения, а ты тестируй например функцию преобразования имени файла.

Лучше всего, когда тест ведет себя так же как пользователь кода. Если ты тестируешь класс, то тестируешь его публичные методы, не привязываясь к внутреннему устройству класса. Если тестируешь интерфейс то опять же стараешься имитировать действия пользователя, а не лезть напрямую во внутренности кода.

Сами тесты как правило пишут на основе требований к функции или странице. Ну условно говоря, ты пишешь функцию выбора имени файла для хранения и предъявляешь к ней такие требования:

- имя файла должно иметь длину в заданных пределах
- имя файла должно содержать только разрешенные символы
- имена файлов должны быть уникальны даже если исходные имена одинаковые

Ну вот осталось только это тестами проверить. Аналогично проверяется интерфейс. Ну например, есть страница загрузки файла. К ней предъявляются такие требования:

- при выборе файла и загрузке пользователя должно перекинуть на страницу просмотра файла. При скачивании файла мы должны получить назад загруженный файл с тем же именем и содержимым
- при отправке пустой формы мы должны получить сообщение об ошибке

Вот опять же из требований мы получили основу для написания тестовых сценариев.

То есть берем требования, пишем тестовые сценарии, пишем код тестов.

Если времени совсем нет, то можно сделать smoke test - просто вызвать функцию или загрузить страницу и просто проверить что не произошло никакой ошибки. Это лучше чем отсутствие теста.

В файлообменнике я вижу такие тесты:

- юнит-тесты отдельных классов и функций, где есть какая-то логика
- возможно, тесты для проверки взаимодействия нескольких классов. Ну например, тест, тестирующий загрузку и сохранение файла с записью данных в БД.
- тесты интерфейса для страниц сайта

Советую показать тесты на проверку. Также, могу прокомментировать тестовые сценарии.
Аноним 10/11/16 Чтв 12:53:46 #403 №873413 
>>873411
Спасибо, буду думать.
Аноним 10/11/16 Чтв 14:42:30 #404 №873461 
Тут кто-то пользуется эклипсом? Я вот доволен им неимоверно, но не хватает всего одной фичи - хочется создавать классы по клику, а не создавать пхп файл, потом прописывать название класса и неймспейс.
Аноним 10/11/16 Чтв 14:51:39 #405 №873469 
>>873461
Первая иде была именно эклипс, но быстро переполз на нетбинс. В 2 раза быстрее, темы встают нормально, нету этих дурацких перспектив и вообще збс. По твоему вопросу сказать нечего, никогда это не парило.
Аноним 10/11/16 Чтв 14:53:39 #406 №873470 
>>873469
Странно, у меня нетбинс медленно работает.
Аноним 10/11/16 Чтв 15:20:56 #407 №873482 
>>873461

У меня в саблайме плагин прописывает неймспейс на основе пути к файлу нажатием одной кнопки.

Алсо вот это вот расширение http://p2.pdt-extensions.org/phpfeatures.html вроде как поддерживает создание класса через диалог (но мне кажется, тут с тобой что-то не так, по идее руками должно быть быстрее).

Аноним 10/11/16 Чтв 15:27:32 #408 №873486 
>>872056
ОП, вроде все исправил.
https://github.com/never3ver/students_list
Одно только не стал переделывать:
>https://github.com/never3ver/students_list/blob/master/templates/parts/pagination.html
>Тут логику выбора номеров страниц и генерацию ссылок можно было бы переложить на класс Pager, а в шаблоне оставить только их вывод.
Генерация ссылок и так вроде в классе, стрелки я допустим могу перенести, а как убрать цикл из шаблона, что-то не соображу. Да и надо ли?
Аноним 10/11/16 Чтв 15:29:16 #409 №873488 
>>873486

Насчет пагинации. А представь, тебе нужно выводить номера страниц не подряд, а с какой-то логикой, например:

1 ... 4 5 [6] 7 8 ... 15

как ты это реализуешь?
Аноним 10/11/16 Чтв 15:33:35 #410 №873493 
>>873482
Спасибо, попробую. Ну не знаю насчет удобно/не удобно, но имхо легче сразу же указывать название класса и неймспейса, таким образом в зендстудио можно даже каталоги сходу создавать.
Аноним 10/11/16 Чтв 15:33:40 #411 №873494 
>>873488
Добавлю ифов для троеточий и цикл буду организовывать с -3 до +3 от нынешней страницы, ничего особо не изменится. Если я правильно тебя понял.
Аноним 10/11/16 Чтв 15:41:44 #412 №873500 
Нихуя не выходит ёбаное задание друга-ОПа.

Надо проверить телефонные номера через регулярное выражение.

>Подсказка: не надо строить сложных выражений и предусматривать все возможные комбинации символов. Достаточно написать: сначала идет +7 или 8, за ними ровно 10 цифр, между которыми может быть любое число скобок, минусов, пробелов

$regexp = '/^(\+7|8)[0-9]{10}$/u';

Здесь соовтетсвенно проверка, что в начале +7 или 8 и десять цифр. А вот как записать, что между цифрами было сколько угодно скобок, - и пробелов я не пойму. Пиздец какой-то, нихуя не соображу.
Аноним 10/11/16 Чтв 15:58:53 #413 №873511 
https://toster.ru/q/368853
Аноним 10/11/16 Чтв 16:00:14 #414 №873512 
>>873494

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

>>873500

Попробуй написать выражение "одна цифра, за которой идет любое число скобок, пробелов, минусов".
Аноним 10/11/16 Чтв 16:00:48 #415 №873513 
>>873359
> специально для твоей задачи решение напишет
>передать перенменную из js в php

Охуеть какая узкая задача
Аноним 10/11/16 Чтв 16:06:48 #416 №873516 
>>873512
>Попробуй написать выражение "одна цифра, за которой идет любое число скобок, пробелов, минусов".

Ну, моей фантазии хватает только на такое: $regexp = '/^(\+7|8)[0-9](\(\-\s\))*$/u';
но похоже несу лютый порожняк, потому что конечно же не работает. Как меня вымораживают эти спецсимволы.
Аноним 10/11/16 Чтв 16:08:43 #417 №873517 
Хм. Я кажется понял почему у меня нетбинс медленно работал - я раньше качал пакет, в котором сразу же все фичи были. Сейчас скачал пакет только с пхп, аштиемель/цсс и яваскриптом и все залетало, не хуже эклипса, а функциональность больше. Алсо, поясните мне чего все так носятся с пхпштормом? Что в нем такого крутого по сравнению с тем же нетбинсом, который вроде все основные преимущества дает, но при этом швабодным и быстрый?
Аноним 10/11/16 Чтв 16:29:38 #418 №873527 
>>873516

Ну вообще конечно я не просил 8 или +7 добавлять, а написать только нужную часть выражения.

И то, ты написал его неправильно. Вот это например: \(\-\s\) значит "скобка, за ней минус, за ним пробельный символ, за ним скобка".

А надо: скобки, минусы, пробелы в любом порядке и количестве.

Подумай еще.

Подсказка:

http://php.net/manual/ru/regexp.reference.character-classes.php
http://php.net/manual/ru/regexp.reference.alternation.php


Аноним 10/11/16 Чтв 16:54:40 #419 №873533 
Не обращайтесь непосредственно к суперглобальному массиву $_SERVER.

Вместо этого можно использовать функции фильтрации (например, filter_input(), conditions with is_
() functions и др.).
----*
Вот такое мне выдает нетбинс когда я использую $_SERVER['REQUEST_URI'] в методе класса. С чего бы это было плохо?
Аноним 10/11/16 Чтв 16:59:22 #420 №873534 
>>873533
Жри что дают.
Люся! И ему такое подай.
Аноним 10/11/16 Чтв 17:33:33 #421 №873545 
>>873486
>>873512
>Там будут еще другие условия
Ну ок, теперь совсем все переделал. ОП, ты просил напомнить, что
>Когда будешь сдавать на проверку, напомни, что у тебя все почти готово и все замечания исправлены.
https://github.com/never3ver/students_list
Аноним 10/11/16 Чтв 18:07:46 #422 №873552 
Пишу проект с нуля для довольно крупного (по сравнению с моими предыдущими работами) сайта-магазина, посещаемость в день планируется около 4-5 тыс. человек. На данный момент идёт тестирование и допиливается фронтенд (заказчики из серии "кнопкуПовышеМожно?"). В общем в чём суть вопроса: вся html-часть состоит из множества (около сотни) файлов-чанков по 1-2 кб, и всё это дело вызывается в движке функциями с file_get_contents() и подстановкой значений из базы с помощью strtr() вместо каких-то переменных по типу {MENULIST}. Концепция в том, что чем меньше HTML внутри php, тем лучше.
Так вот иногда на сервере возникают ошибки функции file_get_contents(), мол, не удалось выполнить HTTP-запрос, ошибка 503. F5 - всё ок. Но раз в 15-20 запросов такая шляпа возникает. Вопрос: забить ли на это хуй (ведь, когда тестирование закончится, я припилю на всё это дело memcached), изменить логику в сторону уменьшения количества запросов к файлам, или поменять хостинг (beget)?
Аноним 10/11/16 Чтв 18:14:02 #423 №873557 
>>873552
И ещё вопрос вдогонку:
Хорошая ли практика для передачи значений переменных в js использовать код по типу:

(В HTML-шаблоне)
...
<script>
var a = {NUM};
</script>
...

(PHP)
return strtr($template, ['{NUM}' => $a]);

Или лучше закидывать переменные в hidden input'ы, или, как на первый взгляд кажется наименее костыльно, всё-таки для получения вообще всех данных с бэкенда выполнять get-запросы непосредственно из js?
Аноним 10/11/16 Чтв 18:34:06 #424 №873566 
>>873557
2) Нормальная практика, нужны переменные - генерируй код, нужны данные форм - делай инпуты. Я делал и так, и эдак - никто не умер. 1) Похуй что там на бекенде с чанками, раз горячие данные все равно в мемкеш.
Аноним 10/11/16 Чтв 19:01:59 #425 №873579 
В клаасах TableDataGataway методы статическими надо делать?
Аноним 10/11/16 Чтв 19:13:59 #426 №873582 
>>873579
Ты должен привязать БД к объекту при его создании, так что не статические.
Аноним 10/11/16 Чтв 19:19:11 #427 №873586 
>>873582
Так, что-то я запутался. Я думал, что ТДГ это типа есть класс Users, и для него создается класс для работы с БД UsersGateway с объектами типа insert, delete и прочее, но это датамаппер, а из уроков ОПа я что-то вообще не понял что такое ТДГ - как это для работы с разными сущностными использовать один класс?
Аноним 10/11/16 Чтв 19:19:33 #428 №873587 
>>873586
> с объектами
С методами
фикс
Аноним 10/11/16 Чтв 19:50:38 #429 №873603 
>>873552

Судя по описанию твой код это набор плохих практик. Дабы другие аноны не использовали их в своих проектах, опишу подробнее:

1) не надо писать свой кривой велосипедный шаблонизатор, есть twig который по возможностям раз в 100 мощнее "шаблонизатора" на strtr()
2) для получения данных по HTTP есть нормальные HTTP-клиенты
3) разобраться, почему происходят ошибки, надо
4) в принципе неправильно если при генерации обычной страницы ты шлешь куда-то HTTP запросы

> Концепция в том, что чем меньше HTML внутри php, тем лучше.
Ты плохо понял идею. Идея в том, чтобы отделить логику отображения страниц от логики обработки данных.

>>873557

Плохо сделано. А что если в переменной есть что-то, кроме цифр? А что, если она пуста?

В twig я делаю так:

var a = {{ a | json_encode | raw }};

В качестве домашнего задания оставлю тебе и другим анонам объяснить, как это работает, насколько надежно и зачем там raw.

> , всё-таки для получения вообще всех данных с бэкенда выполнять get-запросы непосредственно из js?
Какой смысл делать запрос, если можно обойтись без этого?
Аноним 10/11/16 Чтв 19:55:13 #430 №873607 
>>873579

Это почему?

>>873586

TDG принято называть класс, который содержит в себе все методы для работы с определенной таблицей. Дата маппер - класс, который отображает записи из БД на объекты. То есть TDG может включать в себя и функционал дата маппера, и что-то еще сверх того.

Также даю ссылки на перевод статей Фаулера по этим классам, попробуй сравнить их самостоятельно:

http://design-pattern.ru/patterns/table-data-gateway.html
http://design-pattern.ru/patterns/data-mapper.html

Аноним 10/11/16 Чтв 19:57:29 #431 №873609 
>>873130
Бамп
Аноним 10/11/16 Чтв 20:14:11 #432 №873616 
>>873607
>Это почему?
То я сначала все вообще не так понимал.
>Также даю ссылки на перевод статей Фаулера по этим классам, попробуй сравнить их самостоятельно:
Честно говоря, так и не понял в чем разница. А вот это вообще даже примерно не понял:
>Это что-то напоминающее DataMapper, но он может быть реализован без объектов-сущностей.
https://gist.github.com/codedokode/c4cbc4d7dc8e45ea074a
Аноним 10/11/16 Чтв 20:57:50 #433 №873635 
>>873616
Короче в TDG можно делать так:
$userGateway->setName($id, 'Новое имя') и объекты-сущности не требуются.
В DataMapper будет так:
$user = new User();
$user->setName = 'Новое имя';
$userMapper->persist($user);
Аноним 10/11/16 Чтв 21:17:33 #434 №873645 
>>873635
>$userGateway->setName($id, 'Новое имя')
Зачем $id?
> и объекты-сущности не требуются.
А как отображать данные? Ну т.е. вот у меня есть метод getAll. Где-то там в недрах есть код return $sth->fetchAll(\PDO::FETCH_CLASS, $class) - и что тогда вместо класса?
Аноним 10/11/16 Чтв 21:53:36 #435 №873662 
Читаю ссылка на ТДГ в Зенд. https://framework.zend.com/manual/1.12/ru/zend.db.table.html у меня сложилось впечатление, буд-то ТДГ скорее на эктив рекорд похоже. Я похожий велосипед недавно писал, как тут все наследуются от Zend_Db_Table, так у меня был класс Model, в котором были методы для работы с БД, а в наследованых классах-сущностях я только добавлял соответствующие поля и название таблицы. Или это у меня не эктив рекорд был?
Аноним 10/11/16 Чтв 23:25:34 #436 №873728 
>>873603
Понятно, короче, просто под твиг вывод переписать.
А в рав очевидно же, чтобы с &quot'ами проблем не было, хотя это и не очень безопасно.
Аноним 10/11/16 Чтв 23:31:58 #437 №873738 
>>873616

Во-первых, ты читаешь старую версию урока, вот новая, с небольшими дополнениями: https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md

Напишу еще раз:

TDG принято называть класс, который содержит в себе все методы для работы с определенной таблицей. Дата маппер - класс, который отображает записи из БД на объекты.

> А вот это вообще даже примерно не понял:
>>Это что-то напоминающее DataMapper, но он может быть реализован без объектов-сущностей.

Имеется в виду, что в TDG может быть метод updateName($userId, $userName), а в Data Mapper обычно сначала загружают объект в память, меняют ему имя и сохраняют обратно в БД. Но зато некоторые Data Mapper вроде Doctrine умеют сами искать измененные объекты и автоматически сохранять эти изменения.

>>873635

Неправильный пример. new User создаст нового пользователя. Редактирование делается так:

$user = $userMapper->findById(10);
$user->name = 'Новое имя';
$userMapper->save($user); // или, в продвинутых мапперах, просто $mapper->flush(), а дальше он сам найдет измененные сущности и сохранит их

>>873645

>>$userGateway->setName($id, 'Новое имя')
> Зачем $id?
А как без него понять, какому именно пользователю мы меняем имя?

>> и объекты-сущности не требуются.
> А как отображать данные? Ну т.е. вот у меня есть метод getAll. Где-то там в недрах есть код return $sth->fetchAll(\PDO::FETCH_CLASS, $class) - и что тогда вместо класса?
Имелось в виду, что для выполнения update() можно обойтись без загрузки и сохранения сущностей. В отличие от Data Mapper.

Аноним 10/11/16 Чтв 23:44:20 #438 №873755 
>>873662

В Зенде именно TDG так как там в примере

class Bugs extends Zend_Db_Table_Abstract
{
protected $_name = 'bugs';
}

Класс Bugs это класс для работы с таблицей, один его объект обеспечивает доступ ко всей таблице. С помощью этого объекта можно загружать и изменять любые строки.

В актив рекорд же методы работы с таблицей размещаются в модели, и один объект модели соответствует одной записи в таблице. И с его помощью можно менять только эту запись.

При этом в зенде некоторые методы выборки из БД возвращают объекты класса Zend_Db_Table_Row_Abstract. Они реализуют паттерн Row Data Gateway, то есть позволяют изменять соответствующую запись в БД и чем-то в этом плане напоминают актив рекорд.

>>873728

Это абсолютно безопасно. Согласно стандарту HTML содержимое тега script (а также style) воспринимается как есть и HTML-сущности там не декодируются. То есть если внутри script написать & quot то это будет воспринято буквально, а не как кавычка.

Если raw не использовать, то твиг заэкранирует спецсимволы и может получиться некорретный яваскрипт вроде

var x = & quot ; test & quot ;;

Вместо

var x = "test";

Единственный риск тут - если в наших данных содержится закрывающий тег </script> то можно закрыть тег script и вставить произвольный HTML. Но json_encode заменяет слеш / на \/ и потому закрывающий тег там не получится - получится <\/script>'

var x = '<\/script>'; // это не закрывающий тег

То есть то, что я предложил, основано на изучении стандарта и особенностей json_encode. Разумеется, большинство разработчиков, в том числе иностранных, почему-то не следует моему совету и придумывают каждый свой способ, либо с ошибками, либо с уязвимостями. Не хотят учиться.

Если используется шаблон на php то вывод еще проще:

var x = <?= json_encode($x); ?>;

Этот способ позволяет передать из PHP в JS любые значения, включая массивы и хеши.
Аноним 10/11/16 Чтв 23:53:28 #439 №873761 
>>873728

А без json_encode очень легко сломать JS. Ну например, в JS строках не разрешен перенос строки, и как я выше написал, если вставить строку </script> то можно закрыть тег script.

Так как JSON является (почти) подмножеством яваскрипт, то (почти) любой JSON код является валидным JS-выражением. Что бы мы не передавали в json_encode, мы получим (почти) валидное выражение.

(почти) здесь относится к паре экзотических символов которые недопустимы в JS строках, но допустимы в JSON:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON
> the Unicode line separator (U+2028) and paragraph separator (U+2029) characters are permitted;

К счастью (проверил экспериментально) json_encode кодирует эти спецсимволы как \u2028, а не вставляет как есть, и таким образом генерирует валидный JS-код.
Аноним 11/11/16 Птн 01:45:02 #440 №873807 
>>873738
Теперь почти все понял насчет ТДГ и дата мапера. Кроме одного - допустим мне нужен метод getAllNews что бы отображать новости на главной. В каком виде их выгружать из БД? Сохранять в виде масива объектов того же ТДГ, или же просто массив массивов делать?
Аноним 11/11/16 Птн 02:17:58 #441 №873816 
Ребятааааа, а есть среди вас те, кто может странички вконтакте взломать? Очень нужно. Дело тянет на уголовщину а-ля хабаровска, а доказать причастность не можем
Аноним 11/11/16 Птн 02:23:24 #442 №873819 
>>873816
А что за уголовщина случилась в Хабаровске?
Аноним 11/11/16 Птн 02:44:02 #443 №873824 
>>873816
Так просто же всё, вводишь в гугле "Взломать страницу вконтакте без смс", и он тебе находит несколько ресурсов. Сам так взламывал, брат жив.
Аноним 11/11/16 Птн 06:22:10 #444 №873855 
14788345310470.jpg
Вебом последний раз занимался в 2010-м, мама попросила запилить ей магазин для продажи шмоток-тряпок (авито уже не катит), порекомендуйте пхп магазин, чтобы поднять и настроить методы оплаты для русского покупателя, без лишнего геморроя?
Аноним 11/11/16 Птн 08:21:54 #445 №873864 
>>873807

> Сохранять в виде масива объектов того же ТДГ
TDG представлят объект для работы с базой данных, а не новость. Ты все равно все путаешь.

Открой урок и посмотри на пример класса NewsTableGateway. Он не может представлять новость так как у него нет нужных полей, вроде заголовка, текста новости и тд.

Чтобы представить новость, делается отдельный класс News, пример которого тоже есть в уроке.

Соответственно метод getAllNews() может возвращать массив объектов News. Иногда возвращают массив массивов, чтобы не делать отдельный класс для новости, но код в таком случае быстро превращается в лапшу, становится легко допустить ошибку итд.

>>873816

Таких мамкиных детективов сейчас по статье за незаконный доступ к информации сажают, уже были случаи. Расследованиями должна заниматься полиция.

Аноним 11/11/16 Птн 09:11:16 #446 №873869 
>>873527
Ладно. Тогда ответ на твой предыдущий вопрос:
>Попробуй написать выражение "одна цифра, за которой идет любое число скобок, пробелов, минусов".

Получилось такое:
$regexp = '/^[0-9][\(][\)][\-][\s]/u';

Так должно быть?
Аноним 11/11/16 Птн 09:12:27 #447 №873871 
>>873869
>$regexp = '/^[0-9][\(][\)][\-][\s]/u';
Т.е. $regexp = '/^[0-9][\(][\)][\-][\s]/u';

А то что-то звездочки пропали.
Аноним 11/11/16 Птн 09:14:51 #448 №873873 
>>873871
В общем, после скобок [\(], [\)], [\-] и [\s]
звезды у меня стоят, но их макаба как курсив видит.
Аноним 11/11/16 Птн 09:26:29 #449 №873877 
>>873855
битрикс
Аноним 11/11/16 Птн 09:31:04 #450 №873878 
>>873877
Хуитрикс
Аноним 11/11/16 Птн 10:10:30 #451 №873884 
14788482308010.png
>>873359
А так понятно?
Аноним 11/11/16 Птн 12:39:01 #452 №873922 
>>873864
>Чтобы представить новость, делается отдельный класс News, пример которого тоже есть в уроке.
Понял. Вот это мне и нужно было. Но с моей колокольни выглядит несколько неудобно то, что приходится делать пустой класс чисто для отображения. Ну да и ладно.
Кстати ОП, а ты будешь делать уроки по всяких паттернам окромя баз данных? Ну там всякие фабрики, фасады, декораторы? Уж больно годно у тебя получается.
Алсо есть такой баг или фича непонятная в IDE - когда я делаю класс синглтононом я не могу смотреть их через автодополнение. Такая хуита в нетбинсе и эклипсе. Что бы это значило? Это баг, или я чего-то не понимаю в ООП и паттерне синглтон?(использую синглтон для класса соединения с БД)
Аноним 11/11/16 Птн 12:43:17 #453 №873925 
>>873855
Wordpress с плагином Woocommerce.
inb4: хуйпресс с плагином хуйкомерце
Аноним 11/11/16 Птн 12:54:33 #454 №873927 
>>873925
ИМХО быстрей будет уже поднять какой-нибудь опенкарт или престашоп.
Аноним 11/11/16 Птн 17:25:01 #455 №874038 
Добрый день, парсил с помощью curl большой инет магазин (700к товаров) и вроде как парсил мелкими порциями но (250 товаров раз в 15 минут) но теперь ловлю ответом access denied. Сервер мой стоит на виртуалке убунты, внешний IP у неё такой же как и на основной машине. При этом с браузера я могу зайти нормально, а именно curl нарывается на баг, пробовал сменить CURLOPT_USERAGENT - не помогло. Если бан дали не на IP и не на IP + useragent - тогда на что?
Аноним 11/11/16 Птн 17:31:33 #456 №874039 
>>874038
>баг
*бан
selffix
Аноним 11/11/16 Птн 18:02:58 #457 №874056 
>>874038
Поигравшись с опциями всё таки обошел бан установив no-cache.
Аноним 11/11/16 Птн 18:05:51 #458 №874057 
>>874038
хуй знает
посмотри все остальные хедеры
посмотри как он с куками работает
Аноним 11/11/16 Птн 18:50:57 #459 №874081 
Посмотрите, пожалуйста.

Нормально сделано задание про палиндром ?
Решал сам, без мам пап и кредитов.

http://ideone.com/iCawI5
Аноним 11/11/16 Птн 20:00:13 #460 №874134 
>>874081
Поставь там везде echo "Палиндром"/echo "Не палиндром", иначе ничего не понятно.
Аноним 11/11/16 Птн 21:03:48 #461 №874162 
Няши, чекните мое решение, пожалуйста.
https://github.com/anonymous011010/studentslist
Аноним 11/11/16 Птн 23:18:43 #462 №874239 
>>867039
>>867314
https://github.com/someApprentice/maintaskforlayout
https://someapprentice.github.io/maintaskforlayout/

>кроссбраузерность

В ie7,8 ширина body всегда равна ширине окна. А вот в ie6 всё хорошо.

Даже оригинальный otf формат шрифта главного заголовка не отображается в ie6-8. В отличие от шрифта Lato.

Стили и вес моего семейства шрифтов Lato распределяются как попало:

firefox, webkit Наличие описания веса bolder переопределяет значение normal, т.е. c regular на bolder
ie<8 Цифровые значения веса наклоняют шрифты с жирным начертанием
ie Лёгкие шрифты становится жирными
firefox Лёгкие шрифты не определяются

Если убрать описание шрифтов с цифровым значением веса, то в webkit'е так же ломается отображение легких шрифтов - они становиться жирными. Далее, если убрать описание bolder, то абзацы вместо того чтобы стать lighter становится regular, т.е. normal. Однако, это чинит наклонность шрифтов в ie<8.


>адаптивность
Теперь должно быть лучше.
При ширине в 320px всё выглядит хорошо, а вот если сжимать больше, то изображения и другие элементы будут вылазить за пределы тела в зависимости от своих размеров.

Ещё я заметил странный отступ у ссылок на соц.сети в webkit'е. Его задает ul, menu, dir { user agent stylesheet
display: block;
list-style-type: disc;
-webkit-margin-before: 1em;
-webkit-margin-after: 1em;
-webkit-margin-start: 0px;
-webkit-margin-end: 0px;
-webkit-padding-start: 40px;
}

Что это такое?

Удивительно то, что в остальных браузерах элемент выглядит точно так же - без отступа, но на том же месте.


>переработка базовых стилей
>Далее, тебе надо проработать базовые стили CSS. Сделай новый файл с пустым body и впиши в него простой HTML без классов, с тегами вроде h1, h2, ul, li, p, a, img, blockquote (если нет фантазии или лень писать, скопируй с http://motherfuckingwebsite.com/ ). У тебя этот текст выводится бледно-серым на белом фоне - это значит, базовые стили не продуманы совсем. Ты написал не базовый CSS для всего сайта, а стили для единственной страницы и при добавлении новых страниц твой ксс придется значительно переделывать.
А нужно добиться чтобы на этой странице все заголовки и т.д. были как на главной странице? Как быть с цветом? В шаблоне половина страницы с черным фоном, половина с белым - тяжело догадаться какой будет у остальных страниц. Всегда должен быть белый?

Я старался найти ответы самому. Я могу хотя бы рамках обучения спросить подсказку? Учитывая что я первый раз верстаю. Что делать если такие не очевидные вопросы появится в боевых задачах? Такое поведение браузеров для меня очень странное, и я не знаю где я допустил пробел в изучении верстки, что у меня нету понимания почему так происходит.
Аноним 12/11/16 Суб 04:10:23 #463 №874329 
>>874081
http://ideone.com/jQsSOF
Аноним 12/11/16 Суб 06:04:02 #464 №874336 
>>873130
>>873130
я конечно только вкатывальщик с недельным стажем. но в пятой сточке не хватает открывающих кавычек. и вроде бы именно об этом написано внизу.
Аноним 12/11/16 Суб 08:04:44 #465 №874349 
Привет,
подскажите по JS 12 задаче:
метод hamburger.calculateCalories() указанный в примере работы с классом и метод Hamburger.prototype.getCalories указанный в заготовке класса, это разные методы? Если да, то чем они отличаются? Или один, просто названия разные?
Аноним 12/11/16 Суб 10:15:04 #466 №874361 
>>874349

Это одно и то же, ОП опечатался.

>>874081

Программа не пишет в итоге, палиндром это или нет.

> PHP Notice: Use of undefined constant i - assumed 'i' in /home/54lEmO/prog.php on line 16
Надо исправить, ты знак доллара забыл наверно.

Переменную $k незачем отдельно уменьшать, удобнее ее вычислять из $i каждый раз.

>>874329

Твоя программа любое слово считает палиндромом: http://ideone.com/0T6DlV

Ты ее хоть тестировал? И там внизу ошибка написана.

Ну и я бы советовал внимательнее читать официальный мануал или мои уроки. То, что функция strrev переворачивает строку в каких-то других языках, не значит, что она работает так же в PHP. В PHP она работает только с ASCII символами и не работает с кириллицей: https://gist.github.com/codedokode/ff99e357e9860ea169b8
Аноним 12/11/16 Суб 12:57:54 #467 №874405 
PHPч, помоги нуфаку. Нормальным ли является решение написание php скриптов прямо в html файле страницы? Как я понял, браузером они не отображаются. И как можно изолировать .php файлы от .html файлов, и как потом их вызывать в html-формах в атрибуте form [action], если .php скрипт изолирован от .html файла?
inb4 гугли собака
гуглю уже прямо сейчас, просто мб анон может сам расписать или дать линк на достоверный/годный источник, где расписаны за и против различных методов симбиоза html и php?
Аноним 12/11/16 Суб 13:06:19 #468 №874411 
>>874405
В файлах шаблонов лежит только вывод информации, вся логика работы лежит отдельно.
PHP, JS скрипты лежат отдельно.
Когда твой php-скрипт отработал и все данные уже в конечном виде находятся и готовы к отображению - подключаешь подходящий файл с шаблоном и выводишь информацию на экран.

Если у тебя есть форма для обратной связи: в атрибуте action хранится путь к файлу который будет обрабатывать информацию из твоей формы, в атрибуте method хранится способ передачи: (POST/GET). Когда ты отправил данные, скрипт из action её обработал (валидация данных и тд) исходя из того какой результат обработки ты возвращаешь пользователю ту же страницу с ошибками, либо с надписью, что всё ОК и тд. Лучше почитай у ОПа есть статья по работе с формами.
Аноним 12/11/16 Суб 13:12:47 #469 №874417 
>>874411
Ага, благодарю. Подключать в .html файлы .php можно только <?php include '%path%/*.php' ?>
или есть более предпочтительные альтернативы?
Аноним 12/11/16 Суб 13:13:53 #470 №874421 
>>874405
Гугли MVC. Если кратко - то пхп-код можно использовать только в шаблонах для вывода содержимого страницы. Допустим, есть у тебя пхп-код, в котором ты подключаещбся к БД и вытаскиваешь из нее инфу по юзеру. Выглядит примерно так:
$user = new User();
$user->getById(1) //метод который заполняет свойства объекта user по id
Дальше просто подключаешь шаблон(именно так тоже лучше не делать, просто для наглядности)
include 'user_template.html';
В подключаемом файле, помимо хедера и боди что-то вроде того:
<table>
<tr>
<td><?php> echo $user->name; </php></td>
<td><?php> echo $user->secondName; </php></td>
</tr>
</table>
Как-то так. Короче в шаблоне можно использовать немного пхпшного когда для вывода инфы, но вот в пхпшном коде нельзя. Если все правильно делаешь, то у тебя получается нормальное разделение когда на бизнес-логику(т.е. само программирование) и логику отображения(для того верстка и нужна).
Аноним 12/11/16 Суб 13:31:26 #471 №874427 
>>874405

Есть статья http://www.phpinfo.su/articles/practice/shablony_v_php.html

> Нормальным ли является решение написание php скриптов прямо в html файле страницы?
Нет, это ведет к бардаку в коде.

> И как можно изолировать .php файлы от .html файлов, и как потом их вызывать в html-формах в атрибуте form [action], если .php скрипт изолирован от .html файла?
Тебе надо разобраться как работает веб-сервер. Без этого дальше двигаться нельзя. Что по твоему указывается в атрибуте action у тега form? Ты можешь объяснить, что происходит когда ты заполняешь форму и нажимаешь кнопку отправки?

Тебе сначала надо на 100% в этом разобраться.

Алсо у меня есть урок по обработке форм ( https://github.com/codedokode/pasta/blob/master/forms.md ), но сначала тебе надо разобраться с тем что происходит при их отправке.

>>874417

Лучше require. Посмотри чем оно отличается от include.

Аноним 12/11/16 Суб 13:45:06 #472 №874438 
>>873025
Ну так вот об этом и речь. Что непонятно нифига новичку, куда какие методы нужно писать. Некоторые вещи как например взаимодействие классов вообще не ясно как будет работать.

Например по моей логике как раз
>Вообще, у разных существ может быть разная восприимчивость к видам урона, логичнее сделать у существа метод "принять урон", а не закладывать что он всегда складывается.
За эту разную восприимчивость к разному урону будет отвечать обязательный для каждого существа объект армор.
Аноним 12/11/16 Суб 13:50:51 #473 №874442 
>>874421
Спасибо за ответ, пока, правда, не совсем понимаю сути
include 'user_template.html'
Типа берется шаблон разметки (причем не всей, а какой либо её части, типа только div с таблицой из бд), заполняется посредством скрипта php, который в свою очередь соединяется с MySQL (кстати, только MySQL или возможны соединения с любыми БД, типа там постгрес, мсскл, и прочие?) бд, а потом заполненный контентом кусок html подгружается пользователю через какой нибудь ajax?
>>874427
>Что по твоему указывается в атрибуте action у тега form? Ты можешь объяснить, что происходит когда ты заполняешь форму и нажимаешь кнопку отправки?
На данный момент думаю (не знаю точно, но исходя из того, что успел прочитать по html, js и php), по нажатию input-элемента с type-submit происходит invoke действия, указанного в action. В целом, как я понимаю, туда можно захуячить что угодно: js code, php code, главное, чтобы браузер мог это выполнить. Думаю, что в action <form> можно указать путь к .php файлу, который содержит инструкции, которые необходимо выполнить, используя полученные от клиента параметры из $_GLOBALS и прочих $_POST $_GET, ну и потом по необходимости сообщить клиенту соответствующий ответ.
Насчёт урока и require вместо include - патиба, сейчас посмотрю.
Аноним 12/11/16 Суб 14:05:07 #474 №874453 
>>874442
>Типа берется шаблон разметки (причем не всей, а какой либо её части, типа только div с таблицой из бд), заполняется посредством скрипта php, который в свою очередь соединяется с MySQL (кстати, только MySQL или возможны соединения с любыми БД, типа там постгрес, мсскл, и прочие?) бд, а потом заполненный контентом кусок html подгружается пользователю через какой нибудь ajax?
Смотри. Ты видимо не до конца понял что такое программирование, а что такое верстка. Представь что ты работаешь в команде из двух человек. Ты кодер - т.е. делаешь внутренную логику сайта, а твой напарник верстальщик, он делает красивый дизайн. Ты плохо разбираешься в верстке, он плохо в программировании. Задача, допустим, сделать маленький новостной сайт. Есть база данных(любая - mysql, postrge)в ней таблица - с новостями, поля - id новости(надеюсь ты понимаешь что это и зачем оно), заголовок новости, автор, ну и содержимое. Твоя задача как кодера - написать код, который каким-то образом вытаскивает данный из таблица и представляет ее в удобном виде(массив новостей, а еще луче массив объектов-новостей). А верстальщик делает красивую верстку для странички со списком новостей. Вот и подумай - будет ли вам удобно работать с кодом, где все это смешано? Того то и разделяют дизайн(отображение) и логику(код). Допустим ты сделал свой код, в качестве условного шаблона просто подключаешь сначала пустой шаблон в котором максимум выводишь все данные из весртки, а верстальщик уже расставляет эти данные что бы все красиво выглядело.
Аноним 12/11/16 Суб 14:36:20 #475 №874470 
14789505802090.gif
Привет, анон. Нужен твой совет. Суть такова. Живу в сраной Украшке. И срочно потребовалась прибавка к зп, небольшая по московским или даже киевским меркам, может и небольшое, но по нашим мухосранским достаточно ощутимая. И я в общем-то наслышан, что Пых предоставляет такую возможность. Знаю английский на хорошем уровне. Из программирования знаком с сишкой (по учебнику Дейтела) и Жабку на уровне первого тома опус магнума Хорстманна-Корнелла. Я просто в начале года пытался раньше вкатиться в кодинг, но обстоятельства так сложились, что очень мало было свободного времени, да и то проебал попусту.

Так вот в чём вопрос. Сейчас как раз у меня нечто вроде отпуска почти на месяц, свободное время есть. Имеет ли смысл его потратить на пых, вместо того чтобы ковырять жабку? И как это сделать максимально быстро? Имеет ли смысл следовать гайду в оп-посте, или мой мизерный и не из этой оперы опыт поможет мне начать с чего-то более хардкорного, но быстрее?
Аноним 12/11/16 Суб 14:43:17 #476 №874473 
>>874470
Ну то есть ты хочешь за месяц вкатится во фриланс на языке, с которым не знаком + не имея опыта коммерческой разработки вообще ни на одном языке?
Аноним 12/11/16 Суб 14:43:50 #477 №874474 
>>874470
Тут наверное стоит упомянуть какие вещи ты писал на каких языках, потому что книги, которые ты прочитал ни о чем не говорят, судить о твоих скилах можно только по практическому опыту.
Аноним 12/11/16 Суб 14:44:15 #478 №874476 
>>874473
ну не за месяц, естественно, за 5-6 хотя б. Просто этот месяц как раз свободен и хочется использовать его предельно эффективно.
Аноним 12/11/16 Суб 14:52:26 #479 №874482 
>>874470
Чё-т не пойму эту гифку, не в первый раз вижу, только сейчас заинтересовался.
Какого чёрта deadline переносится, когда соня переносит с 15 пятницы на 13 среды? Dead - по этой логике - должна была пройти мимо его...

По сути твоего поста: всё имеет смысл. В PHP ты вкатишься быстро, если Javascript знаешь, поскольку PHP почти полностью копирует Javascript (ну, мне так показалось, когда одно после другого изучал, а JS всё-таки появился раньше и намного).
Другое дело, что надо будет разбираться во всяких CMS, работающих на PHP, а этого за месяц не освоить.
Но пробовать надо всегда и в любом случае.
Аноним 12/11/16 Суб 14:52:49 #480 №874483 
>>874476
PHP, JS сейчас основные направления во фрилансе.
https://github.com/anonymous011010/studentslist Аноним 12/11/16 Суб 14:53:27 #481 №874485 
>>865783
>>868436
>>874162

> https://github.com/anonymous011010/studentslist/blob/master/studentslist.sql#L38
> UNIQUE KEY `id_UNIQUE` (`id`),
Это не нужно так как первичный ключ по определению (ПК = идентификатор записи) уникален.

Я бы советовал не перемешивать файлы бутстрапа со своими, а положить их в отдельную папку. Так легче понять где чей код и проще обновлять библиотеку потом будет.

https://github.com/anonymous011010/studentslist/blob/master/app/bootstrap.php
Задача бутстрап-скрипта только инициализировать приложение и подготовить к работе. А не определять УРЛ и запускать контроллер. Ну вот например если мы захотим написать скрипт для командной строки, мы не сможем использовать бустрап файл, так как он попытается запустить контроллер, который в командной строке не имеет никакого смысла.

В твоем случае содержимое бустрап файла можно было бы просто поместить в index.php.

https://github.com/anonymous011010/studentslist/blob/master/app/bootstrap.php#L9
Мне не очень нравится идея использования констант для настроек: они доступны везде глобально и мы не можем ограничить область, где они доступны, не можем их передать только в определенные объекты.

https://github.com/anonymous011010/studentslist/blob/master/app/Handler.php
Этот класс стоило поместить в файл, путь к которому соответствует неймспейсу. Название стоит поменять, так как Handler значит "обработчик" и непонятно, что именно он обрабатывает.

Имена функций принято начинать с глагола, handleError, а не errorHandler.

https://github.com/anonymous011010/studentslist/blob/master/app/Handler.php#L33
У тебя не очень логичный подход в обработке ошибок. Если произошла ошибка, то ты продолжаешь выполнять программу, скорее всего с неправильными данными.

На мой взгляд единственно верный способ обработки ошибок это преобразование их в исключения: http://php.net/manual/ru/class.errorexception.php

Непонятно, почему разработчики PHP не сделали так с самого начала. Вся эта идея с 20 видами ошибок - пример неправильного проектирования. Статья по теме: https://habrahabr.ru/post/218325/

Ты там еще пытаешься не завершать приложение при непойманном исключении, но это бессмысленно, так как скрипт в любом случае завершится.

Также, ты по моему изобретаешь велосипеды. Ну например, ты выводишь ошибки при установленном APP_DEBUG, но в php.ini уже есть настройка, отвечающая за вывод ошибок на экран: display_errors.

Ты делаешь свой логгер, но в PHP уже есть лог ошибок и возможность писать в него через error_log(). В чем смысл заводить отдельный лог?

Наконец, если уж делать логгер, то лучше следовать интерфейсу логгера из PSR-3:

- (англ) http://www.php-fig.org/psr/psr-3/
- (рус) http://svyatoslav.biz/misc/psr_translation/#_PSR-3

В этом случае ты мог бы использовать любой из сторонних логгеров.

Также, в логгере не очень понятно назначение метода setLogFile(). Зачем может понадобиться менять путь к лог-файлу в процессе? Разве недостаточно указать его при создании объекта?

Запись в файл сделана довольно неэффективно. Если тебе надо что-то писать в файл кусочками, то стандатный способ - fopen/write/fclose, а ты по сути на каждое сообщение открываешь и закрываешь файл.

> \RuntimeException('Unable to create the log file');
В исключении надо указывать путь к файлу, иначе непонятно какой именно файл не удалось создать.

> public function log($type, $message, $file, $line) {
Ты в функию логгирования уже закладываешь что всегда есть имя файла и номер строки. Это потому что ты не не разделяешь функционал обработчика ошибок от логгера и у тебя логгер "знает" про то, какие свойства есть у ошибки.

https://github.com/anonymous011010/studentslist/blob/master/app/Handler.php#L12
> Logger::getInstance();
Синглтон это вредный антипаттерн. Если твоему классу нужен логгер, то его стоит внедрять через внедрение зависимостей: https://github.com/codedokode/pasta/blob/master/arch/di.md

https://github.com/anonymous011010/studentslist/blob/master/app/bootstrap.php#L7
use принято ставить в самом начале файла.

https://github.com/anonymous011010/studentslist/blob/master/app/Studentslist/Core/Router.php#L14
Здесь тоже сделано нелогично. Конструктор предназначен для инициализации и подготовке объекта к использованию. Нелогично и неожиданно что конструктор может внезапно вызвать контроллер, который выведет страницу.

https://github.com/anonymous011010/studentslist/blob/master/app/Studentslist/Core/Router.php#L45
> if ($_SERVER['REQUEST_URI']) {
А что будет если условие не сработает?

> return $url = \explode
Зачем тут "$url = "? зачем создавать переменную, которая нигде после не используется?

> list($urlPath, ) = \explode('?', \filter_input(\INPUT_SERVER, 'REQUEST_URI', \FILTER_SANITIZE_URL));
для этого есть функция parse_url

> \rtrim(\ltrim($urlPath, '/'), '/')
trim умеет обрезать с обоих сторон.

> if (\class_exists('\Studentslist\\Controllers\\' . \ucfirst($url[0]) . 'Controller')) {
> $this->controller = \ucfirst($url[0]);
Тут тоже нелогично, получается при любом несуществующем URL вроде /asdasdad будет вызван контроллер index, а должна быть страница 404.

Ну и твой метод роутинга на мой взгляд неудачный, так как он допускает существование множества URL для одной страницы, вроде /index/action/1/2/3/4/5/6/7/8, хотя у каждой страницы должен быть единственный URL.

> $page = ((!$page) || ($page < 1)) ? 1 : $page;
тут удобнее использовать max()

https://github.com/anonymous011010/studentslist/blob/master/app/Studentslist/Core/Controller.php#L15
> Метод получения объекта класса StudentDataGateway
ты для каждого класса будешь делать по статическому методу в контроллере? При этом для класса DBHelper ты почему-то метод не сделал, а создаешь его через new.

Я конечно не знаю, как тут лучше сделать, может быть стоит сделать отдельный контейнер для получения объектов, и передавать его в контроллер, но это немного усложнит код.

> $token = (isset($_COOKIE['authToken'])) ? \filter_input(\INPUT_COOKIE, 'authToken',
> if ($auth->isRegistred($token)) {
Получение токена тоже наверно лучше инкапсулировать в класс авторизации

> $ErrorController = new \Studentslist\Controllers\ErrorController;
> $ErrorController->error404();
Название метода должно начинаться с глагола.

> \filter_input(\INPUT_GET, 'order', \FILTER_SANITIZE_STRING)
Ты знаешь, что именно делает \FILTER_SANITIZE_STRING, и зачем это тут нужно? Или ты ставишь "на всякий случай"? На мой взгляд бесполезные действия только усложняют проверку, безопасен ли код.

Методы search() и all() очень похожи, зачем 2 раза писать одно и то же?

> \filter_input(\INPUT_GET, 'q')
А что эта функция делает?

> public static function renderViewTable
Базовый контроллер должен содержать какие-то универсальные методы. Но тут явно метод, который нужен только на странице вывода таблицы со студентами. Зачем его помещать в общий для всех базовый контроллер?

> exit(0);
Это на мой взгляд неправльно. А что если тебе надо после отображения страницы еще что-то сделать? да и название функции никак не говорит о том, что она завершает программу.

> public static function renderErrorView
Непонятно, чем это отличается от public static function renderView.

И кстати, почему методы render статические?

https://github.com/anonymous011010/studentslist/blob/master/app/Studentslist/Controllers/FormController.php
Тут методы редактирования и регистрации почти одинаковые. Не надо копипастить код.

Вообще, у тебя в коде слишком много die и exit. Я бы их убрал.

> header("Refresh:5; url=" . \APP_URL_ADDR, true, 303)
Это неправильный подход. Где гарантия что пользователь за 5 секунд успеет прочитать страницу? А если он слепой и исполоьзует программу для чтения вслух? А если он отвлекся?

> } catch (\PDOException $ex) {
> $data['fail']['message'] = "Не удалось изменить данные, пожалуйста, повторите попытку снова.";
PDOException возникает при ошибке работы с БД, например если SQL запрос написан непраивльно. Какой смысл писать особый код для обработки этой ошибки? У тебя ведь уже есть страница на случай исключения.

https://github.com/anonymous011010/studentslist/blob/master/app/Studentslist/Controllers/FormController.php#L81
тут слишком много вызовов renderView на мой взгляд.

https://github.com/anonymous011010/studentslist/blob/master/app/Studentslist/Helpers/DBHelper.php#L26
> public function getOrder($order) {
Это проще переписать через массив разрешенных значений и in_array

https://github.com/anonymous011010/studentslist/blob/master/app/Studentslist/Helpers/DBHelper.php#L72
Это нужно для записи в БД? Тогда этот метод должен быть в StudentDataGateway.

https://github.com/anonymous011010/studentslist/blob/master/app/Studentslist/Helpers/Paginator.php#L24
тут слишком много аргументов у конструктора. Надо либо передавать опции массивом, либо, что лучше, разделить их на обязательные и необязательные, необязельные задавать отдельными методами.

https://github.com/anonymous011010/studentslist/blob/master/app/Studentslist/Helpers/Paginator.php#L81
> public function __set($property, $value) {
Попытка обращения к несуществующему свойству не вызовет ошибки и останется незамеченной.

Сам класс пагинации на мой взгляд, сделан переусложненно. Проще было наверно сформировать в функции массив для вывода, содержащий номера, ссылки на страницы и признак многоточия.

В ссылки не обязательно подставлять имя хоста, хватило бы относительной ссылки.

https://github.com/anonymous011010/studentslist Аноним 12/11/16 Суб 14:54:14 #482 №874486 
>>865783
>>868436
>>874162

Еще, задачи классов TableHelper, NavHelper, Paginator довольно-таки сильно пересекаются, не лучше ли генерацию ссылок перенести в один класс и передавать параметры как аргументы, вроде такого:

getStudentTableLink($order = null, $sort = null, $query = null)

Это могло бы помочь уменьшить число аргументов в конструкторе и число полей.

https://github.com/anonymous011010/studentslist/blob/master/app/Studentslist/Helpers/TokenHelper.php
На мой взгляд создание аутентификационного токена логичнее делать в классе Auth.

https://github.com/anonymous011010/studentslist/blob/master/app/Studentslist/Models/Student.php#L41
Вот не уверен, что тут надо делать read only свойство через магические методы. Не лучше ли сделать геттер и тем самым явно показать что оно только для чтения?

Более того, там у тебя и сеттер есть, непонятно, зачем там вообще магические методы. Главный их недостаток в том что они запутывают код, надо их изучать и тратить время. Я бы советовал их избегать, тем более что особой надобности в них тут нет.

https://github.com/anonymous011010/studentslist/blob/master/app/Studentslist/Models/StudentDataGateway.php#L42
LIMIT и OFFSET надо бы поставлять через плейсхолдеры. Я вижу что тут переменные вставляются прямо в SQL запрос, значит возможна SQL инъекция.

https://github.com/anonymous011010/studentslist/blob/master/app/Studentslist/Models/StudentDataGateway.php#L42
> public function addStudent(array $student) {
Почему array $student, когда у тебя есть удобный класс Student? Причем ведь у тебя не написано, какие поля должны быть в массиве. Надо сидеть изучать код чтобы понять как воспользоваться этой функцией.

> SELECT EXISTS(SELECT `id`
Проще писать просто SELECT id ... LIMIT 1 или SELECT COUNT(*)

https://github.com/anonymous011010/studentslist/blob/master/app/Studentslist/Models/StudentValidator.php
Неудачная идея возвращать true либо строку. Логичнее при отсутствии ошибок возвращать пустое значение.

> (\S[^@])+
А что это значит? Должны чередоваться не-пробел и не-@? Вроде "@ @ @ @ @ @" ?

> if (!\preg_match_all($regExp, $email)) {
preg_match_all используется для поиска нескольких совпадений с регуляркой, тут логичнее использовать preg_match

> } elseif ($this->gateway->checkEmailExists($email)) {
> if ($this->gateway->getEmailOwnerId($email) != $id) {
Это кстати можно сделать одним SQL запросом

> "/^([а-яё]+[-\\s']?){1,32}$/
Эта регулярка пропустит гораздо больше 32 символов.

Для значений пола стоит завести константы Student::GENDER_MALE. Для метса жительства либо константы, либо true/false.

https://github.com/anonymous011010/studentslist/blob/master/app/Studentslist/Views/navbar.php#L23
> value="<?= (isset($data['search'])) ? $data['search'] : ''; ?>">
тут возможна XSS

> <li class="disabled"><a href="#">…</a></li>
Что это за ссылка с адресом #? Тут надо использовать спан вместо <a>.

> endif;
каждую такую команду в шаблоне принято заключать в <?php ?>

https://github.com/anonymous011010/studentslist/blob/master/app/Studentslist/Views/results.php этот файл очень похож на index.php

Имена шаблонов обычно выбирают, чтобы они соответствовали именам контроллеров и действий.

> Возможна попытка CSRF-атаки, пожалуйста, проверьте
Лучше бы убрать про CSRF атаку и просто написать что для успешной отправки формы нужно включить поддержку кук в браузере.

Чтобы не писать везде в шаблоне $data, обычно данные из массива превращают в переменные с помощью extract().

https://github.com/anonymous011010/studentslist/blob/master/logs/.gitignore
gitignore лучше класть в корень проекта в одном экземпляре.
Аноним 12/11/16 Суб 15:25:28 #483 №874502 
Молю, помогите сделать запрос
http://ideone.com/HNVYLP
Аноним 12/11/16 Суб 15:29:55 #484 №874506 
>>874502
Для начала у тебя в echo не открыта кавычка перед текстом.
Аноним 12/11/16 Суб 15:37:18 #485 №874513 
>>874239

Этот тред специально для обсуждения задач, так что можешь тут писать, все, что непонятно, и задавать вопросы в любом количестве.

Проблемы со шрифтами

У меня в Хромиуме не работают кастомные шрифты.

При этом на вкладке Network в отладчике я вижу, что идет загрузка файла https://someapprentice.github.io/maintaskforlayout/fonts/lato-black-webfont.woff (только этого почему-то)

Я попробовал открыть страницу в фаерфоксе и там в отладчике пошли ошибки:

> downloadable font: invalid version tag (font-family: "Lato" style:normal weight:normal stretch:normal src index:0)
source: > https://someapprentice.github.io/maintaskforlayout/fonts/Lato-Regular.eot stylesheets.css

Видимо при наличии 2 атрибутов src браузер грузит шрифт по самой первой ссылке, и так как не понимает формат eot, бросает это дело.

Я в отладчике Хрома на вкладке Sources отредактировал твой CSS и убрал лишнюю строчку src - и шрифт заработал.

Есть статья на Хабре с проверенным синтаксисом

- https://habrahabr.ru/post/113136/
- (англ, более подробно) http://blog.fontspring.com/2011/02/the-new-bulletproof-font-face-syntax/

> Даже оригинальный otf формат шрифта главного заголовка не отображается в ie6-8. В отличие от шрифта Lato.

Для старых IE скорее всего нужен eot.

Также,мне кажется, не надо было определять шрифты для всех значений веса и стиля. Достаточно определить только для тех, что нужны на странице: напимер, обычный, тяжелый, сверхтяжелый.

> firefox, webkit Наличие описания веса bolder переопределяет значение normal, т.е. c regular на bolder
Я думаю, проблема была в 2 свойствах src. Также, у браузеров есть особенность: если им нужен тяжелое или курсивное начертание шрифта, а оно отсутствует, то они генерируют его из обычного механически (получается очень некрасиво). Возможно в этом дело?

И еще, font-weight bold и font-weight 700 по моему это одно и то же. bold это синоним 700:

https://www.w3.org/TR/CSS2/fonts.html#font-boldness

"firefox Лёгкие шрифты не определяются" - а где это можно увидеть? Без кода я не могу проверить. Можешь на jsfiddle или отдельной html страницей сделать пример?

С шрифтами надо бы разобраться.

> При ширине в 320px всё выглядит хорошо, а вот если сжимать больше, то изображения и другие элементы будут вылазить за пределы тела в зависимости от своих размеров.
Ну я сомневаюсь что есть устройства меньше 320px: http://mydevice.io/devices/

Дефолтные стили

> Ещё я заметил странный отступ у ссылок на соц.сети в webkit'е. Его задает ul, menu, dir { user agent stylesheet
user agent stylesheet - это встроенные в браузер CSS стили. Их можно увидеть в исходных кодах браузера по ссылкам тут:

http://stackoverflow.com/questions/6867254/browsers-default-css-for-html-elements/6867287#6867287

Они нужны чтобы по HTML без CSS смотрелся относительно нормально: чтобы между абзацами были отступы, чтобы заголовки были написаны большим шрифтом, чтобы ссылки были синими и подчеркнутыми. (и кстати твой CSS тоже должен адекватно отображать обычный HTML код)

Стили по умолчанию отображают HTML примерно так, как отображали первые браузеры.

В твоем примере

ul {
display: block;
list-style-type: disc;
-webkit-margin-before: 1em;

задает, что тег ul по умолчанию имеет указанные свойства. Например, что он блочный, что элементы списка в нем маркируются точками и что перед ним делается отступ в 1em.

Стили по умолчанию надо учитывать, если они тебе мешают, то можно переопределить нужные своства.

> А нужно добиться чтобы на этой странице все заголовки и т.д. были как на главной странице? Как быть с цветом? В шаблоне половина страницы с черным фоном, половина с белым - тяжело догадаться какой будет у остальных страниц. Всегда должен быть белый?
Нужно догадаться, какой стиль является "стилем по умолчанию". В случае с этим макетом, я думаю, по умолчанию текст должен быть написан примерно как в абзаце под заголовком "Consectetur" на белом или бледно-сером фоне, шрифтом Lato. А черный фон как раз используется чтобы выделить шапку и подвал и как бы показать что это отдельные блоки.

Стили по умолчанию нужны, представь, что завтра мы захотим добавить на сайт просто текстовую страницу. Хорошо бы, чтобы нам не пришлось для нее почти ничего добавлять в CSS и чтобы при этом она соответствовала сайту по стилю.

Ссылки в стилях по умолчанию наверно можно сделать красными (или сделать их красными при наведении).

Для соцсетей надо сделать изменение при наведении.

Сам код посмотрю наверно попозже.
Аноним 12/11/16 Суб 15:42:56 #486 №874516 
>>874506
Не помогло
Аноним 12/11/16 Суб 15:47:39 #487 №874519 
>>874516
На ideone ты это не запустишь в любом случае
Аноним 12/11/16 Суб 15:53:05 #488 №874525 
>>874519
Я знаю
Аноним 12/11/16 Суб 16:04:18 #489 №874531 
>>873037

http://ideone.com/Q9Ypyc

Шестнадцатая! Осталось переделать гамбургеры, электростанции и типы переменных, и на DOM.
Аноним 12/11/16 Суб 16:13:22 #490 №874536 
>>874531

12 - http://ideone.com/873GTD
14 - http://ideone.com/vEyOAj

Источник - https://gist.github.com/codedokode/ce30e7a036f18f416ae0
Аноним 12/11/16 Суб 16:43:33 #491 №874554 
А бывают стримы программирования, типа твича для программистов?
Аноним 12/11/16 Суб 16:47:08 #492 №874556 
14789584287820.jpg
>>874554
Сразу вспомнил.
Аноним 12/11/16 Суб 16:49:31 #493 №874559 
>>874554
Да, у хекслета бывают. У меня приятель может постримить жаваскрипт.
Аноним 12/11/16 Суб 16:49:42 #494 №874560 
>>874554
Хотел было пошутить, но они и вправду есть.
https://www.livecoding.tv/wpkenpachi/
Аноним 12/11/16 Суб 16:51:05 #495 №874561 
14789586657720.jpg
>>874559
>постримить жаваскрипт.
Заржал на весь дом.
Аноним 12/11/16 Суб 17:07:34 #496 №874578 
Статья на Хабре: Принимая PHP всерьез: https://m.habrahabr.ru/post/314970/

Разработчики Slack: "...По итоговым результатам, PHP предоставляет наилучший фундамент для создания, изменения и эксплуатации успешного веб-проекта по сравнению с конкурирующими средами. Сегодня я хотел бы начать новый проект на PHP...."

К кому мы прислушаемся, к разработчикам добившегося многомиллионного успеха стартапа или живущим на мамкином борще анонимным экспертам из раздела /pr/?
Аноним 12/11/16 Суб 17:15:24 #497 №874579 
>>874578
Конечно программистов с двача.
Аноним 12/11/16 Суб 17:17:02 #498 №874581 
>>874578
Я конечно ньюфаг в PHP но
>К примеру, 123 == '123foo' оценивается как истина (что он там делает?), но 0123 == '0123foo' является ложью (хмм).
какого хрена вообще кому-то пришло в голову сравнивать число со строкой? Почему когда Антон делает это на Java - ему говорят "Ты чё, дебил?", а когда так делат на PHP - "Это язык странный".
Аноним 12/11/16 Суб 17:21:43 #499 №874584 
>>874581
Динамическое типизирование, оно такое.
Аноним 12/11/16 Суб 17:24:03 #500 №874585 
>>874581

В Яве еще веселее. Там строки - это объекты класса String и при сравнении через

s1 == s2

сравнивается не содержимое, а проверяется, ссылаются ли s1 и s2 на один и тот же объект. То есть 2 разных объекта, содержащих одинаковые строки, дадут false.

Сравнивать надо через метод, как if (s1.equals(s2))

Справедливости ради, в С++, от которого отпочковалась Ява, примерно такая же ерунда, если не переопределить оператор сравнения для класса строк.

Но конечно, все эти неявные преобразования в PHP это проблема в дизайне языка, добавленная давно в ранних версиях. Я надеюсь, что в будущем либо что-нибудь придумают либо в самом PHP либо в том же HHVM который не так печется о совместимости.
Аноним 12/11/16 Суб 17:29:43 #501 №874590 
>>874585
>2 разных объекта, содержащих одинаковые строки, дадут false.
Кошмар. Меня до сих пор передёргивает от арифметических операций в JAVA и от бесконечных циклов как вполне себе обычное дело для реализации демонов.
Аноним 12/11/16 Суб 17:37:28 #502 №874592 
>>874581
0 указывает на восьмиричную систему счисления. Так что здесь как раз все ок.
Аноним 12/11/16 Суб 17:39:27 #503 №874593 
>>874590
в пхп тоже будет вечный цикл при реализации демона , нужно понимать просто механизм работы демона
Аноним 12/11/16 Суб 17:43:05 #504 №874594 
>>874561
Ну в прошлый раз смотерл, он какой-то проект делал, я не уточнял.
Аноним 12/11/16 Суб 17:43:26 #505 №874595 
>>874581
> вообще кому-то пришло в голову сравнивать число со строкой?
Дело в том, что в твоей программе может произойти такая ситуация, когда ты будешь ожидать сравнения строки со строкой, а получишь число из-за закравшегося неведомо где бага. Решение крайне простое - ВСЕГДА использовать === (оператор сравнения без конвертации типов). JS-линтеры даже ругаются, если видят в коде двойное равно.
Алсо, кто как борется с отсутствием тайп-хантинга в JS? Браться за TypeScript/Flow не очень хочется. Вот вроде интересная либа: http://is.js.org/
но многовато туда всего напихали.
Аноним 12/11/16 Суб 17:46:00 #506 №874597 
>>874590
>бесконечные циклы фуууу
Ну и как большие мальчики демонов делают?
Аноним 12/11/16 Суб 17:49:40 #507 №874599 
>>874595
Хз, я вот в typescript вкатываюсь попутно изучая angular2. Ванильный js знаю неплохо.
Аноним 12/11/16 Суб 18:00:59 #508 №874608 
Поясните, уже ведь нет смысла делать соединение с БД синглтоном?
Аноним 12/11/16 Суб 18:47:58 #509 №874655 
У вас тут ньюфажеские вопросы по HTML допускаются, а то отдельного треда не нашёл ни в /pr, ни в /web. Короче, допустим, есть сайт, у которого есть некоторая статическая часть: хэдер над меню, само меню (nav > ul), и футер. Хочу добиться следующего: при нажатии на кнопку в меню, в div (такой то wrapper) под меню идёт подгрузка контента html файла с помощью ajax'a. Всё бы казалось чикибрики, но, при обновлении страницы, меня, естессно, кидает на основную страницу. Следовательно, при подгрузке контента раздела сайта мне нужно менять текущий URL в браузере, что я хз как сделать.
Мне кажется жутко уебищным в каждом html-файле раздела дублировать
<head></head>
<nav><ul></ul></nav>
<footer>
и то, что до блока с контентом. Какие есть workaround'ы для этой проблемы? или проблема в том, что я ебучая макака и неправильно проектирую дерево сайта?
Сейчас пытаюсь сделать что то типа следующего: по нажатию на кнопку вообще, <a href="nextpage.html">" в меню на основной странице идёт переход на страницу nextpage.html, в которой находится только контент раздела, при этом через jquery подгружаю то, что должно быть до контента (head, nav>ul) и то что должно быть после (footer), и только по завершению after(). делаю .show("fast");
Как такой вариант? Или это ещё уебищнее, чем дублировать в каждом html-файле head, nav>ul и footer?
Аноним 12/11/16 Суб 18:57:51 #510 №874661 
>>874655
Ой, вот я бедил. Для этого, походу, php как раз и можно использовать. Использование include('pagename.html'); нормальная практика?
Аноним 12/11/16 Суб 21:19:01 #511 №874792 
>>870547
Контора какая? Или чем занимается, если боишься деанона?
Аноним 12/11/16 Суб 21:20:26 #512 №874797 
>>874792
А, видимо, веб-студия.
Аноним 12/11/16 Суб 22:06:02 #513 №874845 
Можно ли как то по вызову submit у формы вывести результаты некоторой работы в пхп скрипте на ту же страницу в определенном месте, например, в каком нибудь div'е под самой формой, и чтоб без перезагрузки страницы? Или только заново страницу загружать с результатами обработки формы?
Аноним 12/11/16 Суб 22:25:12 #514 №874862 
>>874845
без перезагрузки только с AJAX/JQUERY
Аноним 13/11/16 Вск 00:36:15 #515 №874944 
>>874845
Не уверен точно, но попробуй через заголовки.
Аноним 13/11/16 Вск 01:42:00 #516 №874960 
14789905207500.jpg
Вообщем решил я сделать список студентов, и в итоге по быстрому получилось вот сие https://github.com/InitF/StudentList . До этого пришлось немного поработать на Yii2, так что структура в общем может быть похожа. Собственно чего можете посоветовать (окромя самоубийства и стерилизации). Особенно интересно, как лучше разгрести ад в controllers/RegController.
Аноним 13/11/16 Вск 02:14:20 #517 №874968 
>>874513
>Я попробовал открыть страницу в фаерфоксе и там в отладчике пошли ошибки:
Я не знал про этот инструмент. Я посмотрел что там за ошибки и исправил их. У меня был лишний пробел в описании форматов format (. Я исправил этот пробел, и это починило всё(!), за исключением наклона и отсутствия легких шрифтов в ie<8.

Далее, я убрал лишнюю строчку src, это не на что не повлияло - в ie шрифы ставятся, но с теми же багами.

Затем, я убрал определения шрифтов с цифровыми значениями веса, и это вызвало несколько других багов:

webkit, firefox Перестают определять шрифт regular
firefox <b> теряет жирность (можно починить добавив этому элементу свойство font-weight: bold)
ie По прежнему легкие шрифты не определяются. Однако, в ie определятся шрифт regular.
ie<8 И по прежнему отсутствие цифровых значений веса чинят наклонность у жирных шрифтов

Я решил что можно определить шрифт regular цифровым значением т.е. 400, это починило регулярные шрифты, но сломало легкие. Я точно так же определил шрифты для легких задав значение 100. Что-то из этого сломало легкие наклонные шрифты в ie>8 сделав их жирными наклонными. Это так же починилось определив наклонный шрифт цифровым значением т.е. задав font-weidght: 100 и font-style: italic.

В ie<8 по прежнему не отображаются легкие шрифты (заместо них regular).

Firefox, кстати, всё равно выдает ошибки парсинга font-weight на значения bolder и lighter (если их убрать то ничего не изменится). Как такое может быть?

https://github.com/someApprentice/maintaskforlayout
https://someapprentice.github.io/maintaskforlayout/
Аноним 13/11/16 Вск 02:22:04 #518 №874970 
>>864640 (OP)
Почему если при использовании YII2, я убираю имя формы из правила required в функции rules, то в переменной создания экземпляра класса модели значение поле формы не передаеётся? Передаются только те, которые указаны как required? Значения же сами должны передаваться, вне зависимости от того, обязательно поле для заполнения или нет?
Аноним 13/11/16 Вск 03:09:17 #519 №874984 
Задам ещё один вопрос, по YII2, да и вообще. Допустим, в контроллере я добавлюя некоторую строку с данными, и после этого хочу перенаправить пользователя на страницу которая их выводит. Ничего если я это сделаю методом взятия последнего добавленного id записи в базу данных? Или так небезопасно и могут быть ошибки? Так вообще можно делать?
Аноним 13/11/16 Вск 04:08:08 #520 №874998 
Я хотел бы поблагодарить господина OP за всё что он делает. Меня впечатляет как он успевает всем ответить, это невероятно продуктивная работа и это продолжается уже не один год. Это вдохновляет! То что он делает означает, что сколько бы не было в мире зла, добро всё равно победит! Такая работа безусловно достойна работы гения, и для меня большая честь учиться под его начинанием.
Аноним 13/11/16 Вск 05:18:48 #521 №875003 
>>874998
а где спасибо мистер OP PHP'eц ?
Аноним 13/11/16 Вск 05:20:20 #522 №875004 
>>874984
нет , например если будет в базу параллельно записывать пару запросов (от 2 одновременно пользователей ) то выйдет что вы будете давать не ту инфу
Аноним 13/11/16 Вск 05:24:01 #523 №875005 
>>874970
все поля должны быть в руле ,тк AR при save() вызывает валидацию всё рано , если оно не required то должно быть в отдельном массив safe
Аноним 13/11/16 Вск 09:23:07 #524 №875026 
>>875005
ОП, ты ли это?
Здесь все еще разбирают и проверяют задачи?
Собираюсь вкатиться в пых по хардкору, пилить задания и всякое такое каждый день. Знал, что раньше тут был ОП с учебником, и вот нашел тред.
Аноним 13/11/16 Вск 09:51:04 #525 №875034 
14790198640870.png
14790198640881.png
14790198640892.png
Как сделать, что-бы всегда было по 4 элемента в ряд?
Аноним 13/11/16 Вск 09:56:30 #526 №875035 
>>875034
display: inline block;
width:22%;
position:relative;

?
Аноним 13/11/16 Вск 10:00:25 #527 №875036 
>>874485

Огромное спасибо за проверку.

>Это не нужно так как первичный ключ по определению (ПК = идентификатор записи) уникален.
Да, этот индекс надо убрать.

>Задача бутстрап-скрипта только инициализировать приложение и подготовить к работе. А не определять УРЛ и запускать контроллер. Ну вот например если мы захотим написать скрипт для командной строки, мы не сможем использовать бустрап файл, так как он попытается запустить контроллер, который в командной строке не имеет никакого смысла.В твоем случае содержимое бустрап файла можно было бы просто поместить в index.php.
Я этого не знал. Cпасибо, я учту это.

>Мне не очень нравится идея использования констант для настроек: они доступны везде глобально и мы не можем ограничить область, где они доступны, не можем их передать только в определенные объекты.
Я и использовал их из-за глобальной доступности, но так делать не стоит, согласен.

>Этот класс стоило поместить в файл, путь к которому соответствует неймспейсу. Название стоит поменять, так как Handler значит "обработчик" и непонятно, что именно он обрабатывает.
Да, определенно стоит поменять ему название. Только как его назвать, если он содержит методы для обработки как исключений так и ошибок.

>Имена функций принято начинать с глагола, handleError, а не errorHandler.
Хорошо, буду знать.

>У тебя не очень логичный подход в обработке ошибок. Если произошла ошибка, то ты продолжаешь выполнять программу, скорее всего с неправильными данными.
Идея была в том, чтобы не прекращать работу в случае некритических ошибок. Но, наверное, так делать не стоит.

>На мой взгляд единственно верный способ обработки ошибок это преобразование их в исключения: http://php.net/manual/ru/class.errorexception.php
О, это действительно хороший способ, я не знал о существовании ErrorException. Спасибо.

>Ну например, ты выводишь ошибки при установленном APP_DEBUG, но в php.ini уже есть настройка, отвечающая за вывод ошибок на экран: display_errors.
Да, константу APP_DEBUG лучше убрать и управлять отображением ошибок через display_errors.

>Ты делаешь свой логгер, но в PHP уже есть лог ошибок и возможность писать в него через error_log(). В чем смысл заводить отдельный лог?
Хм.. В моем случае он действительно не нужен и логичнее использовать встроенную функцию.

>Также, в логгере не очень понятно назначение метода setLogFile(). Зачем может понадобиться менять путь к лог-файлу в процессе? Разве недостаточно указать его при создании объекта?
Да, это и вправду нелогично сделано.

>Ты в функию логгирования уже закладываешь что всегда есть имя файла и номер строки. Это потому что ты не не разделяешь функционал обработчика ошибок от логгера и у тебя логгер "знает" про то, какие свойства есть у ошибки.
Да, он действительно "прибит" к логгированию ошибок.

>use принято ставить в самом начале файла.
Это не вызовет ошибки в том случае если оно стоит до подключения автозагрузчика?

>Здесь тоже сделано нелогично. Конструктор предназначен для инициализации и подготовке объекта к использованию. Нелогично и неожиданно что конструктор может внезапно вызвать контроллер, который выведет страницу.
Да, это неправильно. Эту функциональность нужно перенести в отдельный метод.

>А что будет если условие не сработает?
Переменная $url будет иметь тип NULL, потому что ей не будет присвоено никакое значение.
Потом не сработает условие проверки на существования класса и будет свойство $controller будет иметь значение по умолчанию
Ну и т.д.
Я раньше не обращал внимания на это, честно говоря. Это нужно переделать.

>Зачем тут "$url = "? зачем создавать переменную, которая нигде после не используется?
Действительно, это совершенно бесполезная переменная.

>для этого есть функция parse_url
C REQUEST_URI parse_url работать не будет.

>Тут тоже нелогично, получается при любом несуществующем URL вроде /asdasdad будет вызван контроллер index, а должна быть страница 404.
Да, это плохо.

>Ну и твой метод роутинга на мой взгляд неудачный, так как он допускает существование множества URL для одной страницы, вроде /index/action/1/2/3/4/5/6/7/8, хотя у каждой страницы должен быть единственный URL.
Да, он действительно довольно неудачный.

>ты для каждого класса будешь делать по статическому методу в контроллере? При этом для класса DBHelper ты почему-то метод не сделал, а создаешь его через new.
Я конечно не знаю, как тут лучше сделать, может быть стоит сделать отдельный контейнер для получения объектов, и передавать его в контроллер, но это немного усложнит код.
Нет, это только для TDG.
Я сам так и не решил как все это лучше сделать, честно говоря.

>Получение токена тоже наверно лучше инкапсулировать в класс авторизации
Хорошо

>Ты знаешь, что именно делает \FILTER_SANITIZE_STRING, и зачем это тут нужно? Или ты ставишь "на всякий случай"? На мой взгляд бесполезные действия только усложняют проверку, безопасен ли код.
Знаю, но этот фильтр там бесполезен и не нужен. Его определенно нужно оттуда убрать.

>Методы search() и all() очень похожи, зачем 2 раза писать одно и то же?
Да, и мне это не нравится, но я не придумал хорошего решения для того чтобы избежать дублирования кода.

А что эта функция делает?
Получает переменную извне (в этом случае с массива $_GET) и при необходимости фильтрует значение.
Поскольку фильтр не указан, используется FILTER_UNSAFE_RAW. Поэтому вызов этой функции с этими параметрами фактически равен присвоению переменной значения элемента суперглобального массива $_GET c ключем 'q'.

>Базовый контроллер должен содержать какие-то универсальные методы. Но тут явно метод, который нужен только на странице вывода таблицы со студентами. Зачем его помещать в общий для всех базовый контроллер?
Да, это неправильно. Но я не знаю где их лучше расположить.

>Непонятно, чем это отличается от public static function renderView.
Подключает файлы из другой директории.

>И кстати, почему методы render статические?
В этом нет никакой необходимости, я не обратил на это внимание.

>Тут методы редактирования и регистрации почти одинаковые. Не надо копипастить код.
Опять-таки, мне это самому не нравится, но я не знаю как это решить.

>Вообще, у тебя в коде слишком много die и exit. Я бы их убрал.
В тех случаях разве не надо быть уверенным в том, что выполнение кода завершено?

>Это неправильный подход. Где гарантия что пользователь за 5 секунд успеет прочитать страницу? А если он слепой и исполоьзует программу для чтения вслух? А если он отвлекся?
Действительно.

>PDOException возникает при ошибке работы с БД, например если SQL запрос написан непраивльно. Какой смысл писать особый код для обработки этой ошибки? У тебя ведь уже есть страница на случай исключения.
Да, без этого можно обойтись.

>тут слишком много вызовов renderView на мой взгляд.
Да, согласен.

>Это нужно для записи в БД? Тогда этот метод должен быть в StudentDataGateway.
У меня были мысли о размещении его там, но я не был уверен в том, что его стоит там размещать.

>тут слишком много аргументов у конструктора. Надо либо передавать опции массивом, либо, что лучше, разделить их на обязательные и необязательные, необязельные задавать отдельными методами
Они там все обязательные

>>874486

>getStudentTableLink($order = null, $sort = null, $query = null)
Но это приведет к загромождению view.

>Не лучше ли сделать геттер и тем самым явно показать что оно только для чтения?
Да, лучше.

>LIMIT и OFFSET надо бы поставлять через плейсхолдеры.
Но как?

>Я вижу что тут переменные вставляются прямо в SQL запрос, значит возможна SQL инъекция.
Да, поэтому пользовательские данные не вставляются напрямую, а вставляется значение которое соответствует запросу.
Это, конечно, костыль но я не знаю как это лучше сделать.

>Неудачная идея возвращать true либо строку. Логичнее при отсутствии ошибок возвращать пустое значение.
Да, это действительно логичнее.

>А что это значит? Должны чередоваться не-пробел и не-@? Вроде "@ @ @ @ @ @" ?
Любой символ кроме проблема и @.

>gitignore лучше класть в корень проекта в одном экземпляре.
Он там для того, чтобы создать пустую директорию.

Еще раз спасибо, буду исправлять.

Аноним 13/11/16 Вск 10:01:35 #528 №875037 
>>875036
пробела*
Аноним 13/11/16 Вск 13:36:58 #529 №875103 
14790334186750.png
Сделал на yii2 всё по гайду https://yiiframework.com.ua/ru/doc/guide/2/rest-quick-start/
GET /tasks и /tasks/1 работают отлично, DELETE /tasks тоже.
Post-ом отправляю запрос на создание и получаю 500.
Аноним 13/11/16 Вск 13:40:23 #530 №875106 
>>875103
Очень странно, задал дефалтные значения, и всё работает. Странно что сперва просто создается новая запись, а потом видимо апдейтится.
Аноним 13/11/16 Вск 13:45:12 #531 №875108 
>>875106
Хотя нет, создало запись с дефалтными значениями и всё.
Аноним 13/11/16 Вск 14:18:04 #532 №875115 
Заметил интересную особенность поведения БД. Есть у меня табличка со студентами, поле email уникальное. Пытаюсь вставить методом поля, указал повторяющийся имейл - > ошибка. Но вот фишка в том, что если у последней записи id был 3, то у следующей, правильно вставленной, id уже 5. Т.е. из-за ошибки один порядковый номер айдишника куда-то пропал. Чому так?
Аноним 13/11/16 Вск 15:59:45 #533 №875147 
Я правильно понял, что в классе можно объявить только 1 конструктор. Если мне нужен конструктор с другим набором параметров - соси писос/делай статические методы, возвращающие новый инстанс?
Аноним 13/11/16 Вск 16:18:10 #534 №875151 
>>875147
Зачем тебе два конструктора? Если тебе надо изменять свойства класса то делай методы. Или можешь делать это динамически, а еще лучше почитай про магические методы.
Аноним 13/11/16 Вск 16:31:47 #535 №875155 
Ньюфаг врывается. Встал ступором на регулярных выражениях. Т.е. появляются какие-то мысли, но на уровне интуиции, а что-то дельное в голову не идёт. Есть ли какие-то годные уроки для всего этого делать, кроме учебника для нюфань из шапки?
Аноним 13/11/16 Вск 16:53:19 #536 №875160 
Почему-то мой хттп сервер перестал нормально отдавать данные браузеру. Когда делаешь socket_close сразу после socket_write браузер выдает ERR_CONNECTION_ABORTED, если поставить перед закрытием сокета sleep(10) все нормально отображается.
Аноним 13/11/16 Вск 16:56:37 #537 №875161 
>>875026
нет я другой анон
Аноним 13/11/16 Вск 16:58:47 #538 №875162 
>>875161
Я постом промахнулся, сорян.
Но, тем не менее, ОП тут? Он проверяет задачи?
Аноним 13/11/16 Вск 17:30:47 #539 №875169 
>>875147
Да, в PHP нет перегрузки конструктора. Обычно используют статические конструкторы, выглядящие примерно так Foo::createFromBar($bar)
Вообще здесь всё очень спорно и нужно смотреть в код. Если нужно большим количеством разных способов создать объект, то быть может есть смысл выделить дополнительную абстракцию?

>>875151
Ух, и магия и сеттеры, изменяющие состояние. Это всего надо избегать по возможности, передавая параметры конфигурации в конструктор. Оцени новую магию в Laravel: https://laravel-news.com/2016/11/higher-order-messaging/
Они используют свойство объекта как callable. Восторженные фанбои уже ставят очередную звезду репозиторию.
Аноним 13/11/16 Вск 17:39:05 #540 №875176 
>>875155
1) Все нужные регулярки как правило давно без особых проблем гугляться 2) Их лучше вообще избегать.
Аноним 13/11/16 Вск 17:47:01 #541 №875183 
Почему объект класса сериализуется через
serialize($object), т.е. вижу полученные CSV-подобные данные,
но не сохраняются значения массивов - свойства $anArray=array();
?
Аноним 13/11/16 Вск 18:01:04 #542 №875187 
>>875155
Чисто в учебных целях не засирай себе голову ими. Просто в общих чертах пойми что это и зачем это, и потом уже если они тебе понадобятся, сломай себе моск.
Аноним 13/11/16 Вск 18:03:46 #543 №875190 
http сервер, дубль 2
http://ideone.com/F3xhUr
Аноним 13/11/16 Вск 18:11:18 #544 №875192 
>>875004
А как поступать в таком случае? Записывать в куки часть информации (если id то метод последнего id снова не прокатывает) которую ввёл пользователь, перенаправлять его на нужную страницу, а уже затем по этим записанным данным из куки выводить нужную инфу?
Аноним 13/11/16 Вск 19:19:32 #545 №875221 
>>875183
Бамп вопросу? Есть класс, в котором есть двумерный массив, объект которого пробовал сериализовывать двумя способами:
1. просто использовать функцию serialize()
2. реализовал в классе интерфейс Serializable, пробовал сериализовать через $s = $obj.serialize();
где obj - объект класса с массивом. Но при записи в файл всё равно нет значений матрицы.
Алсо, я нуфак
Аноним 13/11/16 Вск 19:31:33 #546 №875222 
>>875187
>>875176
Спасибо большое, прямо гора с плеч
Аноним 13/11/16 Вск 20:08:48 #547 №875232 
ОП у меня вопрос. У тебя в гите в теме про паттерны работы с бд есть цитата:
"для работы с разными таблицами стоит использовать разные классы
".
А если у меня инет магазин с кучей таблиц: продукты, их описание, опции, атрибуты и прочее. Как сделать через такие классы выборку? К примеру я пишу модуль Аякс фильтрации. Мне исходя из этой цитаты придется вместо одного запроса с парой join делать неудобные 3-4 запроса плюс обрабатывать это все на стороне php. Что скажешь?
Аноним 13/11/16 Вск 20:32:07 #548 №875253 
Стоило ОПу денек отдохнуть от треда, как он наводнился вредными советами.

>>875222

Рано радоваться, они тебе советуют неправильные вещи. Надо остановиться и изучить, чтобы непонимания не было. Есть официальный мануал по регуляркам pcre, есть наши задачки, можно в треде задать вопросы.

Не надо темы пропускать, надо все изучать последовательно.

>>875221

serialize() работает рекурсивно и сериализует вложенные массивы и объекты. если ты считаешь что это не так, покажи простой пример кода.

Интерфейс Serializable нужен когда стандартный способ не работает.

> Но при записи в файл всё равно нет значений матрицы.
Надо проверять не так. Надо сериализовать, потом десериализовать и проверить, что получилось. Не надо пытаться разбирать сериализованные данные.

И это не матрица, а массив.

>>875192

Надо использовать lastInsertId ( http://php.net/manual/ru/pdo.lastinsertid.php ), в PDO метод так и называется, в Юи в классе работы с БД тоже наверно есть что-то аналогичное.
Аноним 13/11/16 Вск 20:32:54 #549 №875254 
>>875232

Можно в классе работы с одной таблицей джойнить к ней вспомогательные.

>>875190

> echo "Не удалось выполнить socket_accept(): причина: " . socket_last_error($sock) . "\n";
> break;
тут наверно логичнее continue

> while ($read = socket_read($msgsock, 2)) {
Неправильно сделана проверка. Что, если socket_read вернет строку "0" ?

Плюс, не понимаю какая выгода читать по 2 байта? И почему именно 2?

> socket_set_nonblock($msgsock);
Неправильно. Если ты хочешь сделать сокет неблокирующим, то это надо делать один раз, а не каждый раз, как что-то из него прочитал. Плюс, для работы с неблокирующими сокетами нужен select (который ты изучишь чуть позже). Если не использовать select, то socket_read будет сразу же возвращаться при отсутствии данных и ты будешь грузить процессор на 100% в цикле while.

> function socketWrite
Эта функция делает только 2 попытки записи. Почему из должно быть 2? В теории за раз может даже 1 байт отправляться. Тут нужен цикл.

Плюс, у тебя неблокирующий сокет, а это значит что 2 вызова могут отправить вообще 0 байт. Ведь блокирующий сокет блокируется до возможности отправить/получить данные, а не блокирующий всегда возвращает управление сразу.

> //без этой функции мы повиснем на чтении из сокета навечно, но почему-то если объявить её до этого цикла, то даные из сокета не прочтутся
Потому, что неблокирующий сокет не ждет поступления данных, а возвращает управление сразу. Понятно, что браузеру нужно какое-то время на то, чтобы сформировать и отправить заголовки, и твой сервер просто их не дожидается, а сразу получает строку длиной 0 байт (значащую, что данных пока нету).

> //здесь был sleep(10) до того, как я стал читать данные из сокета. Без socket_read или sleep сокет как будто закрывается до того, как клиент успевает принять респонс, что приводит к ошибке в браузере
Скорее всего потому, что неблокирующий сокет не успевает отправить данные.

Видимо, ты не изучил, как работают блокирующие и неблокирующие сокеты. Давай повторим.

Чтение

Блокирующий сокет при чтении блокируется до возникновения одного из событий:

- пришел пакет данных - будет возвращен этот пакет (в пределах указанного тобой числа байт, если там больше, то остаток вернется при следующем чтении)
- удаленный хост закрыл соединение - будет возвращена строка длиной 0 байт и feof($socket) вернет true
- проихошла ошибка - будет возвращен false. Ошибка может быть в том числе если например удаленный хост отсоединился от сети и связь с ним прервалась. Ну сети на то и сети, что там сломаться может все, что угодно. Любая функция может вернуть ошибку.

Неблокирующий сокет отличается тем, что он не ждет прихода данных. Если данных пока нет, он сразу вернет строку длиной 0 байт (но feof($socket) покажет false). Если же данные пришли, соединение закрыто или произошла ошибка, он возвращает то же самое что и блокирующий.

Запись

Блокирующий сокет отправляет данные в сеть и блокируется до одного из событий:

- один пакет с данными успешно передан операционной системе и поставлен в очередь на отправку. Возвращается число байт, которые поставлены в очередь, оставшиеся ты обязан отправить повторным вызовом функции.
- произошла ошибка при попытке отправить данные

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

Неблокирующий сокет в отличие от блокирующего возвращает управление сразу, если буфер заполнен и положить в него данные нельзя.

Неблокирующие сокеты позволяют параллельно работать с несколькими соединениями и передавать данные в 2 направлениях. Но для работы с ними нужно использовать select() или (если соединений очень много) специальные высокопроизводительные системы событий вроде libevent.

В общем, ощущение, что у тебя сделано как-то неправильно все. Алгоритм должен быть такой:

- используем блокирующий сокет
- читаем данные из сокета, и проверяем, есть ли там пустая строка (которая обозначает конец заголовков и начало тела запроса, если оно есть).
- получив пустую строку, мы имеем заголовок запроса и можем сгенерировать и отправить ответ
- после отправки закрываем соединение

Заметь, что тут есть один хитрый момент: как определить, что браузер закончил передавать запрос и ждет ответа? Если мы начнем передавать данные раньше времени, возможно что браузер будет еще не готов их принимать, и мы заблокируемся навечно (мы передаем ответ и ждем что браузер примет его, а браузер пытается передать остаток запроса и ждет что мы примем данные). Важно правльно определить тот момент, когда передача запроса закончена и можно передавать ответ.

Протокол HTTP определен в RFC 7230, 7231, 7232, 7233, 7234, 7235. Поищем ответ там.

https://tools.ietf.org/html/rfc7230#page-20 , пункт "Формат Сообщения":

> The normal procedure for parsing an HTTP message is to read the
> start-line into a structure, read each header field into a hash table
> by field name until the empty line, and then use the parsed data to
> determine if a message body is expected. If a message body has been
> indicated, then it is read as a stream until an amount of octets
> equal to the message body length is read or the connection is closed.

Необходимо прочитать первую строку запроса, затем прочитать строки с заголовками до пустой строки (которая обозначает конец заголовков). Затем необходимо проанализировать заголовки и определить, есть ли у запроса тело (при его наличии в Content-Length указывается его длина в байтах). Если тело есть, то прочитать указанное число байт.

Заметь, что браузер не обязан закрывать соединение на передачу (и генерировать EOF на сервере). Сервер должен сам определить конец запроса. Если это не делать, и ждать EOF то ты просто будешь висеть, пока браузер не закроет соединение по таймауту.

Так как мы делаем простую задачу, ты можешь не читать тело запроса и слать ответ сразу после окончания заголовков. Запрос GET все равно не содержит тела. Но если хочется, можешь добавить поддержку Content-Length и тогда сможешь например принимать тело POST-запросов.

В общем, тебе надо

1) разобраться получше, как работают блокирующие сокеты
2) разобраться получше, как работает HTTP

Если ты мог бы отслеживать соединение через Wireshark, то было бы хорошо. Если нет, то ты можешь попробовать соединяться со своим сервером через telnet или putty и отправлять запрос руками.

Пока, к сожалению, твой сервер совсем нерабочий.

Если тебе что-то непонятно по сокетам или HTTP - задавай вопросы.
Аноним 13/11/16 Вск 20:42:39 #550 №875259 
>>875254
Всю стену еще не осилил, но пока ты тут пару вопросов/примечаний
>Плюс, не понимаю какая выгода читать по 2 байта? И почему именно 2?
Забыл вернуть обратно, проверял все ли данные читаются
>Эта функция делает только 2 попытки записи.
Почему 2? По идее она будет вызываться пока все данные не запишутся
>Скорее всего потому, что неблокирующий сокет не успевает отправить данные.
С блокирующим он тоже не работал, в общем-то sleep я туда поставил еще когда он был блокирующим.
Аноним 13/11/16 Вск 21:43:00 #551 №875283 
>>875253
Нет, я понял как они работают и как поставить, но всё это слишком сложно на моём уровне. Возможно это потому, что я делал перерыв около двух месяцев в изучении языка и кое-что мог забыть.
Аноним 14/11/16 Пнд 00:18:40 #552 №875331 
Привет всем.

Может знает кто, как залить на heroku yii1 сайт?
И реально ли это?
Есть ли альтернативы heroku.
Аноним 14/11/16 Пнд 03:36:15 #553 №875375 
>>875259

> По идее она будет вызываться пока все данные не запишутся
Действительно. Только у тебя это все неправильно сделано. Ты написал рекурсию, в результате чего логику работы стало сложно понимать, а надо было просто сделать цикл.

> С блокирующим он тоже не работал, в общем-то sleep я туда поставил еще когда он был блокирующим.
значит, ты неправильно что-то сделал. Я написал в своем ответе логику, по которой должен работать сервер.


Аноним 14/11/16 Пнд 03:37:29 #554 №875376 
>>875187

Вредный совет. Люди так пропускают темы, а потом ничего не понимают, например, когда дойдут до фреймворков.

>>875183

Покажи пример кода. Должно все работать.

>>875176

> 1) Все нужные регулярки как правило давно без особых проблем гугляться
Не всегда гуглятся, и не всегда они правильные (могут например не поддерживать кириллицу или еще что-то не учитывать)

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

>>875162

Прокрути тред выше и посмотри ответы

>>875160

Если это тот сервер, что ниже, то потому, что он написан неправильно.

>>875155

А ты все задачи из учебника решил? Если по-прежнему непонятно, может тебе дополнительную заадчку дать? А если не решил и на чем-то застопорился, то покажи код и напиши, что именно непонятно.

Регулярки надо знать. Чтобы при чтении кода ты с первого взгляда понял, что она делает, а не долго гуглил и мучал справочник.

>>875147

Надо делать статические конструкторы. Также, у конструктра могут быть значения аргументов по умолчанию.
Аноним 14/11/16 Пнд 03:38:04 #555 №875377 
>>875115

Может ты просто ранее удалил запись с номером 4?

>>875103

Ну там же в ответе написано, в чем причина. Ты видишь? Надо не гадать, а сдампить, что куда приходит, что куда передается. В данном случае впрочем все написано в самом сообщении.

Ну и кстати это плохо что твое приложение отдает пользователям подробности ошибки.
Аноним 14/11/16 Пнд 03:38:31 #556 №875378 
>>875036

> Только как его назвать, если он содержит методы для обработки как исключений так и ошибок.
ErrorHandler

> Идея была в том, чтобы не прекращать работу в случае некритических ошибок. Но, наверное, так делать не стоит.
Не стоит, это только усложняет обнаружение ошибки. И откуда ты знаешь, что она некритическая? Может из-за этой некритической ошибки у пользователя обнулится баланс счета.

Встроенный в PHP подход неправильный. Не бывает "некритических" ошибок. Программа либо написана правильно, либо нет.

>>use принято ставить в самом начале файла.
> Это не вызовет ошибки в том случае если оно стоит до подключения автозагрузчика?
Нет. use ничего не загружает, он просто задает короткое обозначение для класса в коде ниже, что класс X это на самом деле \A\B\C\X.

> >для этого есть функция parse_url
> C REQUEST_URI parse_url работать не будет.
Будет, если ты пытаешься получить PHP_URL_PATH. Посмотри мануал и поэкспериментируй.

> Я конечно не знаю, как тут лучше сделать, может быть стоит сделать отдельный контейнер для получения объектов, и передавать его в контроллер, но это немного усложнит код.
Вот я тоже не знаю. В больших фреймворках делают специальный класс - DI контейнер, который умеет создавать нужные объекты. Но в твоем крошечном приложении - нужны ли такие сложности? Просто без него тоже плохо. Ну например, тебе надо как-то обеспечить чтобы все классы использовали общее соединение к БД, чтобы другие класы были бы в одном экземпляре, и код создания объекта придется везде копипастить. Если бы ты не использовал классы дял контроллеров, можно было бы все объекты просто создать в бутстрап-скрипте.

Я все же предлагаю выбрать одно из решений, например:

- создать в бутстрап-скрипте объекты и положить в контейнер (объект или массив), который передавать в контроллер
- сделать класс-DI контейнер, умеющий создавать все объекты
- взять готовый контейнер, например, Pimple

> Да, и мне это не нравится, но я не придумал хорошего решения для того чтобы избежать дублирования кода.
Делаешь один метод, а в нужных местах ставишь if ($isSearch).... Если передан не пустой поисковый запрос - значит, у нас поиск.

> Поэтому вызов этой функции с этими параметрами фактически равен присвоению переменной значения элемента суперглобального массива $_GET c ключем 'q'.
Я хотел написать, что проще сразу обращаться к $_GET, но поймал себя на мысли что там придется писать array_key_exists, и код с filter_input может быть получается короче, так что есть смысл его использовать. Ну добавил бы хотя бы strval() и trim() тогда что ли.

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

>>Непонятно, чем это отличается от public static function renderView.
> Подключает файлы из другой директории.
Для этого наверно отдельную функцию заводить и не требуется.

>>Вообще, у тебя в коде слишком много die и exit. Я бы их убрал.
> В тех случаях разве не надо быть уверенным в том, что выполнение кода завершено?
лучше бы делать return, так как вызывающий может захотеть что-то сделать после обработки запроса.

>>тут слишком много аргументов у конструктора. Надо либо передавать опции массивом, либо, что лучше, разделить их на обязательные и необязательные, необязельные задавать отдельными методами
> Они там все обязательные
Тогда надо внимательно посмотреть, правильно ли спроектирован класс. Ну например, можно убрать из него функционал генерации URL. Например, так:

- задать функцию-генератор УРЛ вида function ($page) { ... }, которая по номеру страницы генерирует УРЛ (наиболее универсально)
- передать объект, генерирующий УРЛ
- передать шаблон URL вида /table?order=sort&page={page}, в который класс подставит номер страницы (немного костыльно конечно так как в теории например у 1-й страницы может быть УРЛ немного не такой, как у других, и вообще, может мы захотим номер страницы римскими цифрами вписывать)

Вот у тебя генерация УРЛ по моему по 3 классам раскидана. Может можно ее всю убрать в один класс?

Также, $maxVisiblePages вряд ли обязательный аргумент. Можно задать ему в классе значение по умолчанию и метод для изменения (и скорее всего он даже не понадобится).

Вот видишь, мы обнаружили в итоге что класс решает 2 задачи сразу (расчет пагинации и генерацию УРЛ) и этим вызвано такое большое число аргументов.

>>getStudentTableLink($order = null, $sort = null, $query = null)
> Но это приведет к загромождению view.
Ну не знаю, мне кажется, что нет. Ну можно попробовать сделать еще так:

getTableLink(['page' => 1]), getTableLink(['order' => 'name']), то есть передавать только параметры, которые должны измениться.

> >LIMIT и OFFSET надо бы поставлять через плейсхолдеры.
> Но как?
->bindValue(':limit', 100, какая-то константа). Смотри мануал https://secure.php.net/manual/ru/pdostatement.bindvalue.php

>>Я вижу что тут переменные вставляются прямо в SQL запрос, значит возможна SQL инъекция.
> Да, поэтому пользовательские данные не вставляются напрямую, а вставляется значение которое соответствует запросу.
> Это, конечно, костыль но я не знаю как это лучше сделать.
Проверку надо делать прямо в этом классе, а не где-то далеко в контроллере. Чтобы была гарантия, что неправильное знаечние ни при каких условиях не попадет в запрос.

Если ты делаешь проверку в контроллере, во-первых, трудно ее найти, во-вторых, кто-то может вызвать функцию работы с БД, передав в нее непроверенные данные.

>>А что это значит? Должны чередоваться не-пробел и не-@? Вроде "@ @ @ @ @ @" ?
> Любой символ кроме проблема и @.
Ну у тебя там неправильная регулярка. \S[^@] значит "сначала идет символ, не являющийся пробелом, за ним идет символ, не являющийся @".

> Он там для того, чтобы создать пустую директорию.
Для этого используют файл с другим именем, например .gitkeep. .gitignore - это специальное имя, там задается список файлов, которые не должны попасть в репозиторий, и его лучше иметь в одном экземпляре в корне.
Аноним 14/11/16 Пнд 03:38:53 #557 №875379 
>>875034

Надо разобраться, в чем проблема. Скорее всего в том, что ты используешь col-md-3, а это float. Флоаты выстраиваются горизонтально, а если места не хватает, то они пытаются встать ниже, и видимо потому 5-й блок оказался под 4-м.

Тебе надо вместо флоатов использовать inline-block, которые выстраиваются в строки и переносятся аналогично буквам.

Ну и это показывает, что тебе надо бы изучить CSS. Бутстрап придуман для тех, кто уже знает CSS. У нас в ОП посте есть задания по CSS.

>>875026

Посмотри выше по треду, проверяют или нет.

>>874984

Надо использовать lastInsertId. В случае использования Active Record скорее всего Юи сам в модель проставляет ее id после вставки.

>>874970

Там есть ограничение, какие поля могут передаваться из POST в модель по умолчанию - только явно разрешенные. Если это не делать, то будет уязвимость и злоумышленник сможет при редактировании обновлять любые поля.

Описано же в мануале (хотя если честно, замучался искать, но ты как специалист по Юи должен был найти быстрее меня):

- https://github.com/yiisoft/yii2/blob/master/docs/guide-ru/structure-models.md#Массовое-Присвоение-
- http://www.yiiframework.com/doc-2.0/guide-structure-models.html#massive-assignment

Ну и ты всегда можешь присвоить нужное значение вручную без mass assignment.
Аноним 14/11/16 Пнд 03:39:21 #558 №875380 
>>874968

https://someapprentice.github.io/maintaskforlayout/MotherfuckingWebsite.html - вот это конечно никуда не годится. Ладно, отсутствие полей у html можно объяснить необходимостью, но шрифт по умолчанию не должен быть бледно-серым.

> Я исправил этот пробел, и это починило всё(!), за исключением наклона и отсутствия легких шрифтов в ie<8.
Я решил заглянуть в MSDN (мануалы майкрософта), чтобы найти информацию про font-face в ИЕ. Если что, информация по ИЕ есть в MSDN, по фаерфоксу в MDN, а у других браузеров нет таких сайтов и они обычно кивают в сторону стандартов, мол они их поддерживают.

https://msdn.microsoft.com/ru-ru/library/ms530757(v=vs.85).aspx

Тут мы видим:

> font-weight:fontWeight
> Internet Explorer 9. A valid font-weight property value (except for the relative values, bolder and lighter).

Итак, font-weight поддерживается только начиная с ИЕ9, и не поддерживаются относительные значения bolder, lighter (не очень-то и нужны).

Вот еще статья по теме (англ): http://itsravenous.com/blog/banishing-faux-italic-and-faux-bold--on-css3-fonts-in-IE-8-and-below

Я думаю, что в данном случае особо делать ничего не надо. Раз ИЕ8 и ниже не поддерживают семейства из нескольких начертаний, то пусть отображают шрифт как умеет. Моя точка зрения такая, что для малопопулярных браузеров достаточно, чтобы сайтом можно было пользоваться, а каким шрифтом будет отображена информация, не так и принипиально.

Если хочется поддерживать ИЕ8 и ниже, придется наверно делать отдельный CSS файл, подключаемый через условные комментарии https://msdn.microsoft.com/ru-ru/library/ms537512(v=vs.85).aspx . В нем объявить шрифты каждый под своим именем, только с eot файлами, например IeLatoRegular, IeLatoBold. Вписать эти имена в отдельные CSS правила только для ИЕ:

h1 {
font-family: IeLatoBold, sans-serif;
font-weight: normal; - сбрасываем вес, чтобы ИЕ не пытался "ужирнять" шрифт
}

Но на мой взгляд, оно того не стоит. Достаточно, чтобы в ИЕ можно было прочесть текст. То есть я за поддержку максимального числа браузеров, но без цели сделать чтобы везде выглядело одинаково и без больших затрат времени на древние браузеры. Это лично моя точка зрения, другие считают по-другому - кто-то просто не умеет поддерживать старые браузеры, кто-то не хочет, кто-то требует чтобы везде страница выглядела одинаково.

> Firefox, кстати, всё равно выдает ошибки парсинга font-weight на значения bolder и lighter (если их убрать то ничего не изменится). Как такое может быть?
Это относительный вес ("чуть потяжелее") и его не стоит указывать внутри font-face в любом случае, так как непонятно относительно чего его отсчитывать.

https://github.com/someApprentice/maintaskforlayout/blob/master/stylesheets.css#L97
> font-family: Lato, 'Times New Roman', Arial, Helvetica, sans-serif;
Times New Roman совсем не похож на Lato (у него засечки). Я бы Arial и Helvetica тоже убрал (а зачем?) и оставил бы только Lato и sans-serif. sans-serif определен в стандарте и любой браузер должен уметь отобразить текст таким шрифтом. Arial это по сути стандарт де-факто (даже на тех системах, где его нет, например, Андроид, вместо него подставляют что-то похожее), но зачем он нужен, если есть sans-serif.

Вот еще ссылка, если интересно: http://www.cssfontstack.com/

> a {
> font-weight: bold;
> color: #d9d9d9;
> text-decoration: none;
Что-то мне не очень нравится стиль. Серые неподчеркнутые ссылки жирным шрифтом. Должны ли они так выглядеть везде? Если ссылки жирные в меню, может стоит их только там такими и делать.

> p {
> font-weight: lighter;
Вот это мне тоже не нравится. Почему вес шрифта изменен именно для абзацев? А что насчет таблиц, списков? Если ты хочешь сказать, что шрифт по умолчанию должен иметь вес 300, то надо объявить это на элементе html - шрифт по умолчанию задается именно там.

https://github.com/someApprentice/maintaskforlayout/blob/master/stylesheets.css#L146
> position: relative;
> bottom: 10px;
не очень понимаю, зачем это тут? Подвинуть блок вертикально можно через margin-top наверно?

> .header ul {
Хочу предупредить насчет таких селекторов, что на мой взгляд это селекторы слишком широкого действия и в будущем они могут распространиться на те элементы, для которых не предназначались. Вот допустим завтра кто-то добавит в шапку ul и твои правила к нему применятся. Придется разгребать код и смотреть, как исправить их.

Я думаю, что тут ты не хотел написать "для всех списков внутри шапки". Скорее, ты хотел написать "для меню в шапке". Ну тогда так и напиши: .header .header-menu { ... }. А теперь, если подумать, то не так важно где находится это меню - в шапке или нет, и можно упростить до .header-menu { ... }.

Важно делать селекторы максимально точными, иначе потом будет придется больше усилий тратить на поддержку верстки.

> .header ul :nth-child(1n) {
С этим правилом проблема в том, что если мы захотим сделать подменю внутри меню, то правило сработает и на него. Лучше писать что-то вроде .header-menu > li.

Вот скриншот из ИЕ11: https://www.browserstack.com/screenshots/b5bec7763e6986c4898f75ece20e9d312e81834b/win10_ie_11.0.jpg

Видно, что между шапкой и бледно-серым блоком есть белая полоска. Скорее всего у тебя там margin collapsing - маргин вывалился из шапки или из серого блока.

насчет хаков с :nth-child - мне кажется, для ИЕ лучше использовать либо специальные ориентированные на него хаки (звездочка или минус перед именем свойства), либо отдельные стили, подключенные через условные комментарии. А у тебя это по сути тест не на поддержку ИЕ, а тест на поддержку CSS3. И допустим старый фаерфокс получит те же правила, что и ИЕ, а ты вряд ли такое задумывал.

По моим ощущениям, у тебя многовато этих хаков с nth-child. Лучше наверно стараться, чтобы правила для ИЕ были как исключение, а не правила для нормальных браузеров.

Статья: https://habrahabr.ru/post/62002/

Я бы использовал хак со звездочкой для ИЕ или отдельный файл стилей.

> .consectetur::before {
> .tristiquet::before {
> .fermentum::before {
Тут написано почти одно и то же. Надо избавиться от повторов. Размеры картинки там почти одинаковые, проще сделать их везде одинаковыми.

>.services .content .box p {
Что-то многовато тут компонент в селекторе. Зачем, например, тут .content? Он тут по моему лишний.

Когда задаешь font-size, стоит задавать и line-height. В абзаце текста под заголовком "Consectetur" например строки стоят очень тесно, правильный ли там line-height?

> .portfolio .content .works :nth-child(4n) {
> padding-right: 0px;
Это плохая идея, так как подразумевает что картинки идут ровно в 4 ряда, хотя на узком экране удобнее их размещать например по 2-3 в ряд. И будет ли это работать корректно, когда мы скроем часть картинок?

> .rss:before {
> .facebook:before {
Надо избавиться от повторов

> @media (max-width: 1110px) {
Что-то тут подозрительно много правил. Это может говорить о том, что верстка сделана не очень гибко и плохо подстраивается под внешние размеры.

И мне кажется что точка переключения 1110px не очень удачная. Наверно, лучше сделать ее в районе 700-800px, так как на большем размере блоки consecutor смотрятся не очень удачно.

ну и например, что касается меню, можно для него использовать свои правила, например, перемещать логотип вверх только при ширине меньше 500px. А то на 800px там места сбоку вполне достаточно остается.

Для иконок соцсетей надо сделать реакцию на наведение.

Далее, я открыл отладчик в Хроме и закомментировал тег link, подключающий CSS файл. Именно так, без CSS, видят твой сайт поисковые роботы и программы чтения вслух. Сразу же нашлась проблема: ссылки на соцсети сделаны пустыми тегами <a>. Это плохо, надо бы, чтобы в них был какой-то текст, например название соцсети или надпись "мы на facebook".

Адрес и номер телефона при отсутствии CSS склеились слитно.

title у тебя идет раньше чем meta charset. Это может привести к тому что meta charset будет проигнорирован.

> srcset="img\home_0003s_0001s_0022_Layer-1-Large.jpg"
Я вижу, ты используешь srcset, но почему тут не указано разрешение картинки? Так и должно быть? Вот я статью нашел по теме, если что: http://frontender.info/webkit-implements-srcset-and-why-its-a-good-thing/

Вот этот вот WOFF легкий: https://github.com/someApprentice/maintaskforlayout/blob/master/fonts/ReklameScript-Regular_DEMO.woff - 13 Кб
Но вот этот вот https://github.com/someApprentice/maintaskforlayout/blob/master/fonts/ReklameScript-Regular_DEMO.ttf почему-то тяжеленный. 232Кб ради 7 букв в логотипе.
Аноним 14/11/16 Пнд 03:52:49 #559 №875388 
Проверьте, пожалуйста, правильно ли ? Есть какие советы?
http://ideone.com/hwzlXh
Аноним 14/11/16 Пнд 07:59:36 #560 №875407 
помогите, всю ночь мучаюсь! как добить эти ссаные регулярные выражения ?
http://ideone.com/2M0Sjp
Аноним 14/11/16 Пнд 09:38:27 #561 №875422 
>>875388
Покажи решение задачи про Айфон - по всей видимости, ты её тоже неправильно решил. Во втором банке (это тот же по параметром, который был в задаче про Айфон) должно получиться 61270, около того.

>>875407
Попробуй начать с того, чтобы регулярка просто верно определяла + 7, +7 и 8, потому что у тебя в самом конце такое: 7 234 5678901 - correct.
Дальше пробуй код, дальше основной номер.
Надо идти по чуть-чуть в этой ситуации.
Аноним 14/11/16 Пнд 11:06:04 #562 №875442 
>>875422
http://ideone.com/tngpKm
http://ideone.com/BSoy64

Так все вроде правильно ?
Аноним 14/11/16 Пнд 11:20:58 #563 №875445 
>>875442
Yep.
Аноним 14/11/16 Пнд 13:09:10 #564 №875483 
Решил поискать работу на госпортале. Нашел вакансию программиста SAP с окладом 12 180 р: https://trudvsem.ru/vacancy/card/1037832048605/18b8f9d2-75f2-11e6-b903-bf2cfe8c828d?to=https://trudvsem.ru/vacancy/search%3F_page%3D1%26_titleType%3DVACANCY_NAME%26_title%3D%25D0%25BF%25D1%2580%25D0%25BE%25D0%25B3%25D1%2580%25D0%25B0%25D0%25BC%25D0%25BC%25D0%25B8%25D1%2581%25D1%2582%26_publishDateType%3DALL

Бросайте PHP, изучайте SAP.
Аноним 14/11/16 Пнд 13:13:18 #565 №875485 
>>875483
Что я только что прочитал, это бред какой-то.
>Социально незащищенные категории: Инвалиды
Что бы это значило? Инвалиды же и так получают пенсию, она у них явно больше 12к.
Неужели, инвалид пойдёт работать за меньшие деньги, чем у него пенсия?
Аноним 14/11/16 Пнд 13:24:43 #566 №875489 
Хочешь работать в Яндексе? Есть вакансия сишника от 12 000 р (ну учитывая качество кода типичного сишника, я бы больше и давал): https://trudvsem.ru/vacancy/card/1027700229193/cadd5c52-bae5-11e5-bbaf-3bdbd1a6e39d?to=https://trudvsem.ru/vacancy/search%3F_page%3D0%26_titleType%3DCOMPANY_NAME%26_title%3D%25D1%258F%25D0%25BD%25D0%25B4%25D0%25B5%25D0%25BA%25D1%2581%26_publishDateType%3DALL
Аноним 14/11/16 Пнд 13:58:39 #567 №875501 
Как нормально подключать скрипты жс? Нихуя не выходит чет. Есть у меня файл шаблон, в нем же лежит js скрипт. Подключаю <script src="search.js"></script> - не работает. ЧЯДНТ?
Аноним 14/11/16 Пнд 14:28:20 #568 №875513 
>>875501

Открой вкладку network в отладчике браузера (ctrl + Shift + I), перезагрузи страницу, посомтри, грузится ли скрипт и откуда.
Аноним 14/11/16 Пнд 14:35:16 #569 №875516 
14791233163590.png
>>875513
Оно?
Аноним 14/11/16 Пнд 14:50:11 #570 №875521 
>>875516

Оно, только стоит выбрать "All " и перезагрузить страницу. Если нет скрипта- открыть исходный код страницы (ctrl + U) и поискать там тег "скрипт".
Аноним 14/11/16 Пнд 15:01:49 #571 №875534 
14791249097370.png
>>875521
Вроде все подключается, хм. Может в скрипте дело? На всский случай запощу
var cells = document.getElementsByTagName('td');
alert(cells);
Аноним 14/11/16 Пнд 15:41:15 #572 №875553 
Существуют ли адекватные, бесплатные, серверы/хостинги?
Аноним 14/11/16 Пнд 16:16:33 #573 №875562 
>>875534

Посмотри еще в Console, нет ли ошибок. Ну и вообще, погугли и научись, как пользоваться инструментами разработчика.

С их помощью можно отладить скрипт, то есть пройти его по шагам и увидеть, как он выполняется.
Аноним 14/11/16 Пнд 17:10:04 #574 №875578 
>>875562
В консоли такая ошибка
>search.js:1 Uncaught SyntaxError: Unexpected token <
Аноним 14/11/16 Пнд 17:10:38 #575 №875579 
>>875562
Алсо сам скрипт работает, если его просто в hmtl код вставить.
Аноним 14/11/16 Пнд 18:21:43 #576 №875600 
>>875578

По моему ты невнимательно пользовался инструментами разработчика. На вкладке Network надо нажать на запрос с search.js и проверить, что в содержимом правильный JS код, а не HTML.
Аноним 14/11/16 Пнд 18:22:51 #577 №875601 
>>875534

Также проверь полный URL, по которому запрашивается search.js. У тебя там вместо JS HTML код отдается.
Аноним 14/11/16 Пнд 18:38:21 #578 №875605 
>>875601
Да, и правда. Наверное все дело в том, что я шаблон вызываю из котроллера, а не напрямую по ссылке.
Аноним 14/11/16 Пнд 18:40:16 #579 №875606 
>>875601
Там вообще хрень какаято. Скрипт запрашивается по адресу search/search.js, которого у меня физически нет.
Аноним 14/11/16 Пнд 20:00:49 #580 №875625 
>>875606

Начни с чтения урока про ссылки https://github.com/codedokode/pasta/blob/master/network/urls.md
Аноним 14/11/16 Пнд 20:23:06 #581 №875627 
>>875625
Не понял как это применимо к моему случаю.
Аноним 14/11/16 Пнд 21:14:39 #582 №875646 
Короче я понял в чем проблема. Суть в том, что я запускаю не какой-то файл, а метод контроллера из корня сайта, в index.php. Поэтому естественно не срабатывает подключать скрипт из просто закинув его туда же, куда и шаблон. Как тогда правильно подключать? Пробовал указывать путь <script src="/app/scripts/search.js"></script> - не срабатывает. Еще пробую <script src="<?php echo getcwd() . "\app\scripts\search.js"; ?>"></script> - но так возникает ошибка, браузер не разрешает из пеки грузить скрипт.
Аноним 14/11/16 Пнд 21:57:26 #583 №875667 
>>875646

У меня есть ощущение, что урок выше тебе все же надо прочитать.

Ты написал первоначально script src="search.js". То есть ты использовал относительный путь. Очевидно что тебе надо сначала изучить, как работают относительные пути, прежде чем их использовать. То есть прочитать урок по ссылке.

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

> Суть в том, что я запускаю не какой-то файл, а метод контроллера из корня сайта, в index.php
> браузер не разрешает из пеки грузить скрипт.
У тебя проблема с пониманием, как работает браузер и веб-сервер. И также проблема с пониманием, как устроены ссылки и что можно, а что нельзя писать в атрибуте src.

Браузер не знает ничего про файлы на сервере и он ничего не знает про то, какой файл генерирует страницу. Прочти в уроке про основы протокола HTTP: https://github.com/codedokode/pasta/blob/master/soft/web-server.md

Браузер, как я написал, ничего не знает ни про PHP, ни про то, откуда на сервере берется страница. Он просто посылает запрос и получает в ответ HTML-файл, находит в нем ссылку на скрипт и посылает второй запрос для его получения.

Тебе надо:

- разобраться с относительными и абсолютными ссылками
- исправить приложение, чтобы при запросе с неправильным URL вроде /search/search.js отдавался код 404 как и положено в протоколе HTTP
Аноним 14/11/16 Пнд 22:09:38 #584 №875670 
>>875192
зачем ? просто загрузил в модель или модели , сделал сейв и либо отрисовал вьюху или узнал id этой записи (в AR должна быть функция) и направил на контроллер который будет брать эту запись с базы и рисовать во вьюхе
Аноним 14/11/16 Пнд 22:10:43 #585 №875671 
>>875253
>Надо использовать lastInsertId
не прокатит например если я сохранил запись а за мной сразу человек ешё сохранил запись оно вернёт значение записи 2 человека тк оно и будет последнее
Аноним 14/11/16 Пнд 22:12:47 #586 №875672 
>>875331
в гугле ответов аж отбавляй например
http://aaronfrancis.com/2013/automate-yii-migrations-in-heroku/
Аноним 14/11/16 Пнд 22:13:37 #587 №875674 
>>875667
>- разобраться с относительными и абсолютными ссылками
>- исправить приложение, чтобы при запросе с неправильным URL вроде /search/search.js отдавался код 404 как и положено в протоколе HTTP
Читал. Мало чего понял, но вроде как просто "search.js" - это относительный путь, тогда абсолютный должен быть \app\scripts\search.js? Т.е. от корня сайта. Но не работает же.
Аноним 14/11/16 Пнд 22:15:47 #588 №875677 
>>875674
может проблема в самом скрипте , код скрипта и файла в студию , но только на какой-то сервис для кода выложи
Аноним 14/11/16 Пнд 22:21:07 #589 №875680 
14791512677660.png
>>875677
Да я там просто alert('a') от греха подальше написал. В итоге абсурд какой-то.
Аноним 14/11/16 Пнд 22:27:43 #590 №875684 
>>875671

lastInsertId возвращает последний вставленный id в рамках текущего соединения с mysql, оф мануал: http://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-id

> The ID that was generated is maintained in the server on a per-connection basis. This means that the value returned by the function to a given client is the first AUTO_INCREMENT value generated for most recent statement affecting an AUTO_INCREMENT column by that client. This value cannot be affected by other clients, ....

>>875670

После успешной отправки формы надо редиректить (Post/Redirect/Get).

>>875674

Что такое "корень сайта", по твоему, для браузера? И почему ты используешь обратные слеши? Это только в винде их используют.

> Мало чего понял
Значит надо перечитать еще раз и решить предложенные там задачи.

> но вроде как просто "search.js" - это относительный путь, тогда абсолютный должен быть \app\scripts\search.js?
Да, нужен путь от корня сайта.
Аноним 14/11/16 Пнд 22:39:37 #591 №875689 
>>875684
>Что такое "корень сайта", по твоему, для браузера?
Ну вот вводишь example.com/ - разве это не корень сайта и есть?
Аноним 14/11/16 Пнд 22:47:47 #592 №875691 
>>875689

Ну вот, теперь правильно построй путь к скрупту от этого корня и впиши в src.
Аноним 14/11/16 Пнд 22:58:35 #593 №875698 
>>875691
Лол, так я это уже много раз делал. Не работает. Т.е. я так понимаю, если указать абсолютный путь, то без разницы из какого скрипта ты подключаешь другой скрипт? Вот есть у меня сайт students.local, скрипт лежит в /app/scripts/search.js, значит абсолютный путь будет src="/app/scripts/search.js"? Может мне лучше весь код показать? Заодно разберусь как выгружать проект на гитхаб. Но уже завтра.
Аноним 14/11/16 Пнд 23:16:31 #594 №875702 
>>875698

Почему бы тебе сначала не попробовать протестировать путь в брузере? То есть вписать в адресуную строку

http://students.local/app/scripts/search.js

И проверить, что откроется?

Может у тебя .htaccess файлы переопределяет работу сервера? Тогда тебе надо разобраться в директивах, которые там вписаны.

Может у тебя корень не в той папке?

Код можешь показать, я гляну.
Аноним 14/11/16 Пнд 23:20:12 #595 №875704 
>>875702
>Может у тебя .htaccess файлы переопределяет работу сервера? Тогда тебе надо разобраться в директивах, которые там вписаны.
Бля лол, спасибо. Это же надо так, слона то и не заметил. У меня же там просто редирект на index.php в любом случае.
>Код можешь показать, я гляну.
Тогда уже как студентов доделаю.
Аноним 15/11/16 Втр 00:31:51 #596 №875765 
История одного тестового задания: https://m.habrahabr.ru/company/ecwid/blog/315228/

А вы, аноны, можете его решить? Guzzle
Аноним 15/11/16 Втр 01:43:13 #597 №875800 
>>875684
в фреймворке можно это не делать
http://stackoverflow.com/questions/13540317/active-record-last-insert-id
Аноним 15/11/16 Втр 01:45:54 #598 №875805 
>>875684
но за наводку в доку спасибо не знал
Аноним 15/11/16 Втр 05:50:00 #599 №875849 
Как изучать YII2? Прочитал документацию, посмотрел несколько видео. Понял как создавать модели, контроллеры, представления, понял как обрабатывать и выводить информацию в простейшем случае, узнал что есть хелперы и виджеты, которые всё упрощают, сделал постраничную разбивку, сделал формы, научился записывать в базу данных и выводить из неё данные. Смог написать блог, с добавлением записей, их отображением и сортировкой. Работает. Но такое ощущение что так ничего и не понял. Все эти модули, компоненты, приложения и многое другое о чём пишется в документации, воспринимаются как другая вселенная, я о них читаю и не представляют как их можно вписать и как их использовать. Складывается ощущение, что если не смотреть как кто-то их использует на реальной практике, я не смогу понять их смысл. Так как подсматривать не у кого, что делать? Как вы учили YII2 дальше знаний необходимых для создания блога? В документации у всех этих компонентов, модулей и всего остального нет демонстрации реального использования, только немного о том как они устроены, их код и синтаксис внутри фреймворка, и словесное описание для чего они нужны. Но так очень сложно понять их смысл.
Аноним 15/11/16 Втр 05:56:24 #600 №875850 
>>875380
>https://someapprentice.github.io/maintaskforlayout/MotherfuckingWebsite.html - вот это конечно никуда не годится. Ладно, отсутствие полей у html можно объяснить необходимостью, но шрифт по умолчанию
С этим ещё я не разбирался, сначала нужно было с шрифтами разобраться. Закинул чтобы посмотреть что будет и случайно закоммител его.


>Я решил заглянуть в MSDN (мануалы майкрософта), чтобы найти информацию про font-face в ИЕ.
>
>https://msdn.microsoft.com/ru-ru/library/ms530757(v=vs.85).aspx
А я заместо этого читал про свойство font-weight в котором об этого ничего не сказано, а лишь помечено версией CSS2.1. Не удивительно что у меня столько проблем.

https://msdn.microsoft.com/ru-ru/library/ms530762(v=vs.85).aspx

>http://itsravenous.com/
Красивый дизайн. Похоже у меня появился один из примеров как должно выглядеть среднестатистическое портфолио верстальщика. (Для себя я сделаю что-нибудь по лучше)


>Я думаю, что в данном случае особо делать ничего не надо. Раз ИЕ8 и ниже не поддерживают семейства из нескольких начертаний, то пусть отображают шрифт как умеет. Моя точка зрения такая, что для малопопулярных браузеров достаточно, чтобы сайтом можно было пользоваться, а каким шрифтом будет отображена информация, не так и принипиально.
Интуитивно я приходил к этой мысли.

>Но на мой взгляд, оно того не стоит. Достаточно, чтобы в ИЕ можно было прочесть текст. То есть я за поддержку максимального числа браузеров, но без цели сделать чтобы везде выглядело одинаково и без больших затрат времени на древние браузеры. Это лично моя точка зрения, другие считают по-другому - кто-то просто не умеет поддерживать старые браузеры, кто-то не хочет, кто-то требует чтобы везде страница выглядела одинаково.
Мне все равно, я могу сделать как угодно, оказывается, это не так уж и сложно. Мое мнение, это зависит от цели. Думаю, в обучающих целях сделаю, чтобы везде было одинаково.


>> .consectetur::before {
>> .tristiquet::before {
>> .fermentum::before {
>Тут написано почти одно и то же. Надо избавиться от повторов. Размеры картинки там почти одинаковые, проще сделать их везде одинаковыми.
Я пытался это сделать, присвоить для всех заголовков общие свойства, но ничего не получилось https://jsfiddle.net/3fsukce0/


> .portfolio .content .works :nth-child(4n) {
> padding-right: 0px;
>Это плохая идея, так как подразумевает что картинки идут ровно в 4 ряда, хотя на узком экране удобнее их размещать например по 2-3 в ряд. И будет ли это работать корректно, когда мы скроем часть картинок?
А как тогда убрать отступ для последнего элемента в ряду? Учитывая что он не последний элемент по списку.



Аноним 15/11/16 Втр 08:18:57 #601 №875869 
https://2ch.hk/pr/res/763854.html#875454
там еще один тред запилили. Какой православный то?
Аноним 15/11/16 Втр 08:57:11 #602 №875871 
>>875765
Ну и как газлом качать многопоточно? Нужно как минимум pthreads ставить. Да и информация по этому расширению в сети скорее справочная, для тех, кто уже работал с многопоточностью в других языках. Для Java есть целые вводные книги по многопоточности.
Аноним 15/11/16 Втр 11:35:21 #603 №875911 
>>875869

Этот. Тут ведь даже 700 постов еще нет. Куда спешить?

Тот тред там с лета висит.

>>875871

Не нужно. Нужно разобраться в возможностях курла и guzzle.

pthreads и треды уровня ОС работают хорошо только пока их мало. Странно, ты пишешь что работал с многопточностью, но не знаешь про другие подходы (например кооперативная многозадачность и асинхронные операции внутри одного потока ОС).
Аноним 15/11/16 Втр 11:55:01 #604 №875916 
Привет, подскажите по JS,
можно ли указывать свойство объекта в качестве ключа другого объекта?

Hamburger.allowedToppings = {
Hamburger.TOPPING_MAYO: 123
};

В топике JS подсказывают, что можно, но ideon и хром выдают ошибку:

SyntaxError: Unexpected token .

http://ideone.com/qpKFUB
Аноним 15/11/16 Втр 13:12:57 #605 №875971 
>>875916

Нельзя использовать выражения в ключах в литерале объекта (литерал объекта это конструкция вида { a: 1, b: 2 }).
Аноним 15/11/16 Втр 14:01:23 #606 №875992 
>>875849

Yii очень гибкий, на некоторые вопросы о том, как правильнее использовать компоненты, разработчики отвечают, "Как хотите".

Есть https://github.com/samdark/yii2-cookbook можно полистать её, но лучше всего, смотреть, как сделаны готовые приложения или проекты.
Хотя везде всё не однозначно.
Аноним 15/11/16 Втр 15:33:29 #607 №876044 
>>875992
Почему там половина страниц отсутствует: https://github.com/samdark/yii2-cookbook/blob/master/book/README.md
Жаль, интересный сборник, надо бы поискать, есть ли полный сборник на просторах, должен быть.
Аноним 15/11/16 Втр 15:54:53 #608 №876067 
>>876044
> должен быть.
В описании написано, что книга полностью свободная, пишется Макаровым и контрибуторами с гитхаба, поэтому "полный сборник" искать бессмысленно.
Есть ещё полный Cookbook, но он по Yii 1.
Аноним 15/11/16 Втр 16:51:01 #609 №876093 
14792178619900.png
14792178619901.png
Почему с else не работает?
Аноним 15/11/16 Втр 16:53:40 #610 №876097 
>>876093
В else нельзя указывать условия, так как else означает "во всех оставшихся случаях". Если нужно условие, то используй elseif
Аноним 15/11/16 Втр 16:54:56 #611 №876098 
>>876097
Вот оно что. Спасибо.
Аноним 15/11/16 Втр 17:01:40 #612 №876104 
>>876093
а чего у тебя в if compDice1==compDice2 - два раза повторяются ?
Аноним 15/11/16 Втр 19:21:53 #613 №876209 
поясните ньюфагу, для чего в пышке имена переменных предваряются долларом? Только начал учиться по гайдам опа, никаких затруднений нет, но необходимость вставлять доллар перед именами заёбывает ппц как.
Аноним 15/11/16 Втр 19:25:10 #614 №876212 
>>876209
Что бы жизнь малиной не казалась.
Аноним 15/11/16 Втр 21:02:20 #615 №876321 
>>876209
А var писать в JS/Pascal не надоедает? А объявлять тип переменной в C/C++/Java/C#? В Perl и Bash тоже доллары предваряют переменные, привыкнешь и не будешь замечать.
Аноним 15/11/16 Втр 21:16:18 #616 №876331 
14792337782370.jpg
Где можно почитать про так называемые "горячие клавиши", которым вы наверняка вы пользуетесь и какими чаще? Я имею ввиду допустим когда я пишу код все время переставлю все мышкой, кроме очевидных абзацев клавишей enter.
Аноним 15/11/16 Втр 21:38:54 #617 №876341 
>>876209
Чтобы была иллюзия прибыльности в изучении программирования в общем и использования этого языка в частности...
(Смахивая скупую мужскую слезу.)
Аноним 15/11/16 Втр 22:31:49 #618 №876384 
>>876209
Чтобы отличить переменную от константы? На самом деле удобно
Аноним 15/11/16 Втр 22:34:26 #619 №876386 
14792384664540.jpg
>>876331
в описании своего текствого редактора.
Гугли cheat sheet
Аноним 15/11/16 Втр 22:38:44 #620 №876389 
>>876386
Спасибо, няша
Аноним 16/11/16 Срд 00:11:06 #621 №876442 
>>876386
Я может в глаза долблюсь, но в твоем пикрелейтеде не вижу, как в атоме отформатировать код? Для примера, в нетбинсе я жму контрол-шифт-f и у меня сразу пробелы, отступы, переносы скобок и вся такая фигня появляется, а как в атоме?
Аноним 16/11/16 Срд 03:07:12 #622 №876490 
>>876442
a basic version can be made by putting this in your keymap file:

'.editor:not(.mini)':
'alt-cmd-l': 'editor:auto-indent'
Аноним 16/11/16 Срд 06:19:24 #623 №876511 
>>876442
плугин
atom-beautify
Аноним 16/11/16 Срд 08:52:37 #624 №876520 
>>874536

Анончик расакажи пожалуйста про тестирование (генерацию ошибок) которое ты сделал в 12 задаче: http://ideone.com/873GTD

Такой способ тестирования как-то называется и кем-то где-то описан, или ты сам придумал?

Алсо, сколько лет занимаешься JS?
Аноним 16/11/16 Срд 09:18:39 #625 №876523 
Привет, не могу понять как реализуется наследование в es3. Что такое "хак с прототипами" ? Rabbit.prototype.__proto__ = Animal.prototype;? В learn.javascript наследование описано с помощью Object.create().
Аноним 16/11/16 Срд 12:19:28 #626 №876572 
>>876523
> В learn.javascript наследование описано с помощью Object.create()
Не только: http://learn.javascript.ru/new-prototype#inherit
Аноним 16/11/16 Срд 12:57:28 #627 №876599 
14792902481300.jpg
Всем доброго дня,
http://ideone.com/YSfidW - опечаточки. Проблема в том, что бормалеи-корупционеры меняют сразу по две, а то и три буквы в слове и получается не очень.
http://ideone.com/meYReN - Gr. Nazi. Вроде работает.
Аноним 16/11/16 Срд 13:33:48 #628 №876618 
>>876490
>>876511
Кошмар, прям емакс какой-то, все надо допиливать. Но все равно спасибо.
Аноним 16/11/16 Срд 13:48:23 #629 №876628 
>>876618
а что тебе не нравится? Это текстовый редактор, а не IDE.
Ставь что нравится, а если бы стояло все на свете, то тормозил бы как PHPStorm
Аноним 16/11/16 Срд 13:56:26 #630 №876632 
>>876628
Это какой древний калькулятор нужно откопать, что бы на нем PHPStorm тормозил?
Аноним 16/11/16 Срд 14:14:53 #631 №876640 
>>876632
Ну я в игори не играю, поэтому мне хватает некропеки. Поставил пхпшторм - тормозит, один запуск секунд 30-40 чего стоит. Поставил нетбинс - все летает, грузится за 5 секунд, а функционал тот же. Еще и швабодно.
Аноним 16/11/16 Срд 14:39:39 #632 №876653 
>>876628
Поставил я плагин, а оно мне ошибку, гуглю ошибку - 24000 результатов и танцы с бубнами. С емаксом то я погорячился. Атом - стильно, модно, молодежно и малопригодно к использованию.
Аноним 16/11/16 Срд 14:44:13 #633 №876655 
>>876653
нормально пригодно, лол.
Да, у меня тоже не работает плугин (php-linter), а некоторые настраивать надо. НАпример этот же бьютифаер может потребовать немного в конфиге поковыряться или зависимости поставить
Аноним 16/11/16 Срд 16:07:16 #634 №876684 
>>876653
Потому и стоит использовать IDE. Когда используешь редактор все время хочется еще какого-то функционала, а значит куча времени уходит на танцы с бубнами, в то время как в IDE есть все сразу искаропки. Тот же нетбинс удобен, швабоден, и темку можно как в атоме поставить, например.
Аноним 16/11/16 Срд 16:16:01 #635 №876687 
>>876655
>>876640

А у меня шото, шо то тормозит.
При то что саблайм текст нормально работает и я того же от атома ожидал в надежде уйти на него со шторма, хотя в нем всё же нет менеджера баз данных например и еще некоторых плюшек
Аноним 16/11/16 Срд 16:17:38 #636 №876688 
>>876687
>А у меня шото, шо то тормозит.
Поставь пакет нетбинса, в котором только пхп+хтмл/цсс+жс. Тогда норм должно быть. Если и тогда будет тормозить - ну тогда не знаю, твоя последняя надежда эклипс.
Аноним 16/11/16 Срд 17:54:43 #637 №876743 
http://ideone.com/YUrAg9 чому не работает подстановка запроса? Если ставлю переменную в $sql то все норм, а подстановкой не сортирует.
Аноним 16/11/16 Срд 18:05:36 #638 №876749 
14793087365380.jpg
>>876520
Я его у другого анончика украл из готового решения, хех (когда одним глазком подсмотрел непонятный момент в задаче), так что не знаю что за способ. Обычный цикл с вызовом функций. Лет? 0,25, т.е. 3 месяца (если сложить время продуктивного обучения, то наберется на недели 3).
Аноним 16/11/16 Срд 19:17:16 #639 №876772 
>>874960
Таки бамп
Аноним 16/11/16 Срд 20:06:33 #640 №876814 
>>876772
>бампать треды в бамп-лимите
Аноним 16/11/16 Срд 20:16:32 #641 №876822 
>>876814
Так я не тред бампаю, я свой вопрос бампаю.
Аноним 16/11/16 Срд 20:42:49 #642 №876841 
>>876822
Зачем ты его бампаешь? ОП проверяет всех без исключения, только это происходит не сразу и по очереди. А кроме ОПа тебе вряд ли кто-нибудь хороших советов напишет.
Аноним 16/11/16 Срд 20:47:07 #643 №876846 
>>876841
ОП тоже человек, бывает пропустит пост какой-нибудь, не просто так же он иногда просит напоминать о себе.
Аноним 17/11/16 Чтв 01:01:48 #644 №876988 
https://m.habrahabr.ru/post/315152/
"Ваш язык программирования — отстой"

Во многом согласен.
Аноним 17/11/16 Чтв 02:02:30 #645 №877008 
>>876988
как и говорили в комментах хороший старт лист для тролля , ну и естественно там только 1 язык не отстой brainfack
Аноним 17/11/16 Чтв 02:54:33 #646 №877023 
>>877008

Ну вот теперь тебе есть что ответить любителям других языков, если они будут критиковать пхп.
Аноним 17/11/16 Чтв 03:44:17 #647 №877033 
>>876988
>//m.
Мне-бы хотелось сказать. Что так делать плохо.
Аноним 17/11/16 Чтв 10:28:29 #648 №877093 
>>875672
Это ответ про миграции, а как запустить, там сам проект, всё еще не совсем ясно и вроде, как пишут что это не просто.

Бамп вопросу про альтернативы хероку или бесплатные серверы
Аноним 17/11/16 Чтв 12:40:32 #649 №877158 
http://ideone.com/c0TxC3

Куда дальше копать в отношении этого задания ?
Как добиться того, чтобы 8 (8122) 56-56-56 - этот номер принимало ?
Почему из списка неправильных номеров так много проходит ?

Аноним 17/11/16 Чтв 13:35:08 #650 №877197 
>>877093
а вы вообще понимаете как работает херок ?
Аноним 17/11/16 Чтв 13:55:28 #651 №877210 
>>875331
>>877093

Позволь мне погуглить за тебя: https://devcenter.heroku.com/articles/getting-started-with-php

Аноним 17/11/16 Чтв 15:10:34 #652 №877253 
Как правильно делать валидацию в на сервере? Гугл находит статьи, в которых данные просто надо прогонять через кучу функций типа трим, стрип_слешес и прочее, но я чую, что это плохой способ. Как это делать правильно?
Аноним 17/11/16 Чтв 16:24:48 #653 №877290 
>>877253
Нормальный способ, так оно и бывает.
Сейчас смотрю валидацию в Yii2 - там куча валидаторов, каждый цепляется один к другому, проверяя значение переменной на любые соответствия.
Аноним 17/11/16 Чтв 16:52:18 #654 №877299 
>>877253

Валидация - это проверка введенных данных на соответствие правилам. Например, что имя пользователя состоит из латинских букв, что возраст - это число от 1 до 200 и тд.

Прочитав этот абзац, подумай, как использование "всяких стрип слешес" относится к валидации? Никак.

trim() это не часть валидации, но ее стоит делать, так как лишние пробелы справа не видны, но могут помешать прохождению валидации.
Аноним 17/11/16 Чтв 16:52:56 #655 №877300 
>>877290
Короче пока делаю так. Сначала проверяю данные на соответствие по длине и типу, потом если все норм - прогоняю их через эти функции. Сойдет?
Аноним 17/11/16 Чтв 16:57:56 #656 №877301 
>>877299
>Валидация - это проверка введенных данных на соответствие правилам. Например, что имя пользователя состоит из латинских букв, что возраст - это число от 1 до 200 и тд.
Знаю, а разве вместе с валидацией не убирают пробелы там и прочее?
Аноним 17/11/16 Чтв 16:59:40 #657 №877303 
>>877300

Нет, не сойдет. Зачем прогонять данные через какие-то функции?

>>877301

Валидация - это проверка данных. Убирают пробелы где-то в другом месте кода, например в коде для работы с формами.
Аноним 17/11/16 Чтв 17:01:23 #658 №877306 
>>877303
>Валидация - это проверка данных. Убирают пробелы где-то в другом месте кода, например в коде для работы с формами.
Хм. А почему нельзя все это в одном классе делать, например?
Аноним 17/11/16 Чтв 17:02:57 #659 №877309 
>>877300
Вполне.

>>877301
Да, при сохранении в БД - обязательно.
В Yii2 это trim валидатор будет.

>>877303
Как так зачем? Очистить от мусора, преобразовать "инъекции" в простой HTML.
Я что-то не пойму тебя.

>>877306
В Yii2 в одном и делается, там два метода: на клиенте проверка до отправки на сервер и уже на самом сервере.
Аноним 17/11/16 Чтв 17:03:40 #660 №877310 
Точнее так - я хочу сделать класс валидатор, допустим Validator, который убирает проблемы, прогоняет данные через htmlspecialchars а потом проверяет данные по нужным мне критериям. Так сойдет?
Аноним 17/11/16 Чтв 17:10:18 #661 №877317 
Кстати а зачем вообще делать валидацию и в клиенете, и на сервере?
Аноним 17/11/16 Чтв 17:15:07 #662 №877321 
>>877317
Потому что пользователи могут отключить js в браузере и отправить drop table и если на сервере не проверить выебут тебя.
Аноним 17/11/16 Чтв 17:17:55 #663 №877324 
>>877321
А почему тогда не запретят такую ебалду по http передавать?
Аноним 17/11/16 Чтв 17:36:20 #664 №877338 
>>877324
какую ? данные ? запретить передавать данные по http ?
Аноним 17/11/16 Чтв 17:46:18 #665 №877350 
>>877309

> Очистить от мусора, преобразовать "инъекции" в простой HTML.
В документации по strislashes написано, что она удаляет мусор и защищает от инъекций?

Ты видимо просто не понимаешь как работают SQL-инъекции (и XSS) и потому не знаешь, как от них надо защищаться. Люди, у которых мало знаний, часто обращаются к религии и суевериям. Потому ты ставишь в начале программы пару "волшебных" функций как оберег.

>>877310

Валидатор не должен убирать пробелы и тем более прогонять данные через htmlspecialchars. Идея ООП в том, чтобы каждый класс занимался своей задачей, а ты вопреки принципам ООП хочешь все смешать вместе.

>>877317

На сервере в целях безопасности и для гарантии соблюдения заданных правил.

На клиенте для удобства пользователя, чтобы он мог заметить опечатку или неточность.

>>877309

> В Yii2 это trim валидатор будет.
я сомневаюсь, что это "валидатор", ты по моему просто так думаешь потому, что trim в модели пишется рядом с правилами валидации.
Аноним 17/11/16 Чтв 17:48:37 #666 №877355 
>>877310
Зачем тебе htmlspecialchars, он для защиты от XSS при выводе информации, отправленной пользователем. Не надо думать "понипихаю побольше функций, хуже не будет". Будет. Вот пример: http://pyha.ru/forum/topic/5684
> 'format' => 'json',
Заметил сколько мусора здесь? Это потому, что люди бездумно используют кучу функций, думая, что "хуже не будет, только безопасней".
Аноним 17/11/16 Чтв 17:58:57 #667 №877371 
>>877338
Ну типа, что бы если сервер виделв запросе sql-код то он бы просто игнорировал его.
>>877355
Хорошо. Тогда где вызывать тот же trim()?
Аноним 17/11/16 Чтв 18:01:08 #668 №877375 
>>877371

Как отличить SQL-код от не SQL кода? LIMIT 10 это SQL код или нет? Что, если надо опубликовать комментарий или пост, содержащий SQL код?

> Тогда где вызывать тот же trim()?
Там, где ты получаешь данные, пришедшие из формы.
Аноним 17/11/16 Чтв 18:07:17 #669 №877380 
>>877375
>Как отличить SQL-код от не SQL кода? LIMIT 10 это SQL код или нет? Что, если надо опубликовать комментарий или пост, содержащий SQL код?
Теперь понятно.
Аноним 17/11/16 Чтв 18:14:08 #670 №877393 
>>877375
Нашел еще функцию strip_tags(), по описанию годно. Ее стоит использовать?
Аноним 17/11/16 Чтв 22:34:45 #671 №877566 
>>877350
>Ты видимо просто не понимаешь как работают SQL-инъекции (и XSS) и потому не знаешь, как от них надо защищаться. Люди, у которых мало знаний, часто обращаются к религии и суевериям. Потому ты ставишь в начале программы пару "волшебных" функций как оберег.
Я только ещё учусь. Но ты же не думаешь, что не нужно преобразовывать введённый пользователем код в простой и безопасный HTML? А чего тогда? Мы только об этом и говорим пока, что это нужно.
>я сомневаюсь, что это "валидатор", ты по моему просто так думаешь потому, что trim в модели пишется рядом с правилами валидации.
Это базовый FilterValidator ([[yii\validators\FilterValidator|trim]]), вот его структура:
[
[['username', 'email'], 'trim'],
]
Никто не говорит про смешать всё вместе и не по ООП, мы говорим про то, что надо всячески проверять введенные данные на клиенте и сервере, для этого надо использовать функции, если человек всё пишет с нуля.
Аноним 18/11/16 Птн 00:20:11 #672 №877641 
>>877566

А ты читал мои (или не мои) уроки по уязвимостям?

- https://github.com/codedokode/pasta/blob/master/security/sql-injection.md
- https://github.com/codedokode/pasta/blob/master/security/xss.md
- https://github.com/codedokode/pasta/blob/master/security/xsrf.md

Там написано, как с ними бороться. Ну например, в случае с SQL мы используем плейсходеры или экранируем данные в функции работы с БД. Делать любое экранирование надо в том месте где данные используются - чтобы сразу было видно, что все безопасно.

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

Также, данные надо по-разному экранировать и обрабатывать в разных случаях. Например, одним способом перед выводом на странице, другим при подстановке в JSON и третьим при вставке в SQL запрос. Ты это никак не учел.

Потому не надо писать бессмысленные функции. Если у тебя правильно экранируются данные, то, что бы не пришло от пользователя, угрозы нет. И скорее всего эти данные будут отловлены еще на этапе валидации.

А если ставить бессмысленные преобразования, как ты предлагаешь, то данные будут искажаться, как это видно по ссылке на форум выше.

> Это базовый FilterValidator ([[yii\validators\FilterValidator|trim]]),
Действительно, в неймспейсе написано validators. Но я не поленился заглянуть в код:

https://github.com/yiisoft/yii2/blob/master/framework/validators/FilterValidator.php#L13
> FilterValidator is actually not a validator but a data processor.

Это просто разработчики Юи неудачно назвали класс. Это правильнее называть "фильтр". Чтобы увидеть разницу между фильтром и валидатором, можно попробовать применить валидацию не к данным из формы, а например к данным из БД. Для них trim делать не потребуется, так как они там уже отфильтрованные.

> что надо всячески проверять введенные данные на клиенте и сервере, для этого надо использовать функции, если человек всё пишет с нуля.
Проверять надо, но ты-то предложил просто поставить в начале strip_tags не особо разбираясь, к чему это приведет. А приведет это к искажениям пользовательских данных.
Аноним 18/11/16 Птн 01:02:34 #673 №877662 
14794201549670.png
Анончик, ответь, пожалуйста, на нубовопрос. Задачка из учебника ОПа про кредиты на гейфон. И в конце вывожу методом echo переплату и период. Причём переплата вычисляется непосредственно в методе. Из-за чего в выходной строке пропадает слово "Переплата" как на пикрелейтед. Почему так происходит? И как правильно вставлять выражения в строку вывода?
Аноним 18/11/16 Птн 01:09:41 #674 №877663 
>>877641
Спасибо, постараюсь охватить сие своим умишком...
Аноним 18/11/16 Птн 01:09:47 #675 №877664 
>>877662
Это из-за приоритета операторов, сначала происходит конкатенация строки "Переплата" и переменной $total, а из получившегося результата вычитается $credit. Можно явно указать PHP повысить приоритет для вычитания, обернув выражение $total - $credit в скобки.
Аноним 18/11/16 Птн 05:37:22 #676 №877694 
>>877158

> \+7|\+\s7|^8|^\\s8([0-9](\s|\-|\(|\))?){10}

Здесь вертикальная черта имеет самый низкий приоритет, то есть если разбить твое выражение на чсти, получается

(\+7) или (\+\s7) или (^8) или (^\\s8([0-9](\s|\-|\(|\))?){10})

То есть например, если номер начинается с 8 то он всегда пройдет независимо от того, что идет дальше. Или если в номере на любой позиции есть +7, он тоже проходит.

Ты наверняка имел в виду что-то другое, потому используй круглые скобки, чтобы огранить действие вертикальной черты. Примерно так: (a|b|c)d

Далее, \+7 и \+\s7 можно легко объединить вместе.

(\s|\-|\(|\))? - это значит, что может встретиться любой из этих символов не более 1 раза. Но я бы сделал, чтобы они могли встретиться любое число раз, так как например скобка может быть окружена пробелами.

>>876743

Через плейсхолдеры можно подставлять только числа (WHERE x = 100) или строки в кавычках (WHERE x = 'abc'). Подставить имя колонки нельзя, так как оно вставится как ORDER BY 'name' - и смысл меняется, так как 'name' это постоянная строка, а не значение соотв-й колонки.

Подставлять имя колонки придется напрямую в строку. Чтобы не было инъекции, сделай тут же проверку на то, что переменная содержит какое-либо из разрешенных значений.

>>876599

> \p{Cyrillic}
Так можно писать? да, помню что-то такое. Интересно, редко используемая возможность.

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

> Проблема в том, что бормалеи-корупционеры меняют сразу по две, а то и три буквы в слове и получается не очень.
Для этого надо брать найденные регуляркой слова и уже в них например делать замену латинских букв на такие же со скобками.

Gr. Nazi.

Боюсь, у тебя проверяются не все правила. Вот например: "нет пробела после запятой, точки с запятой, восклицательного знака, вопросительного знака, двоеточия" - это не проверяется. Или "в тексте есть слово «координально» или «сдесь», «зделал», «зделаю», «зделан»". Также, есть правило для "но", но нет правила для "а".

Выражения для жы/шы можно было бы объединить вместе.

Я думаю, ты зря там используешь preg_quote и проще было бы сразу писать нужные регулярные выражения.
Аноним 18/11/16 Птн 05:37:42 #677 №877695 
>>876523

Такой важный вопрос, а я пропустил.

__proto__ - это нестандартная конструкция и ее использовать не стоит (ее используют в учебнике для простоты). В ES5 есть функция Object.getPrototypeOf(o) чтобы получить прототип объекта (а в ES6 - еще и Object.setPrototypeOf()).

В JS есть 3 способа создать объект с заданным прототипом:

1) в ES5 есть функция Object.create(p), которая создает пустой объект с прототипом p
2) в ES6 есть Object.setPrototypeOf(), которая задает объекту прототип
2) с помощью оператора new

В ES3 нам доступен только new. Посмотрим, как он работает:

function F() { ... };
F.prototype = p;
obj = new F;

Оператор new F() делает следующее:

- создает новый пустой объект
- делает его прототипом объект, хранящийся в F.prototype
- вызывает функцию F, передав в качестве this новый объект

Таким образом, мы можем написать на ES3 аналог функции Object.create(). Очевидно, что нам надо использовать оператор new, а объект-прототип p сохранить в свойство prototype функции-конструктора. Саму функцию-конструктор можно сделать пустой:

function createWithPrototype(p) {
function F() {};
F.prototype = p;
return new F();
}

Прочитай еще уроки из учебника:

- https://learn.javascript.ru/constructor-new
- https://learn.javascript.ru/new-prototype

>>875916

Можно писать так:

allowed[Hamburger.TOPPING_...] = ...;
Аноним 18/11/16 Птн 05:38:04 #678 №877696 
>>875850

> А я заместо этого читал про свойство font-weight в котором об этого ничего не сказано, а лишь помечено версией CSS2.1. Не удивительно что у меня столько проблем.
Видимо там имелось в виду свойство, задающее вес шрифта в тексте, а не определяющее вес подключаемого шрифта.

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

> Я пытался это сделать, присвоить для всех заголовков общие свойства, но ничего не получилось https://jsfiddle.net/3fsukce0/
h3 и h3::before это разные элементы. Потому нельзя задавать content на h3, надо на h3::before.

> А как тогда убрать отступ для последнего элемента в ряду? Учитывая что он не последний элемент по списку.
Надо что-то придумать. Может быть можно делать отступы слева, и задать отрицательный маргин на контейнере, который компенсирует первый отступ:

parent { margin-left: -10px; }
child { margin-left: 10px; }

Или может можно оставить этот оступ справа и ничего с ним не делать. Попробуй разные варианты.

>>875849

Может тебе надо попробовать сделать что-то посложнее блога? У нас в ОП посте есть задача на сайт TestHub например.

- "компоненты" в Юи, как я понимаю, это обычные классы-сервисы, выполняющие какую-то функцию. Например, компонент для отправки уведомлений на почту.
- "модули" нужны для группировки контроллеров, вью и моделей в больших приложениях. Когда у тебя будет 20-30-40-50 контроллеров и куча моделей, неудобно хранить все в одной папке. Удобно разбить приложение на отдельные модули. Также модули можно делать для повторного использования. Например, модуль форума, который можно подключить к любому сайту.
- "приложения" можно исплользовать, например, если мы хотим в одном проекте реализовать несколько сайтов, мы можем сделать каждый отдельным приложением. При этом какие-то модули можно использовать в нескольких приложениях сразу. Иногда админку или личный кабинет делают отдельным приложением. Главное что для приложения можно задать индивидуальные настройки.

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

В общем, модули и приложения нужны для организации кода в больших приложениях.

>>875388

> $totalPayment = $totalPayment + $creditBalance;
Это повторяется 2 раза, хорошо бы избавиться от повтора.
Аноним 18/11/16 Птн 06:40:57 #679 №877711 
14794404570970.jpg
>>877694
Я вот этот парень >>876599. В Gr.Nazi использовал такой подход чтобы упростить добавление или удаление правил и все правила я не прописал, постараюсь переписать для каждого правила своя регулярка.
Над "опечатками" мысль принял к обдумыванию.
Тысячу лет жизни тебе ОП.
Аноним 18/11/16 Птн 11:39:33 #680 №877756 
>>877694
http://ideone.com/c0TxC3
вот так исправил.
Спасибо тебе за то, что отвечаешь )
Аноним 18/11/16 Птн 13:27:56 #681 №877798 
Возомжно ли нетбинс обмазать под JS и HTML/CSS так, что бы не пользоваться вебштормом? А то нетбинс и быстрей, и бесплатный, и в качестве ide для пхп меня более чем устраивает.
Аноним 18/11/16 Птн 16:39:06 #682 №877869 
Подскажите, нигде не могу найти информации:
Есть ли какой то существенный недостаток такого использования $$ http://ideone.com/fpraVK кроме засорения пространства имен ?
Я конечно не так использую, просто для наглядности сделал пример.
К примеру у меня есть большой массив который хранит в себе информацию по действиям который должны выполняться над некоторым текстом, и чтобы не выдумывать имена переменным внутри foreach я использовал $$ с ключом .
Аноним 18/11/16 Птн 18:09:08 #683 №877907 
>>877869

Недостаток в том что код невозможно понять так как неизвестно какие именно переменные будут созданы. Вместо $$ надо использовать массив.
Аноним 18/11/16 Птн 18:10:56 #684 №877908 
>>877907
Ну это >кроме засорения пространства имен.
А помимо этого?
Аноним 18/11/16 Птн 18:29:30 #685 №877914 
>>877908

Бессмысленное усложнение и запутывание кода. Можно написать $x = 1, а можно $y = 'x'; $$y = 1;
Аноним 18/11/16 Птн 18:30:58 #686 №877916 
>>877908

Есть впрочем функция extract(), она обычно используется для передачи переменных в HTMl шаблон. Но в твоем примере кода цикл не нужен.
Аноним 18/11/16 Птн 20:25:37 #687 №877986 
14794899378510.png
>>873884
А так понятно?
Аноним 18/11/16 Птн 22:35:14 #688 №878072 
>>877986

В PSR переменные называют кемелКейсом, а не через подчеркивания. Названия надо выбрать получше:

text_ar -> characters
word -> character
text_ar_t - непонятно, что значит. Не сокращай слова, пиши полностью.
text_r_ar - непонятно, что значит
text_tr - непонятно
text_r_tr - непонятно

Для удаления пробела хватит str_replace, цикл не нужен

Вместо цикла for($i = 0 лучше использовать foreach

Есть готовая функция array_reverse.

strcasecmp не работает корректно с utf-8 и ее лучше не использовать, урок https://gist.github.com/codedokode/ff99e357e9860ea169b8

Вместо регистронезависимого сравнения проще привести строку в нижний регистр.
Аноним 18/11/16 Птн 22:36:42 #689 №878073 
Двачую затруднения с регулярками, та ещё мозгоёбка. Например, вот из задачки с парсером телефонов, решение, которое здесь мелькало.

$regexp = '/^( ?8|^\+ ?7)([-() ]\d){10}$/';

Точнее, интересует её вторая половина (первая мне понятна, хотя и избыточна, имхо):

([-() ]
\d){10}

Почему указатель количества 10 применяется не ко всем символам, а только к цифрам? Т.е. не пройдёт такое:
+7---1---)--


Аноним 18/11/16 Птн 22:38:34 #690 №878074 
>>878073
после закрывающей квадратной скобки звезда не прошла, ну вы понели.
Аноним 18/11/16 Птн 22:48:42 #691 №878077 
>>878073
те., я бы прочитал этот кусок так: "должны быть цифры и опционально разделители. И суммарно их должно быть не больше 10". Но в итоге число 10 применяется именно к цифрам, а не ко все длине строки.
Аноним 18/11/16 Птн 23:01:59 #692 №878088 
>>878073

{10} применяется к тому, что идет перед ним, в данном случае там круглые скобки и повторение относится к их содержимому. То есть 10 раз x ( любое число дополнительных символов, за которыми ровно одна цифра ). В итоге получается ровно 10 цифр и произвольное число доп. символов перед каждой.

Аноним 18/11/16 Птн 23:07:08 #693 №878093 
>>878088
благодарствую, анон, теперь понял.
Аноним 18/11/16 Птн 23:45:31 #694 №878107 
>>878072
foreach ведь перебирает элементы начиная с 0, а array_pop уменьшает стек, поэтому в массиве text_r(reverse)_ar будет не столько же элемов, сколько и в стеке. Поэтому я решил исп. простой цикл. Или я хуйню несу?
Аноним 18/11/16 Птн 23:47:23 #695 №878108 
>>878107

Вообще лучше всего наверно было использовать цикл while, если ты его изучил:

пока (массив не пуст) {
снимаем один элемент;
...
}

но как я написал, есть уже готовая функция переворота массива.
Аноним 18/11/16 Птн 23:55:25 #696 №878113 
>>878108
Не, там в уроках только for до этого. Мне он не нравится. text_r(reverse) есть жи.
Аноним 19/11/16 Суб 01:20:32 #697 №878132 
>>866012

Длительно работающие скрипты лучше запускать из командной строки, а не в браузере. По поводу твоей проблемы - надо отслеживать, что передается по сети и смотреть, в чем проблема. Для начала - на вкладке Network в инструментах разработчика и далее в WireShark.

Все зависит от того, какое ПО стоит на сервере и какие у него настроки. Может быть там использутся нгинкс в таком режиме, что он сначала получает весь ответ, а только потом отдает клиенту.

>>866117

> (ideone не отобразит)
Почему не отобразит? Надо, чтобы отображал.

> $sinalpha=$lk/$lo;
Надо выбирать нормальные имена переменных. Что такое lk? Непонятно.

> $alpha=$key/$radius;
Вот наверно здесь ошибка. Непонятно, на каком основании ты делишь номер буквы на радиус? Надо преобразовть номер буквы в угол так, чтобы получались бы числа от 0 до 360 градусов. Градусы потом перевести в радианы с помощью deg2rad(). И радианы уже подставлять в синус.

> sin($alpha)*57.2958
Это попытка перевести радианы в градусы? Неправильно. Радианы и градусы - это меры величины угла, и радианы являются аргументов функции sin(). А результат sin() - это отношение сторон треугольника, от 0 до 1, и его умножать на 57 не имеет никакого смысла.

Повтори школьную тригонометрию: https://www.google.ru/search?q=%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0+%D1%81%D0%B8%D0%BD%D1%83%D1%81&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&newwindow=1&gbv=1

> $x=(round(($x))+40);
Тут должно быть не число 40, а половина высоты.
Аноним 19/11/16 Суб 15:07:19 #698 №878293 
Ребята, плАчу в голос: знакомый прислал тестовое задание на джениора в контору, в которой он работает, у них там всё на yii2.
Эх, я вообще тупой и никуда не гожусь - я даже не понимаю, как так можно сделать, чтобы в любой год находился, допустим, второй вторник ноября...
Вот ТЗ тестовое:

Тестовое задание, Yii2
- несколько событий, обработчики, запуск и оповещения;
- веб-интерфейс создания и настройки события: само событие, время срабатывания (месяц, число, день недели и час суток) и время окончания, прочие условия срабатывания на своё усмотрение (выбор конкретного год срабатывания события или выбор повторения события каждый год).
- проверка:
1) события должны срабатывать каждый первый понедельник июня вне зависимости от года;
2) события должны срабатывать каждый четвёртый вторник ноября вне зависимости от года;
3) события должны срабатывать каждые третье воскресенье ноября вне зависимости от года;
- срок реализации: 5 часов.
Я плачу и ору в голос, не понимаю, что тут возможно сделать.
P.S. Я не устраиваюсь туда, просто решил проверить себя, годен ли.
Подскажите, как такое реализовать, чтобы конкретные дни недели определить в любой год.
Аноним 19/11/16 Суб 15:07:59 #699 №878295 
>>878293
*джуниора
Аноним 19/11/16 Суб 15:40:40 #700 №878307 
>>878293

>Подскажите, как такое реализовать, чтобы конкретные дни недели определить в любой год.

Есть алгоритм вечного календаря же:
https://goo.gl/bDYhRC
Итеративно можно определить дни недели для всех дат нужного месяца нужного года.
Аноним 19/11/16 Суб 16:00:09 #701 №878315 
>>878307
Спасибо!
http://ru.wikibooks.org/wiki/Реализации_алгоритмов/Вечный_календарь#PHP
Но я всё равно пока не соображу, как именно ко дню недели это привязать.
Вот надо найти второй вторник ноября в любой год.
Например, можно сделать цикл switch, в котором прогонять каждый день ноября через алгоритм, если это вторник - вуаля, событие активизируется.
Я верно мыслю?
[CodeSchool] Аноним 19/11/16 Суб 17:31:21 #702 №878344 
>>878315
по всей видимости с помощью этого алгоритма ты должен находить дату , вернее число вторника 2 (10.12,11.01) и тд и инсертить в базу
[CodeSchool] Аноним 19/11/16 Суб 17:57:44 #703 №878363 
>>878293
алсо можно было и погуглить
http://stackoverflow.com/questions/924246/get-the-first-or-last-friday-in-a-month
Аноним 19/11/16 Суб 18:19:50 #704 №878384 
>>878293

Тебе ведь не надо определять, какой день будет вторым вторником. Тебе надо только проверить, что сегодня второй вторник ноября, а это проверяется элементарно:

- проверяем что сегодня вторник
- проверяем (по числу прошедших с начала месяца дней) что до сегодня в месяце был ровно один вторник

Нетрудно обобщить функцию до проверки что сегодня N-й по счету день недели M.

Почитай мануалы по функции date, strtotime

Ну и урок, может там что-то есть такое: https://gist.github.com/codedokode/10539805

>>878307

Этот алгоритм давно встроен в PHP (точнее в стандартную библиотеку Си под линуксом), определить текущий день недели можно через функцию date().

тебе тоже стоит почитать мануал.

>>878344

Я думаю, там нужен крон.
Аноним 19/11/16 Суб 18:56:54 #705 №878405 
14795710145980.png
>>878108
Верный ответ? Ну и имена норм?
Аноним 19/11/16 Суб 18:59:08 #706 №878406 
14795711484160.png
>>878405
Бля, забыл исправить в сравнении. Otвет тот же выходит
Аноним 19/11/16 Суб 21:59:42 #707 №878518 
>>878406

Переменные в рекомендации PSR принято писать кемелКейсом, а не через подчеркивание (см второй пост треда).

Имена переменных пишут с маленькой буквы.

Метод расчета довольно костыльный: ты сначала переплачиваешь больше, чем нужно, а потом из общей суммы выплаченного вычитаешь лишнее.


Аноним 19/11/16 Суб 22:33:47 #708 №878538 
>>878344
Как я понял, именно так - находишь дату, инсертишь в базу сразу на текущий год (например, 1 января каждого года или 31 декабря на будущий), а потом в эту дату срабатывает event, либо каждый день проверяется дата на такое соответствие и если находится, то срабатывае event (наверное, так даже предпочтительнее).
UPD: Знакомый сейчас сказал, что желателен для запуска проверки соответствий каждый день, чтобы любые изменения в течение года чекать.
>>878363
Спасибо, тоже интересный подход.
Хотя, в принципе, и в алогритме вечного календаря тоже всё есть, что нужно для этого.
UPD: Ну йокарный бабай, всё это есть в простой функции date(), как говорит ОП. Вот так, собака была зарыта неглубоко.
>>878384
Если сегодня вторник, то проверяем, не является ли он вторым вторником в ноябре?
Хм, немного кажется нелогичным, что ли..
Это так будет каждый вторник в течение года проверяться? Не проще ли экономичней исходить из месяца:
- опачки, ноябрь, 1 число
- проверяем, не вторник ли это
- нет, не вторник
- опачки, ноябрь, 2 число
- проверяем, не вторник ли это
- опачки, вторник
- активизируется event
>Почитай мануалы по функции date, strtotime
Спасибо, посмотрю, пригодится всегда такое. А то я дальше простого вывода времени на сервере ничего не делал.
>Этот алгоритм давно встроен в PHP (точнее в стандартную библиотеку Си под линуксом), определить текущий день недели можно через функцию date().
Ору от смеха теперь.... Я эту функцию одной из самых первых выводил на локалочке.
Тормозень, короче, полная.
Спасибо, ОП, тебя не спутаешь ни с кем.
>Я думаю, там нужен крон.
Знакомый сейчас сказал, что желателен для запуска проверки соответствий каждый день, чтобы любые изменения в течение года чекать.

В итоге вышло, что тут работы для разибрающегося в Йии2 фреймворке и cron от силы на полчаса, если делать всё руками, а не с помощью Gii.
Вот так, буду знать, такая вроде бы несложность, а орал и плакал.
Аноним 19/11/16 Суб 22:45:58 #709 №878545 
14795847581750.jpg
Анончики, устроился на бесплатную практику на фирму.

Получаю задания типа сделай страницу регистрации, измени дизайн главной страницы.

У них есть их личная cms сделанная в 2008 году и все новые и старые проекты пишутся на этой ебаной cms которая написана на первом зенде. Проекты они делают для городских сайтов и учебных заведений и со стремным дизайном.

Как думаете, анончики, стоит ли там оставаться или искать какую-то современную веб-студию которая дрочит на все новое и современное?
Аноним 19/11/16 Суб 22:50:41 #710 №878547 
>>878518
А какой нужно метод? Я знаю, что вычитаю лишнее, это типа сдача.

Можно высчитывать дополнение 0 до долга, но когда оно будет < 5k, то заплатить его, а не 5к. Но это больше действий занимает, чем просто 1 раз вычесть.
Аноним 19/11/16 Суб 23:11:06 #711 №878560 
>>878538

Разумеется, надо запускать специальный скрипт по крону каждый и день и он будет проверять, что назначено на этот день. Вставкой только даты в базу не отделаешься, так как вторник в разные года выпадает на разные числа.

>>878545

Зенд еще не самый плохой вариант. Он хоть и старый, но модульный и объектно-ориентированный.

Смысла в бесплатной практике я особо не вижу. С таким же успехом ты мог бы сидеть дома, читать учебники, писать свой проект (например, делать нашу задачу на testhub) и узнать гораздо больше.

>>878547

> Можно высчитывать дополнение 0 до долга, но когда оно будет < 5k, то заплатить его, а не 5к. Но это больше действий занимает, чем просто 1 раз вычесть.
Ну да, но ненмного, на 1 строку больше, зато без костылей. Если ты понимаешь, как это сделать, то в принципе можешь и не делать.
Аноним 19/11/16 Суб 23:26:53 #712 №878565 
>>878560
после практики меня возьмут туда на работу
Аноним 19/11/16 Суб 23:45:01 #713 №878571 
>>878560
>Разумеется, надо запускать специальный скрипт по крону каждый и день и он будет проверять, что назначено на этот день.
Получается, всё-таки будет лучше так, как ты говоришь:
- день недели - вторник
- месяц - ноябрь
- что у нас на первый вторник ноября?
- действие
- день недели - среда
- что у нас на первую среду ноября?
- действие

Сейчас вспомнил, что знакомый говорил про сайт про фитнес с разными тренями. Если это треня рассчитана на сентябрь, допустим, а 1е сентября у нас в среду, то может потребоваться начать треню с 30го августа - чтобы четко вписаться в месяц, там обычно по дням недели рассчитывается: сентябрь, понедельник - то-то, сентябрь, вторник - то-то.
Поэтому нужно добавить условия для восстановления этой целостности у недели.
И вот тут уже сложнота поперла.
Это у меня загоны, канешн, немношк, но походу так и нужно, скорее всего, такое подразумевалось.
[CodeSchool] Аноним 20/11/16 Вск 00:33:09 #714 №878594 
>>878384
>>878384
я не спорю что нужен крон
[CodeSchool] Аноним 20/11/16 Вск 00:35:35 #715 №878596 
>>878571
нет по моему ты усложняешь анон , в задание чётко сказано что сделать , а та часть которая про 2 вторник месяца , это уже считай тесты , если так делать как ты и думать то за 5 ч явно не сделать , на тестовых нужно делать ровно то что дано и не придумывать
[CodeSchool] Аноним 20/11/16 Вск 00:38:21 #716 №878599 
>>878560
>Смысла в бесплатной практике я особо не вижу. С таким же успехом ты мог бы сидеть дома, читать учебники, писать свой проект

для этого нужно само организация , не каждый человек её имеет , у меня например чёткие грани между дом\работа , дома я отдыхаю на работе я работаю , если этот анон так не сможет то по пи*де пойдёт обучение , в конторе же хоть по шапке настучат за то что вбыдле сидишь
Аноним 20/11/16 Вск 00:39:52 #717 №878600 
>>878596
Оке, так тож думаю.
Ну просто подумал, для чего такая перда может пригодиться им, пока с тем челом не связывался, выходной.
Что посоевтуешь на CodeSchool? Там есть бесплатные курсы ведь? По php и мускулу там норм курс?
[CodeSchool] Аноним 20/11/16 Вск 00:40:27 #718 №878601 
>>878545
зенд не так плох , тот же МВЦ потому можешь месяц попрактиковать изучить его в комерц разработке (и в резюме написать , что не домашние странички делал , а сайты этот этот этот делал в них то то то) а потом свалишь на джуна в другую контору , для твоего уровня разницы будь то Ларавель или ЗФ нет
[CodeSchool] Аноним 20/11/16 Вск 00:42:08 #719 №878602 
>>878600
по пхп нету ешё , по SQL норм , там сейчас 2 дня все курсы открыты на халяву так что успей пройти . Можно ешё JQ LESS SASS пройти чтоб понимать хоть что это такое
Аноним 20/11/16 Вск 00:43:27 #720 №878603 
>>878602
Да, вижу, спасибки.
Аноним 20/11/16 Вск 07:34:28 #721 №878676 
И в этот тред запощу, ибо уж очень сильно печёт.

Посоны, почему у Laravel такая убогая документация? Почему там нет ни слова про тот же RedirectIfAuthenticated? Почему не сказано, как вывести ошибки аутентификации/авторизации? Что за хуйня происходит? Хоть бери и пиши свои классы для аутентификации, иначе вообще нихуя не понятно.
Аноним 20/11/16 Вск 07:44:25 #722 №878678 
>>878676
Потому что нормальным кодерам это говно не нужно, легко свое все напишут, а джуниоры пусть говно жрут.
Аноним 20/11/16 Вск 07:50:09 #723 №878679 
>>878678
Да ебал я изобретать велосипеды, когда нормальные кодеры уже запилили их за меня.
Аноним 20/11/16 Вск 07:59:45 #724 №878680 
Короче, не буду использовать готовые решения из документации, проще самому запилить аутентификацию, используя Illuminate.
Аноним 20/11/16 Вск 08:26:11 #725 №878682 
>>878679
Обычно говно же какое-то изобрели, которое под конкретный проект с пинками и костылями подходит, криво встает и багами покрывается, сразу ограничивая возможности. Сениорам зарплаты за то и платят, что свое такое могут написать под конкретные задачи и без багов. А для каких-то сложных фич есть подключаемые через Composer библиотеки, CMSы там нахуй не нужны.
Аноним 20/11/16 Вск 10:17:06 #726 №878693 
14796262268270.png
14796262268281.png
Bootstrap. Не понимаю, почему второй класс на одной странице игнорируется, а на другой всё верно отображает
Опять я со своим хттп сервером Аноним 20/11/16 Вск 12:20:00 #727 №878736 
http://ideone.com/0k2Uoc
Аноним 20/11/16 Вск 13:34:09 #728 №878766 
Оп, а как тебе денег скинуть? Вроде как видел номер твоего яндекс кошелека, а сейчас найти не могу.
Аноним 20/11/16 Вск 15:05:08 #729 №878817 
Привет,
зацените 13 задачу по JS

http://ideone.com/4bJB05
Аноним 20/11/16 Вск 17:03:31 #730 №878895 
>>878560
Почему на 1 команду больше? Как минимум столько же, сколько раз цикл будет повторяться.
Аноним 20/11/16 Вск 17:49:35 #731 №878930 
>>878682
Так Laravel - это не CMS, лол. Это фреймворк.
Аноним 20/11/16 Вск 20:11:03 #732 №879116 
>>878817
Охуеть. Сколько js дрочить надо, чтобы так писать научиться?
Аноним 20/11/16 Вск 20:33:00 #733 №879137 
14796631801780.jpg
Автомобильный номер http://ideone.com/rGVIk5
Номера телефонов http://ideone.com/RDCPVs
Аноним 20/11/16 Вск 20:34:24 #734 №879138 
>>879116

Я не он, но судя по номеру задачи, перед ней надо решить не менее 12 задач из списка из ОП поста.
Аноним 21/11/16 Пнд 08:46:22 #735 №879414 
>>879116
На самом деле не много, первые 10 задач из мануала я решил за 3 дня. И примерно неделя ушла на решение 11, 12 и 13 задачи. В процессе решения последних были перерывы, и по факту с первой задачи прошел почти месяц.
Аноним 21/11/16 Пнд 16:26:49 #736 №879579 
Чот дошли сейчас до темы с MVC и туплю на сессиях. Как их делать то в MVC? Тут же шаблон, на контроллере и моделью погоняет, а сессию када сувать?
Аноним 21/11/16 Пнд 16:44:11 #737 №879602 
Почему я не стал бы делать новый сайт на Руби: https://m.habrahabr.ru/company/Voximplant/blog/315720/

Статья для идиотов, которые выбирают технологию по тому, что пишут на hacker news. Вчера им сказали писать на Руби, сегодня - не писать.

Я бы еще это отметил:

> фронтенд мигрировал с Prototype на jQuery, потом на Coffeescript, потом на Angular, потом на React.

Хорошо, когда есть лишние деньги, которые можно тратить на ерунду.

Также, в статье используются подогнанные под нужный результат графики. Ну например, график "А здесь показано, что происходит на рынке труда" на первый взгляд показывает превосходство Node.JS, а PHP почти на нуле. Но если присмотреться, то он показывает на абсолютные величины, а прирост в процентах. Пхп очень популярен и потому не особо растет. Понятно, что прирост от 100 до 1000 пользователей на этом графике будет выглядеть выше
чем от 10000 до 11000.

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

>>879579

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

Также, знаешь ли ты, что сессия (как и куки) будет общая если открыть сайт в нескольких вкладках браузера?

Если тебе все равно нужна сессия, то очевидно:

- сессия привязана к протоколу HTTP , то есть к тому как браузер взаимодействует с сервером, и не может быть частью модели
- сессия не может быть частью предсталвения так как никак не связана с задачей отображения данных
- значит, с ней надо работать в контроллере.

Аноним 21/11/16 Пнд 16:47:50 #738 №879605 
>>879602
>Сессии не очень хорошо вписываются в концепцию REST. Зачем ты их используешь? Потому что в сомнительном устаревшем учебнике в каждом файле в начале стоит session_start()?
Нет, сейчас на курсе по PHP. Дали тех задание написать свою реализацию. Собственно я на функционалке делал сессию и потом проверял её существование чтобы ограничить доступ незалогиненных людей к личным частям сайта.

>- значит, с ней надо работать в контроллере.
Хм... Спасибо огромное. Теперь я знаю что мне нужно делать.
Аноним 21/11/16 Пнд 16:55:39 #739 №879610 
>>879605

> Собственно я на функционалке делал сессию и потом проверял её существование чтобы ограничить доступ незалогиненных людей к личным частям сайта.
Неиспользуемые около получаса сессии подчищаются. Недолгая у тебя авторизация получится.

Для авторизации можно использовать сразу куки.
Аноним 21/11/16 Пнд 16:59:15 #740 №879612 
>>879610
>Недолгая у тебя авторизация получится.
Ну лично мне для своих нужд именно это и нужно, так что даже хорошо. А на курсе - скорее всего попросят куки прикручивать. А с ними я вообще никогда не работал. Но пока решаю проблемы по мере их поступления.
Аноним 21/11/16 Пнд 17:25:53 #741 №879642 
>>879612

Сессии используют куки. Ты выбрал очень странный порядок изучения, если учишь сессии до кук.
Аноним 22/11/16 Втр 07:53:11 #742 №880015 
14797903916450.png
Помогите разобраться с Апи сбербанка? Есть один урл, по нему дергается недельный курс доллара.
http://www.sberbank.ru/common/js/get_quote_values.php?version=1&inf_block=123&_number_amount114=10000&qid[]=3&qid[]=2&cbrf=0&period=on&_date_afrom114=22.11.2016&_date_ato114=22.11.2016&mode=full&display=json

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

Ну и я ощущаю себя пиздец тупым, но как мне обратиться к полю с именем "3" у объекта????
Аноним 22/11/16 Втр 10:35:15 #743 №880053 
Код https://jsfiddle.net/w22g1txz/
Задание https://github.com/codedokode/pasta/blob/master/html/html.md#Задание-6

Вопросы:
>100%-230px
что это значит?

>если удалить весь текст справа или все пункты меню, верстка не должна ломаться.
удалять можно по-разному: li в целом, или только текст, что находится между тегами <а>?

Каким образом вёрстка сломается, если удалить текст справа?
Есть ли в коде то, чего можно избежать/заменить?
Аноним 22/11/16 Втр 11:44:41 #744 №880071 
>>880053
>что это значит?
твоя ширина блока за вычетом отступов слева-справа и у сайдбара.
Аноним 22/11/16 Втр 11:47:56 #745 №880072 
В Опен сервере если зайти в консоль и попытаться установить composer в какую-нибудь папку, высвечивается:

Package name(<vendor>/<name>) [клыаы/yii]

Проблема в этом клыаы, хоть там и не клыаы а просто каракули напоминающие кириллицу, в чём проблема? Там же должно быть root? Какая-то проблема с кириллицей? Я просто скачал опен сервер и распаковал его на диск С, после чего запустил. Как исправить?
Аноним 22/11/16 Втр 12:02:19 #746 №880079 
>>880071
Ширина блока -230px.
Какое значение имеют 100%?
Аноним 22/11/16 Втр 12:07:04 #747 №880081 
>>880079
100% это ширина родительского элемента
В данном случае это body, ну ширина экрана.
Зачем ты задаешь ширину в 230p параграфу и вообще применяешь к нему все стили?
Примени к article, тк это контейнер, а параграфов у тебя может быть несколько. (конечно если ты не делаешь верстку в стиле газеты)
Аноним 22/11/16 Втр 12:10:56 #748 №880085 
>>880079
https://jsfiddle.net/w22g1txz/4/

Как у тебя отобразится статья, если в ней несколько параграфов

А должно наверное так https://jsfiddle.net/w22g1txz/5/

к article применить float:left;
Аноним 22/11/16 Втр 13:19:18 #749 №880118 
>>877695
Спасибо, JS немного сложнее PHP.

получается способов наследования 5?
1.
Rabbit.prototype = Object.create(Animal.prototype);

2.
Rabbit.prototype = animal;
var rabbit = new Rabbit();

3.
function Rabbit() {
this.__proto__ = animal;
}
var rabbit = new Rabbit();

4.
function createWithPrototype(p) {
function F() {};
F.prototype = p;
return new F();
}
var rabbit = createWithPrototype(animal);

5.
Object.setPrototypeOf()

Кто-то должен это остановить...
Аноним 22/11/16 Втр 14:30:34 #750 №880140 
>>880118
Есть ещё способ в ES6 с ключевым словом extends: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/extends
Аноним 22/11/16 Втр 16:02:34 #751 №880190 
>>880140
В js треде говорят, теперь только так и делают. Врут?
Аноним 22/11/16 Втр 17:16:46 #752 №880249 
>>880072
Исправить это можно удалив опенсервер. По какой-то причине на него композер встает криво. Если не хочешь настраивать все ручками, то можешь накатить Winginx. На нем все работает без вопросов. Но лучше все-таки сборками не пользоваться.
Аноним 22/11/16 Втр 17:28:35 #753 №880260 
Чего врут-то? Тут дело в том, что class и extends - это относительно новые вещи в JS, поэтому для них лучше использовать конверторы из нового синтаксиса в старый, чтобы больше браузеров поддерживало. Об этом у Кантора тоже написано.
А твои примеры с наследованием через прототипы - суть одно и то же. Я вот споткнулся на модулях в JS, так как там зоопарк способов организовывать модульный код, да ещё и каждый способ требует ставить какой-то hipster.js
Аноним 22/11/16 Втр 18:18:52 #754 №880300 
Сап ребят, решаю задачи из учебника, не могу осилить задачу 1 из раздела "Повторим",help
Сам код : http://pastebin.com/XZJGXszP
Аноним 22/11/16 Втр 19:27:02 #755 №880355 
>>880260

Конверторы, насколько я знаю, работают только из ES6 в ES5. То есть старенькие браузеры ES3 не будут поддерживаться. Стоят ли новые фичи потери кроссбраузерности? Мне это не нравится, хотя это мое мнение, а в индустрии многие об этом даже не беспокоятся.

>>880140

Ну это только для новых, поддерживающих ES6 браузеров. В то время как например многие телефоны на андроиде никогда не получат обновления.

>>880118

> Rabbit.prototype = animal;
Это в общем довольно неудобный способ, так как требует создать экземпляр объекта, а это может повлечь какие-то побочные эффекты.

> this.__proto__ = animal;
Это не часть стандарта ES и соответственно будет работать только в части браузеров. Ну и опять же, надо объект создать сначала.

> Rabbit.prototype = Object.create(Animal.prototype);
Это требует поддержки ES5.

Кстати, какие браузеры поддерживают или неподдерживают новые стандарты можно глянуть тут:

- http://caniuse.com/#search=es5
- http://caniuse.com/#search=es6
- http://kangax.github.io/compat-table/es6/
- http://kangax.github.io/compat-table/es5/

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

Удобно конечно ориентироваться на последние версии браузеров, но все же интернет задумывался как среда, доступная с самых разных видов устройств, стоит ли сокращать эту доступность?

> Object.setPrototypeOf()
Только в ES6

> Кто-то должен это остановить...
Это мое личное мнение, но кто-то должен был при разработке языка сделать нормальные классы в стиле Ява, а не копировать идею прототипов из никем не используемого языка. Сами авторы утверждают что прототипы наоборот, не навязывают использование классического ООП, а позволяют каждому использовать свой подход.

По задумке, в JS должно было не быть классов (только функции-конструкторы, в первой версии синтаксиса литерала { a: 1 } еще не было), а объекты должны были "наследоваться" друг от друга с помощью прототипов. Я сам плохо понимаю, какие в этом преимущества и пока не видел внятного объяснения.

Что еще интересно, в первой версии языка не было Object.create(), и видимо наследование предполагалось делать по схеме:

Rabbit.prototype = animal;

Вот например мануал от Мозиллы: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain

> While this is often considered to be one of JavaScript's weaknesses, the prototypal inheritance model is in fact more powerful than the classic model. It is, for example, fairly trivial to build a classic model on top of a prototypal model.

> Хотя это считается слабым местом языка, прототипное наследование в действительности гораздо мощнее, чем классическая модель. Например, несложно построить классическую модель поверх прототипной.

Также, на эту тему писал Дуглас Крокфорд:

- http://javascript.crockford.com/prototypal.html (англ)
- http://javascript.crockford.com/inheritance.html (англ)

Кто хочет, может попробовать разобраться. Я сам пользовался разными вариантами имитации классов и в конце концов нашел вариант с

Class.prototype.method = ...

самым удобным. ООП без классов я плохо понимаю и плохо представляю, как его использовать и в чем его преимущества. Жаль, никто не хочет объяснить.

Аноним 22/11/16 Втр 19:40:54 #756 №880365 
>>880085

Да, параграфы раскидало как-то.

> А должно наверное так https://jsfiddle.net/w22g1txz/5/
Тут недостаток, что если растянуть окно, статья не растягивается и не занимает всю доступную ширину. Статья должна занимать всю ширину окна, за вычетом поля слева, которое отведено под меню. То есть ширина статьи = ширина окна - ширина меню.

>>880072

> и попытаться установить composer в какую-нибудь папку, высвечивается:
Ты имеешь в виду "попытаться установить что-нибудь с помощью композера"? Возможно, в openserver надо использовать его специальную консоль и работать в ней. В мануале ничего не написано?

Напиши, что именно (как запускаешь консоль и какую команду пишешь) ты делал. Если можно приложить скриншот или текст из консоли - вообще замечательно. А то очень трудно понять, о чем речь, особенно если я сам никогда не пользовался оперсервером.

>>880053

> >100%-230px
> что это значит?
Это значит, что ширина статьи равна ширине окна минус 230px которые отведены на меню и отступы.

По коду:

> article p
Статья может содержать не только абзацы, но и заголовки, цитаты, таблицы, ты это учел?

Определяй line-height вместе с font-size.

> font-family: Trebuchet MS;
Имена с пробелами безопаснее писать в кавычках. Также, что если у пользователя нет этого шрифта? Надо указать в конце один из стандартных шрифтов вроде sans-serif.

Текст статьи и меню тоже должны быть требушетом. Его надо задать как шрифт страницы по умолчанию.

Зачем для p задан display: inline-block? Это ведь заставит абзацы выстраиваться горизонтально, а не вертикально. Ты знаешь как работает inline-block? Инлайн-блоки выстраиваются горизонтально и переносятся, как слова внутри абзаца.

> Каким образом вёрстка сломается, если удалить текст справа?
Имеется в виду, что если удалить элемент article, меню не должно никуда съехать. И наоборот. И если добавить текста или пунктов меню, тоже ничего не должно сломаться.

То есть верстка не должна быть хрупкой и не содержать ненужных зависимостей между блоками.

Аноним 22/11/16 Втр 19:47:01 #757 №880370 
>>880015

Прочти мануал по json_encode. JSON не обязательно представлять в виде объектов, и я не очень понимаю, зачем ты выбрал такой вариант. И зачем разработчики PHP его сделали.

По поводу поля, тут есть намек: http://php.net/manual/ru/language.types.object.php

> Массивы преобразуются в object с именами полей, названными согласно ключам массива и соответствующими им значениям, за исключением числовых ключей, которые не будут доступны пока не проитерировать объект.

И тут: http://php.net/manual/ru/language.variables.variable.php

Как я помню,там есть странный синтаксис вроде $o->{$x} или $o->{'x'}

Но тебе все это не нужно.

Аноним 22/11/16 Втр 20:20:36 #758 №880384 
>>879137

Автомобильный номер: нет проверки на края строки: http://ideone.com/uljuin

Номера телефонов

> (-|\\s|\\(|\\)
Тут проще использовать символьный класс и квадратные скобки.

2 раза повторять это выражение не требуется.

>>878817

> if (arguments.length != 1) {
В JS так делать не принято, насколько я знаю. Ошибки впрочем тут нет, просто так обычно не делают. Ведь тогда тебе придется в каждой функции это в начале писать.

> if (typeof(power) != "number") {
Обычно, когда требуется проверка типов, используют
надстройку над JS вроде TypeScript. Советую почитать про него, в нем это делается гораздо проще. Правда это уже другой язык, хоть и компилируемый в JS.

Опять же, ошибки тут нет. Я иногда делал специальную функцию и писал так:

Util.assert(typeof(power) == "number");

В программе я вижу недостаток в том, что объекты энергосети не имеют у тебя ничего общего. Мы вынуждены передавать их по отдельности в конструктор департамента и по отдельности обрабатывать. Если мы захотим добавить методы вроде "добавить элемент сети", нам придется его добавлять 4 раза.

А если мы захотим добавить новый вид элементов сети, например, ПромышленноеПредприятие? Переписывать весь код?

Но ведь у элементов энергосети есть много общего:

- их всех можно подключить к энергосети
- они могут выкачивать/закачивать из нее энергию

Это явно случай, где стоит применять наследование. Сделать базовый класс ЭлементСети и наследовать от него Дома, Электростанции и тд.

Имей в виду что наследование A от B подразумевает что "A является (разновидностью) B". Не используй наследование там, где это утверждение неверно. В этом случае надо использовать подход "A содержит B внутри".

Также, неудобно что при создании Департамента надо сразу передать все элементы сети. Сделай, чтобы был метод "добавить новый элемент сети".

> Array.PowerStation
Неверно указан тип. В твоем случае это понимается как то, что PowerStation является свойством объекта Array. надо писать

Array.<PowerStation> или PowerStation[]

мануал: http://usejsdoc.org/tags-type.html

Но вообще, хорошо, что ты документируешь код.

> _powerSatations
Опечатка

> powerStationsMegawatts += pwrStat.getPower() / 2;
Не очень понятно, зачем деление на 2? Попытка учесть дневную/ночную генерацию? Это лучше сделать по аналогии с другими элементами сети.

> @param {сonst} timesOfDay - Константы класса DepartmentOfEnergy
Мне стало интересно, а можно ли описать как-то что тут константы, с помощью jsdoc? Я нашел такое:

- http://usejsdoc.org/tags-enum.html
- https://github.com/jsdoc3/jsdoc/issues/629

Но это по моему все не то. В TypeScript вроде есть enum для этого.

> if (tempPwrLines.getPower() >= demandPower - power) {
Тут можно использовать min/max

> tempPwrLines[ i ]
Это часто повторяется, стоит сделать переменную.

> function Report(timesOfDay, consumption, production, balance, balanceConverge, purchasePower, purchaseCost, salesPower, salesCost) {
Многовато аргументов, легко перепутать порядок или пропустить один из них.

Лучше использовать литерал объекта, хотя тогда не очень нужен сам класс Report, так как в нем больше ничего и нет.

> this.consumption = consumption / 1000;
Вот такие преобразования повышают риск ошибиться.

Аноним 22/11/16 Втр 20:26:26 #759 №880392 
Сап двачь, в чём профит от Eloquent и ему подобных надстройках? Насколько я понял оно по производительности сильно душит сервак. А ещё заставляет программиста подстраиваться под "его" синтаксис, не особо при этом давая профиты над тем же PDO. Или есть что-то, что даёт профиты?
Аноним 22/11/16 Втр 20:27:30 #760 №880394 
>>880392
>Или есть что-то, что даёт профиты?
Абстракция над sql кодом.
Аноним 22/11/16 Втр 20:28:08 #761 №880395 
>>874531
>>874536
Меня пропустили.
Аноним 22/11/16 Втр 20:28:47 #762 №880397 
>>880394
Зачем над SQL абстракция? в 2016 есть люди которым он кажется сложным?
Аноним 22/11/16 Втр 20:31:06 #763 №880403 
>>880397
Сложность тут не причем. Код sql довольно громоздкий, не очень красивый, и большинство запросов все равно довольно простые и вместо того, чтобы писать их из раза в раз, ОРМ предлагает тебе удобные методы.
Аноним 22/11/16 Втр 20:32:18 #764 №880405 
>>880403
А это всё не разобьётся о сложный SQL запрос?
Аноним 22/11/16 Втр 20:33:27 #765 №880407 
>>878736

> $request = implode("<br>", preg_split("/\r\n/", $request));
Ты мог бы не делать этого если используешь content-type text/plain. Но если ты используешь HTML то используй и htmlspecialchars.

Алсо есть функция nl2br

> if($read == "") break;
Лучше писать в 3 строки.

> socket_close($msgsock);
Она тоже может дать ошибку. закрытие сокета подразумевает обмен TCP пакетами FIN/ACK по сети.

Можешь попробовать погуглить про устройство протокола TCP, пригодится, хотя не знаю, понятно ли там объяснено:

- https://ru.wikipedia.org/wiki/TCP#.D0.9C.D0.B5.D1.85.D0.B0.D0.BD.D0.B8.D0.B7.D0.BC_.D0.B4.D0.B5.D0.B9.D1.81.D1.82.D0.B2.D0.B8.D1.8F_.D0.BF.D1.80.D0.BE.D1.82.D0.BE.D0.BA.D0.BE.D0.BB.D0.B0
- http://www.xserver.ru/computer/protokol/tcpip/3/18.shtml

> if ($bytesSent == $length) {
Я бы написал >= на всякий случай.

> if (preg_match("/\r\n\r\n/",
Я бы советовал для надежности делать, чтобы принимались бы и окончания строк \n\n.

В общем, хорошо сделано, переходи к следующим задачам.
Аноним 22/11/16 Втр 20:34:01 #766 №880408 
>>880405
Смотря что в твоем понимании сложный. Если совсем сложный в том же eloquent есть методы в которые можно передать чистый SQL код.
Аноним 22/11/16 Втр 20:35:30 #767 №880409 
>>880407
Спасибо. А нет ли ссылки на архив прошлого треда? А то пост про сокеты затерялся.
Аноним 22/11/16 Втр 20:36:09 #768 №880411 
Аноны, если кто-то давно ждет ответа, а я пока не ответил, можете напомнить о себе тут.

А то мы скоро перекатываться будем ведь.

>>878693

Открой инструменты разработчика (Ctrl + sHift + I) и посмотри на вкладке Elements, там пишутся примененные стили.

Аноним 22/11/16 Втр 20:36:33 #769 №880412 
>>880408
>в том же eloquent есть методы в которые можно передать чистый SQL код.
Забавно когда подключаешь ОРМ чтобы SQL код не писать, а потом пишешь SQL код...
>Смотря что в твоем понимании сложный.
Множественная выборка из 5 таблиц например.
Аноним 22/11/16 Втр 20:38:02 #770 №880414 
>>880412
>Множественная выборка из 5 таблиц например.
Обычный джоин тоже не проблема для ОРМов. Вряд ли это можно назвать сложным запросом.
Аноним 22/11/16 Втр 20:41:34 #771 №880419 
>>880409

Зайди сюда http://arhivach.org/search/ и вбей в плохо работающий поиск адрес предыдущего треда https://2ch.hk/pr/res/848550.html

Там есть то, что нужно? Если нет, я могу нужный пост у себя поискать.

>>880392
Ты плохо понял. Это ORM и его основное назначение - Object to Relational database Mapping, то есть загрузка и сохранение объектов в базу данных.

Если тебе это не надо, или ты не используешь ООП, то не используй.

Он использует судя по документации паттерн ActiveRecord. Почитать про него и про ORM можно в моем уроке про работу с БД: https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md

Если нам нужен ООП то следовательно нам нужен и ORM - либо готовый, либо самописный.

Аноним 22/11/16 Втр 20:44:28 #772 №880424 
>>880419
Благодарю, выложу тут, может кому пригодится:

>>853495

Изучи командную строку (есть гайд в ОП посте) и композер. Судя по твоим ответам, у тебя пока плоховато с теорией.

>>853619

УК почитай.

>>853636

Самый известный учебник по сетям это Олифер (книга под 1000 стр). Разбирает все последовательно с нуля.

Если неохота, то можно поискать статьи по конкретным словам. Для начала можешь взять модель OSI:

https://ru.wikipedia.org/wiki/%D0%A1%D0%B5%D1%82%D0%B5%D0%B2%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_OSI

Затем гугли конкретные технологии:

- Ethernet
- IP
- ARP
- ICMP
- UDP, TCP
- DNS
- HTTP
- php функции socket_... и stream...

Также, у меня есть кое-что по теме:

---------------

http://pastebin.ru/KO4E1mB4
http://pastebin.ru/dnO7PZfq
http://pastebin.ru/8aEdIFeO
https://github.com/codedokode/pasta/blob/master/network/http.md
https://gist.github.com/codedokode/1af26d3a64748f05ba8b870b273edfc6
Куски из моих ответов на вопросы про сокеты и сети: https://gist.github.com/codedokode/21a432321fe7bc435dab

------------------

Ну и практические задания:

1) установи Wireshark (программа перехвата пакетов на сетевой карте), закрой все лишние программы, кроме браузера. запусти wireshark, открой в браузере любую страницу, посмотри какие пакеты будут пойманы. Учти что там обычно еще идет куча мусора от соседних узлов сети и от других запущенных программ

Если ты под линуксом, то еще можно использовать tcpdump

2) с помощью команды nslookup запроси IP сервера yandex.ru у DNS-сервера 8.8.8.8

3) с помощью tracert/traceroute и whois узнай, через какие узлы и города идут пакеты, отправляемые на адреса google.com, twitter.com, vk.com, yandex.ru (или другие сайты)

4) С помощью telnet или putty соединись с сервером yandex.ru и отправь HTTP-запрос GET / HTTP/1.0

5) Напиши на php простой echo-сервер, который слушает порт, принимает соединение и отсылает каждую принятую строчку обратно.

6) Напиши простой HTTP-клиент на php, скачивающий файл по указанной ссылке

7) Напиши простой HTTP-сервер на php, отдающий какую-то простую страницу, и протестируй его с помощью браузера. В случае затруднений можно использовать wireshark (только ловить пакеты на 127.0.0.1 скорее всего не получится, используй IP на сетевой карте, узнать его можно через ifconfig)

8) Простые программы выше были однопоточными. Напиши многопоточный сервер. Его суть такая: он принимает соединения от клиентов, и все, что напишет клиент, пересылает всем остальным (что-то вроде чата). Тебе понадобится socket_select или strea_select для этого. Тупо сделать синхронный алгоритм вроде "отправить сообщение клиенту 1, затем клиенту 2" не получится, так как при зависании одного из клентов (если он перестанет принимать пакеты) зависнет и сервер до истечения таймаута.

9) перепиши свой сервер на reactphp

10) Напиши простой многопоточный HTTP сервер на reactPHP

11) Сделай чат на вебсокетах и reactPHP
Аноним 22/11/16 Втр 20:44:42 #773 №880425 
>>880419
>Если нам нужен ООП то следовательно нам нужен и ORM - либо готовый, либо самописный.
Об этом я как-то и незадумывался. Спасибо.
Аноним 22/11/16 Втр 20:47:16 #774 №880427 
>>880397

SQL это язык, специально придуманный для написания запросов к таблицам. Очевидно что он гораздо эффективнее для выборки данных чем громоздкие конструкции.

Однако, есть случаи, когда нужна именно надстройка:

- в тривиальных случаях написать $em->find('User, 10) быстрее, чем SQL запрос
- сохранить изменения в объекте удобнее через save() чем искать что именно изменено и писать запрос
- в случае, если запрос формируется кусками в зависимости от условий, то строить его через Builder выгоднее.
- в ORM Doctrine мы работаем не с таблицами, а с сущностями, и для выборки из коллекции сущностей нам нужен свой язык DQL, похожий на SQL

То есть в разных ситуациях нужны разные подходы. Глупо заменять большой SQL запрос на еще более громоздкую конструкцию из вызовов методов.

Насчет Eloquent, я его не изучал и не могу сказать насколько он адекватный. Laravel славится нестандартными подходами. Если ты хочешь пример "правильного" ORM, изучи Доктрину.

Аноним 22/11/16 Втр 20:49:00 #775 №880429 
>>880412

> Забавно когда подключаешь ОРМ чтобы SQL код не писать, а потом пишешь SQL код...

ORM подключают чтобы загружать и сохранять объекты в базу данных. Все остальное - последствия.

ORM не значит что SQL учить не надо. Это надстройка поверх, а не замена SQL.
Аноним 22/11/16 Втр 20:51:29 #776 №880432 
Кстати, ORM - хорошая тема для собеседования и проверки, понимает ли кандидат что он изучил или просто заучил примеры использования, правда? Также, можно поспрашивать всякие сложные ситуации вроде реализации наследования таблиц или EAV.

Жаль только что в этом случае вакансия так и останется незанятой, а бизнесу все же нужно ее заполнить.
Аноним 22/11/16 Втр 20:58:45 #777 №880443 
Асло, насчет тормозов, не знаю, как тормозит Eloquent, но думаю, что до Доктрины ему далеко. На быстром сервере выборка 1 объекта занимает где-то 1-2 мс и это довольно много. Но если не выбирать много объектов, то терпимо.

Может кто-то хочет поковыряться в доктрине и придумать способ более быстрой генерации объектов? Например через кодогенерацию кода маппинга вроде:

$obj->name = $array['name'];
$obj->id = $array['id'];

Задача очень сложная, требует ковыряться в внутренностях доктрины и есть ненулевая вероятность, что ничего не получится.

Вообще, надо бы нам сформулировать "сложные" задачи для тех, кто хочет прокачать свои навыки. Вот что у меня есть в запасе:

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

Надо наверно это оформить в задачи, вдруг кто заинтересуется. Не всем же наверно интересно студентов из массива в массив перекладывать.
Аноним 22/11/16 Втр 21:06:19 #778 №880449 
>>880443
Меня всегда интересовало, как доктрин узнает, что доставленный объект изменил свои свойства где-то в скрипте, чтобы потом проапдейтить его в бд.
Аноним 22/11/16 Втр 21:14:23 #779 №880460 
>>880432
Да там всё изучение состоит в
>Зайти на сайт ORM
>Прочитать 1 страницу инструкции
Если и не знаешь, выучишь за минут 10.
>>880443
>Асло, насчет тормозов, не знаю, как тормозит Eloquent, но думаю, что до Доктрины ему далеко.
Интересно насчёт торможения vs Самописной ORM.
>придумать способ более быстрой генерации объектов?
Весьма интересная задача должен заметить!
Аноним 22/11/16 Втр 21:18:40 #780 №880466 
>>880449

По умолчанию она хранит у себя:

- все загруженные или за-persist-ченные объекты
- копию значений всех свойств этих объектов.

При вызове flush() она сравнивает свойства и их копию и генерирует INSERT/DELETE/UPDATE.

Код реализован в этом классе: https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/UnitOfWork.php

Смотри метод commit().

Если тебя это не устраивает, ты можешь использовать явное уведомление доктрины об изменениях или объявить сущности неизменяемыми:

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/change-tracking-policies.html

Способ с уведомлениями очень эффективный, но требует подстраивать код моделей под него и убирает часть магии.

Аноним 22/11/16 Втр 21:40:34 #781 №880484 
>>880449

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

>>880460

кстати, если интересно, можно найти доклады про то как люди писали свои ОРМ:

- http://www.slideshare.net/munkie/orm-8320208

увы, не смог найти ссылку на интересную презентацию, которую где-то раньше видел.

Алсо интересный доклад http://www.slideshare.net/ssuser796ae4/pony-orm-piterpy2014

>>880460

Тогда постараюсь как-нибудь на неделе сформулировать нормально задачу, пока, если хочешь, установи доктрину, поработй с таблицами, сравни скорость выборки например 100 сущностей через доктрину и напрямую, попробуй попрофайлить это все.
Аноним 22/11/16 Втр 22:48:23 #782 №880523 
14798441036120.png
Сап Двач, есть ли способы открыть файл на стороне обходя эти функции ?
Аноним 23/11/16 Срд 01:26:41 #783 №880629 
>>880523

Что значит "открыть на стороне"? Установи PHP себе на компьютер (урок в ОП посте) и запускай что хочешь.
https://github.com/TheSidSpears/Students Аноним 23/11/16 Срд 09:37:56 #784 №880707 
>>866133

> https://github.com/TheSidSpears/Students
> Скопировать проект в web-директорию
Мне не очень нравится эта идея. Небезопасно выкладывать код в публичную папку, и в твоей инструкции лучше бы сделать по умолчанию безопасный способ с папкой public в качестве корня сервера. Да и не очень понятно, в чем сложность сделать папку public корнем. Встроенный в PHP сервер можно запустить в этой папке за поминуты (правда, ему понадобится вспомогательный скрипт для роутинга...).

https://github.com/TheSidSpears/Students/blob/master/composer.json#L14
> "require-dev": { "ext-xsl":
Что-то я не очень понял, зачем. Или это композер сам нагенерировал?

> `hash` varchar(200) NOT NULL, хеш, используемый для авторизации
Комментарии надо добавлять через ключевое слово COMMENT, чтобы они сохранились в БД и отображались в программах просмотра таблиц: id INT NOT NULL COMMENT '....'

https://github.com/TheSidSpears/Students/blob/master/public/user_style.css#L1
> mark{ display: inline-block;
Зачем менять стиль с inline на inline-block? Если mark это inline то он натягивается на текст и может например переноситься вслед за текстом. В то время, как inline-block выглядит как отдельный прямоугольник: https://jsfiddle.net/vpq88vmh/

Кстати, в ОП посте есть задачки по CSS.

> https://github.com/TheSidSpears/Students/blob/master/app/container.php
> Контейнер, использующий технологию Dependency Injection
Не совсем точный комментарий. DI это передача зависимостей классу извне (например, в конструктор). DI контейнер сам по себе ничего не получает через конструктор и к нему эта фраза неприменима. Он скорее используется как вспомогательный компонент, чтобы не было нескольких копий одного сервиса и чтобы не надо было много раз копипастить код создания сервиса.

https://github.com/TheSidSpears/Students/blob/master/app/Controllers/FrontController.php#L59
> private function errorCaller($errorCode){
Названия функций начинаются с глагола


https://github.com/TheSidSpears/Students/blob/master/app/Controllers/FrontController.php#L32
> exit;
лучше не использовать exit. Может мы хотим после вызова start() что-то еще сделать.

https://github.com/TheSidSpears/Students/blob/master/app/Controllers/ViewController.php#L20
> public function showView($viewVars=NULL){
Эта переменная тут не используется. И непонятно, зачем 2 метода, render и showView, вместо одного.

https://github.com/TheSidSpears/Students/blob/master/app/Controllers/FrontController.php#L60
> new ErrorController($this->c,$this->router);
Конструктор там принимает вторым аргументов название действия

https://github.com/TheSidSpears/Students/blob/master/app/Controllers/ProfileController.php#L82
> $student=$this->c['studentsGW']->getStudentByHash($_COOKIE['hash']);
Надо бы, чтобы вся работа с авторизационными куками была спрятана в классе авторизации.

https://github.com/TheSidSpears/Students/blob/master/app/Controllers/ProfileController.php#L111
> ,'hash'));
Непонятно, почему hash должен содержаться в данных формы. Его можно редактировать?

https://github.com/TheSidSpears/Students/blob/master/app/Controllers/ProfileController.php#L90
> foreach ($studentData as $field) {
> $field=trim(strval($field));
$field это не элемент массива, а лишь копия его значения. Сам массив при этом ты не меняешь.

https://github.com/TheSidSpears/Students/blob/master/app/Exceptions/ConfigException.php#L8
> if (isset($jsonLastError)) {
лучше использовать is_null или === null для проверки, так как isset обычно используется для проверки факта существования переменной.

https://github.com/TheSidSpears/Students/blob/master/app/Validators/StudentValidator.php
Я не помню, говорил я тебе или нет, что тут можно перейти от массива с описанием формы к ООП. Ну например, тут можно сделать элементарные валидаторы отдельными классами. Это позволит легко добавлять новые валидаторы, а также позволит использовать их и в других проектах.

В принципе, в твоем случае массив еще допустим, но по мере развития кода там скорее всего станет слишком много всяких условий и код получится запутанным.

> if($mask['type']=='string'){
> elseif($mask['type']=='int'){
> elseif($mask['type']=='enum'){
В таких случаях надо всегда ставить else с выбросом исключения, иначе опечатка останется незамеченной.

> if (($this->checkEmail( $s->email,$s->getId() ))) {
Название неудачное, так как непонятно, что она должна вернуть. Надо использовать название вроде isEmailUsed/isEmailAvailable.

> $s->$field
Это там так много раз повторяется, что стоит однозначно вынести его в переменную

https://github.com/TheSidSpears/Students/blob/master/app/views/modules/auth_status.php#L3
> Вошли как: <?=$user->name?> <?=$user->sname?>
А где тут htmlspecialchars?

https://github.com/TheSidSpears/Students/blob/master/app/views/modules/form_errors.php#L6
> <li style="list-style-type: none;">
тут однозначно стоит поставить на ul класс error-list и прописать нужный стиль там.

> case 'register_succsess':
Пока у тебя только 3 уведомления, может это и не требуется, но вообще тут лучше было использовать константы.
Аноним 23/11/16 Срд 09:53:31 #785 №880713 
Новый тред >>880700 (OP)

>>880395
>>874531

null превращается в {}: http://ideone.com/GIedXZ

Прочитай внимательно например это: https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Operators/typeof

>>874536

12 - http://ideone.com/873GTD
> Hamburger.prototype.getPrice = function() {
> if (this._toppings.length != 0) {
Это не обязательно.

Решено верно.

14 - http://ideone.com/vEyOAj

> if (typeof data == "object" && type != "array" && data.length >= 0) {
А что, если data === null? Ошибочка. http://ideone.com/0Yg8bz


Аноним 23/11/16 Срд 09:57:58 #786 №880714 
>>880300

> $punctuation = ['!',',','.','?',':',';'];
> foreach ($punctuation as $symbol){
Ты недооцениваешь мощь регулярных выражений. С их помощью можно искать все знаки препинания одновременно, используя конструкцию вроде

(a|b|c) или [abc]

И $0 ... $9 в выражении для замены (смотри офиц. мануал).

> ([!,.:;?]<!{$symbol})
Вот тут явно ошибка. Символы

<!

обозначают тут сами себя.

> preg_replace($pattern,$replacement,$processed_sentences);
Preg_replace не трогает исходную строку, а возвращает новую. Надо ее сохранять.


Аноним 23/11/16 Срд 10:04:15 #787 №880715 
>>877756

Все верно, хотя это (\s|\-|\(|\) было удобнее записать через символьный класс (квадратные скобки).

Аноним 23/11/16 Срд 11:16:16 #788 №880737 
>>880370
Спасибо большое, я просто конвертнул в массив вместо объекта в итоге, да.
Аноним 23/11/16 Срд 12:54:34 #789 №880777 
>>880355
>Удобно конечно ориентироваться на последние версии браузеров, но все же интернет задумывался как среда, доступная с самых разных видов устройств, стоит ли сокращать эту доступность?


Можно же сравнить разные подходы разработки:
1. С самого начала пытаемся поддерживать максимум устройств и версий браузеров. Используем ES3 и кроссбраузерные решения.
Плюсы:
- Начиная с первых этапов разработки программа поддерживает много устройств
- Код весит меньше, чем в случае подключения библиотек для поддержки старых браузеров, т.к. мы используем хаки только там, где это необходимо
Минусы:
- Придется писать больше строчек кода
- Код несколько сложнее читать / модифицировать, т.к. часть которая отвечает за логику самого приложения смешана с частью, которая осуществляет кроссбраузерность и поддержку старых устройств
- Разработчик не может знать все, соответственно в конце придется тестировать код на разных браузерах, и либо искать решение самостоятельно, либо брать готовое куски для определенных багов из библиотек
- Сложнее оценить время на разработку
- Для заказчика такой подход достаточно затратен, требует поиска профессионала с опытом, и платить ему придется больше
2. Ориентироваться на последние версии браузеров и устройств. ES6
Плюсы:
- Писать такой код приятнее
- Код понятнее, так как сама логика программы отделена в пространстве-времени от той части, в которой мы затыкаем дыры и осуществляем кроссбраузерность и поддержку старых браузеров
- Меньше строк кода
- Фактически мы используем готовые библиотеки для поддержки старых устройств, соответственно тратим меньше времени
- Весь проект легче оценить с точки зрения трудозатрат. Время на разработку программы будет зависеть, только от скорости кодера писать простой код. Он не будет тратить время на дебаг и поиск решений для поддержки старых браузеров для каждой конкретной проблемы, появляющейся по мере написания программы. За это отвечают сторонние библиотеки, качество которых мы можем оценить заранее.
Минусы:
- На первом этапе разработки программа будет корректно работать только в браузере разработчиков
- Финальная версия программы тяжелее, т.к. тянет за собой несколько сторонних библиотек
3. Ориентируемся на распространенные браузеры среди нашей аудитории, и соответственно используем стандарт, который наиболее широко поддерживается в этой среде. Далее используем либо первую, либо вторую стратегию.


Можно сделать вывод, что наиболее оптимальный способ для сферической разработке в вакууме, это выбрать наиболее распространённый стандарт. А поддержку старых устройств осуществлять за счет подключения сторонних библиотек. Это сэкономит время и нервы.


Кстати EA нынче делают игры для топовых конфигураций, а потом оптимизируют под старое железо, в т.ч. консоли.


Ни-одной-строчки-настоящих-JavaScript-приложений-Кун
Аноним 23/11/16 Срд 16:00:17 #790 №880886 
>>864640 (OP)

http://ideone.com/kqa2me
Аноним 23/11/16 Срд 16:39:41 #791 №880912 
О госпади! 10 из 10!

>Желтый старичок (:older_man:) отмечаeт комментарии. Встретив его, компилятор сразу же переходит к следующей строчке.
>Многострочные коммeнтарии удобнее делать при помощи старушек (:older_woman:). Все, что попaдает между двух старушек, будет проигнорировано.

Язык будущего Emojicode

https://xakep.ru/2016/08/11/emojicode/
Аноним 24/11/16 Чтв 04:47:03 #792 №881324 
>>880777

Неплохой анализ, но я кое-что дополню:

> Код несколько сложнее читать / модифицировать, т.к. часть которая отвечает за логику самого приложения смешана с частью, которая осуществляет кроссбраузерность и поддержку старых устройств

Не обязательно. Я обычно такие вещи выношу в отдельные функции в отдельном модуле, и ничего не смешивается. Ну условно говоря, если мне нужен аналог indexOf для массива, то я делаю отдельную функцию для этого.

> Разработчик не может знать все, соответственно в конце придется тестировать код на разных браузерах, и либо искать решение самостоятельно, либо брать готовое куски для определенных багов из библиотек
Это верно, но это повышает уровень разработчика и со временем кроссбраузерность перестает быть сложным моментом. Хорошим источником информации может быть код библиотек вроде jQuery.

> требует поиска профессионала с опытом,
Ну зато наличие профессионала повышает вероятность, что приложение будет качественным, а не сделанным на "отвяжись".

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

Сейчас в комментах на хабре прочел например, что на собеседовании в booking.com спрашивали про особенности IE6.

Ну и надо понимать, что если например есть андроид-смартфон 2-3 летней давности, его браузер вполне может не справиться с рассчитанным на ES6 кодом.

Потому мне кажется, что разработчику стоит учиться делать все правильно и кроссбраузерно, а на работе - делать так, как скажут.

> Кстати EA нынче делают игры для топовых конфигураций, а потом оптимизируют под старое железо,
Скорее всего они заранее в архитектуру закладывают такие возможности.

Аноним 24/11/16 Чтв 04:47:53 #793 №881325 
>>880886

Хорошо, все верно.
Аноним 24/11/16 Чтв 21:57:05 #794 №881673 
14800138251410.png
>>880411
А как мне это поможет?
Старые ответы Аноним 26/11/16 Суб 13:18:39 #795 №882402 
>>866170

> Но как его передать в следующий скрипт, в котором ко всему создается свой экземпляр $data.
Если ошибок нет, то ты сохраняешь данные в базу и следующий скрипт может взять их оттуда. Если ошибки есть, то ты выводишь форму повторно и таким образом проблем с передачей данных нет.

> Но потом на самой странице выводится темплейт и в начале него создается еще один экземпляр Data(), я пробовал сохранить как public свойство в $data, но т.к. создается новый экземпляр, это не работает.
Значит надо не создавать новый экземпляр, а использовать старый.

Название - Data - неудачное так как почти любой класс хранит какие-то данные. Класс логично назвать SomethingForm если он хранит данные формы. И непонятно, зачем тогда массив $values, если у нас есть $data.

> Если (ошибок нет) {
> $errors = $data->someDataMethod($values);
И это тоже странно. Ты же выше проверил данные, зачем их еще раз проверять?

> если все ок то $errors = ['check' => 1, 'balance' => 1, 'transaction' => 1];
И это странно, $errors это массив или объект для хранения ошибок. Зачем туда сохранять единицы? Если ошибок нет, то $errors пуст.

Ты как-то странно изменил алгоритм, добавив в него нелогичные вещи.

>>866640

Не поможем.

>>866907

Ты пробовал гуглить по "protobuf php"? То, что находится, не подходит?

Возможно там есть библиотеки, которые не требуют компиляции.

>>867356

Я как-то не особо пользовался, потому не знаю
https://github.com/anotherCodeMunkey/studentsList/ Аноним 26/11/16 Суб 13:19:14 #796 №882403 
>>867331

Что-то у тебя пример конфига нгинкса какой-то запутанный. Ну вот например:

> rewrite ^(.*)$ /index.php;
Там для статических файлов наверно запрос к PHP отправлять не надо. Обычно статические файлы определяют по расширениям, и отдают их нгинксом, а все остальное перенаправляют на php-fpm.

А твой конфиг выглядит каким-то переусложненным. Один и тот же root несколько раз прописан. зачем-то сделан location для php-файлов который все равно перенаправляется на index.php. Советую почитать мануал по нгинксу, благо он есть на русском.

https://github.com/anotherCodeMunkey/studentsList/blob/master/students.sql
Тут в таблицу надо добавить уникальный ключ для полей, значения которых не могут повторяться.

https://github.com/anotherCodeMunkey/studentsList/blob/master/autoloader.php#L3
> set_include_path(__DIR__);
Теоретически в include_path могут быть заданы какие-то нужные папки для библиотек, и обычно его не переопределяют, а дополняют. Но в принципе, в этом случае я особой проблемы не вижу.

https://github.com/anotherCodeMunkey/studentsList/tree/master/bootstrap
Эта папка у тебя за пределами папки public и будет недоступна для браузера.

https://github.com/anotherCodeMunkey/studentsList/blob/master/router/Router.php
> namespace router;
Неймспейсы у тебя не по PSR-4 названы, так как там они начинаются с большой буквы. Ну и я бы советовал не добавлять app в неймспейс, так как он ничего не значит, а сделать папку app корнем.

Класс роутера можно было положить в app, а не выделять для него отдельную папку.

https://github.com/anotherCodeMunkey/studentsList/blob/master/router/Router.php#L11
> $routesPath = '../config/routes.php';
> $this->routes = include($routesPath);
Плохо использовать относительные пути к файлам. Там запутанная система, относительно какого именно каталога ищется файл. Соответственно, есть вероятность что в каких-то случаях он просто не найдется. Надо использовать абсолютные пути через __DIR__

В роутере плохо, что у тебя в нем захардкожено обращение к $_SERVER. Почему мы не можем вызвать роутер и передать ему произвольный URL?

> if(preg_match("/bootstrap/",$uri))
> require_once $uri;
Вот это неправильно. require_once выполняет PHP код, а при отдаче статики никакого PHP кода там не должно быть. Тут бы больше подошел readfile. Ну и отдавать статические файлы надо сразу веб-сервером, не дергая PHP для этого.

> if(preg_match("/bootstrap/",$uri))
Ты не проверяешь, что bootstrap идет именно в начале, а не в середине URL.

> if(preg_match("~$uriPattern~", $uri))
А почему ограничитель ~ не хранить тоже в конфиге? Будет меньше путаницы.

> $controllerName = 'app\controller'."\\".ucfirst(array_shift($pieces)).'Controller';
Лучше указывать полное имя класса. При поиске по имени класса (чтобы узнать, где он используется), например твой конфиг не найдется. То же касается и метода.

Методы контроллеров обычно называют как somethingAction.

Твой роутер - это не роутер, а Front Controller. Обычно роутер только определяет, кто должен обработать URL, но сам контроллер не вызывает.

Метод run() написан некорректно. Что, если URL не соответствует ни одному маршруту в конфиге? У тебя это просто не обрабатывается. Что, если URL соответствует 2 маршрутам? У тебя вызовутся оба контроллера по очереди.

> if(!empty($_SERVER['REQUEST_URI']))
И что должно происходить, если REQUEST_URI пуст?

> https://github.com/anotherCodeMunkey/studentsList/blob/master/config/routes.php
> '(\\/\\?[p][a][g][e]\\=[0-9])'
Это неудачная идея. Обычно query string не участвует в роутинге, так как к URL всегда могут быть приписаны какие-то дополнительные параметры.

И непонятно, зачем букву p брать в квадратные скобки. И зачем слеш перед равно.

> https://github.com/anotherCodeMunkey/studentsList/blob/master/app/controller/ListController.php
> public $pageNumber;
Не очень понятно, зачем это поле сделано public. Кто-то будет обращаться к нему снаружи?

> require_once '/../view/main.php';
Обычно для этого делают метод вроде render('template.phtml', ['a' => 1]);

> if(isset($_POST['exit']) == false)
Для разлогинивания логично сделать отдельный маршрут и отдельный метод контроллера.

Насчет метода search - для него нет особого смысла делать отдельный метод, это по сути тот же самый getStudents.

> $pdo = new TDG();
Одинаковые вещи надо называть одинаково.

https://github.com/anotherCodeMunkey/studentsList/blob/master/app/controller/UserController.php#L16
> $this->info[$key] = htmlentities($data, ENT_QUOTES, "UTF-8");
htmlspecialchars надо использовать только в шаблоне при выводе данных. Ты делаешь экранирование слишком рано.

Приведу пример проблемы: как ты проверишь, что пришедшее значение содержит не более N символов, если htmlspecialchars может удлинять обработанное им выражение?

> $student->insertName($this->info['name']);
> $student->insertLastName($this->info['lastName']);
> $student->insertGender($this->info['gender']);
Тут стоило бы использовать цикл или сделать в классе метод для простановки значений разрешенных полей из массива.

https://github.com/anotherCodeMunkey/studentsList/blob/master/app/controller/UserController.php#L24
> if($validator->validate($this->info) === true)
> ....
> }else{
> $this->error = $validator->validate($this->info);
Не могу понять логику, зачем один и тот же метод вызывается 2 раза?

Также, логичнее сделать валидатор для модели студента, а не для массива с неопределенным набором полей.

> private function getValidation()
Как читать это название? "получить валидацию"? Что значит получить? Нужно выбрать более логичное название для метода.

Также, не вижу особого смысла хранить данные из формы в поле info. зачем хранить их в поле, если можно просто передать в функцию, как аргумент? Вот у тебя код:

> $this->getInputData();
> $this->getValidation();
Непонятно, как тут передаются данные. Если же написать

$formData = $this->getFormData();
$something = $this->validate($formData);

То будет гораздо нагляднее.

> if($_POST == NULL)
В какой ситуации это условие выполняется? $_POST это всегда массив.

> $user = $pdo->hashSearch($_COOKIE['student']);
> if(is_array($user))
> {
> $student = array_shift($user);
> }
> return $student;
Что произойдет с этим кодом, если условие is_array не выполнится? Подсказываю: тут будет ошибка. Это некорретный код. Понять, что он некорректный, очень легко: видно что переменная $student иногда создается, а иногда - нет и при этом используется ниже.

Вообще, эти контроллеры никуда не годятся и их надо переписывать.

https://github.com/anotherCodeMunkey/studentsList/blob/master/app/controller/helper/CookieMaker.php
Плохое название. Во-первых, класс не только "делает" куки, но и уничтожает. Во-вторых, из названия можно подумать, что он создает любые куки, но по факту он работает только с одной кукой. Надо переименовать.
https://github.com/anotherCodeMunkey/studentsList/ Аноним 26/11/16 Суб 13:19:50 #797 №882405 
>>867331

> static function destroyCookie()
> header("Location: http://$serverHost/");
Это нелогично. Почему функция, которая называется "уничтожить куку", делает редирект? Что, без редиректа унитожить куку невозможно? Вот представь, кто-то использует твою функцию, не зная, что она делает редирект, а потом будет долго искать причину ошибки. Название функции должно соответствовать ее логике работы.

https://github.com/anotherCodeMunkey/studentsList/blob/master/app/controller/helper/Pager.php
На мой взгляд, задача получения студентов из БД - лишняя. И непонятно, почему этот класс отнесен к контроллеру.

https://github.com/anotherCodeMunkey/studentsList/blob/master/app/controller/helper/Validator.php
Валидатор это вообще-то часть модели.

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

Как я написал выше, удобнее валидировать не массив неизвестной структуры, а модель студента. Тогда валидатор сможет проверять любых студентов, а не только пришедшие из формы данные.

> $validation['name'] = 1;
> $error['name'] = true;
А в чем именно ошибка, ты не сообщаешь? И не очень понятно, зачем 2 массива, если достаточно просто массива $errors.

> if (isset($error) != NULL)
isset возвращает true или false, зачем ты сравниваешь его с NULL? Также, зачем тут вообще isset, ты хочешь проверить, что переменная существует? Не надо писать такой код, где переменная может существовать, а может и нет, так как его труднее читать и поддерживать.

Способ возврата выбран неправильно. Функция должна возвращать значение определенного типа, а не иногда массив, иногда true. Это усложняет работу с результатом этой функции.

Вообще, я тут собрал некоторые полезные советы по написанию хорошего кода, советую почитать: https://github.com/codedokode/pasta/blob/master/good-code.md

> $sql = $pdo->searchEmail($form['eMail']);
Почему переменная названа $sql? Она хранит SQL-код?

> +[.][a-z]{2,3}$/iu';
Это давно устарело, давно уже есть домены верхнего уровня вроде .engineering или .moscow. Погугли "валидация email адресов".

Код в валидаторе слишком запутанный, надо его переписать. Метод валидации слишком длинный, надо разбить его на части.

> if(strlen($form['lastName']) < 30 && $match == 1)
strlen считает байты, а не символы, читай урок https://gist.github.com/codedokode/ff99e357e9860ea169b8

https://github.com/anotherCodeMunkey/studentsList/blob/master/app/model/Student.php#L17
> public function insertName($name)
Традиционно такой метод называют setName().

https://github.com/anotherCodeMunkey/studentsList/blob/master/app/model/TableDataGateway/TableDataGateway.php#L8
Конфиг должен быть в отдельном файле. Пользователь не должен лазать по коду, чтобы поменять настройки базы данных.

Ты создаешь объект TDG иногда по несколько раз. А ты знаешь, что при каждом создании объекта PDO создается новое соединение к БД? Это неэффективно, надо переиспользвоать одно соедиенние. Также, класс работы с БД не должен сам устанавливать с ней соединение, а получать объект PDO через Dependency Injection, у меня есть урок по нему.

> $sql = $pdo->prepare("SELECT * FROM list WHERE eMail = :eMail");
Неудачное название переменной, там возвращается объект PDOStatement, а не SQL код.

https://github.com/anotherCodeMunkey/studentsList/blob/master/app/view/login.php#L17
> required=""
Нужно писать либо просто required, либо можно required="required".

> <html lang="en">
Это повторяется почти в каждом шаблоне, логично бы перенести это в шапку.

> action="http://<?php echo SERVER_HOST;?>/search">
Не обязательно указывать полный URL, почитай про относительные УРЛ: https://github.com/codedokode/pasta/blob/master/network/urls.md

https://github.com/anotherCodeMunkey/studentsList/blob/master/app/view/search.php#L26
> if(!isset($students)
Надо чтобы переменная существовала всегда, а не иногда. Это же неудобно.

По условиям задачи номер группы может содержать не только цифры.

Для поля года рождения возможно логичнее использовать инпут с type=number.

У тебя при неправильном заполнении формы значения в ней теряются. Это неправильно. Надо выводить форму с введенными в нее значениями.

https://github.com/anotherCodeMunkey/studentsList/blob/master/app/view/blocks/pop_ups/searchNotification.php
тут классический пример XSS, читай: https://github.com/codedokode/pasta/blob/master/security/xss.md

> <br> Вы вошли как: <br>
Использование br тут показатель того, что ты плоховато знаешь CSS. Логичнее было завернуть строки в дивы. Отступы надо делать через CSS. В ОП посте, если что, есть задачи по этй теме.

https://github.com/anotherCodeMunkey/studentsList/blob/master/app/view/blocks/autorizedBody.php
https://github.com/anotherCodeMunkey/studentsList/blob/master/app/view/blocks/body.php
Тут много общего, стоит объединить вместе.

> <meta name="description" content="">
> <meta name="author" content="">
не очень понятно, зачем тут эти пустые теги.

Пока еще не реализована сортировка списка студентов.

В общем, читай комментарии к задаче, читай разные уроки, улучшай код.

Старые ответы Аноним 26/11/16 Суб 14:16:55 #798 №882441 
>>867437

Можешь погуглить, но я сомневаюсь, что найдешь.

>>867451

Sublime Text, Atom, PHPStorm, Netbeans.

>>867561

Ну вот для борьбы с этим придуман Query Builder.

>>868883

Куки в браузере хранятся отдельно для каждого домена. Если открыть один сайт в нескольких вкладках то логично что все эти вкладки будут использовать одни и те же куки. Так как идентификатор сессии хранится в куке, то и сессия общая для всех вкладок. Если ты в одной вкладке записал что-то в куки или сессию, то при загрузке страницы в другой вкладке она увидит эти изменения.

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

>>869361

Значит ты все-таки что-то вывел. Проверь, что в конце файла ты не ставишь ?> за которым может прятаться лишний пробел. И что в файле перед <?php ничего нет, включая BOM (то есть файл сохранен в кодировке utf-8 без BOM).

>>869378

header Location автоматически ставит код из серии 3xx (так как именно этот код говорит браузеру сделать повторный запрос). Ты должен отдать код 404 и страницу ошибки и завершать скрипт, а не редиректить. Плюс, при редиректе теряется УРЛ в адресной строке и бесполезно обновлять страницу. Где такому учат? В устаревших учебниках?

>>869379

ну вот, ты отдаешь редирект с кодом 3xx, а надо отдавать код 404.

>>869598

Если ты не можешь сделать на JS, можешь сделать без JS. Сделай радиокнопки перед каждым комментом и замаскируй их под кнопку "ответить на комментарий", а также подсвечивай выбранный комментарий.

>>869671

Обычно значение константы не так важно. Константу в принципе не предполагается выводить. Или например, если для 2 констант мы должны выводить один и тот же текст - как их различать?

Ну и с константой могут быть связаны еще другие дополнительные значения.
Аноним 26/11/16 Суб 15:05:28 #799 №882472 
>>875765
> А вы, аноны, можете его решить?
Попробовал, буду рад если глянешь хотя бы одним глазком: https://bitbucket.org/learning_acc/file-downloader/src/

Использовал разные подходы/инструменты, у меня результаты такие:
- самый медленный загрузчик - тот, что использует file_(get|put)_contents;
- использование cURL вместо file_get_contents немного уменьшает время загрузки, синхронный газл ещё чуть-чуть быстрее;
- асинхронный газл во много раз быстрее загрузчиков, упомянутых выше;
- для файлов малого размера (до мегабайта) форки немного медленне асинхронного газла (создаю форк процесса на каждую ссылку), но с оговоркой - если мне нужно скачать, к примеру, 500 файлов, то создаётся 500 форков, посылающих запросы на скачивание файла. Доброчан отдаёт код 503, сосач же просто перестаёт отвечать;
- форки быстрее асинхронного газла если размер файлов больше 5-10мб и их немного;

Там сейчас много копипаста в загрузчиках + их неудобно запускать с разными файлами (нужно менять лезть в исходник загрузчика, а не указывать ссылки для скачивания к примеру из консоли). Приоритетным было научиться писать что-то более сложное, чем file_(get|put)_contents. Хотя, я ведь просто воспользовался готовыми инструментами, понимания это не прибавило.
Аноним 28/11/16 Пнд 15:21:01 #800 №883629 
Новый тред есть где-нибудь?
Аноним 28/11/16 Пнд 18:19:01 #801 №883743 
На проверку:

Граммар Наци

http://ideone.com/uNsBBv - первое задание с выделением текста. У меня сложилось ощущение, что тут нужно больший кусок текста выводить с ошибкой, но я без понятия как это сделать. В голову приходит работа с флагом PREG_OFFSET_CAPTURE, но как на деле это все применить - хз...

http://ideone.com/XHg06L - вторая часть с тихим исправлением полегче.
Старые ответы Аноним 29/11/16 Втр 21:15:56 #802 №884464 
Не пишите здесь, пишите в новом треде: >>880700 (OP)

Если я кого-то пропустил - напомните о себе в новом треде.

>>873056

У кого-то из анонов получилось, поищи истории по треду.

>>873085

Тогда надо использовать группировку, чтобы сгруппировать несколько записей, относящихся к одному виду товара, в одну строку.

>>873199

Твой ответ верный, в учебнике просто примерная цифра указана.

>>873305

Надо сначала объединять, а только потом группировать.

>>873517

Не знаю, но могу предложить зайти на их сайт, там наверняка написано в чем преимущества.

>>873533

Это не очень удачная рекомендация, на мой взгляд. И мне эти функции filter_input не очень нравятся, так как они дают людям ложное чувство защищенности. Для защиты от разных уязвимостей фильтровать данные на входе недостаточно.

С другой стороны, многие классы (кроме специально для этого предназначеннных) не должны обращаться к глобальным переменным, ни через $_SERVER, ни через filter_input, а получать информацию от того, кто их использует.

>>873552

Очень странно, что ты получаешь некоторые шаблоны по HTTP. Где тут логика? Это медленнее и ненадежнее, чем брать их с диска. Если не используется HTTPS, то это еще и создает вектор атаки для "человека посередине", способного перехватывать трафик, он может вместо шаблона что-то еще подсунуть. Или может это закладка от предыдущих разработчиков?

Писать свой шаблонизатор, на мой взгляд, глупая затея. Тем более такой убогий.

> Концепция в том, что чем меньше HTML внутри php, тем лучше.
Концепция не в этом, а в том, что надо отделять логику обработки данных от логики вывода данных. PHP внутри HTML использовать можно, как и писать логику вывода данных в шаблонах.

Аноним 29/11/16 Втр 21:16:51 #803 №884467 
>>883743

Пожалуйста, напиши в новом треде >>880700 (OP)

>>883629

Да, >>880700 (OP)
Старые ответы Аноним 29/11/16 Втр 21:17:25 #804 №884469 
>>873869

Нет, не верно. Твое выражение читается так:

- цифра
- за ней любое число открывающих скобок
- за ними любое число закрывающих
- за ними любое число минусов
- за ними любое число пробелов

А надо именно "любые из указанных символов в любом порядке". Ну дам подсказку. Написать "один любой из указанных символов" можно аж 2 способами:

- (a|b|c)
- [abc]

Перечитай внимательно урок про ветртикальную черту и квадратные скобки.

Ну а написав "один любой из символов", несложно там добавить кое-что, чтобы получилось "любое число этих символов". Ну а далее останется только добавить "повторить 10 раз" и задача решена.

>>873884

Переусложнено. Зачем что-то делать с массивом, если можно просто сделать переменную и увеличивать на 1 каждый раз когда видишь высокого школьника?

Не используй подчеркивание в названиях переменных. Не используй бессмысленные названия вроде h или h_1, пиши anonHeight например.

> foreach ($h as $height => $number)
Неправильно. Ты перепутал местами ключ и значение элемента массива. Рост будеет справа от стрелочки, а не слева.

Ошибок, как видишь, много, почти в каждой строке.

>>873922

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

> Алсо есть такой баг или фича непонятная в IDE - когда я делаю класс синглтононом я не могу смотреть их через автодополнение. Такая хуита в нетбинсе и эклипсе.
Не знаю, не могу сказать без примера кода. Но могу сказать что синглтон довольно плохой паттерн и вместо него надо в большинстве случаев применять Dependency Injection.

> использую синглтон для класса соединения с БД
Зря. Синглтон не нужен для этого, объект PDO можно просто создать через new и не усложнять код. Это типичный пример как писать не надо. Кто-то неграмотный написал про это в учебнике, теперь все это копипастят как самый простой паттерн для изучения.

Советую прочитать мой урок по Dependency Injection.
Старые ответы Аноним 29/11/16 Втр 21:17:51 #805 №884470 
>>874438

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

У меня в учебнике есть задача "Вектор" и "Кошки-мышки", которые пытаются помочь с этим разобраться.

Также, есть аббревиатура SOLID, можешь погуглить "solid ооп".

Также, есть статья с Хабра: https://habrahabr.ru/post/153225/

Ну и еще полезно смотреть примеры ООП кода, ну например, из компонент Симфони.

>>Вообще, у разных существ может быть разная восприимчивость к видам урона, логичнее сделать у существа метод "принять урон", а не закладывать что он всегда складывается.
> За эту разную восприимчивость к разному урону будет отвечать обязательный для каждого существа объект армор.
Это тоже возможно, хотя в моем представлении у воина может не быть брони, ну например, не купил или сломалась. И тогда логично сделать, чтобы удар сначала гасился броней, и остаток, возможно, уже применялся к персонажу. Можно конечно и твой вариант использовать, если броня будет всегда.

>>874442

> Типа берется шаблон разметки (причем не всей, а какой либо её части, типа только div с таблицой из бд), заполняется посредством скрипта php, который в свою очередь соединяется с MySQL (кстати, только MySQL или возможны соединения с любыми БД, типа там постгрес, мсскл, и прочие?) бд, а потом заполненный контентом кусок html подгружается пользователю через какой нибудь ajax?

Для начала лучше не использовать аякс, тебе надо сначала с основами разобраться на простых примерах. Один скрипт получает данные, неважно как, и вызвает шаблон, чтобы тот их отобразил.

> по нажатию input-элемента с type-submit происходит invoke действия, указанного в action.
Складывается ощущение, что ты как раз не понимаешь, что происходит, и используешь английские слова, чтобы это замаскировать. Вот если посмотреть на твой ответ:

- что значит "действие, указанное в action"? Там не действие указывается, а URL
- что значит "invoke"? Такого термина в протоколе HTTP я не видел.

Происходит вот что. Браузер собирает значения всех не-деактивированных полей ввода и отправляет HTTP-запрос методом GET или POST на указанный в атрибуте action URL. Полученный ответ он отображает на экране.

Тебе надо почитать про протокол HTTP и отправку форм.

Более того, достаточно набрать в гугле "form action", и перейти не на первый результат, а на страницу из MDN: https://developer.mozilla.org/ru/docs/Web/HTML/Element/form

Там написано: "action - URI-адрес программы, которая обрабатывает информацию переданную через форму.". Имеется в виду URL, который обслуживается программой на сервере (например это может быть адрес, по которому расположен PHP скрипт вроде http://example.com/handler.php).

>>874470

Да, стоит попробовать. Учебник ОПа пройти и затем браться за более сложные задания. С одним учебником тебе вряд ли что светит, там только основы.
Старые ответы Аноним 29/11/16 Втр 21:18:12 #806 №884472 
>>874502

Надо использовать не тег <a> (он для ссылок), а <button>. Также, прочитай урок по использованию аякса: https://github.com/codedokode/pasta/blob/master/js/ajax.md - у тебя там не обрабатываются ошибки например.

Затем прочитай на learn.javascript.ru про работу с событиями. Тебе прежде чем учить jQuery, надо выучить работу с DOM из чистого яваскрипта.

После исправления кода открой инструменты разработчика (Ctrl + Shift + I), узнай как ими пользоваться, и отладь свой скрипт.

>>874608

Нет. Надо использовать Dependency Injection.

>>874655

Надо менять УРЛ страницы. Гугли HTML5 history. также читай урок по работе с аяксом: https://github.com/codedokode/pasta/blob/master/js/ajax.md

>>874661

Да, на пхп это сделать получится скорее всего проще и грузиться будет быстрее.

>>874944

Нет, только аякс.

>>875151

Создать объект можно разными способами. Ну например, объект Отрезок можно создать, указав координаты 2 точек, можно через 1 точку и смещение по 2 осям, можно через точку, угол и длину. Соответсвенно, нужно несколько конструкторов.

>>875162

Тут, проверяет.

>>875553

Есть, есть даже сайты с обзорами таких хостингов, но на английском, у нас на русском вроде все с рекламой.

>>877393

Только если тебе требуется вырезать HTML теги из строки. В большинстве случаев лучше просто их отобразить как текст.

>>877798

Не знаю. Может есть какое-то расширение для этого, но я не знаю.

>>878766

Пока что никак.

>>881673

По идее ты должен увидеть, какие стили применены к элементу, как они перекрывают друг друга. В твоем случае видно, что в файле upload-master.css написан код, который перекрывает значения из бутстрапа. Приоритет у них равный, просто видимо он подключен позже.

Не понимаю, зачем ты переопределил стандартный класс из бутстрапа. В твоем коде логично добавлять свои классы.

Заодно почитай про приоритеты селекторов в CSS.
https://bitbucket.org/learningacc/file-downloader/ Аноним 30/11/16 Срд 09:47:37 #807 №884783 
>>882472

> https://bitbucket.org/learning_acc/file-downloader/src/dc9c4d2ead296e1cd7d55963226577ba9e791f2b/downloader/curlGetSource.php?at=master&fileviewer=file-view-default
Если ты используешь курл, то тебе надо внимательно изучить мануал, особенно список опций. Копировать код из интернета не стоит, так как там он почти всегда написан людьми, которые плохо его знают.

> if (!$content) {
> throw new Exception(curl_error($handler));
Это неправильно. Что, если файл - пустой или состоит из единственного символа "0"? Твой код выдаст ошибку, хотя ее нет. Изучи внимательно мануал по curl_exec и curl_error.

Небольшая мелочь. Функция curl_init может вернуть false, у тебя это не проверяется.

Еще одна мелочь. При выбросе исключения curl_close() не вызывается. Я не знаю, возможно, он сам вызывается при уничтожении переменной, но если нет, то мы получаем утечку объектов curl, которые никогда не будут высвобождаться при исключении. Я проверил мануал:

- http://php.net/manual/ru/language.types.resource.php
- http://php.net/manual/ru/resource.php

И вроде как все в порядке (объект curl будет автоматически освобожден при уничтожении переменной при выходе из функции). Но помнить о таких вещах при использовании исключений стоит.

Для курла нет ограничения на скорость скачивания. Нет вывода статистики.

> chdir(__DIR__ . '/../');
Не советую так делать, не будут работать относительные имена файлов, заданные относительно текущей директории. Консольные команды обычно не должны менять текущую директорию.

> echo getElapsedTime(function ($total = null)
Почему $total не обязательный, непонятно. Может он вообще не нужен тогда?

> for ($i = 0; $i < $total; ++$i) {
Тут лучше foreach использовать.

В случае с скачиванием в несколько потоков нужно всегда делать ограничение на число потоков. Любой нормальный сервер тебя забанит при превышении. В протоколе HTTP есть рекомендация о 6 соединениях на домен. Таким образом, тебе надо реализовать нужное ограничение, отслеживать завершение дочерних процессов и запускать новые. На мой взгляд, использовать форк тут самый неудобный вариант, так как сложно передать обратно результат загрузки, сложно как-то взаимодействовать, но в принципе можно извернуться - уведомления о завершении дочернего процесса приходят в виде unix сигналов SIGCHILD, и в них же приходит информация о коде завершения (по pid процесса можно понять, какая именно ссылка не скачалась). Ну или можно использовать твой вариант с wait(), но не знаю, можно ли там получать коды ошибок для каждого процесса.

Для отслеживания ограничений на число соединений удобно использовать ООП.

> } catch (Exception $e) {
> exit(1);
Неправильный код. Сообщение об ошибке просто теряется и никуда не выводится и не фиксируется в логи.

В общем, код с форками надо переделать, чтобы была полноценная обратная связь, чтобы родительский процесс знал об ошибке в дочернем. И чтобы было ограничение на число соединений. И я думаю, стоит сделать еще общее ограничение на число процессов, так как в общем при большом числе процессов будут большие накладные расходы на переключения между ними.

> // Тут надо остановить все форки, временный грязный способ:
> // shell_exec('killall php');
Это конечно неправильно. Как минимум стоит прибивать процессы по тому, что они - дети текущего. Ну или сделать группу процессов во главе с основнмы ( https://en.wikipedia.org/wiki/Process_group ) и прибивать по ее идентификатору.

https://bitbucket.org/learning_acc/file-downloader/src/dc9c4d2ead296e1cd7d55963226577ba9e791f2b/downloader/guzzleAsync.php?at=master&fileviewer=file-view-default
> yield function () use ($client, $link) {
Тебе не кажется, что это как-то переусложнено? Нельзя ли тут просто передать массив ссылок? Или yield'ить не функцию, а объекты запросов Guzzle? Стоит разобраться в коде guzzle, а не копировать примеры из документации.

Ну и опять же, нет управления потоками на основе числа соединений, нет ограничений общей скорости, нет статистики.

Вообще, ограничение на общую скорость - интересная штука. Позволяет ли guzzle ее реализовать? Я тут подумал, что может и не позволяет, и придется делать свой клиент на основе ReactPHP. Ну ограничение по числу соединений точно можно сделать.

Насчет измерений скорости разных методов - мне кажется, тут сложно сказать, что должно быть быстрее. С одной стороны, записывать данные по мере скачивания выгодно, так как диск не простаивает зря, с другой стороны, записать несколько файлов по очереди выгоднее, чем писать куски файлов вразнобой, так как последовательный доступ н магнитном диске быстрее случайного.

> Хотя, я ведь просто воспользовался готовыми инструментами, понимания это не прибавило.
Ну так реализуй ограничения.
Аноним 30/11/16 Срд 09:58:02 #808 №884790 
>>883743

Граммар Наци

Самый простой способ вывести окружающий текст - это добавить в регулярку "от 0 до 10 любых символов" в начало и конец.

Второй вариант - разобраться по мануалу с PREG_OFFSET_CAPTURE. Учти, что он возвращает позицию в байтах, а не в символах (один символ в строке кодируется от 1 до 6 байтами). Чтобы перевести байты в символы, придется заморочиться с функциями вроде substr/mb_substr/strlen/mb_strlen.

> '/(здела)(л|ю|н)/ui'
Сработает на слово "разделать на части", которое пишется через З. И не сработает на "зделать", "зделаем".

> for($i = 0; isset($errors[0][$i]);
Немного странное условие. тут можно было просто сделать foreach по $errors[0].

вторая часть

Тут те же замечания по поводу "зделан". В остальном, решено верно.
Тред закрыт Аноним 30/11/16 Срд 09:58:33 #809 №884791 
Не пишите больше здесь, пишите в новом треде: >>880700 (OP) (OP)

Если я кого-то пропустил - напомните о себе в новом треде.

Этот тред закрыт.
comments powered by Disqus

Отзывы и предложения