«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Клуб изучающих PHP 76 Аноним 2016/04/28 14:18:31  №729430 1
14618423114790.png (33, 500x500)
500x500
14618423114791.jpg (132, 1024x683)
683x1024
14618423114802.jpg (34, 650x384)
384x650
14618423114803.png (3449, 1920x1080)
1080x1920
Добро пожаловать в наш уютный тред. Тут мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет научиться программировать, кто-то - делать сайты, кто-то - просто размять мозги и заняться чем-то полезным.

Это не чат! Пожалуйста не флудите, а старайтесь постить только вопросы, решения и ответы. Сколько лет вы не можете найти работу никому не интересно. Высказывайтесь одним большим постом а не цепочкой мелких

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

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

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

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

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

Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания. ОП заходит редко, где-то раз в 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/Yii2: https://gist.github.com/codedokode/8733007
- После нее можно изучать автоматизированное тестирование
- Если ты все решил, переходи к 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://gist.github.com/codedokode/10539213

Что почитать

- Мануал по 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

Нужен ли ООП, фреймворки, MVC, git, composer? — Да, однозначно. Посмотри любую вакансию.
Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.ru/6bfCY9lfl и получи личную немного устаревшую оффлайновую копию сайта (можно читать хоть на андроиде без интернета)
Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
ОП, сделай за меня мою работу или домашнее задание? — Это конечно, хорошая идея, но нет.
Подскажи сайты для поиска работы, я не умею гуглить? — hh.ru, geekjob.ru, moikrug.ru (склеен с brainstorage.me), fl.ru, upwork.com (бывший одеск). Имей в виду, что кроме фриланса есть еще постоянная удаленная работа (remote job) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.
Важно! Аноним 2016/04/28 14:20:14  №729433 2
14618424144520.png (46, 500x644)
644x500
14618424144531.jpg (70, 1022x575)
575x1022
14618424144532.jpg (87, 561x800)
800x561
Код нужно писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.

Если тебе лень выравнивать код руками, закачай его на 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/php-fig/fig-standards/blob/master/accepted/ru/PSR-1-basic-coding-standard.md
PSR-2: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-2-coding-style-guide.md


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

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

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

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

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

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

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

Объясняй

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

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

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

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

Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
Аноним 2016/04/28 14:21:35  №729435 3
Напомню что в старом треде >>715010 (OP) я проверил все посты и ответил почти на все вопросы кроме вчерашних. На вчеращние - отвечу чуть позже. Если я вас забыл, напомните о себе в этом треде.

Аноним 2016/04/28 15:15:58  №729497 4
>>729438
Так ведь $department это и есть объекты. Сам массив клонируется вместе с компанией, ведь это не объект, он копируется сразу.

>I ran into the same problem of an array of objects inside of an object
public function __clone() {
foreach ($this->varName as &$a) {
foreach ($a as &$b) {
$b = clone $b;
}
}
}
Вот ещё нашел в мануале, типа для клонирования массивов объектов. Но тоже не работает.
Аноним 2016/04/28 15:22:51  №729503 5
14618461711620.jpg (161, 850x1188)
1188x850
Ребята, здравствуйте!

Пишу сейчас простенькую систему парольной аутентификации.

Возник небольшой вопрос по сессиям пользователей.

Когда пользователь вводит в форму правильную пару логин\пароль, ему выдается кука с SESSID (просто набор рандомных символов).

Этот SESSID так же прописывается в БД.

Потом при посещении личного кабинета эта SESSID кука сравнивается с SESSID в БД. Если данные совпадают то разрешаем пользоваться личным кабинетом.

Собственно сам вопрос:
Что если потенциальные хацкеры напишут программу, которая будет пытаться подобрать куку с SESSID.

Спасибо
Аноним 2016/04/28 15:26:27  №729508 6
Почоны, нашел xss уязвимость - вывел в консоль куки через поиск на сайте. Для чего можно использовать?
Аноним 2016/04/28 15:32:57  №729513 7
Аноним 2016/04/28 15:41:43  №729516 8
14618473033270.jpg (120, 700x525)
525x700
>>729513
По всей видимости, Вы, к сожалению, не поняли сути моего вопроса.

В статье, которую Вы привели, говорится о хранении паролей в БД.
Для хранения я использую функцию:
password_hash($_REQUEST["pass"], PASSWORD_DEFAULT);

Меня интересует как проверять перебирают ли хацкеры кукисы в которых хранится SESSID.
Привязывать в БД sessid к ip пользователя? Но если ip у пользователя сменится то под этой кукой ему уже не войти.

Делать ограничение на количество попыток с одного ip войти под разными кукисами?

Аноним 2016/04/28 15:51:02  №729524 9
>>729516
>Но если ip у пользователя сменится то под этой кукой ему уже не войти.
Перечислите, пожалуйста, случаи, когда это может произойти вне зависимости от волеизъявления пользователя.
Например, он переходит из кафе в кафе, пользуясь бесплатным Wi-Fi, либо едет на поезде (летит на самолёте и т.п.), переключаясь между доступными мобильными сетями.
На этом моя фантазия, увы, иссякла.
Аноним 2016/04/28 15:56:28  №729529 10
>>729524
Да, у пользователей редко меняется ip.

Но задача стоит в том чтобы пользователь мог войти при смене ip.

Возможно я ошибаюсь, но так в основном на всех сайтах и происходит
Аноним 2016/04/28 16:06:14  №729535 11
>>729524
Динамический айпи.
Аноним 2016/04/28 16:31:36  №729546 12
>>729529
Тогда в зависимости от частоты смены IP в промежуток времени, наверное. Если часто меняется - непорядок.
В одном из тредов вроде бы ОП советовал проверять, залогинен ли юзер в социальных сетях. То есть если он залогинен в одной сети, но IP меняется - плохо. Если ни в какой не залогинен и IP меняется - того хуже.
Соцсети, почта, поисковики, вот это всё.
Живой человек где-то да залогинен. Купи пасскод, азаза!
Неплохое решение от ОПа (вроде бы), только кучу всего надо изучать, наверное, я пока теоретик.
Ну а если зарегистрирован на самом сайте, то и шут бы со всем этим, если не нарушает какие-либо правила.
>>729535
У меня такой.
Так он не меняется в обычной ситуации, когда не отключаешь роутер. А если часто включаешь-выключаешь и находишься на сайте - тоже не всё чисто.
Аноним 2016/04/28 16:33:02  №729548 13
>>729546
Оговорюсь: тогда речь шла о простом доступе к сайту, без регистрации на нём, говорили об анонимных лайках, как сейчас помнится.
Аноним 2016/04/28 17:24:33  №729613 14
Оп, подскажи, когда лучше всего начать читать Шлосснейгла и Зандстру? В каком порядке? До знакомства с этим тредом, я начал читать обоих, но через ~ 70 страниц дропнул, т. к. мало что понял, а то, что понял, быстро забыл. Ибо без практики теорию плохо усваиваю.
На данный момент, я уже решил больше половины задач по сосновам: все до дополнительных задач, одну дополнительную (про банкомат), 2 из 4 про ООП.
Аноним 2016/04/28 20:11:24  №729793 15
14618634846650.jpg (157, 550x827)
827x550
Аноним 2016/04/28 23:55:40  №730130 16
>>729497

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

Когда ты делаешь

$x = clone $x;

Ты делаешь клон объекта и помещаешь его идентификатор в $x, но в массиве-то остаются старые идентифиаторы.

> foreach ($this->varName as &$a) {
А ты изучил мануал по ссылкам? Изучи сначала тогда этот раздел от кроки до корки, а не копируй бездумно код.

>>729503

> Что если потенциальные хацкеры напишут программу, которая будет пытаться подобрать куку с SESSID.
Надо сделать код достаточно длинным, чтобы было очень много вариантов кода и перебрать их было нереально. Например если брать 32 цифры или латинских буквы (с учетом регистра) то получается 62 в 32 степени вариантов, и это очень много: https://www.google.ru/search?q=62%5E32%3D&newwindow=1&gbv=1&sei=lHciV7CVO-md6ATQnreIAw

> Этот SESSID так же прописывается в БД.
Ты учел что можно залогиниться с нескольких браузеров на разных компьютерах?

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

>>729508

Сообщить разработчикам сайта

>>729516

Он хотел тебе сказать про число вариантов для перебора я думаю

>>729524

На мобильных устройствах при пропаже сигнала или переходе от сот к соте теоретически может происхоlить разрыв связи и выдача нового IP. да и у некоторых домашних провайдеров (если они используют какой-нибудь PPP) это бывает.

>>729613

Дойди в моем учебнике до ООП и можешь параллельно начинать читать.
Аноним 2016/04/29 05:00:36  №730263 17
Аноним 2016/04/29 06:14:17  №730277 18
При настройке апача куда в файл настроек вписывать вот это?
#
LoadModule php5_module "c:/php/php5apache2.dll"
AddHandler application/x-httpd-php .php

# конфигурирование пути к php.ini
PHPIniDir "C:/php"
Просто скопировать в любое место?
Аноним 2016/04/29 06:53:22  №730285 19
Почему программы работающие на ideone, выдают ошибки при запуске в своём браузере? Нужно доустанавливать какие-то компоненты?
Аноним 2016/04/29 07:41:30  №730290 20
час ломал голову над тем как организовать структуру программы на Го. Официальные мануалы рекомендуют использовать GOPATH и складывать все в домашнюю папку, но по моему это идиотизм. Я хочу чтобы проект был в своей, отдельной папке, чтобы я мог в любой момент скопировать его, забекапить, и тд., а не сваливать все проекты в одну общую папку. Также, я не хочу хранить код в домашней каталоге а хочу хранить его под виндой, копировать в /tmp на линуксе и там его запускать и желательно без переменных окружения. Также я хочу разбить приложение на приложение-специфичный код и универсальнй код и вынести тот отдельно. Вообще, такое ощущение, что язык рассчитан на написание простых утилит помещающихся в один файл. Не верьте клоунам которые говорят что Го может что-то там заменить
Аноним 2016/04/29 10:18:52  №730337 21
>>729418
>$validate = [
>'validateName' => 'getName',
>....
>];
А разве ключом не должно быть название поля? Как тогда обозначить ключ ошибки?


>>729418
>
>В качестве значения по умолчанию нельзя использовать выражение. И по моему ты плохо понял что написал. Когда ты пишешь
>
>$this->x = func();
>
>ты не сохраняешь функцию в поле. ты сохраняешь то,что она вернула - число например.
Нет нет, я понял что здесь подвох. Я просто не знал про функцию call_user_func.
Аноним 2016/04/29 10:38:10  №730350 22
Господа, посоветуйте рабочее окружение под макось.
Задача разработка проекта на php, постоянно этим не занимаюсь поэтому особо в дебри лезть каких-то крутых иде не хочется. Что-то бесплатное чем можно комфортно выполнить задачу, пример из мира винды xampp + notepad++ например.
Аноним 2016/04/29 14:11:51  №730507 23
>>730350
xampp для Mac чем не устроил? + atom/sublime/visual studio code.
Аноним 2016/04/29 15:41:20  №730518 24
Можно ли перебирать массив с объектами с помощью foreach и вызывать методы каждого объекта, таким образом:

foreach ($this->departaments as $departament) {

$quantity = $departament->countEmployees();

$result[$departament->name] = $quantity;
}
Аноним 2016/04/29 15:43:05  №730520 25
>>730518
>$result[$departament->name] = $departament->countEmployees();
Вполне.
Аноним 2016/04/29 15:45:54  №730522 26
>>730507
Я еще не пробовал, решил сперва посоветоваться. Благодарю!
Аноним 2016/04/29 15:52:00  №730528 27
>>730522
Советовал бы ставить всё по отдельности.
Не повторяй моих ошибок.
Apache, PHP, MySQL. И дальше IDE, которые советует анон.
Аноним 2016/04/29 15:54:30  №730529 28
>>730528
А в чем могут быть проблемы? Я пару лет назад делал задачу на винде и хамп отлично справился.
Аноним 2016/04/29 15:59:09  №730533 29
>>730529
1. Если проект потом переносить на сервер, то могут быть проблемы из-за настроек.
2. РНР там какой-нибудь 5 версии и не самой последней.
3. Perl Там на хрен не нужен тебе.
4. MariaDB тоже на хрен не нужна, Мускул таки лучше и ТРУЪ.
Аноним 2016/04/29 16:02:27  №730537 30
>>730533
А эти отдельные пакеты я потом смогу удалить из системы? Задумался, может просто поставить это на виртуалку все...
Аноним 2016/04/29 18:56:29  №730666 31
14619453895840.jpg (177, 720x353)
353x720
14619453895851.jpg (91, 585x800)
800x585
>>729430 (OP)
Ребзи, с помощью чего на PHP можно замутить систему лобби ? Хватит ли одного Аякса ?
Аноним 2016/04/29 19:02:59  №730668 32
>>730666
На пхп такое делать будет неудобно. Я бы смотрел в сторону модного жс-фреймворка на фронт, и ноду\пайтон на бэкэнд.
Аноним 2016/04/29 19:10:31  №730673 33
>>730668
Почему ? Неужели всё на столько сложно ?
Аноним 2016/04/29 19:12:34  №730674 34
>>730673
Нет, он тралит.
Любой фреймворк на РНР для бэкенда, Аякс да хоть чистый JS для фронтенда.
Аноним 2016/04/29 19:14:39  №730676 35
>>730674
Я чето слабо себе представляю как вообще такое реализовывать, даже с аяксом. Вот люди, сидящие на странице, отправляют аяксом пост запросы о своём присутствии в лобби, но что сервер должен с ними делать? Не в базу же заносить? Как их передать другим участникам лобби?
Аноним 2016/04/29 19:14:46  №730678 36
14619464867020.jpg (89, 807x792)
792x807
>>730674
Так а может какие-то сокеты посоветуешь ? Или на чистом аяксе можно всё сделать ?
Аноним 2016/04/29 19:15:05  №730679 37
>>730673
Несложно, но аякса явно не хватит.
Нужен reactPhp.
Аноним 2016/04/29 19:15:47  №730680 38
>>730676
Ну пускай они в лобби сидят, как на отдельной генерируемой страничке. Или не прокатит ?
Аноним 2016/04/29 19:16:53  №730681 39
>>730680
>Ну пускай они в лобби сидят, как на отдельной генерируемой страничке
Wat? Во первых это как, а во вторых вопрос о передаче юзерам инфы друг о друге всё еще в силе.
Аноним 2016/04/29 19:18:51  №730683 40
>>730676
На вебсокетах такие лобби делают обычно. Проблема в том что на пхп есть один вариант, это reactphp. И не важно нормальный он или нет, тебе все равно нужно будет его использовать, если хочешь реализовать такое на пхп. Я думаю проще было бы взять ноду и сделать все на ней.
Аноним 2016/04/29 19:19:36  №730684 41
>>730681
Ну вот зашли они по факту на отдельную страницу, созданую для них двух, и Аякс там манипулирует ДОМ"ом и в реальном времени меняет то что нужно. Или так нельзя ?
Аноним 2016/04/29 19:21:05  №730685 42
>>730683
Блеа. но мне не нужна нода, мне нужен php ...
дело в том, что на PHP уже многое сделано. Нужно уже добить.
Аноним 2016/04/29 19:21:25  №730686 43
>>730684
Отдельная страница или нет, и что там аякс с домом делает это второстепенные вопросы. Главная проблема передать друг другу какую-то инфу, будь то сообщение в чате, или профиль.
Аноним 2016/04/29 19:26:36  №730688 44
>>730685
Погугли что такое веб-сокеты и как они работают, потом возьми библиотеку для PHP которая реализует эти вебсокеты. Фронт на жсе, бэкэнд на пхп, и не нужно никаких аяксов, ноды и пайтона.
Для примера вот Ratchet http://socketo.me/ вроде как вполне норм.
>>730684
А ты подумал как в таком случае сделать обновление в реальном времени? Отправлять на сервер запросы каждые n секунд? В таком случае не слишком ли большая нагрузка будет для простого лобби с чатом?
Аноним 2016/04/29 19:29:59  №730691 45
14619473995170.jpg (111, 599x958)
958x599
>>730688
Окей. Спасибо. Доверюсь тебе.
Аноним 2016/04/29 20:58:26  №730763 46
Анон, пытаюсь пилить свои ВЕБ ПРИЛОЖУХИ. Стоит ли выучить синтаксис питона и попытаться вкатиться в джангу? Какие перспективы у пхп и джанги? У пхп синтаксис вроде гибче, да и я с него начал, даже поработать на нем не успел, а уже смотрю на питон. Стоит ли?
Аноним 2016/04/29 21:28:47  №730779 47
>>730763
Вперед и с песней.
Аноним 2016/04/29 21:30:37  №730781 48
>>730779
Ой, ну объясни нормально, анон, что ты сразу.
Аноним 2016/04/29 21:39:55  №730792 49
Аноним 2016/04/29 23:20:46  №730857 50
14619612466240.jpg (55, 600x763)
763x600
Дошёл до ООП.
Поясните по хардроку, как вообще это функционирует на сайтах.
1. Вот у меня файл .php со скриптом, там ООП, классы, вот это всё, ему нужны экземпляры класса создавать - как-то надо подключать их, ставить на место созданий экземпляра include с файлом, уже содержащим созданные классы? Я правильно понимаю логику? Или это всё возможно через БД - оттуда брать инфу и вставлять в скрипт?
2. Соответстветственно, ещё какой-нибудь скрипт отвечает за заполнение этого скрипта с экземплярами класса или БД с ними. Например, это студенты - скрипт собирает с регистрацией набивает БД студентами как экземплярами класса Student, а ты потом их вставляешь хитроумным способом в свой первый скрипт с ООП и вертишь там по-всякому.
Я верно это представляю себе?
Аноним 2016/04/30 01:44:00  №730943 51
Азаза, задача 4 na JS с засадой такой, еле решил. Там так и подразумевалось, что apply надо использовать? Или есть другой более простой способ?
http://ideone.com/asjGPa
Аноним 2016/04/30 03:01:47  №730967 52
>>730857
ООП - это такой стиль программирования, который придумали чтоб совсем не ахуеть с мильенами строк кода в разрастающихся приложениях. Оно типа упрощает все, структурирует.
Объекты эта такая штука, которая позволяет создавать тебе что-то вроде собственных типов данных, такие, как например уже знакомые тебе массивы. Очень гибкая и удобная.
Когда ты описываешь конструкцию class MyClass{}; ты типа вводишь новый тип данных в окружение и после этого можешь создавать экземпляры этого типа инструкцией new MyClass;. Я особо не шарю, но вроде и обычные массивы тоже можно создавать в таком стиле - $array = new ArrayObject;
Касательно где создавать экземпляры - там же где и массивы, если бы ты использовал их вместо специально созданного тобой класса студента.
Аноним 2016/04/30 03:09:27  №730969 53
>>730857
>ставить на место созданий экземпляра include с файлом
Нет, юзай композер.
>Или это всё возможно через БД
БД вообще тут не при чем.
>ещё какой-нибудь скрипт отвечает за заполнение этого скрипта с экземплярами класса или БД с ними
Экземпляры в коде создаются ручками, вместо инклюдов композер автозагрузку делает автоматически.
>Я верно это представляю себе?
Данные из БД тащит класс работы с ней, потом в коде создается нужный экземпляр класса с использованием полученных данных, данные просто передаются в конструктор.
Аноним 2016/04/30 03:28:23  №730973 54
>>730857

Классы обычно делятся на 2 вида (это не официальные названия, а придуманные мной) - модели и сервисы. Модель - это класс который представляет какой-то реальный объект и хранит информацию о нем (например класс Студент хранит информацию о зарегистрированном студенте). Может быть много экземпляров моделей - 10 студентов это 10 объектов. А сервис - это класс который обычно существует в 1 экземпляре и делает какие-то действия, в том числе над моделями. Ну например Валидатор в котром есть метод валидации. Он берет на вход модель студента, проверяет ее и выдает на выходе список ошибок или признак что наоборот, вся информация соответствует заданному формату. Или TableDataGateway - это сервис, который умеет сохранять модели студентов в базу данных и доставать из нее обратно.

В MVC как ты наверно знаешь, приложение делят на 3 части - модель (не та модель что описана выше, а модель как 1/3 часть приложения), контроллер и вид. Ну вот, собственно в коде обычно ты в начале создаешь всякие нужные сервисы, контроллер и запускаешь его. А контроллер например просит у TDG взять из базы 10 студентов, и передает этих студентов в вид, который отображает их на HTML странице. Как-то так.

Читай замечания к задаче про студентов, все там подробно расписано. И конечно читай урок про ООП очень внимтельно и решай задачи там.
Аноним 2016/04/30 03:33:04  №730978 55
>>730973

Разумеется разделение на модели и сервисы не очень четкое. Вот например что такое контроллер? С одной стороны это не модель так как он не соответствует никаким реальным объектам и не хранит информацию о них. С другой стороны это не совсем сервис, так как мы часто создаем новый контроллер на каждый новый запрос от пользователя. Хотя есть фреймворки который считают что контроллер это сервис. А некоторые считают что это такой "одноразовый сервис", который создается, обрабатывает 1 запрос пользователя и выбрасывается в корзину.
Аноним 2016/04/30 03:45:57  №730987 56
>>730978
>это не совсем сервис, так как мы часто создаем новый контроллер на каждый новый запрос
Но ведь сервисы тоже создаются на каждый новый запрос
Аноним 2016/04/30 04:26:23  №730995 57
>>730987

Ты подразумеаешь стндартную модель работы php когда скрипт обрабаывает запрос и завершается:

- создать все нужные сервисы
- проанализировать запрос
- сгенерировать ответ
- выйти

А вещи вроде взаимодействия с браузером по HTTP реализуют веб-сервер и ядро php.

Но PHP можно использовать и в другом сценарии:

- создать все нужные сервисы
- открыть порт и ждать входящий HTTP запрос
- бесконечно повторять {
-- принять запрос
-- проанализировать запрос
-- сгенерировать ответ
}

Эта модель имеет как преимущества так и недостатки:

+ инициализация делается 1 раз а не на каждый запрос
+ можно сохранять какие-то данные между запросами в памяти в переменных (напрмиер какие-то часто используемые данные можно загрузить в начале из БД в массив и дальше брать из него с огромной скоростью. Это хорошо работает только для read-only данных вроде всяких справочников которые не меняются в процессе работы)
+ соответственно не нужны кеши байткода вроде APC, opcache так как скрипты компилируются в момент запуска приложения а не при каждом запросе
- требуется большая внимательность. В стандартном подходе мы не боимся утечек памяти так как после заверщения скрипта она очищается, а тут может получиться такая ситацция что расход памяти будет расти, она закончится и наше приложение упадет
- опять же при какой-то фатальной ошибке падает все приложение а не обработчик одного запроса. Это обычно решают автоматическим перезапуском приложения при падении

В таком сценарии сервис может пережить много запросов, а например контроллер будет на каждый запрос создаваться новый (так как это проще чем очищать состояние). В других языках вроде явы именно такая модель используется и там сервисы долгоживущие.
Аноним 2016/04/30 04:29:20  №730996 58
>>730973
Модель - это не обязательно сущность. Только в небольших приложениях позволительно использовать ORM. Сразу видно, что ты новичок и никогда не работал с реальными проектами.
Аноним 2016/04/30 04:32:55  №730998 59
>>730995

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

в случае умирающего подхода эта проблема решается сама собой, а вот в долгоживущем приложении ты еще замучаешся ее искать. В некоторых языках вроде Явы или C# (и даже в Хроме в инструментах разработчика) есть профайлеры памяти, позволяющие узнать кто сколько отъел, а вот в php вроде простого способа нет.

Я слышал что некоторые рубисты (там используется долгоживущее приложение) и разработчики на ноде не смогли найти причины утечек и решали свою проблему прибиванием и перезапуском приложения по расписанию. Ну то есть расписываются в своем же бессилии.

Если ты будешь делать логгер SQL запросов или чего угодно в массив - ограничивай его размер.
Аноним 2016/04/30 04:34:10  №730999 60
>>730996

Поясни. Я про ORM ничего не говорил и есть подозрение что ты ошибаешься.
Аноним 2016/04/30 09:47:53  №731041 61
>>723256
>> Я не вижу такого решения с помощью цикла, только прописывать всё в ручную
>Почему цикл не годится? ты можешь обраьиться к полю по имени в переменной, такой конструкцией:
>
>$fieldName = 'year';
>$this->{$fieldName} = 1990;
>
>И соответственно можно использовать цикл по массиву разрешенных имен полей:
>
>$fields = ['name' ,surname'];
>foreach ($fields as $field) {
>....
>$this->{$field} = ....;
>}
Цикл не годиться потому что в массиве могут придти любые данные.
>Могут быть какие-то поля (например статус модератора) которые не должны заполняться из пришедших данных.

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

function fillFromArray(array $data)
{
$allowed = ['name', 'surname', ...];

foreach ($allowed as $value) {
$this->$value = $data[$value];
}
}


И прокомментируй пожалуйста вот этот вопрос, мне действительно непонятно почему мы должны ограничиваться только массивом:
>А почему именно из массива? Вот например у меня раньше брались данные из $_POST, и я подумать не мог что они будут браться откуда-то еще. Если мы собрались расширять гибкость кода, то давайте расширять до конца. Например, мы можем получать данные и из объекта.
Аноним 2016/04/30 10:38:42  №731052 62
Анон, есть несколько вопросов от полного нубаса по Doctrine ORM:

1) Модели можно объявить через PHP-классы, XML и YAML? Вторые два способа редко используются или как?

2) Где в модели указываются типы значений, внешние ключи и т.д.? Вижу в туторе комментарии над полями моделей, это оно что ли?

3) Миграции из коробки есть или надо модуль устанавливать?
Аноним 2016/04/30 12:43:19  №731130 63
Уже пхп7 вышла. слыхали? Кто-нить тестировал на лампе? Какие обновы?
Аноним 2016/04/30 13:18:43  №731147 64
>>731052

> Модели можно объявить через PHP-классы, XML и YAML?
Ты странные термины используешь. Модели - это твои классы и ты их создаешь без всякой доктрины. Для доктрины ты просто добавляешь ним правила маппинга, то есть описываешь как именно ты хочешь их сохранять в БД. Это можно делать с помощью аннотаций или отдельных файлов, на мой взгляд аннотации удобнее так как когда ты например удаляешь поле, то сразу же и удаляешь аннотацию к нему. Хотя есть и те кто предпочитает файлы

> Где в модели указываются типы значений, внешние ключи и т.д.? Вижу в туторе комментарии над полями моделей, это оно что ли?
Это называется аннотации. Каждая аннотация представлена классом, и там даже поддерживаются неймспейсы то есть когда ты пишешь

use .... as ORM;

@ORM\Table(name=....)

То ты ссылаешься на класс Table из внутренностей доктрины: https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/Mapping/Table.php у которого как ты видишь есть свойство name.

Сам модуль который отвечает за чтение и анализ аннотаций, вынесен в отдельный проект, так что ты можешь создавать свои аннотации и использовать для каких-то своих целей:

https://github.com/doctrine/annotations
https://github.com/doctrine/annotationshttps://github.com/doctrine/annotations

> Миграции из коробки есть или надо модуль устанавливать?
есть https://github.com/doctrine/migrations но я им не пользовался. Попробуй, можешь рассказать нам потом о впечатлениях от исопльзования.

>>731041

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

>И прокомментируй пожалуйста вот этот вопрос, мне действительно непонятно почему мы должны ограничиваться только массивом:
>>А почему именно из массива? Вот например у меня раньше брались данные из $_POST, и я подумать не мог что они будут браться откуда-то еще. Если мы собрались расширять гибкость кода, то давайте расширять до конца. Например, мы можем получать данные и из объекта.

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

Во-вторых, про объект. Массив это набор произвольных элементов который может иметь любые ключи. Но у объектов поля жестко заданы и даже если они называются одинаково это не значит что они связаны. Значит мы можем копировать поля не из любых объектов, а только имеющих отношение студенту - например других студентов, наследников, предков или классов реализующих тот же интерфейс. У тебя в программе есть такие классы? Ты впрочем можешь сделать копирование данных из другого студента. Разумеется отдельной функцией так как желательно определить тип аргументов функции и одна функция не может принимать в данной ситуаци и на вход разные типы данных.

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

То есть я не вижу смысла, но если ты хочешь, можешь сделать функцию берущую данные из другого источника кроме массива.
Аноним 2016/04/30 14:41:27  №731200 65
Здравствуйте господа. Подскажите пожалуйста а где проходит обсуждение задач из материала для новичков? А то есть вопросик по решению, но вдруг он уже задавался.
Аноним 2016/04/30 15:02:06  №731208 66
14620177264460.png (973, 866x2934)
2934x866
Спасибо за ответы, братья, люблю вас.

>>730967
Это я в общих чертах понял. Но просто мы до ООП делаем так, что всё находится в одном скрипте, в одном файле. Мне интересен сейчас сам механизм - правильно ли я его себе представляю. Что надо подключать разные файлы к скрипту, создавать скрипты, которые отвечают за заполнение этих файлов. Либо не файлы, а строки в БД - оттуда как-то вставлять.
Я пока лишь разбираюсь в ООП - просто на будущее.
>>730969
>Экземпляры в коде создаются ручками, вместо инклюдов композер автозагрузку делает автоматически.
А как быть, когда уже созданы экземпляры? Они же где-то хранятся? В файлах или в БД лучше?
Композер пока и не смотрел - мне еще рановато.
>Данные из БД тащит класс работы с ней, потом в коде создается нужный экземпляр класса с использованием полученных данных, данные просто передаются в конструктор.
Вот это ответ на мои вопросы, спасибо, это как раз интересовало больше всего.
>>730973
Спасибо, неплохо расписано!
>контроллер например просит у TDG взять из базы 10 студентов, и передает этих студентов в вид, который отображает их на HTML странице. Как-то так.
Вот то, что хотел узнать. Отлично, я придвигаюсь к сути понемногу.
>>730978
>мы часто создаем новый контроллер на каждый новый запрос от пользователя.
Хм, сложновато для меня пока.
Но что-то уже формируется, займусь-ка ООП.
Аноним 2016/04/30 15:02:09  №731209 67
>>731200
Тут и происходит. Просто новичков сейчас мало. Наверно куличи пекут. Кидай вопросы и код не забудь.
Аноним 2016/04/30 15:09:12  №731213 68
>>730998
>Если ты будешь делать логгер SQL запросов или чего угодно в массив - ограничивай его размер.
А если нужны прежние данные для чего либо (для статистики, например)?
Можно ли как-то настроить, чтобы раз в какой-либо промежуток времени этот массив становился равным массиву $period? Каждый раз разный, конечно, название - по первому моменту и по последнему моменту. Например, $mon2may2016_sun8may2016, что-то такое.
Так, стало интересно.
Аноним 2016/04/30 15:18:03  №731223 69
>>731147
По поводу Доктрины:
Миграции автоматически анализируют аннотации полей и создают поля нужногл типа и связью в БД? Вообще странный подход в комментариях указывать такие важные вещи. В Джанго ОРМ и Алхимии, просто как параметр в конструкторе каждого поля передаётся.
Аноним 2016/04/30 15:18:23  №731224 70
>>731208

> А как быть, когда уже созданы экземпляры? Они же где-то хранятся? В файлах или в БД лучше?

Экземпляр класса (объект) нельзя хранить в бд или файле, он хранится в памяти, единственные способы его создать - new или clone, нельзя сохранить произвольный объект в файл и восстановить (есть сериализация но она не работает с любыми классами).

Да и подумай, если бы мы вдруг хранили объекты в бд, нам нужен бы был объект который их оттуда достает, это проблема курицы и яйца.

Что касается кода то код хранится в файлах. Более удобного способа никто не придумал пока.

Аноним 2016/04/30 15:19:28  №731225 71
>>731209
http://ideone.com/85fwQ6
Вот такое дерьмо написал по задаче с кубиками. Все время пишет что выиграл комп. Где я обосрался помимо того что родился?
Заранее благодарю.
Аноним 2016/04/30 15:20:39  №731226 72
>>731223

Можно генерировать SQL код из моделей. Вроде там есть команда для этого (а также противоположное - создавать осову для моделей по схеме БД). Можно писать руками. Мне всегда было интереснее и удобнее писать SQL самому, и доктрина тем и хороша что позволяет мапить любые модели на любую базу, она не обязывает тебя создаваьть таблицы через нее.

Аноним 2016/04/30 15:21:27  №731227 73
>>731225

> PHP Notice: Undefined variable: anonDIce2 in /home/ruUGkD/prog.php on line 13

пишет что нет такой переменной. Ты там большую букву с маленькой не перепутал?
Аноним 2016/04/30 15:44:42  №731246 74
>>731227
Благодарю, Антоний, я и правда с регистром одной буквы обосрался.
Аноним 2016/04/30 16:15:53  №731255 75
Аноним 2016/04/30 17:37:27  №731304 76
>>731224
Ну, я имел в виду, что не в готовом виде хранится, а в отдельных соответствующих полях.

$student1 = new Student();
$student1->number = 321;
$student1->name = "Иван";
$student1->surname = "Иванов";
$student1->team = 2;

Вот эти "Иван", "Иванов" и 2 ведь хранятся в БД, а потом используются при создании экземпляра класса, когда надо вывести это всё или произвести иные действия?
Я не имею в виду, что вот такое создание экземпляра хранится в БД, а только эти элементы для создания.
Иначе как быстро доставать студента из файла? Ведь должно быть проще достать его из БД?
Я, наверное, неправильно сделал, что полез со своими вопросами - всё равно еще пока ООП не рассмотрел, ты уж извини, анончик.
Ну просто захотелось всё себе представить.
Аноним 2016/04/30 17:37:59  №731305 77
>>731147
>Значит мы можем копировать поля не из любых объектов, а только имеющих отношение студенту - например других студентов, наследников, предков или классов реализующих тот же интерфейс. У тебя в программе есть такие классы?
Да, есть, у меня класс Формы наследуется от класса студента, следовательно даже будет лучше, если у меня будет метод которые будет принимать данные и из массива и из объекта. Однако, этот метод всё равно придется переопределять в классе Формы потому что класс Формы содержит пароль и повторныйПароль, а класс Студента содержит хэш.

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

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

Еще немного подумав у меня возникает вопрос с той же самой проблемой получения паролей и хэшей в классе Студента:
Если у меня будет в Студенте метод получения данных, то чтобы решить ту проблему мне придется писать два разных метода. Из-за этого класс "раздувается" и к тому же всё это наследуется в класс Формы где хэши не используются. Я зря беспокоюсь по этому поводу и мне стоит привыкать к таким условностям или это вполне резонно?


>>731147
>Но у объектов поля жестко заданы и даже если они называются одинаково это не значит что они связаны.
Элементы массива тоже могут быть не связанны.
Аноним 2016/04/30 17:40:16  №731308 78
14620272167130.jpg (72, 700x500)
500x700
Можно ли сразу начать изучать Yii2, или лучше сначала изучить Yii самый первый?
Помню, анон расписывал всё чётко, когда кто-то задавал такой вопрос, только я забыл, в чём была суть, лол.
Вроде Yii2 советовал, потому как первый вариант уже устарел чутка.
Аноним 2016/04/30 17:47:47  №731312 79
>>730130
Я и есть один из разработчиков, мне нужно понять как работает xss уязвимость и чего я добьюсь тем что в инет. Магазине подменю свои кукизы чужими и зайду под чужим акком
Аноним 2016/04/30 18:05:40  №731320 80
14620287406080.png (23, 298x291)
291x298
>>731130
А ты быстрый! Обновления в основном "в ядре", теперь PHP стал более пригоден для хайлоада (но все равно еще на порядок медленнее чем остальные языки). Ну и по мелочи сделали возможность объявлять скалярные типы, объявлять какой тип вернет функция, анонимные классы и многое другое. Полный список новых вещей почитать можно тут http://php.net/manual/en/migration70.new-features.php
Аноним 2016/04/30 18:25:21  №731341 81
Как в слиме изменить ответ? Почему-то он шлет мне всю страницу с разметкой, куда я уже только не пихал die() и exit(), один хуй отправляет всю страницу. Нужно же изменить body в responce? Но как? Гугл не помог.
Аноним 2016/04/30 18:35:24  №731350 82
Как через php передавать на каждую страницу html-код интерфейса? Ну чтобы не прописывать каждый раз html-код а "вызывать" его и тем самым формировать вёрстку веб-страницы.

Автоматизировать процесс, так сказать.
Аноним 2016/04/30 18:38:16  №731356 83
Хочу вместо локалхоста упражняться на каком-то хостинге, чтобы сразу видеть результат "какой будет". Посоветуйте хостинг.

Желательно, халявный или чтобы раз вносить оплату.
Аноним 2016/04/30 19:17:50  №731402 84
>>731356
раньше мог посоветовать hostinger, но эта параша теперь требует смс-валидацию через смс(которая стоит почти 2 бакса).На данный момент нашел только один нормальный - 2freehosting.com Косяк там есть, но не знаю ошибка сайта или ограничение фри-версии акка - не делает бекап.
Аноним 2016/04/30 19:19:54  №731404 85
Аноним 2016/04/30 19:38:44  №731436 86
>>731404
>Желательно, халявный
>халявный
731402-кун
Аноним 2016/04/30 19:39:55  №731440 87
>>731436
Бесплатный сыр только в мышеловке, пора бы уже это понять.
Аноним 2016/04/30 19:52:15  №731453 88
>>731440
ну я уже год работаю на этом хостинге, брат жив.Иногда сайт падает, но это незначительный минус.
Аноним 2016/04/30 20:05:12  №731456 89
>>731312
Если куки чужая, то сможешь под этим акком заказы делать.
Аноним 2016/04/30 20:10:22  №731458 90
>>731456
>заказы делать
не забывай о тайм-ауте сессии и сроке работы печеньки
Аноним 2016/04/30 21:44:00  №731535 91
>>731404
За сто рублей можно впску взять с 256 оперативки и 10 гигами места. Это более чем достаточно для бложиков до 10к трафа и своих маня проектиков. Заодно придрочишь скилы в настройке сервера и работы по ссх. Оно тебе нужно будет.
Аноним 2016/04/30 21:46:50  №731538 92
>>731535
Что-то я не видел таких впсок по 100 рублей. Везде минимальная цена 400 - 600 за самый дешевый тариф.
Аноним 2016/04/30 22:00:26  №731549 93
14620428267790.png (42, 796x457)
457x796
>>731538
Сто рублей это без админ панели или как она там называется. Ее можно прикупить, тогда будет рублей 400/мес, да.
Вот например: firstvds.ru/products/vds_vps_cheap
Аноним 2016/04/30 22:28:19  №731563 94
14620444998970.png (70, 1157x235)
235x1157
>>731549
Вот еще одна, сам ей пользуюсь - x5x.ru. В чикаго/денвере не советую брать, пинг в консольке будет пиздецовый и дороже немного. Разве что для впн.
Рефочка http://x5x.ru/?aff=4349
Аноним 2016/04/30 23:00:34  №731604 95
>>731458
Так я сделаю заказы, менеджеры свяжутся с клиентом в любом случае и очевидно что отменят заказ, даже если не отменят - он приедет не мне, а если я укажу удобный мне адрес - там либо предоплата по карте либо наложенный платеж, в самом аккаунте инфы о карте очевидно что нет, в итоге профита особого и нет как мне кажется.

Аноним 2016/04/30 23:13:28  №731615 96
>>731402
А как на 2freehosting.com по FTP коннектнуться? Не работает что-то нихуя, как я не изголялся. Анон, что нужно-то? Прописываю порт, айпишник, имя, пароль от cPanel и сосу с "невозможно подключиться ко-ко-ко".
Аноним 2016/04/30 23:28:13  №731619 97
14620480938450.jpg (7, 488x455)
455x488
14620480938451.jpg (6, 338x319)
319x338
PHP учебник, задачка про круг из фразы. Круг строится, но выглядит как дерьмо. Что я делаю не так?
https://ideone.com/TZL4rs
Аноним 2016/04/30 23:38:11  №731626 98
>>731619
Поправь ошибки. У тебя там куча нотисов
Аноним 2016/05/01 00:11:09  №731639 99
Аноним 2016/05/01 00:25:07  №731646 100
>>731304

> Вот эти "Иван", "Иванов" и 2 ведь хранятся в БД, а потом используются при создании экземпляра класса, когда надо вывести это всё или произвести иные действия?
Да. Нам надо иметь возможность сохранять данные из модели в БД и наоборот, создавать модели по данным из БД. Это называется ORM - object to relational database mapping и есть 2 подхода, active record и data mapper. В комментариях к задаче есть ссылка на урок по этой теме.

Если тебе это интересно, читай комментарии к задаче про студентов и уроки по ссылкам, которые там приведены.

>>731305

> Да, есть, у меня класс Формы наследуется от класса студента
Я считаю это неправильно. Форма это не разновидность Студента и вряд ли может от него наследоваться. даже если формально выполняется правило Лисков (что объект формы можно использовать в коде везде вместо объекта студента) мне кажется тут оно неприменимо.

Вот статья по теме:

https://tproger.ru/translations/inheritance-and-composition-in-java/
http://sergeyteplyakov.blogspot.ru/2012/12/vs-vs.html

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

Вот еще тут написано: https://msdn.microsoft.com/ru-ru/library/27db6csx(v=vs.90).aspx

> Наследование лучше использовать в следующих случаях.
> Иерархия наследования представляет собой отношения тождественности (is-a), а не отношения включения (has-a).

Вот попробуй ответить, какое утверждение звучит логичнее:

- "Форма Регистрации является (разновидностью или улучшенной версией) Студента"
- "Форма Регистрации содержит в себе модель Студента"

Аноним 2016/05/01 00:30:24  №731649 101
>>731305

> Так же, этот метод был бы весьма полезен, потому что мы можем заполнять Студента из массива получаемого из ДБ и из объекта Формы, но тут мы сталкиваемся с тем же самым подвохом, при получение данных из Формы мы получаем чистый пароль и преобразовываем его в хэш, а при получении данных из ДБ мы получаем хэш.
Ты еще не учел, что если в форме 2 поля для ввода пароля то эти пароли могут не совпадать и непонятно как от них брать хеш. Плюс, в студенте могут быть поля (токен например) которые проставляет не форма. Полностью заполненного студента из формы возможно получить не получится, только частично заполненного.

> Если у меня будет в Студенте метод получения данных, то чтобы решить ту проблему мне придется писать два разных метода. Из-за этого класс "раздувается" и к тому же всё это наследуется в класс Формы где хэши не используются. Я зря беспокоюсь по этому поводу и мне стоит привыкать к таким условностям или это вполне резонно?
Это из-за того что ты считаешь Студента и Форму однотипной сущностью. Если использовать композицию, то есть сделать чтобы Форма содержала в себе Студента и записывала данные в него, эта проблема может решиться сама собой: в студенте будет поле для хеша, в форме поля для воода пароля. И кстати преобразовывать пароль в хеш форма не обязана самостоятельно - этим может например заниматься сервис авторизации в методе setStudentPassword($student, $password).

> Элементы массива тоже могут быть не связанны.
могут быть не связаны, могут быть связаны, но если пользователь передает его в метод простановки значений, то наверно они все же имеют отношение к студенту.
Аноним 2016/05/01 00:41:30  №731658 102
>>731312

Если ты действительно разработчик то тебе надо ее закрыть, а не изучать что с ней можно сделать. Урок есть: https://github.com/codedokode/pasta/blob/master/security/xss.md

XSS похзволяет делать хакеру любые вещи от имени пользователя сайта и выводить на нем любую информацию. Как именно, я думаю, не принципиально.

>>731320

> (но все равно еще на порядок медленнее чем остальные языки)
Это же ложь. Динамические языки, такие как Руби и Питон медленнее пхп. И в php например за счет настоящих нерасширяемых классов и тайп-хинтов больше возможностей для оптимизации во время компиляции или выполнения (смотри HHVM). А на Си++ ты будешь сидеть в отладчике с утра до вечера в то время как php разработчики сделают несколько сайтов за это время.

>>731341

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

>>731350

include в шаблоне

>>731356

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

>>731440

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

>>731535

> взять с 256 оперативки
Оперативка бывает разная. На openVZ (он часто используется в дешевых решениях) считается не реально используемая память, а потенциально используемая, и по факту ты получаешь где-то в полтора-два раза меньше (разумеется владельцы хостинга специально так делают чтобы больше серверов запихнуть в одну машину). Также твоя память может быть вытеснена в своп на диске.

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

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

Аноним 2016/05/01 00:44:28  №731661 103
14620526682390.jpg (70, 1149x687)
687x1149
14620526682401.jpg (40, 1005x340)
340x1005
Помогите разобраться с гитом. В гуи гите (GitHub Desktop) у меня были коммиты вида пикрелейтед1. Я решил освоить консольку, прочитал часть учебника по гиту из оп поста, создал тестовй репозиторий, запустил git bash, потыкал туда сюда, дошел до отправки коммита и опять я вижу пикрелейтед2. Что не так, а.
Аноним 2016/05/01 00:45:46  №731664 104
>>731563

> OVZ
Имейте в виду что в openvz 256 мегабайт значит не то что вам даются реальные 256 мегабайт памяти, а виртуальные и условно говоря на сервере с реальными 256 Мб (или в виртуалке с Xen) вы сможете запустить больше программ чем тут. openvz позволяет оверселлить, то есть продавать больше памяти чем ее реально есть на сервере.



Аноним 2016/05/01 00:51:30  №731675 105
>>731661

Скорее всего изменен тип окончаний строк. То есть в исходном файле например был формат окончаний строк windows (\r\n) а после изменений стал unix (\n) или наоборот. Или табы заменены на пробелы.

Как узнать реальную причину?

Для начала надо извлечь старую и новую версию файла из гита (например командой git checkout) и сохранить в отдельную папку.

Затем надо скачать hex редактор https://ru.wikipedia.org/wiki/Hex-%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%BE%D1%80

Например https://en.wikipedia.org/wiki/HxD или бесплатный http://www.hexedit.com/ подойдет

Этот редактор покажет байты из которых состоит файл. Сравни файлы и сделай выводы.



Аноним 2016/05/01 00:59:09  №731681 106
>>731675
Там даже самые первые коммиты (т.е. только отправленные в пустой репрозиторий) такие почти везде. Наверное у меня редактор сразу ставит не те переносы/табы?
Аноним 2016/05/01 01:10:22  №731685 107
14620542222980.png (148, 996x1908)
1908x996
14620542222991.jpg (463, 944x1544)
1544x944
>>731675
Пикрелейтед 1 коммитился нормально и в гуи, и в консоле. А вот второй пикрелейтед нет. Я не понимаю причину по байтам в этом редакторе.
Аноним 2016/05/01 01:11:32  №731687 108
>>731685
Не туда вставил скрин успешного коммита, скрин гитхаба слева должен быть у пикрелейтед2 и наоборот.
Аноним 2016/05/01 04:45:32  №731732 109
>>731685

Посмотри внимательно на байты на первом скрипте что идут после <?php

Слева там 0D0D (\r\r), справа 0D0A0D0A (\r\n\r\n). Это разные способы обозначения конца строки, видимо ты в редакторе поменял формат конца строки.

Новое задание на MVC/JS Аноним 2016/05/01 08:09:43  №731757 110
Анончики, если вы уже изучили JS и DOM, гляньте этот урок: https://github.com/codedokode/pasta/blob/master/js/minesweeper-mvc.md

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

Упоминаются knockout, angular, react.

Пожалуйста, посмотрите, напишите свое мнение. Даже если вы пока плохо яваскрипт знаете.
Аноним 2016/05/01 08:12:59  №731758 111
14620795798330.jpg (161, 550x827)
827x550
Аноним 2016/05/01 10:14:17  №731799 112
>>731757
Хорошо. Давно хотел переделать, да всё как-то руки не доходят, да и слабо представлял MVC на жсе.
Аноним 2016/05/01 10:26:19  №731813 113
>>731757
Спасибо, антош. Всё необходимое в одном месте собрал, мне нравится.
Аноним 2016/05/01 10:28:45  №731816 114
Почему в некоторых примерах используются фигурные скобки при выводе переменных. А в некоторых нет?

echo "$sasamba";
echo "{$sasamba}";
Аноним 2016/05/01 12:10:39  №731844 115
>>731758
А де у тебя среднее соотношение тугр./стр по всем департаментам?
Очень много сложноты в коде, мне кажется, гораздо проще многое возможно.
Давно хотел спросить: ты где-то учился кодингу? Чувствуется по подходу к решению задач - не совсем новичок.
Аноним 2016/05/01 13:18:50  №731871 116
Аноним 2016/05/01 14:00:16  №731882 117
>>731844
> А де у тебя среднее соотношение тугр./стр по всем департаментам?

Вроде 3.28, строка "Среднее", последний столбец.
Или ты про последнюю строку, последний столбец? Там не совсем понятно что считать...

> Очень много сложноты в коде, мне кажется, гораздо проще многое возможно.

Да возможно, а что например?

>Давно хотел спросить: ты где-то учился кодингу? Чувствуется по подходу к решению задач - не совсем новичок.

В школе написал пару простых флеш игр, хардкорная процедурка :) Потом 10 лет принимал тяжелые наркотики и работал дизайнером. Сейчас наверстываю.

По задаче вопрос, для чего тут имеет смысл использовать фабрику?
Аноним 2016/05/01 15:17:37  №731909 118
Ответы в прошлом треде Аноним 2016/05/01 15:23:51  №731919 119
Ответил на все посты в прошлом треде, зайдите прочитайте, если пропустил напомните о себе тут.

>>731911 числа прописью, вектор
>>731912 калькулятор, банкомат
>>731913 симфони, вордпресс
>>731915 https://github.com/fidnex/student

Аноним 2016/05/01 16:31:27  №731946 120
>>729430 (OP)
Приветствую вас, уважаемые. Мой мозг опять решил включить тупого, и я не могу понять, где я снова обосрался, при попытке решить задачу про депозит из стартового туториала в оппосте.
http://ideone.com/qvdLfh
Вот код. Заранее благодарю за помощь
Аноним 2016/05/01 16:34:24  №731948 121
>>731946
>PHP Parse error: syntax error, unexpected ';' in /home/dZCMd4/prog.php on line 3
Почему не читаешь уведомления об ошибках?
Аноним 2016/05/01 16:35:50  №731950 122
14621097507450.png (47, 963x452)
452x963
Аноним 2016/05/01 16:36:24  №731951 123
>>731946
>x*10%
Поехавший чертяка. Прочитай начало самое, где рассказывается об операторах. Знак "%" нужен для того, чтобы остаток числа получить, ты не получишь так проценты.
Аноним 2016/05/01 16:52:30  №731955 124
>>731732
Да. Увидел это сейчас в phpstorm. Спасибо!
Аноним 2016/05/01 16:55:52  №731960 125
>>731948
Читаю, так эт хуйня пишет что нет скобочки.
>>731950
Исправил, все равно пишет что нет скобочки какой то.
>>731951
Благодярю за помощь, исправил.
Аноним 2016/05/01 17:03:38  №731962 126
>>731960
У тебя там дофига точек с запятыми внутри for. Их должно быть три. Одинаковые вещи отделяются запятыми. Синтаксис такой:
for(Инициализация счетчика 1, инициализация счетчика 2... и тд ; условие 1, Условие 2... и т.д; увеличение счетчика 1, увеличение счетчика2... и т.д)
Аноним 2016/05/01 17:04:14  №731963 127
>>731962
> Их должно быть три
То есть две.
need help Аноним 2016/05/01 17:15:33  №731972 128
14621121330640.jpg (28, 480x360)
360x480
Реквестирую регулярку или готовый класс, или кусок кода.
Для того чтобы выдергивать ВСЕ урлы из текста.
Если есть класс, с бд всех доменов чтобы четко детектить урлы типа ololo.moscow и отличать их от от шлака типа web.hui будет вообще круто.

Строка для примера:
asdf asdf http://asdads1.ru asdf asdf asdf a11sffdads2.ru a mail@mail.ru sdf asdf www.a11sffdads3.ru asdf фывафыа4.рф/ывапвыпа asdf http://фывафыа5.рф asdf a11sffdads3.ru/sdfdd фывафыа4.рф asdf
Аноним 2016/05/01 17:31:42  №731974 129
>>731972
(http:\/\/|www\.)[^\s]+\.[a-z]{2,3}
Аноним 2016/05/01 17:32:41  №731976 130
>>731972
все домены, минус .hui и .blya

/ [^.]*\.(?!hui)(?!blya).+ /U
Аноним 2016/05/01 17:36:44  №731977 131
>>731976
А, сори, с ошибкой было, так правильно
/ [^.]*\.(?!hui)(?!blya)[^\s]+ /U
Аноним 2016/05/01 17:39:03  №731979 132
>>731977
Алсо, пробелы в начале и конце строки придется обрезать через какой-нибудь trim, или используй группу захвата ().
Аноним 2016/05/01 17:47:19  №731987 133
14621140394340.jpg (44, 673x304)
304x673
>>725118
Привет, ОП. У меня студенты на ООП ̶b̶a̶d̶u̶m̶-̶t̶s̶s̶. Вообщем вот мой репозиторий (третий по счету) https://github.com/greenTea242/Student_List, но теперь в нем все коммиты отображаются. В него вошли два старых коммита из прошлого репозиторий и мои последние изменения.

> Тут уже возникает вопрос почему эти функции отдельные и какой смысл ставить одну куку, не поставив другую?
Установка кук для токена существует отдельно потому что в register.php проверяется защита на СSRF во время отправки формы, т.е. до момента регистрации студента и выставления оных.

>>725118
Ты мне советовал для выделения слов при поиске использовать preg_replace_callback. У меня не получилось ее правильно использовать, потому что она сразу меняет параллельно все совпадения по массиву регулярок и нигде нельзя посмотреть процесс изменения текста, а мне нужно сделать так, что если это совпадение уже в тегах <mark>, мне это не нужно делать. Данный результат мне удалось получить через дополнительный foreach. Результат по пикрелейтеду вроде правильный.
Аноним 2016/05/01 17:49:01  №731989 134
Аноним 2016/05/01 17:50:31  №731990 135
>>731989
Хорошая традиция.
Аноним 2016/05/01 18:06:48  №731997 136
Аноним 2016/05/01 18:31:41  №732002 137
Дорогие похаперы, у меня вопрос. Я хочу начать изучать похапэ сам, так как я первокурсота и ждать третьего курса чтобы выучить один из самых добрых и простых языков мне лень. Так вот, в чем вопрос: Читал я ваш урок, пару книг качал - ну это же просто скука неебическая! Есть ли книжка где мне не будут объяснять что такое переменная, массив, цикл и тд. Я типа мамкины олимпиады в школе писал.
Аноним 2016/05/01 18:51:56  №732009 138
14621179163740.gif (27, 715x488)
488x715
>>731919
Спасибо тебе большое.

>В сумме 60 бит энтропии. Для их записи хватит 10 символов (если каждый принимает 64 значения = 6 бит), а не 32.
Я, если честно, не совсем понимаю что это и зачем все оно нужно. Проблема в том что в моем коде неоправданно много ресурсов тратится на генерацию токена, да?

$i = 32; $hash = '';
while($i--) $hash .= chr(rand(40,126));
return $hash;
Сойдет такое? Меня возможная точка с запятой немного смущает.
Аноним 2016/05/01 18:55:31  №732010 139
Анон, создаю базу данных в консоли, по рецепту. Но не пойму одно: где мне узнать мое имя, лол? Я его нигде не задавал, откуда мне его выдрать?
mysql> GRANT ALL ON menagerie.* TO your_mysql_name;
>your mysql name
Аноним 2016/05/01 18:57:31  №732013 140
>>732010
А как ты в терминал SQl заходишь вообще, если не знаешь своего имени?
Аноним 2016/05/01 18:58:10  №732014 141
>>732013
Я поставил mysql, придумал простой пароль. Захожу с помощью mysql command line
Аноним 2016/05/01 18:58:26  №732015 142
>>732014
В этом комманд лайне нужно только пароль ввести.
Аноним 2016/05/01 18:59:10  №732016 143
>>732015
Скорее всего под юзернеймом root сидишь
Аноним 2016/05/01 18:59:41  №732017 144
>>732010
Создаешь пользователя, типа vasya@localhost, а потом даешь ему права на бд GRANT ALL ON menagerie.* TO vasya@localhost
Аноним 2016/05/01 19:09:06  №732021 145
Аноним 2016/05/01 19:13:23  №732024 146
1) Где хранить коды ошибок и их сообщения?
2) Как правильно сообщать об ошибках на разных уровнях: бд, валидатора, модели?
3) Где проверять логические ошибки? То есть, когда нам нужно сначала получить запись из бд и посмотреть, наш ли это комментарий, например. Пока получается нагромождение if'ов в модели.
Аноним 2016/05/01 23:04:13  №732156 147
Аноним 2016/05/01 23:12:02  №732163 148
>>731974
>>731977
слабовато на моем примере не со всеми ссылками срабатывает
Аноним 2016/05/01 23:23:54  №732170 149
>>732163
(http:\/\/|www\.)?[^\s]+\.[a-z]{2,6}
Аноним 2016/05/01 23:33:11  №732176 150
14621347915370.png (50, 1709x316)
316x1709
Может кто помочь?
Не могу найти что и где задаёт цвет верхней части в википедии, на скрине белым. Можете помочь понять где там её цвет менять?
Аноним 2016/05/01 23:33:58  №732178 151
>>732176
Всё нашёл, там просто не было этого параметра!
Аноним 2016/05/01 23:40:44  №732183 152
Аноним 2016/05/01 23:46:58  №732188 153
>>732183
suqa
(((http|s):\/\/)?(www\.)?)?[^\s]+\.[a-z]{2,6}([a-z0-9\/]+)
Аноним 2016/05/02 00:05:23  №732196 154
>>732009

Давай я поясню более простым примером. Допустим ты генерируешь токен как

md5(rand(0, 9))

с виду кажется что это надежный токен из 32 символов но на самом деле там ровно 10 возожных вариантов, то есть по уровню защищеннности он равносилен

rand(0, 9)

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

md5 не увеличивает число возможных вариантов токена, значит она никакой пользы не несет и не нужна.

> while($i--) $hash .= chr(rand(40,126));
сойдет, только я бы код оформил чуть получше, с фигурными скобками и циклом for вместо while так как в этом случае лучше будет видно что мы делаем ровно 32 итерации.

> Меня возможная точка с запятой немного смущает.
а что с ней не так? setcookie вроде бы делает urlencode для спецсимволов.
Аноним 2016/05/02 00:12:20  №732200 155
>>732024

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

- поле "имя" должно содержать не более 50 символов, вы ввели 100

2) через return, например возвращать массив ошибок или объект ErrorsCollection содержащий список ошибок

3) сделать функцию валидации которая все проверяет. Подумай, что функия получает на вход? Наверно комментарий. А что дает на выходе? Список ошибок

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

> получается нагромождение if'ов в модели.
неудобно делать валидацию в самой модели. Например не получится сделать проверку если надо обращаться к БД

Ты читал комментарии к задаче про студентов? Там вроде упомянуто это. Делается отдельный класс для валидации.
Аноним 2016/05/02 00:18:47  №732203 156
14621375274940.png (91, 309x249)
249x309
>>732196
И даже вложенные md5 не помогут? Пожалуй стоит почитать чего на тему.
>а что с ней не так? setcookie вроде бы делает urlencode для спецсимволов.
Тогда с 33 по 126 брать, довольно солидно выглядит.
Аноним 2016/05/02 00:29:28  №732209 157
>>732188
А кириллические домены?
Аноним 2016/05/02 08:50:08  №732267 158
Аноним 2016/05/02 09:09:19  №732272 159
А есть пример безопасной авторизации? Все, что находил очень старое или очень странное
Аноним 2016/05/02 09:41:49  №732279 160
>>732002

Олимпиадные задачи и написание реальных приложений - разные вещи. Насчет учебника, если ты знаешь циклы и ифы - пропускай их, переходи сразу к массивам (если ты не изучал раньше php то ты вряд ли их знаешь так как массивы в пхп и массивы в Си это разные вещи), регуляркам, ООП. Если ты все это знаешь, можешь браться за студентов, но я бы советовал минимум решить задачи на регулярки и на ООП.
Аноним 2016/05/02 10:20:36  №732301 161
>>732209
pidoras
/(((http|s):\/\/)?(www\.)?)?[^\s]+\.[a-zа-яё]{2,6}([a-zа-яё0-9\/]+)/ui
Аноним 2016/05/02 10:30:48  №732313 162
>>732301

http|s - неправильно же
Аноним 2016/05/02 10:33:28  №732317 163
>>732313
blyadina
/(((http(s)?):\/\/)?(www\.)?)?[^\s]+\.[a-zа-яё]{2,6}([a-zа-яё0-9\/]+)/ui
Аноним 2016/05/02 11:19:01  №732331 164
14621771413910.jpg (55, 842x396)
396x842
Аноны, можете накидать литературы по разработке модуля сайта.Модулем web-сайта будем называть программу, хранящуюся и выполняющуюся на сервере, имеющую один или несколько вариантов представления хранимой на сервере информации и интерфейс управления этой информацией. Ну либо поможете помочь разобраться? Реально это будет сделать за 1 день, даже не знаю с чего начинать. Прошу говном не кидаться.
Аноним 2016/05/02 11:28:45  №732335 165
Аноним 2016/05/02 12:53:23  №732393 166
14621828033080.png (23, 652x237)
237x652
>>732317
Еще вот такая штука бывает
Аноним 2016/05/02 12:58:48  №732399 167
>>732393
Хм, вообще вот эта часть рассчитана под такое:
>(((http(s)?):\/\/)?(www\.)?)?
А, нет, вот так надо:
>([a-zа-яё0-9\/]+)?
То есть после домена могут и не быть никакие символы.
Я с планшета, так бы давно сам проверил, соррян, делал наугад и для развлечения.
Аноним 2016/05/02 13:26:53  №732421 168
http://ideone.com/6KVcTW
Приветствую, ананасики. Решил вот вкатиться в пхп, до этого изучал паскаль. Оцените решение задачки про рост.
Аноним 2016/05/02 16:32:55  №732572 169
14621959756370.gif (115, 269x169)
169x269
>>729418
>у тебя все странно выглядит, я бы мог написать замечания к каждой строчке но некогда.
ОП, ну зачем ты так? Уже 5 дней ничего не пишу и только гадаю что у меня не так в КАЖДОЙ строчке. Напиши пожалуйста что не так.
>Ну например почему у тебя всюду статические методы
Половина статических методов - это методы Laravel. Мои методы тоже не требуют создания объектов, классы существуют просто для группировки функций..
>или что за странный класс table (и погчему он с маленькой буквы?).
Это метод. Насчет странности я не понимаю о чем речь, взял тут https://laravel.com/docs/5.2/queries#retrieving-results
>Почему имя класса GetLinks начинается с глагола?
Уже переправил на PageProcessor. Как еще я мог назвать класс, который только и делает что достает ссылки из страницы? LinksExtractor?
>Тебе надо разобраться с ООП, MVC, прежде чем браться писать такие приложения. В ОП посте есть задача про студентов с комментариями, почитай. Про ООП есть в моем учебнике в ОП посте.
Пожалуй прислушаюсь, а то у меня классы все как модули для хранения функций выглядят со статикой во всех полях.
>> . Это правильно? Или надо передавать массив параметров в модель чтобы она меняла свое состояние сама?
>А за что по твоему отвечает модель? Чем она отличается от контроллера?
Решил передавать массив параметров напрямую в модель для разбора. Правильно или нет (логика разбора параметров в голове не укладывается когда их много)? Модель отвечает за выработку состояния компонента или приложения в зависимости от настроек, которые лежат в сессиях, бд и передаются вместе с запросами. Модель отвечает за работу с БД (или это бизнес-логика делает уже - я пока не вкурил). Контроллер отвечает за выбор необходимой модели и передачу ей параметров запроса, а также получает массив данных из модели и возвращает вид, заполненный данными из этого массива.
>> Делать запрос в модель для получения массива состояния вида, возвращать обновленный вид - это задача контроллера или модели?
>А почему массив а не объект?
В Laravel view работает с массивами, но может и объект blade'y передать как элемент в массиве.
Модель не должна знать ничего про view и потому возвращать его не может.
Разобрался. Это должен делать контроллер.
Аноним 2016/05/02 17:03:34  №732615 170
В PHP, как я понимаю, нельзя произвести редирект сразу после POST-запроса? Как обойти,коданы?
Аноним 2016/05/02 17:18:54  №732630 171
>>732317
>>732399
Годно, а как теперь чтобы он не захватывал имейлы?
Аноним 2016/05/02 17:31:42  №732647 172
>>732630
Он и так не захватывает
Аноним 2016/05/02 17:38:18  №732654 173
Переделал задачу про калькулятор. Пока не доходит до меня как ввести поддержку дробных чисел.
http://ideone.com/qXKUpj
Задача про банкомат.
http://ideone.com/q63wGt
Аноним 2016/05/02 19:28:04  №732719 174
>>732647
захватывает вместе с собакой
Аноним 2016/05/02 19:30:52  №732720 175
>>732719
Как он их захватывает? Только если твои имейлы начинаются с www или http
Аноним 2016/05/02 19:39:57  №732725 176
>>732720
(((http(s)?):\/\/)?(www\.)?)?[^\s]+\.[a-zа-яё]{2,6}([a-zа-яё0-9\/]+)?/u

Вот что ты споришь?
Аноним 2016/05/02 20:21:04  №732741 177
Нужен даун фронтендщик на удаленку, но с опытом реальных проектов.
Резюме пилите на: spaceship0x44@yandex.ru
Аноним 2016/05/02 21:02:07  №732759 178
>>732725
Как-то так тогда.
\s(((http(s)?):\/\/)?(www\.)?)?[a-zа-яё]+\.[a-zа-яё]{2,6}([a-zа-яё0-9\/]+)?
Другой анон
Аноним 2016/05/02 21:24:11  №732777 179
Анчоусы,не могу осилить 3е задание,не понимаю что от меня хотят,чтобы я сравнил суммы?

$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";

$anonSum = ($anonDice1 + $anonDice2);
$compSum = ($compDice1 + $compDice2);

if (($anonDice1 == $anonDice2) && ($compDice1 == $compDice2)) {
echo "2 дабла - тебя ждет удача\n";
exit ();
}
Аноним 2016/05/02 22:11:35  №732815 180
>>732759
С пробелом в начале регулярки не захватывает урл, если он в начале текста.

Еще один анон
Аноним 2016/05/02 22:13:54  №732816 181
>>732777
Не понял вопроса.
У тебя в условии стоит если выпавшее у человека на первом кубике равно выпавшему на втором кубике, а выпавшее у компьютера на первом так же равно выпавшему на втором, то у них два дабла - выводим это и выходим из скрипта.
Аноним 2016/05/02 23:20:18  №732884 182
14622204185060.jpg (77, 400x369)
369x400
>>730857
>
>Дошёл до ООП.
>Поясните по хардроку, как вообще это функционирует на сайтах.
>1. Вот у меня файл .php со скриптом, там ООП, классы, вот это всё, ему нужны экземпляры класса создавать - как-то надо подключать их, ставить на место созданий экземпляра include с файлом, уже содержащим созданные классы? Я правильно понимаю логику? Или это всё возможно через БД - оттуда брать инфу и вставлять в скрипт?
>2. Соответстветственно, ещё какой-нибудь скрипт отвечает за заполнение этого скрипта с экземплярами класса или БД с ними. Например, это студенты - скрипт собирает с регистрацией набивает БД студентами как экземплярами класса Student, а ты потом их вставляешь хитроумным способом в свой первый скрипт с ООП и вертишь там по-всякому.
>Я верно это представляю себе?
Кто-нибудь может перевести на русский язык то что он написал?
Аноним 2016/05/02 23:36:42  №732896 183
>>732884
Что тебе непонятно?
Интересно, как всё взаимосвязано на сайте.
Мы со всеми начальными задачами делаем так, что весь скрипт со всеми данными расположен на одной странице, в одном файле.
Но ведь на сайтах всё по-другому.
Что-то вводится пользователем, что-то берется из БД.
Аноним 2016/05/03 00:30:35  №732920 184
>>729430 (OP)
Я не понимаю концепцию MVC. Вот сейчас пытаюсь ковырять yii2 и сделать на нём приложение. Мне нужна стартовая страница, где была бы простая форма, куда бы я добавил адрес треда на дваче и после нажатия на кнопку подтверждения данные треда (тема оп-поста, текст оп-поста, адрес треда и прочее) добавлялись бы в таблицу. Может кто-то на пальцах пояснить как это на yii2 реализовать?
Аноним 2016/05/03 03:57:23  №732965 185
Аноним 2016/05/03 04:48:57  №732967 186
>>732741

Сомневаюсь что кто-то пойдет к "дауну" работодателю.

>>732759

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

>>732920

возможно MVC лучше изучать на примере более простого приложения без фреймворков.
Аноним 2016/05/03 08:01:24  №732988 187
14622516842200.png (7, 416x86)
86x416
Фреймворко-макака, на знающая основ, взялась за студентов.
Поэтому, пока не наделал глупостей, вопрос по роутингу: хочу создать класс Router, который будет парсить, разбивать запрос из адресной строки, а потом вызывать соответствующий контроллер и его метод. Каким образом лучше получать запрос из адресной строки? Один из вариантов - это указать в public/.htaccess правило вроде RewriteRule ^(.*)$ index.php?url=$1, чтобы все запросы вида controller/method преобразовывались в index.php?url=controller/method. Роутер проверит, если есть $_GET['url'], тогда нужно функцией explode() по слешу по слешу разбить строку, первый элемент массива на контроллер, второй на метод, остальные на параметры, а потом всё вызывать фунцией call_user_func_array(), для того, чтобы вызвать соответствующий контроллер и метод.
Второй вариант - использовать $_GET['REQUEST_URI'], но он указывает путь относительно локалхоста, то есть добавляет лишнее (пик). Вот как можно обойти: http://stackoverflow.com/a/13040861
Не слишком костыльно? Или лучше виртуальные хосты использовать?
Аноним 2016/05/03 08:08:14  №732991 188
14622520945090.png (5, 249x88)
88x249
Вот это выхлоп $_GET['REQUEST_URI'] с виртуальным хостом.
Аноним 2016/05/03 08:12:44  №732992 189
14622523646460.png (929, 1200x630)
630x1200
Извиняюсь, не $_GET['REQUEST_URI'], а $_SERVER['REQUEST_URI'] в обоих случаях.
Аноним 2016/05/03 09:08:43  №733003 190
>>732988

> Второй вариант - использовать $_GET['REQUEST_URI'], но он указывает путь относительно локалхоста, то есть добавляет лишнее (пик).
Лучше бы конечно REQUEST_URI. если испольщуешь реврайтинг надо добавлять флаг QSA иначе все GET-параметры теряются. Ну и надо помнить что сервера вроде nginx не поддерживают htaccess и не будут передавать параметр url, а REQUEST_URI должен работать везде.

> хочу создать класс Router, который будет парсить, разбивать запрос из адресной строки, а потом вызывать соответствующий контроллер и его метод.
Если он вызывает контроллер то это уже формально Front Controller а не просто роутер. Роутер никого не вызывает.

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

/some/page/x/1
/some/page/x/2
/some/page/x/3

что негативно может сказать на индексации поисковиками.

Как альтернатива можно использовать регулярки:

if (preg_match...) {
вызываем конроллер X;
}

Аноним 2016/05/03 09:38:41  №733013 191
>>732896
>Что тебе непонятно?
Половину написанного.
>>730857
>Вот у меня файл .php со скриптом, там ООП, классы, вот это всё, ему нужны экземпляры класса создавать - как-то надо подключать их, ставить на место созданий экземпляра include с файлом, уже содержащим созданные классы?
Это у тебя вопросительное или утвердительное предложение? 34 слова в предложении - не многовато ли?
>Дошёл до ООП.
>Поясните по хардроку, как вообще это функционирует на сайтах.
>1. Вот у меня файл .php со скриптом, там ООП, классы, вот это всё,
Зачем ты это пишешь?
>ему нужны экземпляры класса создавать
Кому "ему"? Классу ничего не нужно. Объекты нужны тебе.
>как-то надо подключать их
Что подключать? Что? Объекты? Что значит "подключать"? Инициализировать может?
>ставить на место созданий экземпляра include с файлом, уже содержащим созданные классы?
"Созданий"? "Создания" может? Что за "include с файлом"? Пиши "include". Какие созданные "классы" у тебя в инклюде?
>>730969
>Нет, юзай композер.
Ты шутишь, да?
>БД вообще тут не при чем.
Как ни при чём если объекты заполняют с помощью массивов и таблиц БД, или в процессе работы данные узнают.

>>730857
>2. Соответстветственно, ещё какой-нибудь скрипт отвечает за заполнение этого скрипта с экземплярами класса или БД с ними. Например, это студенты - скрипт собирает с регистрацией набивает БД студентами как экземплярами класса Student, а ты потом их вставляешь хитроумным способом в свой первый скрипт с ООП и вертишь там по-всякому.
>Я верно это представляю себе?
Что тут вообще написано?

Аноним 2016/05/03 09:55:21  №733018 192
>>733013

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


Аноним 2016/05/03 10:05:50  №733023 193
>>733018
>По моему ты занимаешься глупостью.
Смени тон разговора. У человека с мышлением и рассудком не все в порядке. Мне интересно очень в каком порядке должны замкнуться нейроны чтобы вышел этот опус.
Аноним 2016/05/03 10:08:56  №733027 194
>>733023

Это тред про программирование, а не тред грамматики, орфографии и синтаксиса.
Аноним 2016/05/03 10:11:52  №733031 195
14622595123120.webm (2747, 1280x720)
720x1280
ООО ВЕКТОР
Я опять выхожу на связь. Тащемта, запилил отдельные классы под каждую профессию и проверку названия профессии константой класса, например. Пока кидаю без антикризисных мер, но уже делаю их. http://ideone.com/Ery6OY
Аноним 2016/05/03 10:14:10  №733033 196
>>733027
А программирование значит для тебя не лингвистика? И декодирование сбитой логики уже не входит в рамки анализа постановки задачи?
Аноним 2016/05/03 10:30:38  №733055 197
>>733031

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

У тебя это правило не соблюдается:

> if ($position == self::POSITION_MANAGER||$position == self::POSITION_MARKETER||
> $position == self::POSITION_ANALYST||$position == self::POSITION_ENGINEER)
{
$this->position = $position;
}else{
echo 'Професия введена неверно.'

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

По этой же причине нельзя сделать константы для профессий в базовом классе. Эти константы и поле position вообще не нужны так как у тебя используются разные класса и их имена сами по себе константы.

Если тебе где-то надо передать идентификатор профессии, можно использовать такую конструкцию:

Marketter::class

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

> foreach ($employees as $employee)
> {
> $this->quantity[] = $employee->quantity;
> $this->position[] = $employee->position;
Это тоже непрвильно. У тебя есть объект-сотрудник, и в нем хранится его должность, ранг. и тд. Зачем ты эти данные копируешь и храишь где-то еще? Это ведь тольео добавляет проблем. Что если у сотрудника поменяется ранг - он обновится в департаменте? Что если мы наймем или уволим сотрудника?

Не надо дублировать данные. В департаменте надо хрнить массив объектв-сотрудников а не копию информации о них которая может оказаться неактуальной.

> }elseif ($this->position[$x] == 'Marketer')
> {
> $coffe = ((new Marketer($this->rank[$x], > $this->boss[$x]))->getCoffe())*$this->quantity[$x] + $coffe;
Тут жестко заложен список профессий и это не позволяет добавлять новые.

> class Company
>{
> public $total = 'Всего';
Это такое свойство компании? ЧТо оно обозначает? Какие еще значения у него могут быть?

> public $totalPersonelAmount;
> public $totalSalary;
Если я повышу сотруднику зарплату, она автоматически обновится в этом поле?

> class Employee
> {
> public $quantity;
У тебя класс называется "сотрудник" (не "группа сотрудников"), тогда почему там есть поле "количество"? И это плохая идея, так как непонятно, если у тебя один объект обозначает группу сотрудников, как например повысить ранг только одному из этой группы?
Аноним 2016/05/03 10:45:04  №733062 198
Кстати, аноны, а я вот в уроке про ООП относительно недавно добавил разделы про наследование, агрегацию, исключения - они вам понятны? Что-то у меня ощущение что люди не очень понимают ООП-дизайн, проектирование классов и надо может какое-то задание сделать где надо придумать набор классов для описания чего-нибудь, например классы, которые бы описывали музыкальную библиотеку с Альбомами, Треками, группами или что-нибудь аналогичное?
Аноним 2016/05/03 10:48:35  №733064 199
Аноним 2016/05/03 10:53:14  №733069 200
Аноним 2016/05/03 10:53:17  №733070 201
>>732816
Я имел ввиду,я должен сравнить суммы $anonSum и $compSum, если сумма у анона и кампуктера ровна, то объявляется ничья, итд итп.

if ($anonSum == $compSum) {
echo "Нечья\n";
} elseif ($anonSum > $compSum) {
echo "Человек победил.\n";
} elseif ($anonSum < $aiComp) {
echo "ИИ победил.\n";
}

Верно?
Аноним 2016/05/03 10:54:41  №733071 202
14622620812030.jpg (35, 604x579)
579x604
>>733055
>>733062
Да все понятно, только я, видимо, тупой и ленивый.
Аноним 2016/05/03 10:57:02  №733072 203
14622622224750.jpg (16, 200x296)
296x200
>>733013
>Половину написанного.
Согласен. Там поток сознания, писал с планшета и слегка засыпая.
Отредактирую сейчас именно тот пост:

"Дошёл до главы "Объектно-ориентированное программирование" в учебнике ОПа.
Прошу вас объяснить без лишних слов и затрагивая самую суть, каким именно образом скрипты, созданные с помощью ООП, функционируют на динамических сайтах.
1. Я создал файл с расширением .php, в нём создал скрипт на РНР, написанный с помощью ООП - там инициализированы классы, имеющие свои свойства и методы. Но ведь нам нужно каким-то образом динамически создавать экземпляры этих классов? Нам нужно как-то подключать их из сторонних файлов или базы данных? Обычно мы создавали экземпляры классов прямо в самих скриптах, а в случае с динамическими сайтами как должны поступать? В том месте скрипта, где необходимо оперировать уже созданным экземпляром класса, мы должны каким-то образом подключать сторонний файл, уже содержащий созданные экземпляры класса? Либо каким-то образом подключать информацию из базы данных? Правильно ли я понимаю логику взаимодействия разрозненных файлов в динамическом сайте?
2. Соответственно, нам могут потребоваться дополнительные скрипты, отвечающие за связь с базой данных и создание необходимых экземпляров класса? Своё предположение могу продемонстрировать на примере динамического списка студентов. Как мне кажется, для его функционирования необходим отдельный скрипт с регистрацией самих студентов (он отвечает за заполнение базы данных либо отдельного файла информацией, которая понадобится при создании экземпляров классов, необходимых для полноценной работы этого динамического списка студентов). Например, мы имеем класс Student, а в базе данных либо отдельном файле имеем информацию, которая каким-то образом должна использоваться при создании экземпляров этого класса Student. После чего мы получаем возможность тем или иным образом оперировать как с отдельными экземплярами, так и с их совокупностью.
Могу ли я считать, что мои первоначальные представления о функционировании динамического сайта верны хотя бы отчасти?"

Так лучше?

>>733018
Да, в целом я уже разобрался, спасибо братишкам. Я и хотел просто понять, верно ли я себе представляю динамику именно на самих сайтах.
Аноним 2016/05/03 11:18:44  №733080 204
>>733023
Какие нейроны? У человека просто напрочь отсутствуют представления о предмете разговора, поэтому он несет такую хуиту.
Например если бы я или ты, или другой человек совершенно незнакомый с генетикой попытался бы изложить свое представление
об этом вопросе, тоже получилась бы шизофазия вида
"ну там всякие рибосомы через митохондрии че-то там передают генетический код, код это короче типа молекула из атомов. скажите я правильно понимаю ООП генетику?"
А студенты медики такие "омг, фейспалм, ти вапщи с кокой плонети???77".

Короче ты какой-то хуйней занимаешься. Если это вброс, то максимум что можно выжать это вялый флейм.

>>733023
>Смени тон разговора.
А ты соси хуй и не забывай где находишься. Или съеби в хабр/жж.
Аноним 2016/05/03 11:24:38  №733084 205
>>733072
>Так лучше?
Намного. У тебя вопросы получились не про ООП, а про порядок исполнения многофайлового приложения.
>>733080
Ты посмотри что он написал >>733072. Он себе на все вопросы практически ответил.
Аноним 2016/05/03 11:29:38  №733087 206
14622641785190.jpg (36, 595x479)
479x595
Аноним 2016/05/03 12:50:40  №733133 207
>>733080
>У человека просто напрочь отсутствуют представления о предмете разговора, поэтому он несет такую хуиту.
Да, всё верно.

>>733084
>У тебя вопросы получились не про ООП, а про порядок исполнения многофайлового приложения.
Да, я просто задумался об этом всём именно при изучении ООП.
>Он себе на все вопросы практически ответил.
Да, действительно.
Суть же в том, что это всё было моим предположением, я просил всего лишь объяснить этот механизм и подтвердить, верно ли я предполагаю это взаимодействие файлов.
Ну, спасибо, друзья, но не хотелось бы, чтобы это всё продолжалось - выяснение какое-то чего-то.
Аноним 2016/05/03 12:58:21  №733136 208
При работе с сайтом URL'ы каждый раз проходят через DNS?
Аноним 2016/05/03 14:06:34  №733183 209
14622735944070.png (41, 1397x387)
387x1397
14622735944081.png (207, 797x849)
849x797
Добрый день всем в этом треде. ОПчик, очень нужная твоя консультативная помощь, ну и всех кто знает. В общем такая проблема - одно время в админку получил доступ кто-то левый (неизвестно каким образом - скорее всего sql-инъекция). После этого предприняли меры - закрыли доступы в админку со всей ip кроме модераторов. Далее прошел месяц и стали отслеживаться подозрительные изменения файлов (причем не ясно это СЕОшники их делали или это какая-то третья сторона). Скрины подозрительных файлов - закрасил url нашего сайта (аяксом отправляются данные на php скрипт который курлом отправляет их куда-то). Что это может быть, как думаете?
Аноним 2016/05/03 14:34:39  №733196 210
Аноним 2016/05/03 14:44:00  №733202 211
>>733196
> public function delEmployee(int $i){
В пятом php нет тайпхинтов для скаляров.
>XAMPP
Говно из жопы.
Аноним 2016/05/03 15:41:51  №733234 212
>>733202
А, всё, понял в чём ошибка. Просто у меня модно-новый php7, там так можно
Аноним 2016/05/03 15:47:57  №733238 213
Есть тут yii2 боги? Хотел запилить rest api, а из коробки поддерживаются только запросы типа:
/api/x/2

А хотелось бы:

/api/x/2/y/1/z

Как быть?
Аноним 2016/05/03 15:58:22  №733245 214
>>733238
Читать документацию.
Аноним 2016/05/03 16:28:29  №733253 215
>>733245
Ты мне лучшую практику дай. Зачем я буду велосипеды городить?
Аноним 2016/05/03 19:22:56  №733360 216
14622925767410.jpg (92, 784x554)
554x784
Ответы 28 апреля Аноним 2016/05/03 23:47:00  №733641 217
>>729793

> ООП. Два типа вопроса
Ок, решено верно.

> И в прошлом треде за 27ое число три задачи без ответов,
На них вроде дал ответы в старом треде.

>>730277

В конфиг сервера, в винде он в папке conf Апача, в линуксе обычно в /etc/apache2/apache.conf или как-то так.

> Просто скопировать в любое место?
ну можно в конец например. Не знаю, важно ли расположение.

>>730285

Может быть слишком старая версия языка или не хватает какого-то расширения. Напиши что за ошибки и в какой строке.

>>730337

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

>>730350

На мак вроде через homebrew ставят пхп и апач.

>>730533

> MariaDB тоже на хрен не нужна, Мускул таки лучше и ТРУЪ.
Там вроде различия не очень большие и есть фишечки вроде мониторинга использования индексов, которые, впрочем, на локальном сервере не особо нужны.

>>730537

Если через homebrew ставить то оно вроде в отдельные папки ставится.

>>730666

Может быть, не знаю.

>>730763

Не знаю, спроси в Питон треде.

>>730943

Да. Причем можно было записать еще короче, без промежуточных переменных.
Ответы 30 апреля Аноним 2016/05/03 23:47:26  №733642 218
>>730967

> Я особо не шарю, но вроде и обычные массивы тоже можно создавать в таком стиле - $array = new ArrayObject;
Нет, это не массив. Ты например не можешь передать его в функцию sort().

>>731213

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

>>731223

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

>>731255

Не совсем. Вот смотри:

> if ($number < 100) {
> $number = $spelling[($number % 100) - ($number % 10)].$spelling[$number % 10];

Если число меньше 100 то у него может и не быть единиц, например в числе "80"

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

> if (($a < 5) and ($a != 1) and ($a != 0)) {
> return "$textNumber ($number) рубля";
Это надо вынести в функицю, иначе тебе придется копипастить ифы и для тысяч и миллионов.

Ну и ошибку исправить:

> PHP Warning: Missing argument 2 for smallNumberToText(), called in /home/15mtSB/prog.php on line 66 and defined in /home/15mtSB/prog.php on line 18

>>731308

Можно

>>731604

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


Аноним 2016/05/04 01:19:10  №733712 219
14623139502520.jpg (47, 1342x642)
642x1342
Всем хай. Имеется нубовопрос, решение на который сам найти не могу:
Есть модальное окошко-элемент с бутстрапа, хочу изменить в нем цвет тени вокруг элемента и никак не могу врубиться как это запилить, вроде и написано что через модал контент, но конкретный идентификатор элемента не представлен.
Аноним 2016/05/04 03:26:04  №733728 220
14623215645330.png (13, 380x255)
255x380
>>733003
>Это годится только для самых простых случаев.
Из этих соображений и исходил. Насчёт регулярок в роутере и бесконечное число URL. Разбивать не explode(), а регулярками? Но в таком случае удобнее воспользоваться parse_url(). Не понял.

Разбор URL и вызов соответствующих контроллеров/экшенов, получение конфига для доступа к БД пока вынес в класс App. Теперь понимаю, что это плохая идея, так как слишком много обязанностей различного характера на один класс.

И ещё, вот у меня есть StudentController c экшенами all(), one($id), create(). Модель студента содержит только свойства. За поиск студента по id, возврат всех студентов из базы отвечает StudentMapper. Конструкции на пикрелейтед допустимы? Просто я во фреймворках использовал схему обратиться к модели -> сохранить в переменную -> переменную направить во view. Почему DataMapper, а не, к примеру, наследование модели Student от класса Model, которая соединяется с БД, предоставляет методы для поиска/сохранения? Отнаследуется уйма ненужных методов?
Аноним 2016/05/04 10:18:36  №733827 221
http://ideone.com/ZNqjGw

Почему я не могу произвести вычитание в конструкции echo если используется конкатенация строк?
Аноним 2016/05/04 10:26:32  №733830 222
>>733712
А девтулс в браузере для кого?
Аноним 2016/05/04 10:33:24  №733834 223
>>733827
Разобрался, причина оказалась в приоритетах операторов.
Аноним 2016/05/04 10:40:31  №733838 224
>>733062
>надо может какое-то задание сделать где надо придумать набор классов для описания чего-нибудь, например классы, которые бы описывали музыкальную библиотеку с Альбомами, Треками, группами или что-нибудь аналогичное?
Было бы полезно очень.
>>732920-долбоёб
Аноним 2016/05/04 11:42:22  №733885 225
14623513422980.jpg (32, 600x396)
396x600
>>733062
Тот случай, когда прошёл урок по ООП, решил несколько задач (кроме кошек-мышек), а ОП переделал урок и теперь надо заново его проходить.
Аноним 2016/05/04 14:50:14  №734054 226
>>733728
>Почему DataMapper, а не, к примеру, наследование модели Student от класса Model
Вот мне тут не понятно немного, разъясните за эти мапперы. Почему класс студента называют моделью, если он не работает с бд? Как в мвс приложениях с этими датамапперами работать? Это ведь то самое ОРМ?
Аноним 2016/05/04 14:59:53  №734065 227
Заметил что на сайтах в последнее время стало модно добавлять счетчик времени на чтение, то есть бесполезный визуальный мусор. В мое время оценить объем статьи можно было по размеру двигающегося прямоугольника (забыл как он наызвается) на полосе прокрутки.

Увы, появившаяся в последнее время мода делать тонкие или невидимые полоски прокрутки (взятые с тач интерфейсов) лишает возможности оценить объем документа.

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


>>734054

> Почему класс студента называют моделью, если он не работает с бд?
Потому что модель студента (domain model, модель предметной области) - это объект соответствующий реальному студенту и описывающий его свойства. Почему он обязан работать с БД? Если ты где-то прочел "модель это то что работает с БД" то это неправильтно. Наверно там имели в виду Model из MVC которая отвечает за хранение данных в приложении, и включает в себя и модель студента, и маппер для сохранения ее в БД.

> Как в мвс приложениях с этими датамапперами работать? Это ведь то самое ОРМ?
да, разновидность ОРМ. Ты читал мой урок про паттерны работы с БД? active record, data mapper , table data gateway?
Аноним 2016/05/04 15:12:35  №734084 228
>>734065
А, там модель из орм, а тут модель из мвс. Разные вещи с одинаковым названием. Пока понятно, спасибо.
>Ты читал мой урок про паттерны работы с БД?
Ага, раз десять. Еще разок почитаю.
Аноним 2016/05/04 15:56:01  №734138 229
>>734065
>В мое время оценить объем статьи можно было по размеру двигающегося прямоугольника (забыл как он наызвается) на полосе прокрутки
Бегунок или движок. Стрелочки по бокам - кнопки прокрутки.
Сейчас на многих сайтах реализована бесконечная полоса прокрутки - перемещаешься в них экрана - а там подгружается новый контент. Так на любых социальных сетях, так даже на этой имиджборде, когда находишься в любом разделе и скроллишь в низ страницы - подгружаются новые треды.
Но, по сути, раньше это и было минимализмом - оценивал документ по этому бегунку на полосе прокрутки, а сейчас - увы - не всегда это возможно.
Аноним 2016/05/04 16:01:56  №734151 230
>>734138
*в низ экрана
Раньше это было минимализмом - как структурированные сайты без CSS.
А сейчас - кроме как таким вот счётчиком - сложно оценить объём контента.
А когда под статьёй появляется добрая сотня комментариев и она раздвигается - тем более.
Так что, в целом, указание на примерный объём статьи - неплохая опора, ящитаю, возьму это на заметку. Встречал такое только на разных обучающих сайтах: Лингвалео, Гикбрейнс и т.п.
Аноним 2016/05/04 16:47:21  №734193 231
>>734084
Модель в ORM не обязана взаимодействовать с базой данных.
Это ты наверное зашкварился об YII с ее AR, поэтому сложился такой стереотип, что модель это типа хрень работающая с базой данных.
То что идет в Yii это вообще не ORM, они это так назвали чисто в рекламных целях.
Аноним 2016/05/04 17:35:53  №734257 232
14623725535900.png (4, 144x113)
113x144
>>734193
Я ток вкатываюсь.
И если не модель, то как это все называется? Как мне папку назвать со всеми этими мапперами и гейтвеями?
Аноним 2016/05/04 17:51:16  №734268 233
>>734065
>стало модно добавлять счетчик времени на чтение
Можно пример какой-нибудь посмотреть как это сделано?
Аноним 2016/05/04 18:22:34  №734285 234
>>731844
>>733062
Новая редакция урока понятнее предыдущей. Задач мало не бывает.

Кстати, бывают абстрактные свойства, которые должны быть переопределены в классах-потомках в обязательном порядке?
Аноним 2016/05/04 18:28:41  №734289 235
>>734193

Ну почему? Как я понимаю AR как раз одна из возможных реализаций ORM

>>734257

Не надо делать папки Controller, View, Model вообще. Разделение в MVC условное. Просто сделай все на 1 уровне:

Controller
Model
Mapper
...

>>734268

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

>>734285

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

Если тебе надо "абстрактное свойство" то лучше сделать абстрактный метод, возвращающий нужное значение.
Аноним 2016/05/04 18:35:28  №734293 236
>>734289
>Считается число букв, слов или слогов (например по гласным) и делится на экспериментально подобранное число.
А где посмотреть то реализацию можно? И не проще считать умножая среднее время чтения на количество слов?
Аноним 2016/05/04 18:38:35  №734299 237
Процедурки Аноним 2016/05/04 18:52:47  №734308 238
Аноны, чем плох процедурный код? Уже пол года пишу сайты на процедурах. Все красиво и аккуратно. Сейчас ещё и js начинаю учить чтобы сайты были более динамичнее.
Аноним 2016/05/04 19:17:05  №734323 239
>>734299
Не увидел ничего подобного у Варламова.
Ну а на первом блоге если бы была куча комментариев, то указанное примерное время помогло бы сразу сориентироваться, не глядя на полосу прокрутки, которая вводила бы в заблуждение относительно реального объёма статьи.
Аноним 2016/05/04 19:23:40  №734328 240
Фух, сейчас такой охуенный велосипед написал, хочется трогать себя в некоторых местах, когда на него смотришь. Все решения в гугле просто ужасны и громоздки на вид, а мое заняло 30 строчек кода.
Аноним 2016/05/04 19:24:51  №734330 241
>>734328
Есть чё? Покежь ссылочеку, братуха!
Аноним 2016/05/04 19:25:58  №734331 242
>>734330
Ну вы же разрушите мой манямирок сразу, я вас знаю.
Аноним 2016/05/04 19:32:49  №734344 243
Аноним 2016/05/04 19:48:41  №734374 244
>>734344
>'active'=>($i==$currentPage)? true:false
==
>'active'=>($i==$currentPage)
Аноним 2016/05/04 19:49:56  №734376 245
>>734374
Спасибо, я уже забыл про эту фичу.
Аноним 2016/05/04 21:01:42  №734503 246
>>734344
Говно.

Вот написал для сравнения: http://ideone.com/gW2O0v
Алсо вылезают +1/-1 из-за уродской нумерации начиная с 1.
Аноним 2016/05/04 21:03:54  №734507 247
>>734308
Покажи пример процедурного кода.
Аноним 2016/05/04 21:04:19  №734508 248
>>734503
Какая же пыха говнище из-за знака "$" .
Пока писал забывал его через раз, выбесило к хуям.
АЖТРИСЕТ
Аноним 2016/05/04 21:06:56  №734510 249
14623852161010.jpg (41, 500x500)
500x500
Аноним 2016/05/04 22:09:45  №734605 250
Подскажите, пожалуйста, какие нибудь толковые видео уроки или уроки в текстовом виде по регуляркам.
Аноним 2016/05/04 22:14:22  №734609 251
14623892628740.jpg (105, 1024x683)
683x1024
>>729430 (OP)
Ребята. Пишу сайтик на ПХП. В процедурном стиле. Есть файл индекс.пхп с которого производятся практически все манимуляции с сессиями и тд. Появилась потребность выполнить JS скрипт на стороне сервера.
Поясните пожалуйста, как это сделать ?
Аноним 2016/05/04 23:36:51  №734660 252
Аноним 2016/05/05 00:10:16  №734689 253
Господа, простите за чатик, просто больше спросить негде, а у вас здесь адекватно.
Я не так давно вкатился, освоил поверхностно html и css (сейчас прохожу курсы на htmlacademy.ru для закрепления), но в какую сторону двигаться дальше?
Цель: начать фрилансить.
Я для себя наметил несколько направлений, но уже, если честно, сломал всю голову, поэтому спрашиваю у вас, не ругайтесь только, в какой последовательности лучше изучать?
То, что собираюсь выучить: JavaScript, PHP, MySQL, WP и Joomla. Хочу поскорее брать заказики на weblancer.net и остальное доучивать уже на практике, так я гораздо лучше усваиваю. А уже через полгода-год подтяну ангельский и перекачусь на upwork. Помогите лишь определиться с последовательностью? Я у кого ни спрошу, кто советует с КМСок начать, кто с ЖС, кто с пыха.
Аноним 2016/05/05 02:38:51  №734791 254
>>734689
PHP c основами MySQL -> какой-нибудь популярный php-фреймворк (на yii2 много заказов и работы) -> JavaScript.
>WP и Joomla
Забудь про всё это говнище. Там как бы учить нечего, если знаешь php и ооп на примере хорошего фреймворка.
Аноним 2016/05/05 02:54:21  №734793 255
Я сейчас долгое время сижу на очень странной стадии изучения пограмирования. Знаю фундамент, ООП, понимаю зачем нужны паттерны, могу пояснить за большинство понятий, с английским дружу так что при наличии гугла я богоподобен. Но мне просто не интересно писать код чтобы изучать код, я хочу задачи решать(не олимпиадные, олимпиадники пусть сосут хуи) но не могу ничего придумать. Если брать что-то простое то смысла нет, если что-то сложное то понимаешь что будешь писать велосипед. На ПХП можно написать КМС, но зачем когда их и так десятки всяких разных, опять напишу никому не нужную поеботину. Хочется все таки быть полезным. Ебучая жизнь.
Аноним 2016/05/05 03:53:30  №734799 256
>>734793

Если ты хочешь быть полезным, сделай что-нибудь что интересно и нужно тебе самому, что может пригодиться потом и другим. Зачем писать CMS? алсо, это оффтопик получается, с этим наверно лучше в другой тред.
Аноним 2016/05/05 06:46:30  №734820 257
>>734799
> оффтопик
Какой же оп хуй итт. Эх выгнать бы его нахуй на боброчан.
Аноним 2016/05/05 09:23:54  №734857 258
>>734793

Я сейчас опять сижу на очень странной стадии изучения программирования. Знаю 17 управляющих конструкций, 8 типов, понимаю зачем нужен try-catch, немношко могу пояснить за историю ПХП, с английским особо не дружу, так что гугл для меня не особо полезен. Мне интересно писать код чтобы изучать код, я хочу задачи решать (хотелось бы выйти на уровень богоподобных олимпиадников), и так много их придумываю что жизни не хватит все написать. Если брать что-то сложное то смысла нет, поэтому беру простое и думаю над числом вариаций построения велосипедов. На ПХП можно написать все что угодно, но почему то даже для нужных вещей отсутствует документация, опять отгоняю от себя мысли залогиниться в группу документации и описать хоть одно расширение. Хочется все таки быть опытным. Верю что все впереди.
Аноним 2016/05/05 11:02:46  №734914 259
14624353666430.jpg (94, 762x434)
434x762
14624353666441.jpg (269, 1256x911)
911x1256
Как ютюб это сделал?
Аноним 2016/05/05 11:17:55  №734927 260
>>734914
Извиняюсь. Это фича браузера оказалась.
Аноним 2016/05/05 11:22:46  №734931 261
>>734609
Сначала расскажи, что ты хочешь получить.
Аноним 2016/05/05 12:23:57  №734963 262
1. Что лучше использовать в методах контроллера
[code lang="php"]
$this->view('index', [
'students' => $allStudents,
'pageTitle' => 'Студенты'
]);
[/code]
или
[code lang="php"]
$this->view->Page('index')->with([
'students' => $allStudents,
])->pageTitle('Студенты')
->render();
[/code]

2. https://designpatternsphp.readthedocs.io/en/latest/Structural/DataMapper/README.html
Почему в мане по паттерну DataMapper не используют __set() и __get()? Из-за того, что объясняется суть паттерна, а магия/сахар PHP не уместны? Или использовать __get() и __set() плохо? Мне магические геттеры/сеттеры помогли код сократить.

3. Нужно ли юзать DI-контейнеры? В процессе написания студентов понял, что мне не хватает глобальных переменных, так как первый раз пишу многостраничное приложение. Мне из контроллера нужно иметь доступ к объекту StudentMapper. Этот объект создаётся с передачей конфига для PDO. Инстанциирование StudentMapper(PDO $pdo) в контроллере выглядит уродливо, поэтому я в конструкторе контроллера получаю уже готовый объект StudentMapper, как мне кажется, так менее уродливей. Но не передавать же мне всё через конструктор? Или передавать?
Аноним 2016/05/05 12:29:11  №734967 263
14624405518570.png (345, 600x351)
351x600
Сап, /pr/. Есть один класс со статическим атрибутом, поэтому вопрос.
Значение этого атрибута будет одинаково во всех инстансах класса в каждом из запущенных скриптов например, один скрипт запустили дважды.
Или только для всех инстансов класса внутри одного запущенного скрипта?
Аноним 2016/05/05 12:29:50  №734968 264
>>734963
Дополнение к пункту 1. В первом случае кода меньше, но смешиваются переменные. Первый случай под капотом просто require'ит путь APP_ROOT . "/views/" . первый_параметр . ".php"
Для второго случая нужно будет создавать класс и объект view.

Для того, чтобы листинги были более понятны, нужно поставить: https://github.com/ololoepepe/MakabaCode/
Аноним 2016/05/05 12:48:53  №734982 265
14624417332220.jpg (331, 1024x768)
768x1024
>>734931
Пилю веб-приложуху. В данный момент идёт реализация системы лобби. тоесть есть по факту таблица, каждая строка которой - это отдельное лобби. Как на пике.

По нажатию на кнопку "создать лобби", появляется форма, заполняя которую создаётся лобби в этой таблице. Я прилепил на JS(jQuery) событие, что мол при заполнении полей и нажатии на кнопку "создать", в таблицу добавляется строка, с введёнными данными, но вот беда, она появляется до перезагрузки страницы. Мне же нужно, чтобы пункт в таблице вмонтировался в страницу, чтобы его видели другие пользователи и чтобы оно не пропадало после перезагрузки ...
В JS треде сказали выполнить скрипт на стороне сервера, но я уже по-ходу понял, что они имели Ноду ... А мне на ПХП надо.
Аноним 2016/05/05 12:50:37  №734985 266
>>734982
Точнее добавляемый через jQuery элемент существует только на компьютере создавшего пользователя, да и то, пока тот не перезагрузит страницу. Мне же нужно, чтобы оно встроилось в страницу и было видно всем пользоателям.
Аноним 2016/05/05 13:43:59  №735018 267
>>734793
Здесь есть тред идей. Зайди туда и выбирай что понравится.
Аноним 2016/05/05 13:44:48  №735019 268
>>734985
Отправляешь форму на сервер. Чтобы страница не перегружалась, используй ajax
Аноним 2016/05/05 14:08:54  №735032 269
>>734289

В задаче про Вектор и департаменты.
Если мы создаем абстрактный класс Профессия, в нем указываем свойства
ставка = 100;
потребление кофе = 10;
производительность = 20;
И наследуем от него классы профессии (Менеджер, Инженер и тд.), в каждом из которых переопределяем эти свойства.
Но что если, другой программист создаст новую профессию, как быть уверенным, что он переопределит значения по умолчанию?
Аноним 2016/05/05 14:13:31  №735038 270
>>734982
Тебе же ответили выше про веб-сокеты (это же ты был?).
Можно ещё long-polling попробовать, но, я так понимаю, там задержки больше будут.
Аноним 2016/05/05 15:36:30  №735085 271
>>729430 (OP)
Братишки, а чем вы код в текстовых редакторах (не IDE) дополняете?
Аноним 2016/05/05 15:41:53  №735087 272
Добрый день, никто не сталкивался с задачами - просклонять имя прилагательное относительно существительного?
Аноним 2016/05/05 16:22:16  №735111 273
>>735032
Ты имеешь в виду класс Сотрудник? Или помимо него ещё и класс Профессия?
Можно сделать абстрактный класс Сотрудник, а от него наследовать уже любую профессию. Ну или как ты хочешь.
Если другой программист добавляет другую профессию, то он по-любому наследует её от Сотрудника (или Профессии - в твоём случае). Он же должен посмотреть на те свойства, которые идут по умолчанию в них, естественно, что они их переопределит в соответствии с новой профессией.
>>735085
Плагины имеешь в виду или что?
>>735087
Интересная задача, но, наверное, это нереально без огромного списка исключений.
Хотя надо бы прикинуть.
А что на входе - начальная форма в Именительном падеже уже дана? "Синяя ночь", "синий день"? Довольно интересная же задачка, действительно. Уровня чисел прописью, а может даже выше.
Аноним 2016/05/05 16:30:50  №735118 274
>>735111
>Плагины имеешь в виду или что?
Движки анализа/дополнения кода, что-то вроде Tern, Racer, Jedi, но если нет ничего подобного, то хоть что-то. Допустим, пользую я свой любимый Vim, какие у меня есть опции, кроме https://github.com/shawncplus/phpcomplete.vim, что мне YCM / Neocomplete скормить можно?
Аноним 2016/05/05 16:56:02  №735142 275
Как экранировать символ '%'?
Пиздец, гугол не отвечает, я в ярости!
Аноним 2016/05/05 16:59:37  №735144 276
>>735142
Зачем тебе его экранировать?
Аноним 2016/05/05 17:10:24  №735151 277
>>735118
>любимый Vim
Его лучше любить, сидя на IDE. С Vim режимом. Для PHPStorm можно даже создать файл .ideavim и добавлять туда простейшие команды вроде map jj <Esc>
А так могу посоветовать Practical Vim и Practical Tmux заодно, всё из серии The Pragmatic Bookshelf. Там рассказано как с помощью ctags писать самому всякие find by usage и autocomplete плагины.
Аноним 2016/05/05 17:26:06  №735162 278
>>735151
>Его лучше любить, сидя на IDE.
Нет, в Vim мне комфортно, осталось только понять, можно ли сделать дополнение чуточку интеллектуальнее.
Аноним 2016/05/05 18:21:15  №735196 279
Тупанул, перепощу сюда >>735190
>Это нормально, если я передаю в метод аргументом метод из другого класса? Хочу проверять существование мыла в классе-валидаторе.
Аноним 2016/05/05 18:25:47  №735200 280
>>735196
>Это нормально, если я передаю в метод аргументом метод из другого класса?
Вполне нормально, если такие методы ты делаешь универсальными. Универсальными - в том смысле чтобы можно было использовать где-нибудь еще, а не строить новый велосипед.
Аноним 2016/05/05 18:36:36  №735210 281
Хелп, разработчики. Делаю фильтры для продуктов магазина через MySQL. Продукты одежда и обувь, фильтры примерно такие - брэнд продукта (тут сотня разных), пол (мужской, женский, дети, унисекс), размер, цвет, категория, материал, магазин (их много). Есть гора продуктов с id, для продуктов есть таблица all_products (где их id и всякие параметры), для фильтров таблица filters_to_products, где задается соответствие product_id - filter_id, еще есть таблицы store_depot_items где прописано соответствие depot - product_id и есть поле stock равное 0 или 1, т.е. на каком складе какой продукт есть. Ну и наконец таблица store_depots, где задается соответствие depot_id - store_id, т.е. какой склад в каком магазине. Таким образом наличие товара в магазине проверяется через 2 таблицы store_depots и store_depot_items, а остальные фильтры через filters_to_products. Задача - если выбраны фильтр, вывести продукты только под эти фильтры, плюс убрать фильтры, какие для отфильтрованных продуктов уже неактуальны. Например выбран фильтр одежда для девочек, цвет красный, соответственно должны убраться брэнды, у которых нет красной одежды для девочек. С первой частью задачи по выводу продуктов под фильтры я легко справился, просто используя WHERE и JOIN в Mysql, проблем не было. Со второй начались проблемы - тут нужен вложенный подзапрос. Выходит, что сначала собираем все продукты подходящие под фильтры SELECTом, потом смотрим для каждого из этих продуктов соответствия в filters_to_products (какие у каждого продукта есть фильтры), потом делаем SELECT DISTINCT для всех собранных фильтров. Вышло примерно такое (пример с 2 фильтрами 25 и 3):
SELECT DISTINCT filters.filter_id FROM (SELECT ta.filter_id, pa.product_id from filters_to_products ta JOIN all_products pa ON (pa.product_id = ta.product_id) JOIN store_depot_items sb ON (pa.product_id = sb.product_id) JOIN store_depots sdepot ON (sb.depot_id = sdepot.depot_id) WHERE sb.stock = 1 AND sdepot.store_id = 136 AND ta.tag_id = 25 AND ta.tag_id = 3) filters
Проблема в том, что запрос занимает по 4 секунды, поскольку продуктов около миллиона, а пользователь не готов столько ждать обновления фильтров. Можно делать все это как-то быстрее? В каком направлении копать? Сейчас я делаю этот запрос к SQL асинхронно из аякса, но фильтры все равно долго обновляются по нескольку секунд, заказчиков не устраивает. Видел шопы, где это мгновенно происходит, как такое делается?
Аноним 2016/05/05 18:40:43  №735215 282
>>735210
>как такое делается?
Оптимизацией БД (нормализация, индексы) и вменяемыми запросами, попробуй учебник какой-нибудь почитать на эту тему.
Аноним 2016/05/05 18:41:02  №735216 283
>>735085
Ничем не дополняю. Фреймворк которым пользуюсь и тем более свой код я знаю наизусть, набираю быстро.
Аноним 2016/05/05 18:44:56  №735218 284
>>735215
Индексы есть, таблицы нормализованные. Думал, может кто делал уже такое и есть какие-то готовые рецепты, как правильно ненужные фильтры убирать, используя список отфильтрованных продуктов.
Аноним 2016/05/05 18:48:38  №735223 285
>>735218
Избавляйся от JOIN каким-то образом.
Аноним 2016/05/05 18:49:42  №735224 286
>>735210
Почему бы не сделать просто SELECT * FROM products WHERE filter_param = filter_value AND ... ?
Аноним 2016/05/05 18:51:01  №735226 287
>>735200
Чет не получается блин.
У меня есть класс валидации, у него есть метод, который принимает функцию и через нее прогоняет значение. Хочу передать в этот метод метод существующего экземпляра класса, не статического. Такое возможно вообще? Может pimple как-то умеет?
Аноним 2016/05/05 18:51:59  №735227 288
>>735226
>У меня есть класс валидации, у него есть метод, который принимает функцию и через нее прогоняет значение.
Ты наркоман?
Аноним 2016/05/05 18:52:24  №735228 289
>>735216
Какой фреймворк? Не хочешь ли перейти на какой-нибудь другой по каким-нибудь причинам или прям всем тебя устраивает?
Для себя или заказчиков?
Аноним 2016/05/05 18:55:39  №735230 290
>>735224
В products нет фильтров, там только продукты, они в filters_to_products. Каждому продукту соответствует несколько фильтров, например так:
product_id tag_id
34 7
34 136
34 80
Плюс продукты нужно искать, какие только в наличии в конкретном магазине, а это джойнить еще 2 таблицы со складами и магазинами.
Аноним 2016/05/05 18:59:13  №735233 291
>>735227
Нормальный прием. Двойная деспетчеризация, все дела, но зачем она ему не совсем ясно.
Аноним 2016/05/05 19:05:19  №735235 292
>>735210
Также вопрос - ускорится ли все это дело, если вместо джойнов использовать массивы в PHP? Если айдишники продуктов под фильтры например собрать в PHP уже обычным селектом, и передавать их оттуда в выборку новых фильтров через WHERE filters.product_id IN (id1, id2, id3 ...)
Аноним 2016/05/05 19:06:41  №735236 293
>>735233
Проверить пришедшее с формы мыло на существование. Передавать маппер в конструктор ради одной проверки, чет как из пушки по воробьям. Наверное.
Аноним 2016/05/05 19:13:34  №735239 294
>>735230
Продукт имеет свойства.
Фильтр - набор свойств и их значений. Можно, например, его передавать в uri как ?param1=value1&param2=value2&...
Зачем тут еще что-то, кроме WHERE param1=value1 AND ... ?
Ну а что касается необходимых джоинов для денормализации - без них никак. Поможет кэширование запросов. Но нужно учитывать объем памяти.
Аноним 2016/05/05 19:38:06  №735262 295
>>735239
Фильтры отображать надо на сайте же, а чтобы фильтры отображать нужно сначала выбрать доступные фильтры для отфильтрованных продуктов. С одним where ничего не получится. Кэш невозможен, поскольку фильтры каждый раз разные, а продукты обновляются. С секунды на секунду красная рубашка Adidas для девочек может закончиться в магазе (stock=0 станет), а с ней и сразу пара фильтров накроется.
Аноним 2016/05/05 20:05:34  №735277 296
>>735111
>>Интересная задача, но, наверное, это нереально без огромного списка исключений.
Хотя надо бы прикинуть.
А что на входе - начальная форма в Именительном падеже уже дана? "Синяя ночь", "синий день"? Довольно интересная же задачка, действительно. Уровня чисел прописью, а может даже выше.
Есть к примеру категории: Женская/Мужская и есть товар: блузка, пальто, футболки
Итого получим на выходе:
Женская блузка, женское пальто, женские футболки
и Мужское пальто, мужские футболки и тд.
Я откопал какие то словари http://phpmorphy.sourceforge.net/dokuwiki/download и библиотеку, но не совсем понял как именно мне поступать с существительным (как разбивать на корень, префиксы и суфиксы + окончания) чтобы потом искать это в словаре и определять по нему падеж, чтобы потом просклонять прилагательное относительно падежа существительного по тому же словарю. К сожалению документации к самому словарю я не нашел
Аноним 2016/05/05 20:20:00  №735289 297
>>735262
Ты не понимаешь, что такое фильтр. Это просто параметры и значения: color=blue, size=34.
Показываешь все фильтры, пользователь выбирает нужные и делает запрос.
А запрос к бд получается:
SELECT FROM
(SELECT
FROM all_products WHERE color=blue AND size=34) p # этот подзапрос всегда в кэше
INNER JOIN {тут твои таблицы с наличием на складе} ...
WHERE stock = 1;
Весь запрос тоже будет закэширован до изменения таблиц с наличием.
Аноним 2016/05/05 20:37:41  №735297 298
>>735289
То есть ты получишь выборку товаров, которые удовлетворяют условиям и есть в наличии. А скрыть бренды, у которых 0 продуктов в этой выборке, легко на самом клиенте.
Аноним 2016/05/05 21:14:59  №735341 299
>>735289
Как такое кэширование делать? SQL сам умеет? Или memcached какой-то подключать? В кэшировании я вообще плаваю, у нас его нет.
>>735297
Скрыть бренды на клиенте не получится. Смотри - клиент получает только 200 товаров, но по фильтрам там доступно еще тысяч 20-500, которые подгружаются если клиент дальше жмет. Если ты будешь на клиенте скрывать по имеющимся товарам, то он у тебя скроет все, что в эти 200 не входит, а в большей выборке может быть больше фильтров доступно.
Аноним 2016/05/05 21:23:45  №735349 300
>>735341
Здесь дальше - имеется в виду, что клиент жмет "показать следующую страницу", чтобы ему больше товаров по фильтрам подгрузилось. Тогда следующий SQL запрос делается, чтобы больше товаров поулучить. А вот ненужные фильтры нужно отключить уже на самом первом.
Аноним 2016/05/05 22:22:59  №735420 301
Перехожу к более активным действиям: DataMapper сосёт!
https://designpatternsphp.readthedocs.io/en/latest/Structural/DataMapper/README.html

Я сначала не понял, зачем они в UserMapper.php запихали метод mapObject(array $row). Кратко, принцип работы с БД там такой: Мы делаем запрос к базе, получаем ответ в виде массива $row. Массив мапится на объект c помощью mapObject, оттуда возвращается объект класса User. А если бы я просто использовал ActiveRecord, то через FETCH_CLASS возвращал бы данные в виде нужного объекта. Почему в случае DataMapper нельзя воспользоваться FETCH_CLASS? Да потому, что конструктор модели User принимает 3 параметра, которые нужно ставить в null (см. содержимое ссылки). PDO фетчит данные в виде объекта, но когда этот объект создаётся, то все данные заполненные раннее PDO, теперь обращаются в null.

UPD: Нагуглил в PDO опцию FETCH_PROPS_LATE, всё работает: http://stackoverflow.com/a/2862563
А вот FETCH_INTO не работает, забавная ошибка: object must be an object.
В общем, я по-прежнему жалею, что не взялся сразу за ActiveRecord, столько бы времени сэкономил.

>>734963
>>733728
>>732988
-хуй
Аноним 2016/05/06 00:09:45  №735503 302
>>729430 (OP)
помогите пожалуйста разобраться, почему мой скрипт http://pastebin.com/agNbgazH неправильно отображает мой ip-адрес, он должен быть 127.0.0.1, а этот код отображает его как "::1", объясните пожалуйста почему. Сам php-файл называется tuna.php, я запускаю его через Apache как localhost/tuna.php, и если я пишу echo "$ip", то мне выводится "::1", причем если запускать его как 127.0.0.1/tuna.php, то всё выводится верно.
Аноним 2016/05/06 02:51:03  №735630 303
>>735111

> Он же должен посмотреть на те свойства, которые идут по умолчанию в них, естественно, что они их переопределит в соответствии с новой профессией.
Вообще. не факт. Если ты хочешь обязать класс-наследник определить какой-то параметр, надо использовать абстрактный метод (например getBaseSalary()) - PHP не позволит создать конкретный (не-абстрактный) класс без реализации всех абстрактных методов.
Аноним 2016/05/06 02:53:03  №735631 304
>>735142

В какой ситуации? Это зависит от того где ты хочешь его использовать и какие там правила экранирования.

>>735196

нет, это странно. И как именно ты передаешь метод?

Аноним 2016/05/06 03:54:20  №735651 305
Учебник по рекурсии и всяким сложным темам Аноним 2016/05/06 07:45:37  №735685 306
Аноны, у которых затруднения с рекурсией, алгоритмами и прочими сложными темами. Есть учебник (в переводе на русском) под названием SICP который вам поможет немного с ними разобраться.

http://newstar.rinet.ru/~goga/sicp/sicp.pdf

Всякие предисловия которых там 20 страниц, можно проматывать и переходить к делу. Для того чтобы выполнять код из него, вам нужен интерпретатор Scheme (не бойтесь, это язык который учится за 5 минут), который можно либо использовать онлайн:

https://repl.it/languages/scheme

либо скачать себе на компьютер один из интепретаторов

http://stackoverflow.com/questions/2521477/what-is-the-best-scheme-interpreter-or-compiler

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

-----

И кстати на repl.it есть интепретатор и для PHP: https://repl.it/languages/php

Просто пишете слева определения функций, а справа - выражения, ну например

$x = 1;
function a () { return 100; }
a() * 2; // выведет 200

Только точку с запятой ставить не забывайте.

Правда там по моему периодически коннект к серверу отваливается при фатальной ошибке в коде.
Аноним 2016/05/06 08:10:44  №735692 307
>>735349
Понятно, что ты хочешь. Пиши тогда хранимую процедуру, которая:
1) Выбирает все отфильтрованные продукты во временную таблицу
2) Делает по ней селект с GROUP BY по брендам.
Это вернет таблицу брендов.
3) Делает по ней селект с LIMIT X, Y.
Это вернет страницу товаров.
Аноним 2016/05/06 08:44:29  №735700 308
>>735692

Это будет еще медленее, с временной таблицей
Аноним 2016/05/06 09:09:52  №735709 309
>>735700
Будет разы быстрее, чем есть сейчас.
Сейчас он выбирает сначала продукты, потом опять их же выбирает и делает по ним джоины. Плюс запрос не оптимизирован.
Аноним 2016/05/06 10:19:51  №735738 310
>>735709

Сомневаюсь. Твое решение гораздо более громоздкое. Например ты выбираешь все товары в таблицу в то время как нам могут быть нужны только первые N. То есть ты выбираешь намного больше данных чем надо, да еще и таблицы создаешь. И зачем процедуры? Мы не в 80-х.

И вообще я сомневаюсь что тут оптимизация поможет, если индексы проставлены и все равно тормозит то значит надо искать другие пути (кеш, сторонний поисковый движок). Ну и конечно не нужны там подзапросы, лучше джойны.
Аноним 2016/05/06 11:00:23  №735789 311
Почему в pr нет треда для кулхацкеров?
Аноним 2016/05/06 11:10:05  №735796 312
>>735651
Представляю смесь бугурта и любви к Apple у того музыканта.
>Сам он смог восстановить оригинальные файлы из резервной копии, но сочувствует тем, кто не делает бэкапа.
Всю коллекцию собственных работ, например, вот так взять - и потерять.
>Тотальный контроль Apple над файлами пользователя напоминает их известную рекламу «1984», которая воплотилась в жизнь в зеркальном отражении, в печальной и гнетущей иронии, пишет Пинкстоун.
Яблочник прозрел, спешите видеть! С самого начала было понятно, что это именно Apple всегда и последовательно выступает как Большой Брат - с самого начала нельзя было назвать их демократичными. И люди, которые были в теме в то время, выкладывали тогда кирпичи от того, что таким вот образом и стал работать Большой Брат.
Аноним 2016/05/06 13:06:25  №735866 313
14625291856380.png (3, 230x122)
122x230
Я хочу по клику наращивать высоту дива .clicker на 10 пикселей каждый раз.
Но вместо этого он сразу рисует мне див высотой в 1000, тип мне похуй что у тебя там цикл.
Как правильно возвращать нужное значение? Или мб есть какие-нибудь более изящные варианты?
Аноним 2016/05/06 13:12:17  №735870 314
>>735866

Ты изучал функции, переменные и замыкания в яваскрипте?
Аноним 2016/05/06 13:15:20  №735877 315
>>735866
>тип мне похуй что у тебя там цикл
Как раз таки оно и выполняет цикл до конца, и возвращает значение функции в height().
Не вижу причин использовать цикл, тебе нужно по клику увеличить "текущую" высоту на 10, не более.
Ты мог бы также использовать "замыкания"
Аноним 2016/05/06 13:25:44  №735886 316
14625303440710.png (3, 191x149)
149x191
>>735870
>>735877
Спасибо, подтолкнули в нужном направлении, всё работает.
>>735870
У меня из рук вон плохо получается без практики, но да, вникал, читал, смотрел и всякое такое. Оно как будто витает где-то там, но до применения не доходит.
Аноним 2016/05/06 13:29:22  №735890 317
>>735886

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

У тебя по-прежнему код странный так как 2 обработчика вложено друг в друга и ты их многократно навешиваешь. Не, тебе надо начать с правильного яваскрипта.
Аноним 2016/05/06 13:30:24  №735891 318
Аноним 2016/05/06 13:35:50  №735895 319
>>735891

Если у тебя нет времени, то тебе стоит заняться чем-то другим. Ибо на исправление багов и ошибок ты потратишь в сумме гораздо больше времени и заказчики/работодатели вряд ли будут счастливы.
Аноним 2016/05/06 13:57:11  №735913 320
>>735895
Моя ближайшая перспектива - верстка, а не весь фронтенд. Может, ты и считаешь целесообразным сидя дома без штанов въебать полгода на JS, чтоб потом хуярить инфографику пизженными плагинами, но вот я думаю немного иначе.
Аноним 2016/05/06 15:35:37  №736004 321
>>735692
Спасибо, попробую с временными таблицами.
>>735738
Да, может быть медленее, я сейчас товары как раз поэтому ограничиваю до 300-500, потому что иначе много времени занимает, и клиент не готов столько ждать. Думаю, можно создать не временные, а постоянные таблицы для популярных фильтров, где будут лежать наборы доступных для них фильтров. И обновлять их по cronjobу, который запускать раз в пару минут. Будет правда проблема, что этот cronjob кучу времени занимает, комбинаций фильтров же много.
>Ну и конечно не нужны там подзапросы, лучше джойны.
Для выборки продуктов подзапросов нет, но она все равно тормозит на миллионе продуктов, там 6 joinов и group by. Возможно в этом направлении надо крутить, попробую избавиться от лишних joinов для cronjobа.
Аноним 2016/05/06 15:43:55  №736010 322
>>735738
Так все товары как раз и нужны, чтобы не показывать отсутствующие бренды. Только те, которые в них найдутся. Походу ты не понял задачи.
Аноним 2016/05/06 15:45:37  №736012 323
>>735738
>искать другие пути (кеш
По кешам посмотрел, что в Mysql есть встроенный Mysql Query Cache. Он для подзапросов действует? Для SELECT xxx FROM (SELECT xxx from xxx) будет ли действовать для второго SELECT? Или он только для joinов?
Аноним 2016/05/06 15:50:47  №736017 324
>>736010
Да, нужны все товары, фильтров может быть много (штук 7 их всего). При выборе любой комбинации из 7 фильтров, нужно пройтись по всем фильтрам и отключить более недоступные фильтры в каждом из 7. А для этого нужно пройтись по всем товарам, которые попали под эти 7 фильтров. Чем больше фильтров включено, тем доступных товаров по ним меньше (а значит быстрее по этим товарам проходить). Самый долгий обход, если включен только 1 фильтр, тогда может быть до полумиллиона-миллиона товаров под него. Самый быстрый соответственно, если все 7 фильтров включены, там может быть и 3 товара всего.
Аноним 2016/05/06 16:09:04  №736023 325
>>735685
А в учебники написано нужен Лисп
> Для описания процессов нам нужен подходящий язык, и с этой целью мы используем
язык программирования Лисп.

Или Scheme это интерпретатор Лиспа?
Аноним 2016/05/06 16:10:48  №736024 326
>>736012
Также, от кеша, как я понял, мне немного толку, поскольку каждый раз, как будет обновляться таблица с наличием товаров в магазинах, он будет очищаться и соответственно все закешированные запросы надо заново делать. Таблица наличия товаров обновляется каждые пару секунд-минут, в зависимости от подвозов-покупок.
Аноним 2016/05/06 16:12:45  №736025 327
>>735685
>>736023

Прочитал еще пару абзацев, стало понятно.

>Тот диалект, которым мы пользуемся в этой книге, называется Scheme
Аноним 2016/05/06 16:44:11  №736068 328
14625422518530.jpg (63, 799x507)
507x799
Читаю документацию для Yii2 на русском языке: https://github.com/yiisoft/yii2/blob/master/docs/guide-ru/
Ну и дичь...
Сколько всего ещё дополнительно нужно изучить после учебника ОПа, чтобы въехать во всё это? Там адова бездна, просто адова бездна.
Аноним 2016/05/06 16:51:32  №736072 329
>>736068
Не знаю насчет иии(уайии?), но сейчас читаю доки по симфони, вроде все понятно, хотя это вроде как самый сложный фреймворк.
Аноним 2016/05/06 16:53:59  №736074 330
>>736068

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

Алсо, ты весь учебник опа прошел? Вплоть до задачи с yii2?
Аноним 2016/05/06 16:58:43  №736079 331
>>735913
Твоя перспектива - работать без сна и выходных за 15 тысяч.
Аноним 2016/05/06 18:06:24  №736121 332
14625471850190.jpg (65, 800x669)
669x800
>>736072
>Слово Yii (произносится как Йи [ji:]) в китайском языке означает «простой и эволюционирующий». Также Yii может расшифровываться как акроним Yes It Is!
>сейчас читаю доки по симфони, вроде все понятно, хотя это вроде как самый сложный фреймворк.
Ну а ты Студентов и ФО сделал? Я пока только ООП осилил с трудом, но Кошек-мышек пока не трогал - хочу на выходных попробовать.

>>736074
>ты весь учебник опа прошел?
Только ООП заканчиваю. До этого сделал все задачи на HTML+CSS, ещё до смены последовательности уроков.
Я бы не хотел сейчас притрагиваться к Студентам и ФО: слишком много времени уйдёт на это, я думаю.
У меня в планах MySQL на следующей неделе, а до конца мая надо разобраться в Yii2 на базовом уровне, чтобы уметь подключать модули, виджеты и подобное - как минимум.
Аноним 2016/05/06 18:19:08  №736130 333
>>736079
Спасибо за оставленный отзыв!
Аноним 2016/05/06 18:23:22  №736133 334
CSS обязательно учить?
Какого хуя верстальщик должен учить 2 языка программирования, html и css?
Думаю выучить за 2 года html и получать 100 000 рублей в месяц (так написано в рекламе видеокурса, они же не будут врать в отличее от неудачников с двача).
Аноним 2016/05/06 18:25:20  №736135 335
>>736133
>языка программирования
> html и css?
Посмеялся, спасибо.
Аноним 2016/05/06 18:25:40  №736136 336
>>736133

html и css это языки разметки текста и стилей оформления, а не программирования

Аноним 2016/05/06 18:29:57  №736140 337
>>736136
Ну, надо сказать, что в SASS есть функции, переменные и циклы. Т.е. какой нибудь верстак, пишущий CSS на SASS, вполне себе программирует.
Аноним 2016/05/06 18:35:44  №736146 338
14625489441670.png (27, 665x327)
327x665
>>731915
>размещение стилей в футере приведет к тому что может отобразиться старница без стилей на какое-то время. размещение скриптов в футере чревато тем, что при использовании <button onсlick="fn()"> до загрузки скрипта мы получаем неработающую кнопку.
Гугл ругает за стили/js в хедере, а сеодебилы за это переживают. В остальном все вродь поправил. Посмотри пожалуйста: github.com/fidnex/students
Аноним 2016/05/06 18:36:03  №736147 339
>>736130
Целеустремленность - это великолепно, но с таким подходом ты действительно соберешь все возможные неровности на пути, испортишь себе репутацию и потеряешь массу времени.
Аноним 2016/05/06 18:39:28  №736149 340
>>736146
>сеодебилы
Грудь материнскую еще не успел изо рта вынуть, а уже окружающих дебилами называет.
Аноним 2016/05/06 18:46:25  №736157 341
Где можно почитать про Big O и оценку алгоритмов? Язык русский или английский, без разницы.
Аноним 2016/05/06 18:55:40  №736165 342
>>736147
Хорошо.
У меня есть месяц, чтоб довершить свои безумные умения в верстке. В день я уделяю в среднем 10-11 часов. кроме воскресенья и половины субботы
Остался JQ/JS, и я действительно чувствую, что я тону и насасываю, ибо привык брать памятью, а здесь эта хуйня не прокатывает. Разве что запоминать какие-то куски под нужную задачу.
Я могу уделить 10 дней качественному подходу к теории и 10 практике JS/JQ, но смогу ли я так получить больше, чем просто штурмуя всё подряд? Я не знаю.
Терять время я не могу.
Аноним 2016/05/06 18:59:00  №736169 343
>>736165
>В день я уделяю в среднем 10-11 часов
Что-то мне слабо верится в это. С таким темпом работы учебник Ильи Кантора ты пройдешь за неделю.
Аноним 2016/05/06 19:02:38  №736175 344
>>736149
К нам такая крутая московская сеоконтора тикеты бросала. Задачки были уровня выводить 404 страницу на все возможные страницы с гет параметрами
site.ru/ - главная страница
site.ru/?foo1 - 404
site.ru/?foo2=bar - 404
А то дубли страниц, ранжирование-хуирование плохое будет. Или опять же дублирующие страницы - товар лежит в site.ru/category1/tovar и в site.ru/category2/tovar. rel canonical ставить они не рекомендуют, потому нужно переписать кучу кода в тысяче местах и привести все ссылки в магазине к виду site.ru/product/tovar. И это крутая московская сео контора, которая выставляла нашему клиенту неебические ценники за такие вот аудиты. Как-то в общем не очень к ним отношение сложилось.
Аноним 2016/05/06 19:27:32  №736207 345
>>736165

Учебник по яваскрипту у нас один - learn.javascript.ru. Если тебе хочется еще задачки, то они есть в ОП посте. Включая даже изучение MVC на примере игры в сапера.
Аноним 2016/05/06 19:31:11  №736212 346
>>736175
>Задачки были уровня выводить 404 страницу на все возможные страницы с гет параметрами
Правильно делать редирект на каноническую страницу. 404 ошибка - это сигнал поисковикам, что куча битых ссылок, куча ошибок - будет сайт терять свои позиции и по другим запросам.
>нужно переписать кучу кода в тысяче местах и привести все ссылки в магазине к виду site.ru/product/tovar
Думаю, что-то надо мутить в .htaccess, чтобы редиректило любую шнягу именно на каноничный URL. Регуляркой или чем-то проверять URL, приводить к какому-то стандарту, а потом вести на каноникал именно через .htaccess.

Раздался пронзительный голос со стороны SEO
Аноним 2016/05/06 19:33:21  №736216 347
>>736175

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

Эта проблема бывает на каких-то формуах, которым нужна сессия, и они при отстутвии кук делают ее через параметр в URL вида ?sessid=многобукв (что кстати еще и небезопасно, используйте только куки), и потом такие ссылки попадают в гугл.

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

> потому нужно переписать кучу кода в тысяче местах
Это сеоконтора виновата что вы DRY нарушаете и ссылки как попало генерируете, да еще небось и с копипастой?
Аноним 2016/05/06 19:34:41  №736217 348
>>736212

Не надо через htaccess.

- дублируется функционал роутера, с вероятностью близкой к 100% будут баги
- при переносе на нгинкс придется руками все правила переписывать

Аноним 2016/05/06 19:35:13  №736218 349
>>736175
Не учи людей делать их работу, особенно если ты в ней понимаешь ничего - делай хорошо свою.
Аноним 2016/05/06 19:38:15  №736222 350
>>736165
>есть месяц
Это заранее провальное мероприятие, ты даже простенький макет вряд ли сверстать сможешь через месяц, не говоря уже о хоть каком-то программировании.
Аноним 2016/05/06 19:53:24  №736236 351
>>736212
Мне кажется гет параметры редиректить это совсем маразм
>>736216
>Это сеоконтора виновата что вы DRY нарушаете и ссылки как попало генерируете, да еще небось и с копипастой?
Это ок, но чем им rel canonical не устроил? Магазину много лет, тысячи товаров, тысячи ссылок на них по всему интернету, а им вот приперлось вид ссылок поменять.
>>736218
Извини, не хотел никого обидеть.
Аноним 2016/05/06 20:23:50  №736257 352
>>733641
>> А разве ключом не должно быть название поля? Как тогда обозначить ключ ошибки?
>действительно. Ну значит массив должен быть какой-то другой структуры.
А можно подсказку какой?

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

$validations = [
'name' = [
'validator' => 'validateName',
'parameters' => ['getName']
],
...
]

foreach($validations as $field => $validator) {
...
$error[$field] = call_user_func($this, $validator['validator'], $validator['parameters']);
...
}

https://ideone.com/9cuKjL
Аноним 2016/05/06 21:45:37  №736361 353
>>736222
HTML/CSS уже относительно пройдены LESS не затрагивал пока+не пробовал резиновую верстку, только адаптивную.
>>736207
>>736169
Ну не верь. Кстати, спасибо за подкинутый учебник может и его возьму, если пойдет
>>736207
Да, начал читать, но как-то не особо легко частям заходит. Нахуя мне в самом начале знать регулярные выражения, если в большинстве случаев всё ограничивается их копипастом?
Но
> он один
Поэтому делать нечего.
Спасибо.
Аноним 2016/05/06 22:07:02  №736391 354
>>736068
>Сколько всего ещё дополнительно нужно изучить после учебника ОПа, чтобы въехать во всё это?

Скажу по своему опыту: на фреймворках можно писать, вообще не думая. Эти избыточные абстракции и созданы для того, чтобы можно было при минимальном понимании ООП и MVC быстро воплотить задуманное в жизнь. Та же задачка на студентов требует какого-никакого проектирования. Пишу 3-й день подряд и не знаю, сколько ещё буду писать, так как каждый день обнаруживаю огромные пробелы в знаниях, а вот на фреймворке я её меньше, чем за час написал. Так что будь уверен, после студентов и файлообменника никакие монструозные фреймворки вроде Yii тебе не будут страшны.
Аноним 2016/05/06 22:15:17  №736406 355
>>731646
>Мне кажется отношение между формой и студентом правильнее было бы реализовать через композицию.
А как пользоваться композицией в нашем случае?

Вот в Студенте у нас есть поля которые есть в Форме, и в Форме есть поля которых нету в Студенте. Далее, мы хотим чтобы эти поля заполнялись все сразу с помощью одной функции/проходили валидацию/итд, все этих методы используют цикл, но мы не можем заставить цикл проходиться по двум объектам по очереди, тем более в классе Студента есть лишние поля связные с хэшем. Нужно опять составлять массив со свойствами которые нам нужны?
Аноним 2016/05/06 23:33:59  №736483 356
Чому div не на расстоянии 100 пикселей от левой части экрана,аноны?
<div style="left : 0 px"> Ффф </div>
<script>
var ch=document.getElementsByTagName('div')[0];
ch.style.left="100px";
</script>
Аноним 2016/05/07 00:01:40  №736502 357
>>736483
Вроде position: absolute нужен. Заливай в следующий раз на jsfiddle.net, аноны охотнее помогут.
Аноним 2016/05/07 05:52:45  №736613 358
>>736361
>пройдены
А сверстать не сможешь, такие дела.
Аноним 2016/05/07 06:41:59  №736622 359
>>736361

Адаптивную верстку нельзя сделать без умения верстать "резиново". Ну и LESS ты мог бы вообще не упоминать - это просто препроцессор который может за несколько часов осваивается.

В моем понимании, если не уметь верстать "резиново" то это значит что человек в принципе верстать не научился.

Кстати, в ОП посте есть задания на HTML.

Если ты серьезно готов потратить месяц, каждый день уделяя много времени учебе, то вполне реально и HTML подтянуть и JS подучить и наверно немного DOM успеть изучить с jQuery. Задачи по всем этим темам, если что - в ОП посте.

>>736406

Композиция это когда один объект включает в себя другой. Тут по моему вариантов особых нет: в форме должно быть поле student в котором хранится студент.

> , но мы не можем заставить цикл проходиться по двум объектам по очереди
Сделай 2 цикла. Или сделай универсальные методы вроде get($fieldname) которые понимают по имени поля, откуда его надо брать.

Это уже мелочи реализации. Тут главный принципиальный вопрос - должны ли мы хранить в форме студента или должны дублировать все его поля. Что удобнее, какие есть недостатки и преимущества. Как я уже написал, в фреймворках вроед Симфони у формы своя отдельная копия данных, но у нас простое приложение и нам наверно проще будет редактировать данные прямо в студенте чем делать копию. Хотя, кто знает.

>>736391

Можно писать не думая только пока ты делаешь задачи аналогичные тем что в туториале. Как только надо сделать что-то нестандартное, если ты не понимаешь архитектуру фреймворка, ты будешь лепить костыли. Да и ты говоришь что просто, но мы не видели твой код и не знаем насколько он правильный.
Аноним 2016/05/07 06:54:52  №736623 360
>>736257

>>Ну значит массив должен быть какой-то другой структуры.
> А можно подсказку какой?
Давай поставим вопрос по другому: а какие тебе данные нужны для валидации одного поля? (например, имя поля, имя функции-валидатора, еще что-то?) Такие и надо класть в массив.

> Проблема заключается в том что неизвестно как передавать аргументы в функцию валидации.
Несколько аргументов можно передать через call_user_func_array. Она принимает массив аргументов.

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

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

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

Как должна выглядеть функия валидации? Что ей нужно? Ну как минимум ей нужно дать значение поля. Надо ли что-то еще? не знаю. Что она должна вернуть? Как минимум сообщение об ошибке или признак что все ок. В идеале это вообще хорошо бы возвращать как 2 переменных но можно и одной.

Глядя на твой код, я например, не понимаю, зачем ты передаешь в функцию валидации 'getName'. Зачем ей имя геттера? Оно как-то помогает проверить правильность заполнения поля?

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

Попробуй начать с таких рассуждений и определить как должны выглядеть эти функции, что они получают, что они возвращают, как хранить ошибки.
Аноним 2016/05/07 07:11:04  №736626 361
>>736236

> но чем им rel canonical не устроил?
ну как минимум робот будет тратить заходы на индексацию одной и той же страницы. Все же вместо canonical лучше ставить 301.

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

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

>>736212

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

>>736157

Увы, не знаю, погугли. Если кратко то O-нотация показывает как время выполнения или например объем потребляемой памяти увеличиваются при увеличении числа данных.

O(1) - алогритм работает одинаковое время независимо от объекма данных
O(N) - пропорционально объему данных, если данных в 10 раз больше то и работать будет в 10 раз дольше
O(log2(N)) - пропорционально логарифму, в 10 раз больше данных, примерно раза в 3 дольше работать, в 1000 раз больше - примерно в 10 раз дольше (не в 27, а в 10)
O(N^2) - пропорционально квадрату объема данных, в 10 раз больше данных - в 100 раз дольше их обрабатывать

и тд.

O(2N) это то же самое что O(N) и потому так не пишут.

Эта нотация показывает только относительный рост, а не абсолютные числа. Нельзя сказать, какой алгоритм быстрее при N = 100: тот что O(1) или O(N)
Аноним 2016/05/07 07:31:24  №736634 362
>>736121

Ты проскакиваешь темы . Между ООП и фреймворком Юи очень много тем, которые надо изучить - архитектура веб-приложений, DI, MVC, работа с БД, формами - это все изучается в студентах.

>>736017

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

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

id рубрики - список брендов в ней
id рубрики - список цветов товаров в ней
+ комбинации из 2 значений каждого фильтра

В редисе например есть удобный тип hash для этого

Как альтернатива, можно сделать кеш-таблицы с кучей индексов в отдельной БД (чтобы если что перенести ее на отдельный сервер и не грузить основную). Кеш-таблицы такого вида:

рубрика, бренд, цвет

Такая таблица позволяет ответить на вопросы:

- какие бренды есть в рубрике
- какие цвета есть в рубрике
- какие цвета есть в рубрике + бренде

Имей в виду что для эффективной выборки нужно несколько индексов.

Кеш поможет отобразить допустимые значения фильтров для тех случаев когда товаров много и искать их через баз долго. А для случаев когда выбрано уже 3-4 фильтра, и товаров которые им соответствуют, мало, можно считать знаения напримую в БД.

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

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

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

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

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

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

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

Аноним 2016/05/07 07:38:50  №736637 363
>>736024

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

>>736012

Он не поможет так как мала вероятность что будут одни и те же запросы. Он сбрасывается при любой записи в таблицу. Ну и это все описано в офиц документации, гугли mysql query cache

>>736004

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

>>735709

Зависит от структуры БД. Если отношение товар-бренд и товар-рубрика это 1 ко многим то можно сделать индекс и получать ответ "какие бренды есть в рубрике" довольно быстро. Вариант с созданием новой временной таблицы по моему заведомо самый медленный. Не веришь - попробуй сам сделать это на досуге и померяй.

>>735503

Используется Ipv6 а не IPv4, почитай википедию. Там другой формат адресов и ::1 это просто сокращение адреса где куча нулей и единица в конце.



Аноним 2016/05/07 07:48:24  №736638 364
>>735420

> Я сначала не понял, зачем они в UserMapper.php запихали метод mapObject(array $row).
Чтобы преобразовать массив данных в модель.

> А если бы я просто использовал ActiveRecord, то через FETCH_CLASS возвращал бы данные в виде нужного объекта.
- имена полей объекта и БД могут не совпадать (удобнее когда совпадают конечно)
- FETCH_CLASS проставляет поля в обход сеттеров. Может у тебя в модели поля должны запоняться через setName и там есть какая-то логика, FETCH_CLASS ее игнорирует. Хуже, он сначала заполняет поля а потом вызывает конструктор. Это вообще пример глупо спроектированной фичи.
- могут требоваться преобразования типов данных. Например в БД дата хранится строкой а в PHP объектом DateTime. Также, могут быть специальные классы для других типов данных: например денег, каких-то сложных структур данных

Те же проблемы есть и в AR. Раз ты знаешь про эти 2 подхода ты наверно знаешь и главный недостаток AR и мне не надо его рассказывать?

Наконец исопьзование или не использование FETCH_CLASS вообще не имеет отношения к DataMapper или AR. Оба этих подхода могут использовать или не использовать эту фичу. Ты по моему что-то путаешь думая что AR это кодда мы используем FETCH_CLASS. Не так. AR это когда модель и код работы с БД объединены (перемешаны) в 1 классе, DM это когда модель ничего не знает про БД и логика работы с ней вынесена в отдельный класс (класcы).

Простой пример. Допустим у тебя есть код который работает с моделью. В случае AR он не может работать без БД, а в случае DM ты можешь брать модели хоть откуда, например создать вручную, и код будет работать точно так же, без базы.

> Почему в случае DataMapper нельзя воспользоваться FETCH_CLASS? Да потому, что конструктор модели User принимает 3 параметра, которые нужно ставить в null
То что конструктор требует параметры вообще не имеет никакого отношения к выбору между AR и DM.

> PDO фетчит данные в виде объекта, но когда этот объект создаётся, то все данные заполненные раннее PDO, теперь обращаются в null.
Это ошибка в PDO. Там есть параметр http://stackoverflow.com/questions/14336726/pdofetch-props-late-and-construct-call-using-fetched-data специально для исправления этого бага. Просто инвалиды которые делали PDO плохо разбираются в ООП. Лучше не полагаться на такие фичи, а написать свой код маппинга.

Аноним 2016/05/07 07:56:45  №736639 365
>>735277

Да phpmorphy мог бы помочь тут.

>>735239

Ты что-то путаешь

"джойны для денормализации" - это что-то странное.

>>735236

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

>>735235

Нет, выборка 500 000 товаров в PHP скорее всего приведет к перерасходу памяти и будет намного медленнее.

>>735233

Что значит "диспетчеризация"? Сишник? У нас в PHP это не имеет никакого знаения, не применяй термины из одного языка к другому.

у нас это называется функции высшего порядка.

>>735230

> Плюс продукты нужно искать, какие только в наличии в конкретном магазине, а это джойнить еще 2 таблицы со складами и магазинами.
Это скорее плюс так как снижает число просматриваемых записей.

>>735226

Можно, в виде [$obj, 'method']: http://php.net/manual/ru/language.types.callable.php
Но непонятно зачем.

>>735224

Там могут быть связи многие-ко-многим

>>735223

Бред.

>>735218

Кеш как временное решение или движок с поддержкой фасетного поиска.

Аноним 2016/05/07 08:05:20  №736644 366
>>735210

> для фильтров таблица filters_to_products, где задается соответствие product_id - filter_id
Они там все многие-ко-многим что ли? А, понял, вы все фильтры держите в одной таблице.

> AND ta.tag_id = 25 AND ta.tag_id = 3
Тут явно ошибка - это не выберет записей так как условия противоречат - наверно таблицу джойнят 2 раза?

> Со второй начались проблемы - тут нужен вложенный подзапрос.
Не понимаю. Допустим надо найти бренды, предлагающие красную одежду для девочек. Тут не нужен подзапрос. Хватит джойнов.

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

> Видел шопы, где это мгновенно происходит, как такое делается?
специализированный движок для фасетного поиска.
Аноним 2016/05/07 08:17:56  №736646 367
>>735210

Памяти у вас достаточно на сервере для mysql?

>>735151

> Там рассказано как с помощью ctags писать самому всякие find by usage и autocomplete плагины.
костыли же которые в ИДЕ из коробки. Для ctags есть инкрементальное обновление по мере набора или сохранения файлов? В Саблайме например индекс функций обновляется сам собой.

>>734982

Данные надо сохранять на сервере

>>734968

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

>>734968

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

>>734967

Внутри одного скрипта. Выполнение 2 скриптов абсолютно независимо друг от друга и никаких общих данных у них нет.

>>734963

1) первое
2) код должен огбъяснять паттерн а не отвлекаться на лишние подробности. Да и мне тоже не нравятся эти магические методы, они затрудняют понимание кода, требуют больше времени чтобы разобраться (надо прочесть и анализировать их код, непонятно что там может быть написано). Для свойств должен быть специальный синтаксис вроде property name { ... } а мегические методы это уродливые костыли.

3) можно. Если объектов мало, можно просто в bootstrap.php создать их, но когда объектов становится больше, то вручную отслеживать кто от кого зависит становится утомительно.

> Мне из контроллера нужно иметь доступ к объекту StudentMapper. Этот объект создаётся с передачей конфига для PDO.
Это неправильно и нарушает прицип DI. StudentMapper не должен создавать объект PDO. Перечитай урок по DI - идея в том что мы передаем ему готовый PDO а не нагружаем его не своей работой.

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

> Но не передавать же мне всё через конструктор?
Если есть контейнер, в контроллер можно передать его. Если нет - отдельные объекты. А что делать? не копипастить же код создания мапперов.
Аноним 2016/05/07 10:08:24  №736680 368
>>736502
Точно,заработало. Забыл про это свойство. Спасибо,добрый анон!
Аноним 2016/05/07 11:29:57  №736701 369
Домучал задачку с проверкой и исправлением ошибок. Вот что получилось:
Задачка на проверку: https://ideone.com/7gHlP7
Задачка на исправление: https://ideone.com/6TJwXr
Чекните, плез, на наличие велосипедов и ошибок.
Аноним 2016/05/07 12:15:55  №736733 370
>>736646
>Для ctags есть инкрементальное обновление по мере набора или сохранения файлов?
https://github.com/ludovicchabant/vim-gutentags
Как минимум для JS, PHP и Python нормально настроенный Vim точно не хуже тех же Eclipse или Netbeans.
Аноним 2016/05/07 12:27:29  №736739 371
>>736733
Но для php нет ничего лучше phpStorm. vim там и рядом не стоял.
Аноним 2016/05/07 12:28:39  №736740 372
>>736739
Стоял.
PhpStorm стоит нефти.
Дырявые абстракции в Линукс Аноним 2016/05/07 13:29:07  №736818 373
Узнал про интересный пример т.н "дырявой абстракции" ( http://russian.joelonsoftware.com/Articles/LeakyAbstractions.html ) в Линуксе.

Там любят представлять все в виде файлов. Вот и значения некоторых системных параметров передаются из ядра в пользовательское пространство через псевдо-файлы. Ну например, есть такой псевдо-файл /proc/sys/kernel/pid_max который возвращает максимальный id процесса:

$ cat /proc/sys/kernel/pid_max
32768

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

$ stat -c '%s' /proc/sys/kernel/pid_max
0

Упс. Вот и первая дырка в абстракции. А я покажу вам еще одну. Попробуем читать этот псевдо-файл по 1 байту за раз:

$ dd if=/proc/sys/kernel/pid_max bs=1 count=20
31+0 records in

Прочиталась только первая цифра. Попробуем сделать размер блока равным 3 байтам:

$ dd if=/proc/sys/kernel/pid_max bs=3 count=20
3271+0 records in

Прочитались только цифры "327". (1+0 records in - это статистика).

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

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

Я еще проверил, другие псевдофайлы вроде /proc/cmdline или /proc/uptime читаются нормально. Видимо у них как-то избирательно все это реализовано.
Аноним 2016/05/07 13:43:25  №736833 374
Аноним 2016/05/07 15:17:06  №736950 375
Зачем иногда делают специальную ссылку для редиректа на чужие сайты? Типа site.com/redirect/google.com. Что-то с SEO связано?
Аноним 2016/05/07 15:25:27  №736962 376
Мимо-сисадмин-эникейшик вкатывается в ваш тред.
Обезумев от безделья, дохода, беспросветности и собственной никчемности он решил превозмочь, и наконец изучить хоть что нибудь полезное.
Вопросов не задаю, сижу тихо, мануалю манулов и курю бамбук.
Всем добра в вашем чатике!
Аноним 2016/05/07 15:39:34  №736975 377
>>736634
Спасибо, наконец что-то прояснилось.
>скорее всего нужен поисковый движок с фасетным поиском для этой задачи
Какие порекомендуешь для новичков, чтобы не увязли совсем в этом фасетном поиске? В фирме одни джуны-миддлы, профессионалов баз данных нет, так что изучать и внедрять их с нуля придется.
>Кеш-таблицы такого вида:
>рубрика, бренд, цвет
>для эффективной выборки нужно несколько индексов
Хорошая идея, но что делать, когда меняется stock для одного из товаров. Т.е. наличие товара добавляется или удаляется. Генерировать тут же все таблицы с кешами заново? Их, как я понял, много будет.
>у тебя не приведено достаточно данных: какие есть измерения для поиска, какие их сочетания возможны и какие нет.
Возможны все сочетания для которых есть товары, фильтров всего от 7 до 13 штук (сейчас 7 используется, но до 13 подключаем), фильтры в одной таблице filters_to_product, часть фильтров по отдельным таблицам, например category_to_product, special_filter_to_product. Отношение везде много-ко-многим, т.е. множеству фильтров соответствует множество продуктов.
>База не будет быстро работать когда у тебя есть связи вида много-ко-многим (то есть у товара может быть несколько рубрик и несколько цветов) и надо искать по их сочетаниям.
У товара может быть только одна рубрика, бренд или цвет, и остальные фильтры все только по одному на товар.
>Если связи вида один-ко-многим (товар входит только в одну рубрику и имеет только один цвет) тут еще что-то можно сделать составлными индексами по парам критериев, но вставки и обновления такой таблицы могут быть более тяжелыми.
Постоянные изменения идут только в таблицу наличия товаров, которая джойнится. Все остальные таблицы только читаются, обновления списка товаров происходят не так часто и ими можно пренебречь.
>Все это я пишу исходя из того что у вас оптимизированы настройки БД (в общем, используемые индексы должны целиком в нее помещаться + быть место для горячих данных) и расставлены правильно индексы.
Индексы все есть, на это нас хватило, про настройки БД возможно нет, до задачи с убиранием фильтров на все скорости хватало в пределах 1 секунды, что устраивало. Есть где про эти настройки руководство почитать?
>Если вы даже этого не смогли правильно сделать - это задача не вашего уровня, наймите профессионала.
Тут все глухо, профессионалы не хотят у нас работать, это фирма для джунов-миддлов. К тому же у нас нет задач для профессионалов, эта с фильтрами считай единственная, и других такого уровня больше не предвидится. Все остальные задачи в рамках знаний джунов спокойно решаются.
>или денормализованных данных, которые помогут на какое-то время, пока у вас не станет больше товаров
Товаров больше не станет, около миллиона товаров всегда будет.
>В принципе, решения для таких случаев известны, велосипеды тут придумывать не требуется.
Это уже хорошо, что велосипедов не надо. Как я понял из твоих объяснений, из известных решений только кэш-таблицы и фасетный поиск? Или еще какие есть?
>>736637
>Можно не очищать кеш, а продумать механизм его обновления. Если у вас обновление каждые пару минут то надо инкрементально обновлять данные в кеше. Ну или не использовать его.
Это как? Можешь схему примерно объяснить? Не очень представляю.
>>736644
>Они там все многие-ко-многим что ли? А, понял, вы все фильтры держите в одной таблице.
Да, все в одной таблице id продукта - id фильтра. Ну и пара фильтров в отдельных таблицах, вроде category_to_products, где схема такая же.
>Тут явно ошибка - это не выберет записей так как условия противоречат - наверно таблицу джойнят 2 раза?
Хм, да, там OR было, а не AND. Выбираются все фильтры с тэгами 25 или 3.
>Не понимаю. Допустим надо найти бренды, предлагающие красную одежду для девочек. Тут не нужен подзапрос. Хватит джойнов.
Внешний select выбирает фильтры из полученной таблицы доступных продуктов по этим фильтрам. SELECT DISTINCT filters.filter_id FROM (select товары по фильтрам которые в наличии, плюс фильтры к ним через join filters_to_products)
Аноним 2016/05/07 15:56:22  №736992 378
>>736975

По поводу обноления кеша, идея такая. Допустим у нас в кеше хранится информация, что для рубрики "Футболки", цвет "Красный", бренд "Adidas" есть 3 товара.

Допустим теперь товар Футболка красного цвета бренда адидас стал недоступен. Значит мы можем уменьшить соответствующую цифру в кеш-таблице на 1. Тем самым обновив информацию в кеше.

Риск конечно есть всегда что из-за ошибок значения в кеше начинают расходиться с реальными. Этим и плох такой подход.

Я позже наверно напишу подробнее что думаю по этому поводу, сейчас просто некогда.
Аноним 2016/05/07 15:57:01  №736993 379
>>736992

Пока можешь попробовать запрос с DISTINCT и подзапросом который ты писал выше, переписать на чистые джойны без подзапроса и посмотреть скорость.
Аноним 2016/05/07 16:08:02  №736999 380
>>736992
>теперь товар Футболка красного цвета бренда адидас стал недоступен. Значит мы можем уменьшить соответствующую цифру в кеш-таблице на 1
Думаю, не можем. Потому что может быть еще другой товар, тоже футболка красного цвета бренда адидас. Т.е. чтобы уменьшить цифру в кеш-таблице, нам сначало надо пройтись опять по всем товарам в магазине, посмотреть есть ли другие товары, которые футболка красного цвета и бренда адидас, и только если их нет, можно из кэш таблицы удалить эту запись. Также видимо возникнет проблема - при исчезновении товара, какие таблицы обновлять. Если всего 13 фильтров, кеш-таблицы мы видимо создавать будем только по 3-4 фильтрам. Для 13 фильтров таких таблиц будет довольно много, значит при изменении наличия товара, нужно обойти всю эту кучу таблиц и для каждой обойти заново все товары в магазине, проверяя что нет товаров с такой комбинацией 3-4 фильтров. Хмм, кажется все это будет занимать много времени.

>>736993
Ок, попробую.
Аноним 2016/05/07 16:14:16  №737007 381
>>736999
Также, для 13 фильтров, комбинаций из 3 фильтров будет 2197, это 2197 кеш-таблиц каждый раз проверять при исчезновении товара. Что-то много выходит.
Аноним 2016/05/07 16:21:55  №737014 382
14626273152980.png (13, 506x198)
198x506
14626273152981.png (8, 467x121)
121x467
>>736638
Спасибо большое за ответы!

>Ты по моему что-то путаешь думая что AR это кодда мы используем FETCH_CLASS.
Я думал, что DataMapper подразумевает работу без FETCH_CLASS.

>Наконец исопьзование или не использование FETCH_CLASS вообще не имеет отношения к DataMapper или AR.
Дошло, я слишком буквально воспринимал тот сайт с паттернами, хотя мог бы догадаться по аббревиатуре DBAL в коде.

>Это неправильно и нарушает прицип DI. StudentMapper не должен создавать объект PDO.
Он и не создаёт, я немного запутанно объяснил здесь:
>поэтому я в конструкторе контроллера получаю уже готовый объект StudentMapper, как мне кажется, так менее уродливей.
Примеры на пике.

Вопросы:
1) Если упростить, в DataMapper для манипуляции данными в БД нужно первым делом найти модель по id, результат-объект в переменную; теперь для изменения/добавления данных нужно обращатся только к этому объекту; дальше у маппера вызывается метод save(), куда передаётся переменная-объект. Правильно понимаю? У меня сейчас именно так всё и работает.

2) Может ли хелпер обращаться к мапперу? Объясню зачем: есть хелпер Auth. Можно проверить зарегистрирован ли пользователь: <?php if (\App\Helper\Auth::check()): ?>

А вот Auth::user() возвращает $_SESSION['user'], то есть только строчку с ником.
Хотелось бы, что Auth::user() возвращал уже объект зарегистрированного пользователя, чтобы делать такие штуки Auth::user()->id или Auth::user()->email
Для этого из хелпера нужен доступ к мапперу.

3) Я гуглил Front Controller и ничего не понял. Сейчас у меня есть класс App, который запускается в index.php через $app = new App($config)
Этот класс App одновременно соединяется с БД, разбирает URI, определяет какой контроллер и экшн вызывать, заполняет контейнер объектами, вызывает контроллер и экшн. В объекте App чуть меньше 100 строк, но он слишком много разных вещей делает. Это норма?


Аноним 2016/05/07 16:32:31  №737026 383
>>737007
А, сори, ступил, хеш-таблиц будет 455, а не 2197, ведь порядок полей не важен. Но все равно как-то много, если для каждой все товары сканировать.
Аноним 2016/05/07 16:53:17  №737049 384
Проблемы с хелло вордом на слиме. В документации пишут, что нужно поставить правило
RewriteRule ^ index.php [QSA,L]
В итоге отрабатывает только $app->get('/'), какой бы юрл я не вводил. Непонятная чертовщина.
Аноним 2016/05/07 18:17:31  №737130 385
>>737049
Разобрался, все хорошо.
Аноним 2016/05/07 18:43:02  №737150 386
Аноны, подскажите нубу - хочу для начала изучить HTML и CSS
На сайте http://htmlbook.ru есть два самоучителя. по 4-й и по 5-й версии. Скажите нужно начать изучение с сразу с пятой, или сначала четверка, а потом пятерка?
Аноним 2016/05/07 19:01:24  №737162 387
>>737150
Сразу с пятой.
Если ближайшие два года ты будешь просто учиться, то можешь сразу седьмую постигать какими-то путями.
Аноним 2016/05/07 19:24:09  №737190 388
>>737150
Пятая, четвертая не используется уже почти. Также сразу учи CSS3 селекторы.
Аноним 2016/05/07 19:44:45  №737203 389
>>737150
тот, что по 5-ой не про html в целом, а про нововведения, так что начинай с четвертой, там о том, как делать ссылки, таблицы и прочее..
Аноним 2016/05/07 19:45:57  №737204 390
>>737203
про css то же самое, в старом про то что такое селекторы, классы и т.д.
Аноним 2016/05/07 19:48:45  №737208 391
Аноны, а как вы смотрите на то, чтобы придумать еще задачек? Устроили бы скажем голосование, а ОП бы уже добавлял, картиночки из анимы подходящие тож запилить можно.
Аноним 2016/05/07 19:49:19  №737209 392
14626397599320.gif (549, 728x720)
720x728
Аноним 2016/05/07 19:50:56  №737211 393
>>737203
>>737204
Понял тебя. Сначала 4-ю, а потом пятую.
Там в комментах вроде говорил кто то об этом.
Может еще какие -нибудь учебники или тому подобное посоветуешь?


>>737162
>>737190
Вам спасибо все равно!
Аноним 2016/05/07 19:52:27  №737212 394
>>737211
webref.ru от автора htmlbook но о современных технологиях, там и курсы новые добавили
Аноним 2016/05/07 20:24:31  №737234 395
Аноним 2016/05/07 20:39:15  №737247 396
>>737208
Задачка о фасетном поиске, какой выше обсуждали, явно не помешала бы. Популярная же штука, почти в каждом магазе встречается, судя по данным гугла.
Аноним 2016/05/07 22:10:08  №737288 397
>>736622
>Тут главный принципиальный вопрос - должны ли мы хранить в форме студента или должны дублировать все его поля. Что удобнее, какие есть недостатки и преимущества. Как я уже написал, в фреймворках вроед Симфони у формы своя отдельная копия данных, но у нас простое приложение и нам наверно проще будет редактировать данные прямо в студенте чем делать копию. Хотя, кто знает.
Будем хранить студента в форме. Делать копию было бы слишком просто и всегда хорошо научится чему-то новому.

>>736623
>Глядя на твой код, я например, не понимаю, зачем ты передаешь в функцию валидации 'getName'. Зачем ей имя геттера? Оно как-то помогает проверить правильность заполнения поля?
Ну да, функция валидации должна получить что-то в аргументы. Например, есть методы которым нужно только одно поле чтобы проверить, а есть метод проверки пароля и повторного пароля, для которого нужно получить два свойства. Во втором случае не получится применить стандартизированный вид функции валидации.

>>736623
>Дальше, как мы будем хранить информацию об ошибках? Вообще, тут в принципе для этого можно даже объект задействовать. А можно и массивом обойтись.
Я объектами делаю - на каждую сущность свой объект ошибок

class Student
{
...
}

class ErrorList
{
...
}

class StudentErrorList extends ErrorList
{
...
}

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


И еще у меня вопрос про паттерны. Немого погуглив и прочитал на википедии что паттерн это всего лишь пример решения проблемы/задачи, и связи с этим у меня возникло несколько вопросов:
Как (мне) новичку узнать какой паттерн применить лучше? Выучить их все и отталкиваться от собственной базы или есть какой-то способ узнать какой паттерн применить? Или же их вовсе не обязательно знать все? Например, когда я изучал код SymfonyForms я сразу обратил внимание что названиях классов содержится слова Builder и Factory и сразу смекнул что это какие-то паттерны, потому что видел что-то такое в твоих ссылках на Design Patterns. Выходит ли что паттерны это всего лишь некая договорённость правильного написания кода, чтобы проще было понимать что написано. Ведь для любой проблемы или задачи всегда можно найти какое-то собственное решение, которое будет не факт что понятно остальным.
Аноним 2016/05/07 22:45:04  №737298 398
>>737208
Реквестирую на проектирование бд.
Потому что пока там только лайки и кинотеатр, это несерьезно.

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

Только не мути очередной громадный квест, который выполнять полгода. Нужны короткие и красивые как шахматные этюды задания.
Аноним 2016/05/07 23:47:23  №737339 399
Есть большой XML допустим, что рациональее - загнать данные из него в базу или ходить по файлу simple XML/XML reader ?
Аноним 2016/05/07 23:53:28  №737343 400
>>737339
В базу конечно. Парсинг файлов медленное и неоптимальное дело, база же специально под такие задачи заточена.
Аноним 2016/05/08 02:05:36  №737397 401
>>737288

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

Кстати, валидацию наверно стоит разбить на 2 функции: валидация модели Студента и валидация формы, которая может вызывать первую.

> да и кажется весьма логичным чтобы у каждой сущности был свой класс
Да не уверен. Чем StudentErrorList отличается от любого другого ErrorList? если ничем то не стоит и отдельный класс делать, я думаю.

> Как (мне) новичку узнать какой паттерн применить лучше?
паттерны надо изучать на примере конкретной ситуации или конкретного кода. Вот надо тебе сделать наследование таблиц в БД - почитай про соответствующие паттерны. Изучаешь код библиотеки Doctrine или компоненты Симфони - посмотри какие паттерны там используются. Так, абстрактно, ты можешь про них почитать, ну например тут:

http://design-pattern.ru/ (это краткая выжимка из книги Фаулера "Паттерны/Шаблоны Проектирования Корпоративных приложений", можешь ее поискать).

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

Ну например паттерн TableDataGateway ты наверно использовал.

Также, есть примеры тут с кодом, но судя по отзывам других анонов, они менее понятные и в общем похуже чем книга: http://designpatternsphp.readthedocs.io/ru/latest/README.html

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

> Выходит ли что паттерны это всего лишь некая договорённость правильного написания кода, чтобы проще было понимать что написано.
Ну да, паттерн проектирования можно перевести как "шаблон". То есть шаблон решения для той или иной задачи. Вообще, если ты будешь решать ее, не зная паттернов, возможно что в итоге ты придешь к тому же самому, только это займет больше времени, решение получится не до конца идеальным. А в случае паттерна достаточно сказать "давайте используем тут паттерн N" - и все понимают что ты хотел сказать.
Аноним 2016/05/08 02:46:30  №737403 402
>>737209
>>732572

Ок, по коду.

- неправильные названия функций. имена функций начинаются с глагола, "сделайЧтоТо()" и не надо использовать нечитаемые сокращения в них вроде dbst(). parser() это не глагол. pageName это непонятно что.

Попробуй сам прочитать:

GetLinks::pageName()

ПолучитьСсылки::названиеСтраницы()

Как правильно: ПоисковикСсылок::получитьНазваниеСтраницы()

- в Queue::enqueue зачем-то передается двухмерный массив. зачем такая сложная структура? Лучше 1-мерный, а еще лучше - объект Node.
- имена классов - это существительные. GetLinks -> LinksGetter
- к Queue явно надо дописать что именно это за очередь
- нарушение инкапсуляции и зоны ответственности. За работу с очередью отвечает класс Queue. Почему мы узнаем размер очереди не из него напрямую, а через обращение к какой-то таблице?

Много статических вызовов и просто функций: Input::get, view(), Queue::enqueue(). По моему это не очень здорово, чем плохи статические методы? Тем что это по сути не ООП. Это ближе к использованию глобальных переменных или функций.

- Например, если какая-то функция обращается к Input::get, то получается она берет входные данные не из переданных ей аргументов, а откуда-то еще (побочные эффекты: https://github.com/codedokode/pasta/blob/master/good-code.md#Избегай-побочных-эффектов ), мы их не передаем явно, не можем подменить на другие. И это не видно из заголовка функции, что она к Input будет обращаться. То есть эта зависимость не видна, пока ты не изучишь весь код.

Если бы мы использовали не-статический класс Input то нам надо было бы передавать его объект явно в функцию. Было бы явно видно что ей нужны эти данные. Можно было бы их подменить.

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

- Нельзя создать несколько экземпляров объекта с разными данными (это не всегда нужно, но иногда бывает нужно, например при тестировании или каком-то нестандартном коде). Ну например у тебя нельзя создать и обрабатывать 2 Queue параллельно.

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

А вот если бы мы передавали объект Input, мы бы могли передать вместо него альтернативный совместимый с ним класс.

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

Вот еще урок который отчасти связан с этой темой: https://gist.github.com/codedokode/e1d31a31b37d5f635057

Вот как бы мог выглядеть код на объектах (для простоты все объекты я создаю руками без DI-контейенра):

$queueTableGateway = ...
$queue = new Queue($queueTableGateway);
$linksGetter = new LinksGetter();
$pageName = $linksGetter->getPageName();
$node = new Node($pageName, ...);
$queue->enqueue($node);

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

Ну вот посмотрим например на такую штуку:

\DB::setFetchMode(...)

Это как раз пример побочных эффектов. Функция parserResults() меняет глобальное состояние класса DB (который используется и другим кодом) после своего вызова. Допустим, какая-то другая функция использует другой fetchMode, и вызывает parserResults(). Та меняет fetchMode и исходная функция после этого перестает работать. Причем это абсолютно неочевидно, казалось бы, какая связь между ними?

Даже хуже, функция parserResults меняет это трежим не для себя, а видимо для какого-то другого класса (Queue? GetLinks?)

Как было бы лучше: ставить fetchMode не глобально, а только для запросов которые ты делаешь. И не в контроллере, а там, где эти запросы делаются.

В общем, если ты хочешь лучше изучить все эти вещи, придется начинать с основ. У нас в учебнике из Оп поста в последней главе (ООП и пасты) изучается ООП и есть задачки - если ты хочешь разобраться, надо их все решить. Затем было бы полезно почитать про DI, может даже посмотреть задачу про студентов.

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

> Как еще я мог назвать класс, который только и делает что достает ссылки из страницы? LinksExtractor?
Почему нет? Кстати, из-за того что он у тебя статический непонятно откуда он вообще берется, чем заполняется и тд.

> Решил передавать массив параметров напрямую в модель для разбора. Правильно или нет
Скорее всего нет, так как массив параметров это данные формы, а с формами работает контроллер. Модель не должна ничего знать про формы.

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

Ответы Аноним 2016/05/08 02:47:04  №737404 403
>>731615

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

>>731619

> Круг строится, но выглядит как дерьмо.
Идеально он наверно и не будет выглядеть так как буквы ставятся не как угодно, а по сетке. Ну и коэффициент у тебя маловат: 1.1105 - там должно быть что-то в районе 1.4 ... 2. У тебя круг сплющенный из-за этого.

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

Для вывода достаточно сделать 2-мерный массив, то есть массив строк, где каждая строка представлена как массив символов:

$field = [
[' ', ' ', ' '],
[' ', ' ', ' '],
[' ', ' ', ' ']
];

Тогда установка буквы в определенную точку делается так:

$field[$y][$x] = 'А';

А вывод можно сделать например через цикл по строкам + implode для вывода строки.

Ты же выбрал другой способ хранения и как следствие получился запутанный код. Ты еще добавил сюда неудачные названия переменных ($xlast вместо $lastX или $xLast) и не смог разбить сложный код на отдельные простые функции. Ну давай посмотрим например на это:

for ($z=0;$z<$xlast;$z++) {
$echoTemp =$echoTemp.' ';
}

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

> $radius = ceil($leng/4);
Ты не предусмотрел промежутки между буквами, а также не учел что буквы не являются идеальными квадратами, а имеют прямоугольную форму. Ну как минимум тут стоит поиграть с коэффициентом и найти такой, для которого будут промежутки между буквами.

Для разбиения строки на массив букв есть хак - preg_split("//u", $text, null, PREG_SPLIT_NO_EMPTY), хотя твой способ тоже интересный, если ты сам до него додумался.

> 'y' => round(cos(deg2rad($angle $i)) $radius),
Тут надо еще добавлять координату центра, а то будут получаться отрицательные значения

В общем, советую переделать.
Ответы, Вектор Аноним 2016/05/08 03:06:37  №737407 404
>>731758

О, интересное реешние где профессия сделана отдельным объектом.

> public function setProfession ($profession) {
> public function setEmployee ($employee){
тут нужен тайп-хинт. Также по PSR вроде фигурная скобка ставится на новой строке. И лучше не set, а add.

Для классов профессий - ты переопределяешь поля с зарплатой, названием. Но тут есть недостатки:

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

Не хочешь попробовать решить обе проблемы за счет абстрактных методов?

> public $departaments = array(); // департаменты
Лучше наверно будет сделать приватным чтобы снаружи нельзя было что попало туда запихнуть или что-то сделать.

> public function getAvrSalary (){
average сокращается как avg, а еще лучше было бы не сокращать вообще. Если ты еще не сделал это, поставь себе удобный редактор или IDE.

> $avrSalary = round($this->getTotalSalary () / count($this->departaments), 2)
Вообще, окргление лучше делать при выводе, а тут давать точные данные. Кто знает как они испоьзоваться будут.

кстати, я подумал, а ведь Департамент не существует вне Компании, может имеет смысл тут применить композицию вместо агрегации? Хотя можно и так оставить.

> function creationEmployees (
Функции начинаются с глагола, создатьСотрудника, а не создание.

> for ($id = 1; $id <= $vacancyQuantity; $id++) {
> $employees[$id] = new Employee($id);
id уникален только в пределах Департамента - что делать при переводе сотрудника? Лучше либо сделать полностью уникальные id либо отказаться так как объект сам по себе уникален и может сам себя отличать от других.

> $employees[$id]->setProfession($professions[$profession]);
> $employees[$id]->setRank($rank);
Лучше делать это на переменной, а только потом добавлять в массив - меньше скобок будет.

> $departament = $vector->departaments[$depName];
Вот тут явно стоило бы вместо прямого обращения использовать метод поиска по названию. А еще лучще - сделать чтобы функция работала с одним департаментом за раз и он передавался в нее объектом.

> public function padLeft($string, $length) {
зачем этой функции быть публичной? Она же вроде для внутренненго использования?

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

> $this->str .= "\n" . $this->padRight($str, $this->length);
Логичнее хранить исходные загловки, а форматировать только при выводе.

> if ($caption==1) {
> // Добаляем горизонтальное поддчеркивание снизу, длина колонки * кол-во колонок
Логичнее черту по моему выводить в методе таблицы.

Вместо public $str лучше сделать метод getAsString() или render().

> unset($strs); // обнуляем массив
$strs = []; (что за название странное?)

В общем, неплохо, давай теперь еще антикризисные меры.
Аноним 2016/05/08 09:58:31  №737432 405
>>737014
Дополнение к вопросу 2: возможность получать доступ из хелпера к мапперу возникла из-за того, что в форме для редактирования профиля нужно откуда-то брать значения, которые будут передаваться в value="" как дефолтные значения для инпутов.

Как сейчас это работает, если убрать лишнее:
- если пользователь зарегистрирован, получаю email этого пользователя
- обращаюсь к мапперу и получаю модель этого пользователя
- данные модели передаю во view, а во view-файле распихиваю переданные данные по value=""

Быть может, стоит при логине записывать в сессию все данные о пользователе, которые можно редактировать? Из сессии проще достать их потом и распихать по input'ам, через каждый раз запрос в БД делать.

2. Почитал я про DI у тебя в гистах и понял, что у меня в классе App подобие Registry и сделать из этого DI никак не получается. Service Locator подошёл лучше, невзирая на его недостатки; подключение к БД теперь вне App (пик).

>>732572
>Насчет странности я не понимаю о чем речь, взял тут https://laravel.com/docs/5.2/queries#retrieving-results
Если в Laravel можно делать X несколькими способами, то не стоит брать самые неочевидные. Query Builder следует использовать, когда Eloquent ORM недостаточно, а для подсчёта значений в таблице этой ORM достаточно. А вместо непонятно откуда берущегося Input обычно используют объект класса Request, которые передаётся в контроллер параметром.

Аноним 2016/05/08 10:01:10  №737433 406
Привет, дорогие друзья, а подскажите, пожалуйста, существуют ли книги PHP о том как сделать сайт - блог. Всем заранее спасибо.
Аноним 2016/05/08 10:03:29  №737434 407
P.S. Хочу потренировать популярные базовые навыки, то есть смастерить, скажем 10 блогов, и 10 интернет-магазинов исключительно ради тренировки. Книгу про интернет-магазины я нашёл, а про блоги нет.
Аноним 2016/05/08 10:38:53  №737441 408
>>737434
Книгу про интернет-магазины в студию!
Аноним 2016/05/08 11:03:11  №737447 409
>>737441
PHP и MySQL Создание интернет-магазинов Ларри Ульман.
Господа знатоки, но не забудьте и мне про блоги что-нибудь посоветовать.
Аноним 2016/05/08 11:52:45  №737470 410
14626975654750.jpg (45, 248x348)
348x248
>>737434
Пикрелейтед может пригодиться.
Только более новое издание нужно.
Аноним 2016/05/08 12:06:21  №737474 411
14626983815660.png (20, 492x354)
354x492
14626983815661.png (24, 532x375)
375x532
>>737432
Пик отвалился. Даже показывать немного стыдно. Это тот класс, который мастер на все руки.
>Из сессии проще достать их потом и распихать по input'ам, через каждый раз запрос в БД делать.
*через каждый раз запрос в БД делать.

Безуспешно пытаюсь не плодить посты.

>>737434
>Книгу про интернет-магазины я нашёл, а про блоги нет.

Вот посмотри, сможешь ли ты реализовать такой примитивный блог: http://www.blogovo.ru/testovoe-zadanie-programmistu-php-junior
Если да, то тебе осталось добавить аутентификацию и комментарии. Если с этим проблемы, то задачка на список студентов их решит, так как суть везде одна и та же. И не нужны тебе целые книги, посвящённые созданию блогов.
Ньюфаг с задачами Аноним 2016/05/08 12:49:16  №737498 412
Аноны, подскажите, пожалуйста: задачка с проверкой на ошибки решается с одной регуляркой? У меня получилось только через функцию с отдельной регуляркой для каждой ошибки.
Что скажете насчёт опечаточника? http://ideone.com/yhglMW
Аноним 2016/05/08 12:52:18  №737501 413
Что-то непойму. Не получается пдо подключить, пишет, что драйвер не найден, хотя в пхпини они включены и по пхпинфо они тоже есть( и пдо, и пдо_майскл), что за херня?
Аноним 2016/05/08 12:59:03  №737504 414
>>737501
А, нет, это я аутист.
Аноним 2016/05/08 14:25:38  №737589 415
>>737407
>- если кто-то хочет сделать новую профессию. не очевидно что надо переопределить поля (ок, тут класс маленький и в принципе можно догадаться, но в более сложных классах где много полей и методов - нельзя)
>- если кто-то забудет переопределить поле, это никак не обнаружится.
>
>Не хочешь попробовать решить обе проблемы за счет абстрактных методов?

Хочу, только я не понимаю как это сделать. Можно пример?

Я рассуждаю так:

Если я создаю абстрактный метод setSalaryRate, в дочернем классе он должен быть переопределен в обязательном порядке. Тогда программист, который решил создать новый дочерний класс (новую профессию), должен будет его описать. Но, если в данной реализации, программист может пропустить переопределение свойств, то что ему мешает скопипастить этот метод с класса профессии, которая уже существует, и в которой я описал этот метод. Тогда метод должен не просто переопределять свойство setSalaryRate, но и запрашивать значение при создании экземпляра? Тогда, логично описать этот метод в конструкторе. (Значит метод конструктор в классе предке будет абстрактным). И получится примерно такой функционал конструктора: при создании экземпляра класса, конструктор принимает аргументом значение setSalaryRate.
Но опять же, что если он не скопирует этот метод, и не будет описывать вообще какой либо функционал. Т.е. метод уже не абстрактный, но при этом ничего не делает?
Значит, реализация которую я представляю, не защитит от этой ошибки. Как сформулировать этот вопрос гуглгу?
К слову я уже задавал этот вопрос в этом треде >>735032,
думал, что мне ответил ОП >>735111



Аноним 2016/05/08 14:51:54  №737607 416
помогите :с
что-то не так с регулярным выражением, я не могу понять
http://ideone.com/z2spPS
Аноним 2016/05/08 15:46:05  №737634 417
Оп, запили урок по парсингу информации с веб страниц и хранению спаршенной инфы в базе. Что думаешь?
Аноним 2016/05/08 15:49:14  №737635 418
ОП, а ты в бекэнд JS шаришь? Хотелось бы вкатиться безболезненнее в ноду, с ванильным js вроде всё ок
Аноним 2016/05/08 16:38:16  №737647 419
>>737498
Опечаточник в порядке.
А в задаче с проверкой на ошибки можно сделать ассоциативный массив с регулярками в ключах и описаниями ошибок в значениях - это если без функции.
['/жы/ui' => 'Жи/ши пиши с буквой \"И\"', '/сдесь/ui' => 'Правильно писать \"Здесь\"', '/координально/ui' => 'Правильно \"кардинально\"'];
Дальше цикл foreach, который при соответствии найденным ошибкам (регулярки в ключах) будет выдавать описание ошибки (описания в значениях массива).
А так прилагай код всегда, так быстрее и точнее тебе ответят.

>>737607
Если символа между цифрами два и более - не захватывает весь номер. Это исправь.
Аноним 2016/05/08 16:51:53  №737657 420
14627155135490.jpg (45, 640x480)
480x640
ОП, спасибо за разбор задачи про Вектор в прошлом треде, вот небольшие изменения: http://ideone.com/kLgXIj
Главное изменение - внедрил класс Компания.
Вот твой разбор в прошлом треде: >>731915
Кое-что прояснело уже после того, как я это решение сделал, как обычно.
Получается, нам нужно создавать всё-таки кучу экземпляров класса Сотрудник, а потом приписывать их экземпляру класса Департамент? Ну и после этого экземпляры Департамента приписывать классу Компания?
Твой разбор сохранил, позже попробую именно по тем рекомендациям всё сделать.
Нереально ты помогаешь, братишка, куда бы я без тебя...
Аноним 2016/05/08 16:59:35  №737661 421
>>737647
я сколько пытался чего-то менять, но никак ничего не получается. Ты не мог бы конкретно указать, что на что менять, а то я без сил -_-
Аноним 2016/05/08 17:04:17  №737664 422
>>737661
А где у тебя первый вариант? Он был ближе к тому, что нужно.
Когда уже доходит до проверки чисел ЗА +7 и 8, то нужна регулярка "любое количество скобок, минусов, пробелов в любом порядке либо вообще ни одного", а дальше цифры.
Тебе понадобятся квадратные скобки, перечисление внутри них разных знаков, которые не могут быть или не быть, за скобками знак "любое количество указанного или полное отсутствие" - и всё. Дальше сами цифры от 0 до 9 повторить 10 раз.
Так немного понятнее?
Аноним 2016/05/08 17:18:12  №737678 423
Аноним 2016/05/08 18:03:53  №737702 424
>>737634
Гуглишь Simple HTML DOM, читаешь доку: http://simplehtmldom.sourceforge.net/manual.htm

Ты массив сможешь в БД вставить foreach'eм? Так вот, контент сразу парсишь в массив массивов массивов . Пробегаешься по массиву поэлементно, каждый элемент массива суёшь в базу запросами вида "INSERT INTO ..."
Для "вкатиться" тебе этого с головой хватит.

>>737634
Гуглишь что-то вроде "how learn X properly", получаешь гайд вроде http://javascriptissexy.com/learn-node-js-completely-and-with-confidence/

Не отвлекайте ОПа тем, что на первых станицах гугла можете легко найти сами.
Аноним 2016/05/08 18:52:27  №737736 425
>>737678
все верные номера стали верными, а далее я никак, прошу помощи, черт подери
http://ideone.com/vw5P0b
Аноним 2016/05/08 19:00:18  №737742 426
>>737678
Тут ты не даёшь понять, что все символы должны быть тесно связаны с цифрами.
Попробуй объединить круглыми скобками все знаки и цифру - и уже этому задай количество повторений - 10.
>>737736
А вот тут ты исправляешься, но забываешь про то, что в квадратных скобках символы меняют своё значение и большинство из них экранировать не надо. Убери несколько обратных слэшей из квадратных скобок.
Аноним 2016/05/08 19:07:05  №737744 427
Господа, решаю задачу под название "Клавиша shift" из раздела "Повторим" и застопорился вот на каком моменте: " Исправь текст так, чтобы ... после знаков запятая, точка, точка с запятой, двоеточие, восклицательный и вопросительный знак стоял ровно один пробел (а перед ними — ни одного)"
Насколько я понимаю могут быть три случая неправильного расположения знака препинания и один правильный:
1)скачать , но
2)скачать ,но
3)скачать,но
4)скачать, но (правильный). Но неужели можно подобрать такую регулярку, чтобы она одновременно находила первые три и не находила четверую?
Аноним 2016/05/08 19:08:20  №737745 428
>>737736
Аа, ты ещё не определяешь конкретно, чтобы проверка была именно этого номера, а не отдельных частей текста.
Вспомни про циркумфлекс и знак доллара, там было это в начале или середине урока.
Аноним 2016/05/08 19:22:42  №737752 429
>>737736
>[+7|8]
Как ты это себе представляешь? Не имеет смысла ставить в квадратные скобки сравнение, потому что квадратные скобки - это "один из указанных символов в случайном порядке".
Тем более, что есть номера, которые начинаются с "+ 7" - как ты такие захватишь?
Давай-давай, постигай основы.
Это достаточно непростая задача для новичка, но надо самому дойти до всего.
Аноним 2016/05/08 19:30:18  №737757 430
>>737744
Можно.
Условий всего два:
1. Перед запятой не должно быть пробела.
2. После запятой не должна сразу идти буква.
Аноним 2016/05/08 19:48:23  №737765 431
>>733196
ОП, посмотри задачи, пожалуйста. Ты меня пропустил
Аноним 2016/05/08 21:06:40  №737812 432
14627308001370.png (4, 529x163)
163x529
>>737757
все выходит с точность до наоборот
а мне нужен обратный эффект
Аноним 2016/05/08 21:52:42  №737840 433
Аноним 2016/05/08 22:11:39  №737846 434
>>737589

Нет, идея такая:

abstract class A
{
abstract protected function getBaseSalary();
}

class B extends A
{
protected function getBaseSalary()
{
return 500;
}
}

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

> Но, если в данной реализации, программист может пропустить переопределение свойств, то что ему мешает скопипастить этот метод с класса профессии, которая уже существует
Если он копирует код не думая, то, конечно, ничто ему не поможет. Идея другая.

- когда мы используем абс. методы, достаточно посмотреть на список абс. методов и понятно как именно сделать класс-наследника
- когда мы их не используем, то надо полностью анализиовать код класса и думать что надо переопределить. Обычно это дольше. У тебя конечно код классов-профессий очень простой и можно обойтись без абс. методов, но если бы у тебя были более сложные классы, то без абс. методов было бы тяжело.
Аноним 2016/05/08 22:17:18  №737852 435
>>737744

Ищем такие последовательности:

(любое число пробелов в том числе 0) (знак препинания) (любое число пробелов в том числе 0)

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

(знак препинания) (1 пробел)

Аноним 2016/05/08 22:21:52  №737854 436
>>717443
>- в модели студента есть метод хеширования пароля, но не лучше ли если бы он был в хелпере отвечающем за авторизацию? Если посмотреть, этот метод вообще к $this не обращается и непонятно что он там делает в классе студента.
>- методы генерации соли и токена - не лучше ли разместить в классе авторизации?
Хелпер отвечающий за авторизацию и класс авторизации это те же самые вещи?

>>717443
>Вот представь что мы хотим взять модель студента и заполнить форму его данными. Сколько для этого кода надо? А хотелось бы чтобы это делалось в 2-3 строчки:
>
>$form->setStudent($sudent);
С использованием композиции, я лишился надобности заполнять данными Студента после валидации (класс формы заполняет его автоматически), и перед добавлением студента в дб остается только поменять в нём пароль. У меня появляются некоторые сомнения насчет того что это должен делать контроллер, а не класс формы. Вот небольшой отрывок из контроллера: https://ideone.com/yIPuZ6

Мы вместо двух строчек можем получить одну

//код метода Формы
function setStudentPassword()
{
$this->student->setPassword($this->password));
}

//код в контроллере
if (!$errors->hasErrors()) {
$registerStudentForm->setStudentPassword();
...
}

>>717443
>Насчет логина по имени - странная идея. Разве имена уникальны? Нужно тогда как минимум проверять что имя уникально и если нет, не разрешать логиниться через него. Также, надо иметь не 3 поля, а одно, в которое можно ввести что угодно. Это же неудобно, когда в форме лишние поля.
Логика такова, что мало вероятно что имя и пароль будут совпадать у разных людей.

>>717443
>Наконец обрати внимание еще на это место:
>
>> https://github.com/someApprentice/Students/blob/master/app/Controller/LoginAction.php#L42
>Чтобы залогиниться у тебя надо написать сложный код. Почему бы не сделать проще, напрмиер так:
>
>if ($authService->isValidPassword($student, $password)) {
>$authService->login($student);
>....
>}
$authService это все тот же класс авторизации о котором я спрашивал выше?

>>717443
>Для авторизации не стоит исплоьзовать сессию. Она же устаревает и удаляется через 20-30 минут неактивности. Лучше просто использовать куку с id и хешем пароля.
А разве я не должен спросить у пользователя хочет ли он оставаться залогиненым?

>>717446 >>717241
>>Я захотел сделать чтобы для залогинивания можно было использовать и почту, и фамилию, и имя, я подошел к этому таким способом:
>>https://github.com/someApprentice/Students/blob/master/app/Controller/LoginAction.php#L40
>>Это можно как-нибудь сократить или это нужно вынести в отдельную функцию чтобы сделать контроллер 'тонким'? Если выносить в отдельную функцию, то кто этим должен заниматься? Контроллер или хелпер?
>Можно, но я думаю что не имеет смысла так как этот код нигде никогда больше не понадобится. Сам код цикла содержит много ошибок.
Стыдно спрашивать, но можно подсказку в каких местах ошибки?
Нет ничего же плохого в том чтобы залогиниваться через резные типы данных?

>>717446
>> Что будет если сделать редирект перед остановкой цикла?
>Не знаю, а что-то дложно быть? Редирект это просто выдача заголовка. после него код выполнять особого смысла нет.
Перефразирую вопрос: Что становится с кодом после ридеректа? Выполняется функция die()?

>>717446
>Значит, надо сделать такой метод:
>...->ispasswordValid($student, $password)
>Почему контроллер должен считать какие-то хеши? Почему он вообще должен знать что у нас исплоьзуются хеши? Это ответственность хелпера (сервиса) авторизации, знать как она устроена. Контроллер просто просит сервис проверить пароль на правильность. Или залогнинить студента. Или разлогинить. Не вдаваясь в детали, как он устроено.
>Это ответственность хелпера (сервиса) авторизации, знать как она устроена.
А почему не ответственность валидатора? В названии функции присутствует слово Valid, значит это как-то относится к валидации. И если, мы отнесем его к валидации то как не запутаться между этим методом и методом проверки на правильность написания пароля, которая нужна при регистрации?
Аноним 2016/05/08 22:40:09  №737875 437
>>737840
Вот и молодец.
Ну а вот мой вариант, который сделал, чтобы показать тебе, если совсем не пойдёт: http://ideone.com/bRC90j
То же самое, только кое-что местами поменяно.
Регулярные выражения вообще интересные штуки, мощная тема, надо бы что-нибудь дополнительно изучить по ним, я всё хотел.
Аноним 2016/05/08 22:42:40  №737876 438
>>737812
Вообще неправильный подход вроде.
Там чуть выше ОП расписал алгоритм, попробуй его буквально воссоздать в регулярке, базарю, ещё захочешь, поцене 38 рублей.
Аноним 2016/05/09 00:21:56  №737959 439
Подойдет ли пистон для начинающего веб разработчика? Или лучше все же пыха?
Аноним 2016/05/09 00:35:28  №737967 440
Аноним 2016/05/09 00:36:15  №737968 441
Аноним 2016/05/09 00:37:47  №737969 442
>>737959
питончик няшный и джанго там попроще какого нибудь zend'a будет
Аноним 2016/05/09 00:49:31  №737980 443
>>737959
Выбирай то на чём хочешь зарабатывать деньги, если конечная цель именно это.
Аноним 2016/05/09 01:01:57  №737987 444
14627449180130.png (3, 159x170)
170x159
Аноним 2016/05/09 07:00:31  №738027 445
>>737846
Спасибо, теперь стало понятнее для чего и как это делать

>>737702
Спасибо, прочитаю этот урок, потом про взаимодействие с бд. И потом начну пробовать.
Аноним 2016/05/09 07:36:16  №738029 446
>>737967
Начинающий веб-разработчик в Спрингах утонет нахуй.
Аноним 2016/05/09 08:39:07  №738040 447
>>738029
Да и вроде Java скорее больше для мобильных приложений, и для программ для ПК, чем для веб. Безусловно на Java можно и бэкенд сделать, но вакансий и фриланс работ не так уж и много по этому направлению как для PHP, JS.
Аноним 2016/05/09 09:24:06  №738044 448
>>737854

> Хелпер отвечающий за авторизацию и класс авторизации это те же самые вещи?
да

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

> Логика такова, что мало вероятно что имя и пароль будут совпадать у разных людей.
Имя в принципе не уникально так как Иванов много. Не надо полагаться на это вот "маловероятно".

> $authService это все тот же класс авторизации о котором я спрашивал выше?
Наверно да

> А разве я не должен спросить у пользователя хочет ли он оставаться залогиненым?
не знаю. Можешь спрашивать, я не против. Но и в этом случае сессия не нужна.

> Стыдно спрашивать, но можно подсказку в каких местах ошибки?

код если честно создает ощущение что автор не понимает ни как работает цикл ни как надо использовать переменные.

> foreach ($student as $key => $value) {
> if (!count(array_filter($student)))
зачем нужна эта строка? она проверяет не ткеущий элеиент массива что еще было бы логично, а весь массив. Весь массив ты мог бы проверить и до цикла а не во время.

> unset($student[$key]);
Зачем во время цикла удалять элементы из массива? Точнее зачем их вообще удалять?

> $student = $value;
Зачем ты заменяешь массив студентов на одного студента? как читать твой код когда по ходу цикла переменная заменяется на другую и тот же самый код начинает обозначать совсем другое?

> $_SESSION['id'] = $student->getId();
> $_SESSION['name'] = $student->getName();
> $_SESSION['surname'] = $student->getSurname();
> $_SESSION['token'] = $student->getToken();
Зачем класть так много данных? В чем преимущество сессии перед куками? Как ты сделашь залогинивание дольше чем на полчаса?

> $loginStudentForm->getError('login', "Incorrect username or password")
Непонятно почему этот код внутри цикла. Ты хочешь несколько раз ошибку добавить?

> Перефразирую вопрос: Что становится с кодом после ридеректа?
Можно die можно return, так даже аккуратнее мне кажется.

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

И как в твоем сценарии проверить праивльность логина и пароля не имея формы? Ведь пароль можно и не только в форму логина ввести, и вообще не в форму. А например в консоли или через API. Ты сможешь в этих случаях его проверить?

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

В MVC для смены или проверки пароля форма не обязательна. И кстати проверить данные в модели студента тоже должно быть можно без формы.

Потому выгоднее может быть сделать что валидатор лишь проверяет соответсвие данных опредленному формату, а за проверку пароля отвечает не он. Но можешь делать как хочешь, если сделаешь неправильно я все равно увижу ошибку.
Аноним 2016/05/09 09:27:16  №738045 449
>>737657

> Получается, нам нужно создавать всё-таки кучу экземпляров класса Сотрудник, а потом приписывать их экземпляру класса Департамент? Ну и после этого экземпляры Департамента приписывать классу Компания?

Да

И судя по тому что в Компании есть поля вроде public $allSalary = 0; ты еще не все исправил.
Аноним 2016/05/09 09:31:00  №738047 450
>>737635

По моему это глупость так как в JS даже классов нормальных нет. Ни тайп хинтов. Ни многопоточности. Ни фреймворков нормальных. Как ты на нем приложения писать собрался?

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

Так же как раз есть 2 задачи имеющих некоторое отноешние к яваскрипту:

Сапер с MVC https://github.com/codedokode/pasta/blob/master/js/minesweeper-mvc.md
SPA приложение https://github.com/codedokode/pasta/blob/master/js/spa.md

Можешь глянуть.
Аноним 2016/05/09 09:32:31  №738048 451
>>737634

Он не нужен если ты разбираешься в протоколе HTTP, знаешь библиотеку-HTTP-клиент, DOM, сами базы данных - тогда тебе все и так очевидно. Вот по этим темам уроки может быть были бы полезны, но считается что они относительно легкие.
Аноним 2016/05/09 09:40:44  №738050 452
>>737474

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

> Пик
new Session это уже странно. Зачем ты создаешь объхект который сразу же удаляется? Может проще его не создавать тогда?

Алсо что за нездоровая традиция первым делом создавать сессию? Видеокурсы?

Непонятно зачем ты указываешь путь к конфигу в методе setStudentMapper - зачем он там?

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

Картинка демонстрирует непонимание принципов ООП автором.

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

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

Не хватает пагинации и сортировки.
Аноним 2016/05/09 09:46:32  №738052 453
>>737014

на пике я вижу очень странное слово self:: . Это точно ООП?

> 1) Если упростить, в DataMapper для манипуляции данными в БД нужно первым делом найти модель по id, результат-объект в переменную; теперь для изменения/добавления данных нужно обращатся только к этому объекту; дальше у маппера вызывается метод save(), куда передаётся переменная-объект.
вообще в навороченных мапперах в save не надо передавать модель. Они сами умеют находить изменения в любом числе моделей и сохранять их в БД. Более простые не умеют и там надо все вручную передавать.

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

Маппер противопоставляется active record так как в AR модель умеет сама работать с базой. бизнес-логика и работа с БД тесно смешаны в одном классе. Главная разница в этом.
Аноним 2016/05/09 09:49:16  №738055 454
Кстати, насчет ноды. А как её на хостинге поставить, если она сама по себе является сервером? Никак?
Аноним 2016/05/09 09:51:18  №738056 455
>>737014

> 2) Может ли хелпер обращаться к мапперу?
Да так как это более высокоуровневый слой.

> <?php if (\App\Helper\Auth::check()): ?>
У тебя странный код. Ты хочешь проверить залогинен ли пользователь но ничего не передаешь в функицю. Откуда она интересно поймет что проверять? Это как функция сложения в которую не передаются слагаемые.

> 3) Я гуглил Front Controller и ничего не понял.
FC это подход когда все запросы первоначально попадают в этот самый FC и он дальше решает что с ними делать. Это вообще не обязан быть класс, суть в том что все запросы проходят сначала через один общий обработчик.

> В объекте App чуть меньше 100 строк, но он слишком много разных вещей делает. Это норма?
не знаю.

> что в форме для редактирования профиля нужно откуда-то брать значения, которые будут передаваться в value="" как дефолтные значения для инпутов.
А ты читал урок про обработку форм? Там же вроде написано откуда.

> Быть может, стоит при логине записывать в сессию все данные о пользователе, которые можно редактировать? Из сессии проще достать их потом и распихать по input'ам, через каждый раз запрос в БД делать.
Вижу что не читал. Иди и перечитай.

Аноним 2016/05/09 09:53:32  №738058 456
>>737470

Там плохой код имейте в виду. Лапша на функциях. Автор сам по моему тот ее быдлокодер.

>>737433

Разработка блога ничем не отличается от других видов приложений

>>737434

Нет смысла делать 10 блогов. Блоги и ИМ делать проще всего взяв готовую CMS. Это не требует программирования.

Аноним 2016/05/09 10:15:21  №738059 457
Ананасики, подзастрял на опечаточниках, а точнее на расширенном варианте задания. Пришел к выводу что можно решить таким образом: разбитие текста по символу переноса строки -> разбитие строки по пробелам -> проверка слова на специфичные символы свойственные языку (типа "qui или йцф"), если специфичных символов нет, то подсчет количества символов английского и русского алфавита, и в зависимости от того каких символов больше, в ту сторону и переводить через preg_replace с массивами схожих символов -> собирать слова в строки ->собирать строки в текст.
Подскажите, я вообще в правильном направлении иду, а то откуда-то возникает такое чувство, что я что-то упустил, и там может вообще двумя строчками все решается, а я тут горожу велосипеды через циклы.
Аноним 2016/05/09 10:23:37  №738062 458
14627786173280.jpg (12, 250x249)
249x250
Пыханы. Есть подработка (допилить скрипт магазина по мелочи, приделать апи внешнего сервиса, сделать загрузку xml->mysql, интересно в общем). Все расскажу по почте. Скромная оплата.

jwh018@hmamail.com
Аноним 2016/05/09 10:45:07  №738076 459
>>738040
На Java пишутся массивные проекты, которые фрилансерам отдавать не будут, ровно поэтому нет разработки, но разного рода доработки и фиксы периодически заказывают. Btw, новичкам там делать нечего совершенно.
Аноним 2016/05/09 10:47:17  №738080 460
>>738062
>Скромная оплата.
Сам дорабатывай, лол.
Аноним 2016/05/09 11:12:53  №738098 461
>>738045
>И судя по тому что в Компании есть поля вроде public $allSalary = 0; ты еще не все исправил.
Ох щи, что-то забыл убрать.
Я сначала прописал то, что просто должно там считаться, в этом классе, а потом забыл убрать.
В принципе, там у нас всё то, что высчитывается из другого, поэтому нам там никакие поля не нужны. Я помню, ты говорил кому-то, что только обязательные свойства там надо указывать, а остальное всё получать с помощью методов.
Аноним 2016/05/09 11:24:50  №738107 462
>>738062
>по мелочи,
>приделать апи внешнего сервиса
>сделать загрузку xml->mysql
300 баксов и сделаю.
Аноним 2016/05/09 12:00:08  №738132 463
14627844082350.jpg (37, 400x235)
235x400
Я снова выхожу на связь, хотя не моя задача - просто заинтересовался.
http://ideone.com/AVe2d4 - так и не удаётся добиться того, чтобы работало с УРЛом в начале текста. Пробел ставишь - всё как нужно.
Чего не хватает? Как указать, что если другие буквы есть перед УРЛом, то он не нужен?
Туплю, помогите.
Аноним 2016/05/09 13:28:54  №738202 464
Вечер в хату, анчоусы. Подскажите годный учебник по mySQL. Понимаю, что прошлый век, но всё же.
Аноним 2016/05/09 13:57:53  №738221 465
14627914735430.jpg (63, 604x604)
604x604
Аноны, не могу осилить задачи на ООП, по своему опыту я понял, что лучше я посмотрю готовое решение и пойму как надо, потому что само мне в голову это не залетит тупой я


Дайте, пожалуйста, ссыль на гитхаб с задачей студента сделанной идеально на ООП. Буду сидеть и копаться в коде.
Аноним 2016/05/09 16:10:26  №738377 466
14627994270310.png (11, 389x193)
193x389
>>738050
>new Session это уже странно. Зачем ты создаешь объхект который сразу же удаляется? Может проще его не создавать тогда?
Обёртка над session_start(). Проще не создавать.

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

>Непонятно зачем ты указываешь путь к конфигу в методе setStudentMapper - зачем он там?
С этим проблема, я долго пытался отвязать конфиг от маппера. Сейчас маппер получает уже объект PDO вот так: new StudentMapper(Config::getPDOconnection);
Так лучше? Это максимум, до чего я смог додуматься.

>НЕпонятно почему в базовом классе контроллера есть публичные статические поля
Куда положить дефолтные controller и action? В методы setController и setAction?

>нездоровое увлечение цепочечными вызовами методв что на мой взгляд скорее дурнгая привычка так как замусоривает код нелогичными return $this.
С return $this можно использовать $obj->foo()->bar()->baz() вместо $obj->foo(); $obj->bar(); $obj->baz()
Хорошо, я постараюсь убрать цепочные вызовы там, где они лишние.

>непонятно почему в пути к шаблону пропущено расширение.
Ну так DRY, во всех аж 2-х фреймворках, на которых я крудил, расширение не указывается. В моём случае все шаблоны имеют расширение .php и можно в методе view один раз конкатенировать первый параметр с ".php", вместо того, чтобы в каждом вызове view() дописывать php.

>> <?php if (\App\Helper\Auth::check()): ?>
Ты хочешь проверить залогинен ли пользователь но ничего не передаешь в функицю.
Этот метод проверяет наличие $_SESSION['email']. Что передавать в метод, который проверяет, залогинен ли пользователь?

>> что в форме для редактирования профиля нужно откуда-то брать значения, которые будут передаваться в value="" как дефолтные значения для инпутов.
>А ты читал урок про обработку форм? Там же вроде написано откуда.

Там написано, что после отправления формы нужно заполнить values тем, что пришло (если ошибок нет). А вот если я уже зарегистрирован и хочу отредактировать свой профиль, то при переходе на страницу редактирования профиля я никаких форм не отправляю. Но в input'ах должен получить уже заполненные значения для моего профиля. Сейчас в контроллере алгоритм такой: [/i]если пользователь залогинен -> получить модель пользователя в переменную -> переменную отправить во view -> заполнить values тем, что передано во view[/i]

Вопросы:
1. Что должна представлять из себя обёртка над Location для редиректа? Часть класса, хелпер, как назвать, какие ещё функции можно туда добавить?
2. Статические классы. У меня статические - Validator, Auth (хелпер для регистрации/логина), Session, Config. Они ведь все работают только с какой-то одной сущностью, у которой не может быть несколько инстансов. Можно их статическими оставить?
У валидатора один публичный метод make, который принимает 2 массива (пик). Мне иногда кажется, что вместо классов Config и Validator было бы проще создать по одной функции.
Аноним 2016/05/09 16:18:24  №738387 467
ОП, а как же тот факт, что срок истечения сессии можно выставлять вручную? Куки же менее безопасны, чем сессии. Первое хранится на стороне клиента, второе - на стороне сервера. Или возможность не разлогинивать пользователя спустя час бездействия важнее безопасности?

>>738202
Мне очень хорошо помог вкатиться Learning SQL Алана Бьюли, как-то так.
Аноним 2016/05/09 16:33:28  №738409 468
Привет ОП и стремящиеся аноны
Сидел я тут раньше с вами, сделал студентов и почти доделал файлообменник https://github.com/V3N0m21 может кто помнит, потом нашел работу Magento developer'ом. И вот пришел спросить совет.

Все началось с того что пришло предложение сделать тестовое задание на Magento, нужно было сделать модуль отзывов, я еще тогда подумал что тестовое задание было сложновато как для джуна, хоть я и сказал что никогда с magento не работал, но могу попробовать разобраться. В общем за неделю гугления и чтения очень скупой документации я решил делать модуль для magento 2, которая только-только вышла я задание таки сделал и отправил, меня пригласили на собеседование которое проводили CEO и CMO конторы пацаны 23х лет, контора находится в съемной квартире которая дала тестовое задание . Я сказал что хоть я и написал тестовое задание, для меня это было достаточно сложно, и мне обязательно нужен наставник, или хотя бы просвященный человек которому можно задавать вопросы и пару месяцев времени чтоб нормально разобраться, они сказали без проблем, у нас есть люди с большим опытом. По технической части меня вообще ничего не спрашивали, просто сказали что можешь выходить в понедельник. Так как я работал на другой работе я сказал что мне нужно две недели. Написал заявление на работе, в тот же день из этой конторы мне перезвонили, сказали что нужно готовиться, завтра у меня собеседование с заграничным заказчиком и скинули мне мое резюме, чтоб я ознакомился, в котором было указано что-то около 4х лет опыта разработки magento и год разработки magento 2. Я спросил как так, я же говорил что я джун и для того чтоб нормально разобраться в теме мне нужно хотя бы месяца два-три, они ответили "не ссы, вопросы будут не сложные, тем более ты же говоришь по английски", короче всю ночь я готовился к этому собеседованию, на следующий день пришел к ним, созвонились с заказчиком по скайпу. Пообщался с заказчиком, поотвечал на вопросы, не на все, но все прошло более-менее, они меня взяли
tl;dr В общем мне надоело печатать в подробностях, поэтому коротко: я работаю на проекте зарубежного заказчика, среди моих коллег все адские нубы, плюс на зарубежного заказчика работаю только я, и только я работаю на magento2, все остальные на локальных проектах и на magento и wordpress'e, и помощи вообще нет никакой, во всем абсолютно нужно разбираться самому. Заказчик думает что я мидло-синиор, кидает тикеты которые я с адовым трудом и кучей замечаний закрываю. Так я проработал вот уже два месяца, деньги платят как договаривались $500, но силенок работать в таком режиме и таком стрессе у меня уже нет, с ужасом думаю что завтра на работу и там тикет который я скорее всего сделать не смогу. И так вопрос - что делать дальше? Превозмогать и ждать когда я уже досконально в этом всем разберусь, или уходить и искать что-то более адекватное с прошаренными коллегами и параллельно нормально доучить фронтенд и JS с фреймворками? Из плюсов того что есть сейчас, я очень-очень сильно подтянул свой уровень за эти два месяца. Где-то как за 8 месяцев обучения в обычном режиме. ОП, дай свой мудрый совет что делать, а то я запутался и адекватно ситуацию оценить не могу.
Аноним 2016/05/09 16:34:58  №738410 469
>>738409
>Все началось с того что пришло предложение сделать тестовое задание на Magento, нужно было сделать модуль отзывов
Охуеть, мне такое же задание давали. Но я его проебал.
Аноним 2016/05/09 16:36:08  №738412 470
>>738410
Диванон? Ты тоже с запада Украины?
Аноним 2016/05/09 16:36:43  №738415 471
>>738412
Лол, нет. Вообще мимо. Видимо всем такое дают.
Аноним 2016/05/09 16:49:15  №738422 472
>>738409
Оп наверняка скажет "надрывайся-превозмогай".

Бросать сейчас конечно глупо, но что мешает параллельно искать другую работу, с более комфортными условиями?
Я когда устраивался, выложил во-первых резюме, во-вторых разослал по ~50 вакансиям. Ответили 9, плюс еще 5 сами отозвались на резюме, так что выбирать было из чего.
Не нужно хвататься за первую попавшуюся возможность при таком спросе.

>>738412
В Киеве легко можно найти стажировку с адекватной нагрузкой и обучением (~300$).
Аноним 2016/05/09 17:01:44  №738432 473
>>738422
Проблема только в том что я не в Киеве и переехать туда в ближайшие год-полтора я точно не смогу, в Киеве и правда выбор широкий. Ну а вообще в принципе мне на джинне нормально предложений приходило, хотя во всех хотели Symfony или Zend Framework. Я именно поэтому и думал посидеть дома, подтянуть это все плюс верстку с JS.
Хотя по большому счету мне и Magento 2 нравится, просто вот этот вот адовый стресс это что-то невыносимое.
Аноним 2016/05/09 17:17:47  №738440 474
>>738432
Обсуди этот вопрос с начальством (если в той шараге таковое имеется), а не на дваче.
Мол так и так, не справляюсь с нагрузкой/не хватает опыта-квалификации, раскидайте тикеты другим членам команды.
В конце концов ты сам можешь проявить лидерские качества и напрячь кого-то из джунов/верстальщиков, чтобы они помогли
хотя бы с черновой работой (небезвозмездно естественно).

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

Короче твоя проблема решается обсуждением в коллективе. Говори с начальством, ищи напарника, делай бочку.
Аноним 2016/05/09 17:56:24  №738470 475
>>738409
Какой уровень английского и как учил?
Аноним 2016/05/09 18:00:28  №738474 476
>>738470
А вы еврей, вопросом на вопрос отвечать?
Аноним 2016/05/09 18:01:32  №738477 477
>>738470
Свободно общаюсь с сильным акцентом. Никак специально не учил, много читал книжки и интернеты, смотрел кинцо и сериалы без перевода, общался когда появлялась возможность с иностранцами.
Аноним 2016/05/09 18:17:25  №738487 478
>>738409
>но силенок работать в таком режиме и таком стрессе у меня уже нет
Велкам ту программирование, года через три будет немного полегче, а спустя еще два всё просто заебет до невозможности.
Аноним 2016/05/09 18:21:17  №738490 479
>>738477
Да ты успешен. Вангую зп 2к бакинских уже через год.
Аноним 2016/05/09 18:28:04  №738494 480
>>738490
неужели английский так влияет на зп?(другой анон)
Аноним 2016/05/09 18:30:25  №738497 481
>>738494
В Украине очень влияет, у них своих продуктов нет, поэтому вся Украина это рынок дешевой рабочей силы для белых людей.
Аноним 2016/05/09 18:32:37  №738500 482
>>738409
>в тот же день из этой конторы мне перезвонили, сказали что нужно готовиться, завтра у меня собеседование с заграничным заказчиком и скинули мне мое резюме, чтоб я ознакомился, в котором было указано что-то около 4х лет опыта разработки magento и год разработки magento 2.
Хуже всего то, что так почти всегда бывает.
И на фрилансах, и в реальной жизни - везде привирают.
Это какое-то днище для заказчика или того, кто нанимает на работу.
Это я как заказчик говорю.
Ну а с другой стороны, платить мидл-сениору 500 баксов - это сурово, очень сурово.
Но, походу, все тупо в курсе, не дураки ведь.
Аноним 2016/05/09 18:33:41  №738501 483
>>738494
Хоть я еще и не джуниор, но английский по идее должен сильно возвышать тебя. Открывается весь мир клиентов из стран, в которых зп в 10 раз больше, чем в рашке.
Аноним 2016/05/09 18:34:39  №738503 484
>>738494
Имхо его только и наняли из-за английского. Софт скиллс, лел.
Аноним 2016/05/09 18:39:59  №738508 485
Проигрываю с вебмакак за 15к в месяц.
Аноним 2016/05/09 18:40:20  №738509 486
>>738508
Байтослесарь за 16к?
Аноним 2016/05/09 19:10:32  №738538 487
Ну так что, анонасы, какой бесплатный хостинг посоветуете?
Аноним 2016/05/09 19:12:28  №738539 488
Аноним 2016/05/09 19:14:22  №738542 489
>>738539
Так эта параша требует отправить смс за 50р.
Аноним 2016/05/09 19:23:54  №738550 490
>>738542
тебе что, жалко 50 рублей? На толоке накликай.
Аноним 2016/05/09 19:31:29  №738554 491
>>738550
Нет офисов Яндекса в городе.
Аноним 2016/05/09 19:32:58  №738556 492
>>738554
поаскай на улице или попроси у анонов. Я как-то на домен себе 150 рублей напопрошайничал.
Аноним 2016/05/09 19:34:17  №738557 493
>>738556
Да мне нужно сейчас сайт закинуть для дипломной работы. Это необязательно, но желательно.
Аноним 2016/05/09 20:21:18  №738578 494
Бампану предыдущие просьбы
>>736701
>>736833
Настрочил еще две задачи из раздела "Повторим?". Проверьте, плез, кому не сложно. Хотелось бы знать ваше мнение по поводу решения.
https://ideone.com/n2jYia
https://ideone.com/07D9j9
Ответы Аноним 2016/05/09 20:55:57  №738598 495
>>731871

> $array = [];
Название ничего не значит. Массив чего?

> function spellSmallNumber($number, $number1, $female = null){
Вот это странный заголовок функции. Что такое number? чем оно отличается от number1? Непонятно. Ну и это нелогично, это функция которая преобразует небольшое число в строку, зачем передавать ей 2 числа?

Вот когда ты видишь что-то такое "нелогичное", скорее всего это говорит о том что код сделан неправильно.

Я вижу, оно используется в проверке не ноль, но это значит что эта проверка просто должна быть не в функции. Это не ее задача. Если у тебя 0 миллионов, то надо просто не вызвать эту функцию. Надо переделать код так, чтобы передавалось только одно число.

> function zeroinNumbers(
Логичнее было назвать addIfNotZero. Название функции начинается с глагола. сам код можно было написать проще, if ( ...) { ... } без else.

Использование ссылок это в общем плохо. Вот посмотри:

> zeroinNumbers($hundreds, $numbertoWords, $array); //Сотни

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

Если (в числе есть сотни) {
добавить слово для сотен;
}

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

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

> }
> elseif($lastDigit == 1){
Это идет в одну строку: } elseif (...) {

> if($millions == 0 && $thousands != 0){
> return $thousandstoWords . $unitstoWords;
> }
> elseif($thousands == 0 && $millions != 0){
> return $millionstoWords . $unitstoWords;
Тут лучше было применить прием с добавлением в масив. А то если мы добавим еще миллиарды, то число комбинаций возрастет.

>>731882

> По задаче вопрос, для чего тут имеет смысл использовать фабрику?
А я такое советовал? Вообще, тут фабрику можно использовать для создания работников по названию и рангу. В данном случае я фабрикой назвал функцию которая производит объекты, а не тот сложный паттерн с кучей классов и интерфейсов.
Аноним 2016/05/09 22:27:54  №738671 496
>>738409
Норм все у тебя, так программистами и становятся. Подумай вот о чем - еще несколько месяцев таких мучений, и ты и правда миддлом станешь, потом тебе везде дороги открыты. А вот как ты хотел, чтобы учили и показывали, так редко бывает, да и не научишься ничему особо. Если тебя держат, и кое-как справляешься, то так оно и должно быть. В свободное время почитывай книги по программированию, задавай вопросы на форумах, юзай stackoverflow.
Аноним 2016/05/09 22:34:24  №738676 497
>>738409
Еще, забыл упомянуть - тебе это в кайф начнет становиться со временем. Стресс пройдет с увеличением скилла. Чем активнее читаешь и пробуешь, больше тикетов делаешь - тем тебе все это больше нравиться начинает. Потом будешь на джунов и их проблемы еще с усмешкой посматривать, разве же это проблемы.
Аноним 2016/05/09 22:46:39  №738695 498
1)В каких случаях в MVC стоит создавать класс представления вместо обычного шаблона?

2)Как сказать апачу что индекс.php у меня в папке public и ссылаться надо на него? Сейчас в htacess прописано:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]
Аноним 2016/05/09 23:06:05  №738704 499
>>738500
Платят там наверняка тыщи 2-3, а до анона доходит ток 500.
Аноним 2016/05/09 23:11:11  №738707 500
>>738409
Помню тебя, я примерно в то же время делал студентов (года 1.5 назад) и тоже нашел работу. Но у меня ситуация другая: есть люди которые имеют опыт и которые отвечают на вопросы и могут помочь но зп низкое (250$) на данный момент (для моей мухосрани норм). Сперва были задачи по джумле/вордпресс, сейчас онли интернет-магазины. Верстку тоже пробовал на паре сайтов. В свободное время изучаю js. атмосфера в коллективе прекрасная. Стрессы тоже есть, куда без этого но есть и поддержка. Работаю почти год.
Аноним 2016/05/10 00:01:22  №738758 501
Вот интересно, иногда мы видим какие-то библиотеки или фреймворки, которые вроде особо не используются, но почему-то о них много говорят. А вот тут вот (англ.) описано что автор фреймворка PHPPixie накручивает установки на пакаджисте (репозитории композера) и с помощью ботов создает видимость коммьюнити на реддите: http://andrewcarteruk.github.io/programming/2016/05/09/phpixie-fraud.html https://news.ycombinator.com/item?id=11661986 Видимо очень хочется славы и известности.
Аноним 2016/05/10 00:20:27  №738781 502
Аноны, кто с ВК работал? Как там можно собрать список из айдишников или ссылок на подписчиков определенного сообщества? Есть метод в АПИ, но он собирает только первую тысячу, а мне надо несколько десятков тысяч.
Аноним 2016/05/10 00:32:44  №738789 503
>>738781

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

И вообще, это тред про программирование а не про спам и SMM (что в моем понимании одно и то же).
Аноним 2016/05/10 00:37:13  №738795 504
>>738758
Это хипстерские фреймворки. О них говорят, чтобы быть сойти за продвинутого в последней моде.
Аноним 2016/05/10 00:37:22  №738796 505
>>738781
Документацию почему не читаешь?
http://vk.com/dev/groups.getMembers
Максимальное значение получаемых айдишников - 1000. В запросе можно указать offset. Вот так и получаешь - выбрал 1000, увеличил оффсет на 1000, выбрал вторую тысячу и т.д.
Одним циклом можно все сделать.
Аноним 2016/05/10 00:37:48  №738797 506
14628298686580.png (11, 490x267)
267x490
14628298686581.png (11, 475x272)
272x475
>>738781
Там же есть параметр offset
Аноним 2016/05/10 00:38:38  №738798 507
Аноним 2016/05/10 00:39:22  №738800 508
>>738798
Ну что ты вот это сразу, не пользуюсь я им, просто по работе нужно было.
Аноним 2016/05/10 00:50:33  №738810 509
>>738796
>>738797
Благодарю :3
Про оффсет я действительно проглядел.
>>738789
>это тред про программирование а не про спам и SMM
Так я просто для себя хотел программку написать легкую чтобы помогла отслеживать прирост подписчиков от рекламы. Спам тут не при чем.
Аноним 2016/05/10 00:57:13  №738816 510
>>738810

Ну ладно тогда. Но по моему тогда проще будет получать только общее число подписчиков.
Аноним 2016/05/10 01:10:34  №738828 511
>>738816
Нет, тут дело в том, что мне нужна информация о конкретном количестве подписчиков одного сообщества, которые после рекламы стали подписчиками моего. И подписчиках моего, которые подписались на сообщество другого человека. После взаимного репоста записей в наши сообщества. Я бы тогда смог отслеживать эффективность рекламы как в моем, так и в других сообществах и искать наиболее подходящих.
Аноним 2016/05/10 02:50:31  №738883 512
>>738671
>еще несколько месяцев таких мучений, и ты и правда миддлом станешь
У него времени на это становление нет - ad-hoc влепил что-то более-менее с натяжкой, а тут следующий тикет меж булочек лезет. Но можно взять перерыв на год через несколько месяцев и подтянуть свой уровень на основе приобретенного опыта.
Аноним 2016/05/10 09:29:29  №738970 513
>>738883
>>738707
>>738671
Спасибо аноны за поддержку.

>А вот как ты хотел, чтобы учили и показывали, так редко бывает, да и не научишься ничему особо.
На самом деле я забыл упомянуть что самая главная проблема именно в том что по magento 2 практически вообще еще нет инфы, есть две базовые книжки и документация, все это я уже перечитал вдоль и поперек, а больше инфы нету практически, ни на стаковерфлоу ни в гугле. Только чтение и изучение кода ядра, только хардкор
Аноним 2016/05/10 12:59:09  №739146 514
14628743496570.jpg (107, 680x410)
410x680
Пилите перекат.
Аноним 2016/05/10 13:05:15  №739151 515
14628747157030.jpg (47, 600x600)
600x600
14628747157031.jpg (45, 500x500)
500x500
Аноним 2016/05/10 13:09:52  №739157 516
14628749922170.jpg (57, 800x480)
480x800
Аноним 2016/05/10 13:14:03  №739162 517
Аноним 2016/05/10 13:14:54  №739165 518
Аноним 2016/05/10 14:26:24  №739214 519
Опытные аноны, посоветуйте, что делать дальше вкатывающемуся в профессию программиста. Вот я закончу уроки опа, далее я вижу такие варианты:
1. Устроиться в любую около-веб шарагу в своем 700к мухосранске. Зп 35-40 к.
Плюсы - достаточно легко найти работу. Возможно получится немного откладывать 5-10 к.
Минусы - зп будет хватать только на аренду + еда + учеба + активити вроде тренажерного зала. Отсутствие профессионального и карьерного роста. Предполагаю, что не будет времени или сил для прокачки чего-либо кроме кмс.

2. Попытаться устроиться в сириоус контору, вроде крока или ланнита, имеющую филиалы в моем городе.
Плюсы - такие-же как и в первом пункте, + профессиональный и карьерный рост. Постепенное увеличение оклада. Плюс для дальнейшего трудоустройства, т.к. будет опыт работы в серьезной конторе. Слышал, что Ланнит точно проводит обучение своих сотрудников.
Минусы - оче мало вакансий, серьезный отбор, и сравнительно большая конкуренция среди соискателей. Т.е. есть вероятность, что с моим медскилзом не возьмут.

3. Фриланс.
Плюсы - есть время на прокачку. Довольно широкий спектр задач, которые придется решать (он же минус).
Минусы - не постоянный доход, вероятно, я не смогу снимать квартиру первое время, а может и вообще не смогу, т.к. придется жестко самоорганизовываться, чтобы постоянно обеспечивать себя новыми заказами.

4. Удаленная работа. Тут я не совсем в теме, как найти, какие будут условия. Очевидно если работать на СНГ, то зп будет как в п.1 или даже ниже. Если на буржуев, то возможно и выше.
Плюсы - постоянный доход, не обязательно носить штаны на работе.

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

6. Сразу искать работодателя за бугром. Я думаю, что мне, для начала, нужно что-то, что я пока сам не знаю. В Канаду и Австралию, можно эмигрировать официально. И искать работу уже на месте, судя по форумам, этот вариант проще. Но нужно год потратить на бюрократию, и накопить достаточную сумму, чтобы не умереть с голоду, пока буду искать там работу.

Какой стул выбрать, если моя цель завести трактор, отложить 5-10k$ на эмиграцию, мне 28 и я заканчиваю первый курс заочки? Еще, я бы хотел заниматься, чем-то вроде анализа больших данных, или систем на основе машинного обучения или стрелять лазером из глаз.
Аноним 2016/05/10 14:29:43  №739217 520
Анон, помоги идиоту сделать задачку из обучения, в чем моя ошибка? Хочу разобраться, реально понять, а не просто списать с инета...
https://ideone.com/5RnMlV
https://github.com/greenTea242/StudentList Аноним 2016/05/10 15:07:14  №739250 521
>>731987

https://github.com/greenTea242/Student_List

> https://github.com/greenTea242/Student_List/blob/master/public/index.php#L30
> if ($pager->checkPossiblePages($myPage)) {
> $abiturients = $gateway->getAbiturientsInPage($recordsPerPage, $pager->getOffsetForDB($myPage), $sort, $search, $order);
> }
А что если if не сработает? Чему будет равна $abiturients? Это очень подозрительно, когда переменная создается внутри ифа, а используется снаружи.

> require_once "../src/ini.php";
Не стоит подключать файлы с относильным путем, надежнее указывать полный путь через __DIR__, так как правила по которым php ищет файлы с относительным путем, очень мутные.

> /Массив свойств для заполнения модели/
> $properties = [
> "token",
Зачем разрешать перезаписывать токен? Пользователь разве может его редактировать?

https://github.com/greenTea242/Student_List/blob/master/public/register.php#L29
> if (!empty($_POST[$property])) {
А если пользователь при редактировании захочет очистить какое-то поле, эта проверка ведь его не пропустит?

https://github.com/greenTea242/Student_List/blob/master/public/inc/login.php
Почему этот файл в публичной папке?

> if ($gateway->isAbiturientExist($abiturientID, $token)) {
> $abiturient = $authorizator->getStudent($abiturientID);
> $authorizator->logIn($abiturientID, $token);
Это странный код: если куки устанвлены и они правильные, установим их еще раз. Зачем?

> $authorizator->setToken($token);
> $abiturient = new Abiturient();
не очень понятно зачем для незалогиненного студента ставить токен, и создавать объект.

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

> https://github.com/greenTea242/Student_List/blob/master/src/Authorization.php#L12
Этот метод странный. Вообще, класс авторизации у тебя умеет ставить куки, но не умеет проверять. Мне кажется логично применить тут принцип инкапсуляции и поместить всю работу с авторизационными куками в класс авторизации. Чтобы внешний код не знал как сделана авторизация и какие куки используются.

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

> https://github.com/greenTea242/Student_List/blob/master/src/AbiturientDataGateway.php#L210
> if ($counter == 1) {;
Безопаснее писать > 0, а не равно 1. Точка с запятой после открывающей скобки не ставится.

https://github.com/greenTea242/Student_List/blob/master/src/AbiturientValidator.php
тут мне не нравится что трудно понять как пользоваться этим классом. Почему нельзя сделать один метод валидации, куда мы даем студента и получаем список ошибок, а не гадать в каком порядке надо вызывать методы?

https://github.com/greenTea242/Student_List/blob/master/src/AbiturientValidator.php#L151
Букву ё надо указывать отдельно.

https://github.com/greenTea242/Student_List/blob/master/src/TokenHelper.php
Насчет этого класса. Опять же, я думаю, надо инкапсулировать работу с CSRF кукой внутри него. А сейчас у тебя за проверку и генерацию токенов отвечает внешний код.

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

У тебя этот принцип не выполняется. И то, что ты там делаешь проверку на слово "mark" (<> воспринимаются как ограничители в регулярке) это костыль.

Я думаю, замену стоит делать так: сформировать регулярку вида:

длинноеслово1|среднееслово2|слово3

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

> $searchWords = preg_split("/[^\\w]+/ui", $search);
Кстати тут принуип разбиения не совпадает с тем что используется в формировании шаблона для LIKE. Ты нарушил принцип DRY, продублировал код и вот последствия.

https://github.com/greenTea242/Student_List/blob/master/src/config.php
В конфиг стоит класть то, что можно менять и желательно в более простом виде. DSN сложный и в нем нельзя поменять тип БД так как твой код вряд ли заточен на любые базы данных. Потому стоит в конфиге просто сделать хост, порт, имя, пароль, название БД. Ну и количество записей.

https://github.com/greenTea242/Student_List/blob/master/templates/index.html#L3
> <?php require_once("/inc/head.html"); ?>
Не будет же работать, это абсолютный путь от корня диска.

Тут в файлах скопипащена часть тегов, например body и head:

https://github.com/greenTea242/Student_List/blob/master/templates/register.html
https://github.com/greenTea242/Student_List/blob/master/templates/index.html

Копипаста - плохо.

> <p>Показаны только абитуриенты, найденные по запросу "<?=$search?>".</p>
Где защита от XSS? Перечитай урок.

> <?php if ($order == "asc"): ?>
> <?php else: ?>
Тут ведь явно почти одно и то же. Нельзя ли это упростить за счет функций?

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

> <?php if ($search): ?>
> <td><?=ViewHelper::paintFound($abiturient->getName(), $search)?></td>
> <?php else: ?>
> <td><?=htmlspecialchars($abiturient->getName(), ENT_QUOTES)?></td>
Тоже по сути копипаста. Хорошо бы объединить paintFound и htmlspecialchars в одну функцию.

> <p><a href="<?=$_SERVER['PHP_SELF']?>"
Нехорошо что шаблон лезет в SERVER. Пусть ему URL передают снаружи.

> <?php for ($pageNum = 1; $pageNum <= $pager->getTotalPages(); $pageNum++): ?>
> <?php if ($pageNum == $myPage): ?>
> <?php elseif ($pageNum == $myPage + 1 ||
> $pageNum == $myPage - 1 ||
Эта логика по выбору номеров смотрится очень неуклюже. Нелзя ли в пейджер ее перенести и например сделать чтобы он возвращал список номеров страниц для отображения?

> <?php if(!empty($errorList['name'])): ?>
> <div class="control-group has-error">
> <?php endif ?>
Вот это плохо. ты целый див добавляешь при ошибке который может влиять на верстку. Мне кажется, добавялять надо только один класс.

> pattern="<?=$validator->getHTML5RegExpForName()?>"
Спецсимволы стоит экранировать

> &quot - &quot(дефис)
Точка с запятой забыта после quot, почитай про html мнемоники

https://github.com/greenTea242/Student_List/blob/master/templates/register.html#L120
Тут инпуты выбора пола скопипащены 3 раза. Избавься от копипасты.

https://github.com/greenTea242/Student_List
Тут разметка в ридми кривая.

> Установка кук для токена существует отдельно потому что в register.php проверяется защита на СSRF во время отправки формы, т.е. до момента регистрации студента и выставления оных.
Наверно лучше использовать разные токены, один для авторизации, другой для CSRF. И кстати я подумал, авторизационный токен - он ведь уникальный, и id студента в куки можно не класть.

> Ты мне советовал для выделения слов при поиске использовать preg_replace_callback. У меня не получилось ее правильно использовать, потому что она сразу меняет параллельно все совпадения по массиву регулярок и нигде нельзя посмотреть процесс изменения текста, а мне нужно сделать так, что если это совпадение уже в тегах <mark>, мне это не нужно делать.
Нет, прочитай выше, замену надо делать в один проход. preg_replace_callback это бы позволил сделать, как впрочем и другой вариант, что я предложил.
Ответы 1 мая Аноним 2016/05/10 15:07:40  №739251 522
>>732203

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

> Тогда с 33 по 126 брать, довольно солидно выглядит.
ну ок

>>732272

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

В базе хранишь не пароли, а только соленые (не обычные) хеши от них.

>>732331

Тут далеко не день. Тебе минимум пару месяцев изучать сначала теорию придется.

>>732421

Выглядит очень переусложеннным. И сам алгоритм, и то как ты пишешь код.

> $temp1
Это название ничего не значит, а название должно соответсвтовать тому что хранится внутри.

> $numberOfPupils = 10;
Число учеников надо не считать вручную а получить из массива имен. Или они не связаны?

> $classList[$i]['name'] = $names[$index];
> $classList[$i]['height'] = 150 + mt_rand(0,50);
тут наверно проще было сделать массив вида имя => рост.

> echo "{$classList[$i]['name']} {$classList[$i]['height']} {$classList[$i]['isAnone']} <br>";
Тут много раз повторяется $classList[$i], тебя это не беспокоит? Вообще, это повторяется очень много раз в коде и это плохо.

То же касается $classList[$maxIndex]

> for ($i=1; $i<=$numberOfPupils; $i++) {
> if ($maxHeight < $classList[$i]['height']) {
тут надо использовать foreach, он лучше годится для обхода массива.

> if ($i == $temp1) {
> $classList[$i]['isAnone'] = 'Это анон';
Это поле не нужно так как всегда можно проверить индекс.

В общем, надо переделывать.
Ответы 2 мая Аноним 2016/05/10 15:08:00  №739252 523
>>732615

можно

>>732654

> задачу про калькулятор.

> function abc(&$op, &$char, &$number, &$result){
> $op = $char;
Ой, как много ссылок. Зачем? Вообще ссылки это плохо так как удобнее когда функция возвращает результат явно. да еще и половина из них не используется.

И что за бредовое название? Названия функции начинаются с глагола, сделайЧтоТо.

Тут вообще эта функция не нужна, код в ней можно поставить под блоком if/else

В остальном верно.

> Пока не доходит до меня как ввести поддержку дробных чисел.
Можно сделать переменную-флаг, показывающую встретили мы уже точку (или запятую) или нет, и если встретили, то добавлять цифры по другому приницпу (делим число на 10 в степени N и прибавляем). Ну и проверки добавить, что в числе нет двух точек например.

> Задача про банкомат.
> echo "Выдача возможна, число купюр:\n";
не говори "гоп", пока не перепрыгнешь: http://ideone.com/3kTQeP - твой банкомат зажал 100 тугриков.

> $abc =
переменным надо давать осмысленные имена

>>733136

Что значат URL? Ты имеешь в виду каждый раз ли разрешается имя домена в IP адрес? Да, каждый, но результат может кешироваться, благо сам протокол DNS требует указать время в течении которого ответ можно использовать без повторных запросов.
Ответы 2 мая Аноним 2016/05/10 15:08:18  №739253 524
>>733183

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

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

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

Ну и смотрите какие вы там библиотеки и плагины используете, гуглите, может они устарели уже и надо обновить.
Аноним 2016/05/10 15:17:21  №739263 525
>>738409

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

Конечно заказчик и сам немного виноват что толком не проверил тебя.

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

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

> или уходить и искать что-то более адекватное с прошаренными коллегами
Если есть варианты то можно попробовать. Но не окажется ли там то же самое? Насколько я знаю, то, что тебе нужно есть в крупных организациях-аутсорсерах, у них там и сеньоры настоящие есть, и всякие современные штуки используются.
Аноним 2016/05/10 15:19:14  №739267 526
>>739217
У тебя в цикле нет никаких действий, кроме echo.
Ещё:
>PHP Notice: Undefined variable: b in /home/YImoVw/prog.php on line 3
В начале ты объявил $a = ( $b * $b );, но ведь ты не объявил, чему равна $b. Всегда читай, что пишется в заметках - это помогает увидеть ошибки, для того они и нужны.
Тебе сейчас нужно определить переменные и поставить то выражение в тело цикла.
Аноним 2016/05/10 15:29:33  №739279 527
>>739263
Оп, как устроиться в "в крупную организацию-аутсорсер"? Я понимаю, что ответ: открыть hh и посмотреть требования в вакансиях. Но ведь там часто пишут больше, чем реально требуется. И берут с меньшим количеством навыков и знаний. Или нет? У тебя есть опыт, возможно ты знаешь саксес стори коллег по цеху или твоих учеников. Какой реальный порог входа для подобных организаций?
Аноним 2016/05/10 15:37:13  №739287 528
>>738501

> в которых зп в 10 раз больше, чем в рашке.
Давай не будем преувеличивать, далеко не в 10. В Европе программисты вообще не сильно больше среднего европейца получают, а самые большие зарплаты только в Калифорнии и в штате Нью-Йорк. И то, там условия жизни не сладкие, жилье дорогущее, транспорт плохой, пробки, постоянная нервотрепка. И внезапно в США ты сам платишь со своей зарплаты налоги, да еще и немаленькие. ЧТо-то я не уверен что в 10 раз больше. В странах СНГ хорошим разработчикам могут платить до 2000 -3000 долл.

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

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

"хорошо там, где нас нет" в общем.

Мне вспоминается история про тян из техподдержки которой там еду не на что покупать было: https://vc.ru/p/yelp-fired

Конечно в США можно жить хорошо - если ты из богатой семьи или если ты смог развить успешный бизнес. Но не всем так везет.
Аноним 2016/05/10 15:45:21  №739303 529
>>739279

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

> Но ведь там часто пишут больше, чем реально требуется. И берут с меньшим количеством навыков и знаний
Не знаю. Но кто тебе мешает это изучить?
Аноним 2016/05/10 18:54:52  №739590 530
>>739267
Спасибо добрый человек.
Удивительно, после стольких лет на двощах увидел тред в котором исключительно адекватные люди помогают другим, без агрессии, злобы и высокомерства. Прямо на душе теплее стало
Аноним 2016/05/10 18:55:51  №739591 531
Аноним 2016/05/10 20:35:49  №739689 532
>>739591
стало теплее не толькотеа душе <3
Аноним 2016/05/10 20:53:57  №739718 533
14629028372480.jpg (121, 900x675)
675x900
Сап, пыхач, я не твой. Доставьте годный видеогайд, желательно на русском, как пошагово напилить интернет магазин на Php, mysql, вот это всё. Заказать не вариант, денег лишних нет, сам немного могу в кодинг, но боюсь что-то упустить, на Ютубе одни дауны или древнее говно. В одном из тамошних курсов хуйлан постоил интернет-магаз с скл-иъекциями и говорит в конце "вот смотрите мы слепили хороший сайт, за который готовы платить". Короче, доставьте хороший, годный.
Аноним 2016/05/10 21:59:40  №739826 534
>>739214
1. Будет какое-нибудь говно устаревшее и говнокод. Увязнешь.
2. Норм вариант. Возьмут или не возьмут, зависит от того, кого набирают в данный момент. Иногда и сосем джунов берут. В любом случае, если возьмут, то многому научишься.
3. Время на прокачку тебе никто на фрилансе давать не будет. Везде хотят быстро, и чтобы вчера сделано. Естественно один говнокод с такими условиями. Клиенты будут кидать регулярно, пока базу не наберешь.
4. Норм вариант, но найти сложно. Из минусов, что удаленщиков вся остальная фирма за халявщиков держит. Коммуникации осложнены. Все заслуги будут офисным доставаться, а тебя как малоценного работника держать будут.
5. Откладывать вряд ли сможешь сильно больше, жилье дорогое же и все дорогое в ДС. Зато сможешь работу за неделю сменить, если надоест, их полным-полно, и берут охотно.
6. Без законченного высшего будут проблемы с визой, придется закончить сначала. А так, да, лучший вариант, и зарплаты самые высокие. Ну и инглиш конечно выучить надо.
Аноним 2016/05/10 22:06:03  №739832 535
>>739287
Работаю в европке. Джунам платят 2500 евро брутто, сеньерам 5-7 штук. С работой проблем нет, много ее.
Аноним 2016/05/11 00:17:15  №739964 536
14629150352400.png (92, 1366x768)
768x1366
Первую страничку пока токо сделал.
https://github.com/nsdvw/TestHub

По поводу прав на логи/кеш, перепробовал уже все комбинации. Давал любые права,
в том числе три семерки (как знаменитый портвейн), добавлял ввв-рута себе в друзяшки,
и сам к нему добавился.
Все равно какая-то фигня, там в standard-edition в композере какие-то пост-установочные
скрипты (от Distribution bundle), в том числе они должны чистить кеш. Но очистить кеш у него
не получается, говорит нет прав и вдобавок откатывает composer.json, сволочь.
То есть я даже бутстрап установить не мог, он откатывал изменения.

Помогло только заклинание, которое дают в документации по установке.
Что тут вообще написано?
$ HTTPDUSER=`ps axo user,comm | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\ -f1`
$ sudo setfacl -R -m u:"$HTTPDUSER":rwX -m u:`whoami`:rwX var
$ sudo setfacl -dR -m u:"$HTTPDUSER":rwX -m u:`whoami`:rwX var

Да, и почему оно работает только в dev режиме? В prod 404 на любой запрос.
А, нет, уже работает. Но стили похерились.
Аноним 2016/05/11 00:45:37  №739998 537
>>739964
>Что тут вообще написано?
Вроде бы ищет апач в списке процессов, потом отсеивает рутовые апачи, и выдирает юзера из апачей, которые не под рутом. Потом ставит права этому юзеру на папку var.
Аноним 2016/05/11 00:48:44  №740004 538
>>739998
Точнее двум юзерам права дает на папку var и все ее подпапки. Тебе и тому, на кого апач найденный запущен.
Аноним 2016/05/11 02:09:14  №740027 539
Помогите с шестой задачей отсюда ( https://github.com/codedokode/pasta/blob/master/html/html.md ).

Какие есть способы сделать так, чтобы текст статьи не наезжал под меню? Я так понял, что мне нужно растянуть меню до нижней границы экрана. Как это можно сделать? Если выставить свойство height: 100% ничего не происходит. Получилось выставить лишь точное значение.

Исходники прилагаю: https://github.com/codedokode/pasta/blob/master/html/html.md
Аноним 2016/05/11 02:20:32  №740030 540
Аноним 2016/05/11 08:11:16  №740120 541
14629434763170.jpg (105, 1024x683)
683x1024
>>729430 (OP)
Ребятки, помогите плиз.
В файле .htaccess эти строчки:
RewriteRule ^.$ [NC,L]
RewriteRule ^.
$ index.php [NC,L]
Какого-то хуя убивают страничку, на которой расположен простенький ajax чатик. Всё остальное работает отлично. Отличие этого ajax чатика, от всех остальных страниц в том, что в нём инклудятся другие соседние файлы. С чем сввязано, как поправить ?
Аноним 2016/05/11 08:25:19  №740126 542
>>740120
Точнее не убивают, а скорее заставляют сайтик игнорировать скрипты, которые должны выполняться.
Аноним 2016/05/11 09:32:13  №740139 543
>>739964

Проблема с правами действительно есть. В общем случае у нас есть пользователь, от которого работает PHP (www-root или apache) и N пользователей-разработчиков которые могут править код, запускать скрипты.

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

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

Вдобавок есть еще так называемый umask. Он определяет какие биты будут сброшены в разрешениях на создаваемые файлы и папки. Ты можешь увидеть свой umask командой umask, и в php есть опция для его указания.

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

Вот какие я способы решения видел:

- создается отдельный пользователь для сайта, например, testhub, и php-fpm запускается от его имени. Для разработчиков добавляется право делать sudo в testhub через sudoers. Соответственно cli скрипты тоже запускаются от того же пользователя. Все файлы также принадлежат этому пользователю.

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

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

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

http://linux.die.net/man/5/acl
http://linux.die.net/man/1/setfacl

Можешь немного поизучать эту тему и подумать, как лучше все это делать.
Аноним 2016/05/11 09:46:33  №740148 544
>>740027

> Какие есть способы сделать так, чтобы текст статьи не наезжал под меню?
А ты внимательно изучил особенности флоатов в учебнике на softwaremaniacs? Их надо знать наизусть.

Способ решения который подойдет здесь и во многих других случаях, такой: делаем меню флоатом, а контент - обычным блоком с паддингом слева. Чтобы загнать меню на паддинг, используем отрицатеьный маргин, мини-урок: https://gist.github.com/codedokode/3f6063edf0a2227eb313

> Я так понял, что мне нужно растянуть меню до нижней границы экрана. Как это можно сделать?
Только используя display:table-cell (или флексбокс который пока не везде работает), то есть заставить блоки меню и контента вести себя как ячейки таблицы. Но в данном случае с флоатами наверно удобнее.

О! Вот тебе задание. Изучи особенности работы display: table, display: table-row, table-cell. Сравни варианты верстки сайта из нескольких колонок флоатами и таблицей.

То есть у нас есть сайт из центральной колонки и одной или нескольких колонок сбоку. Довольно типичная ситуация.

Сравни преимущества и недостатки каждого способа. ну например:

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

Это мини-исследование поможет тебе лучше понять принципы расстановки и позиционирования блоков в CSS. Уверен что потраченное на него время окупится сторицей, благодаря тому что ты будешь лучше разбираться в CSS и быстрее решать какие-то проблемы в верстке.
Аноним 2016/05/11 10:08:27  №740164 545
Приветствую вас, господа пограммисты.
Застрял на задаче про полином из стартового курса.
Вот ссылка: http://ideone.com/1PghDS Все время говорит что фраза не полином, хотя она полином, сука. Подскажите, где я обосрался?
Заранее спасибо за помощь.
Аноним 2016/05/11 10:13:39  №740169 546
>>739964

По дизайну:

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

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

Конечно, подчеркивание, особенно когда его много, сильно отвлекает внимание и оно бывает "тяжелым" на надписям крупного размера. Но для этого есть способы борьбы - например подчеркивание можно делать через border-bottom на inline-элементе, сделав его тонким и бледненьким.

https://www.artlebedev.ru/kovodstvo/sections/171/

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

Логотип норм.

https://github.com/nsdvw/TestHub/blob/master/tests/AppBundle/Controller/DefaultControllerTest.php
Тест стоит удалить как и сам default controller.

А, еще, какую БД ты используешь? Если mysql то советую вместо нее попробовать постгрес. Она использует тот же SQL так что на 80% там все то же, но у нее есть много других возможностей:

- строгий режим включен по умолчанию
- соответствие стандартам ANSI SQL
- поддерживается CHECK на колонках и таблицах (погугли что это)
- индексы по выражениям
- географические типы данных и индексы (вроде найти точки в радиусе R от данной)
- полнотекстовые индексы
- поддержка JSON с индексацией

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

Плюс, не знаю, важно ли это, но сейчас есть некоторое движение по замене Oracle/MSSQL на открытые БД во всяких крупных организациях, госорганизациях и обычно как замена используется именно постгрес. Хотя это конечно происходит не с такой скоростью, как хотелось бы.

Насчет генерации схемы из моделей. Это конечно красиво выглядит в теории, но на практике этого будет недостаточно, так как тебе захочется добавлять разные SQL опции в таблицы. Так что настраивайся на то, что надо будет переходить на SQL дампы и миграции.
Аноним 2016/05/11 10:24:14  №740175 547
>>739964

Вообще команды от Симфони плохие. Они непонятные и там нет защиты от ошибок. Что если Апач не запущен? Что если запущен, но для других целей? Мне они не нравятся.
Аноним 2016/05/11 10:49:51  №740187 548
>>739964

В ридми ты забыл упомянуть что после правки конфига надо почистить кеш симфони (cache:clear --env=-prod), также надо сделать assetic:dump для prod так как composer install почему-то делает его для dev.

И конечно там какой-то ад с этими конфигами, их много.
Аноним 2016/05/11 10:52:43  №740188 549
>>740164

Перед этой строчкой

if ($text[$i] == $text[$x]) {

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

И кстати, с чего ты взял что $text[$i] это i-я буква? Это i-й байт, в utf-8 буква состоиит из нескоьких байт и это не работает, урок https://gist.github.com/codedokode/ff99e357e9860ea169b8
Аноним 2016/05/11 10:57:52  №740192 550
Задачка Аноним 2016/05/11 11:00:21  №740193 551
Алсо, дам еще такую задачку поломать голову. Допустим, мы хотим отслеживать случаи падения браузера на нашем сайте. Браузер может падать по разным причинам: нехватка оперативной памяти, баги в самом браузере или плагинах. В случае с однопроцессным браузером вроде фаерфокса, падает весь браузер, а в многопроцессных - отдельная вкладка (наверняка вы видели грустную рожицу в хроме).

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

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

Предложите ваши варианты реализации системы сбора такой информации.
Аноним 2016/05/11 11:07:21  №740200 552
>>740164
>полином
>где я обосрался?
Уже на этом месте, например.
>$text = mb_strtolower ($text);
>$text[$i]
Ты путаешь строки и массивы.
Предыдущие задачи точно решил? Покажи парочку (или ссылки на них в треде дай, если уже показывал).
Аноним 2016/05/11 11:42:03  №740209 553
Кто-нибудь работал с PHPmorphy? Как определить число (единственное или множественное) в котором слово находится?
Аноним 2016/05/11 11:53:13  №740213 554
Посоны, прошу пояснить за сессии.

Допустим, постом передаём логин и пасс скрипту, делаем проверку с БД и если всё забеись, делаем такое $_SESSION['logged_id'] = 1;


Теперь, для того, чтобы отобразить закрытую страницу, достаточно просто чекнуть
if (isset($_SESSION['logged_id']) {# some shit}
так?

Вопрос в том, может ли сторона юзера это как-то подделать? Сессии же по идее на серваке храняться, так что видимо, не может?
Сегментация рынка Аноним 2016/05/11 13:23:57  №740281 555
Раз никто не спрашивает вопросов по задачкам.

Прочел новость про то что Тесла продает "программный" апгрейд аккумулятора: https://m.geektimes.ru/post/275516/

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

Это все конечно чушь. Цена на S70 полностью покрывает стоимость более мощного аккумулятора. Реальная причина - сегментация рынка с целью заработать больше денег. Про этот принцип хорошо написал Джоэл: http://russian.joelonsoftware.com/Articles/CamelsandRubberDuckies.html (очень интересная статья)

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

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

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

А плохо станет, когда выбора уже не останется.

Аноним 2016/05/11 13:47:27  №740301 556
Посмотрите пожалуйста решение задачи для новичков про кредит, и подскажите нормально или говнокод?
http://codepad.org/525kYmga
Аноним 2016/05/11 15:31:53  №740367 557
Анон, ты перекатывать будешь вообще?
Аноним 2016/05/11 15:33:26  №740368 558
Аноним 2016/05/11 16:08:50  №740408 559
>>740301
>11 месяцев спустя, долг = 4138.1720657184, выплачено 55000
Смотри, у тебя долг на 11-ом месяце 4138 с копейками. Далее тебе надо ещё раз прибавить к этому 3% и комиссию в 1000 рублей. Это происходит у тебя, но остаётся 262 рубля.
После этого твой скрипт просто прибавляет их к окончательной сумме выплат и всё.
А ведь он должен снова прибавить уже к 262-м рублям 3% и 1000 рублей комиссии.
Правильный ответ - 61270 рублей со многими копейками.
После того, как добьёшься выплаты верной суммы, протестируй на сумме кредита в 1000 рублей - итоговая сумма выплат в этом случае составит 2030 рублей.
Аноним 2016/05/11 16:21:06  №740418 560
14629728663300.png (50, 1344x681)
681x1344
Ребят, у меня ступор.
Установил MySQL, вроде всё нормально (всё по настройкам из коробки, я же не разбираюсь пока).
Читаю по советам ОПа вот это: http://phpclub.ru/mysql/doc/connecting-disconnecting.html

Ну и там сразу идёт:
"3.1. Подсоединение к серверу и отсоединение от него

При подключении к серверу с помощью mysql обычно нужно ввести имя пользователя MySQL и, в большинстве случаев, пароль. Если сервер запущен не на том компьютере, с которого вы вошли в систему, необходимо также указать имя хоста. Параметры соединения (а именно - соответствующее имя хоста, пользователя и пароль) вы сможете узнать у администратора. Получив соответствующие параметры, подсоединиться к серверу можно следующим образом:

shell> mysql -h host -u user -p
Enter password:"

Это всё через консоль, что ли делать надо?
Ни черта же непонятно, где что.
Аноним 2016/05/11 16:23:31  №740420 561
Вообще как с места стронуться?
Мускул стоит - что вообще дальше-то?
Может, есть какие не древние видеоуроки или что-то опять же более-менее современное в текстовом виде?
У меня СТУПОР, короче.
Аноним 2016/05/11 16:36:40  №740440 562
>>740418

Урок по командной строке есть в ОП посте. Прочти его.

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

mysql ...

Если нет то надо писать полный путь

c:\mysql\bin\mysql.exe ....

Где взять параметры подключения?

хост = localhost, то есть твой компьютер
порт = стандартный 3306, указывать не надо
пользователь = root
пароль = задается при установке mysql, если ты не задавал то наверно пустой

Узнать подробности о клиенте mysql можно набрав

mysql --help

(если он не в PATH то с полным указанием пути)

Будь внимателен к пробелам, точкам, слешам и не перепутай ничего.
Аноним 2016/05/11 16:37:29  №740441 563
>>740169
Я же над дизайном и не заморачивался, сделал по ваерфреймам gomockingbird.
Если есть макет, без проблем сверстаю.

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

>Логотип норм.
Мне тоже понравился, с намеком на тестирование ПО.
Позаимствован с shutterstock (в фотошопе замазал ватермарку).
Что можешь сказать по теме защиты петушиных авторских прав? Я имею ввиду, как устанавливается идентичность изображений, если я подкорректирую оригинал?

>Тест стоит удалить как и сам default controller.
Тест понятно, это шло из коробки. А контроллер-то зачем? Я удалил то что там было, пишу в него свои экшены.

На постгрес потом потихоньку перейдем, тем более что уже используется доктрина, так что это не будет проблемой.
>И конечно там какой-то ад с этими конфигами, их много.
Увы, пока не нашел подробного описания, за что отвечает каждая настройка. В мануале пишут: "расслабьтесь посоны, оно само придет с опытом)))00"
>For now, don't worry about the specific configuration options in each section. The configuration file ships with sensible defaults. As you read more and explore each part of Symfony, you'll learn about the specific configuration options of each feature.
Так и живем.

>Насчет генерации схемы из моделей. Это конечно красиво выглядит в теории, но на практике этого будет недостаточно, так как тебе захочется добавлять разные SQL опции в таблицы.
Да, уже заметил, что некоторые фишки в аннотациях особо и не укажешь.
Но в оф.доках к migrations bundle советуют как раз таки генерировать миграции автоматически на основе аннотаций.
>The moral of the story is this: after each change you make to your Doctrine mapping information, run the doctrine:migrations:diff command to automatically generate your migration classes.
Впрочем, есть подозрение, что symfony book рассчитан на умственно отсталых даунов с синдромом дауна, поэтому они так небрежно описывают подобные моменты.

Использовать подход с миграциями на основе аннотаций может быть имеет смысл с точки зрения согласованности, то есть если писать отдельно аннотации и отдельно миграции, неизбежны разночтения.
Ну ладно, я пока освою "ручные" миграции, как минимум в учебных целях пригодится.
Аноним 2016/05/11 16:41:43  №740446 564
>>740440
Спасибо!
Подумал, что это не в командной строке, вот я поехал...
Аноним 2016/05/11 16:52:22  №740456 565

По поводу всяких "авторских прав", мое мнение: копираст не человек.
Давайте тогда мы, как разработчики веб-сайтов, требовать пожизненный процент от прибыли с каждого сделанного говносайта.
Ладно еще автор контента, но всякие посредники и прочие бездельники достойны только кала и мочи в качестве "отчислений".
Аноним 2016/05/11 17:05:15  №740464 566
>>740441

> Что можешь сказать по теме защиты петушиных авторских прав? Я имею ввиду, как устанавливается идентичность изображений, если я подкорректирую оригинал?
В авторском праве есть понятие "производная работа". Ты не имеешь права просто так взять и "подправить" чужую работу, и распространять.

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

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

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

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

Надо стремиться не копировать пиратское ПО, а развивать свободное.

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

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

Ну например, возьмем DoctrineBundle которая интегрирует доктрину в Симфони

Открываем https://github.com/doctrine/DoctrineBundle/blob/master/DoctrineBundle.php#L62

Там метод build отвечает за "компиляцию" бандла, которая вроде бы делается при прогреве кеша, а вот boot() вызывается при каждом запуске приложения.

Вот здесь https://github.com/doctrine/DoctrineBundle/blob/master/DependencyInjection/Configuration.php задаются ограничения для значений конфига.

Здесь они разбираются: https://github.com/doctrine/DoctrineBundle/blob/master/DependencyInjection/DoctrineExtension.php

Назначение этих файлов описано в мануале по бандлам, я плохо помню подробности, поищи их тут:

http://symfony.com/doc/current/cookbook/bundles/configuration.html
http://symfony.com/doc/current/book/bundles.html
http://symfony.com/doc/current/components/config/definition.html
http://symfony.com/doc/current/cookbook/bundles/extension.html

Также, там упоминается doctrine-bridge. В нем есть https://github.com/symfony/doctrine-bridge/blob/master/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass.php который ищет в конфигурации DI контейнера у сервисов теги вроде doctrine.event_listener и ставит эти сервисы обработчиками событий доктрины. Это делаетя на этапе "компиляции" контейнера, надеюсь ты знаешь что в целях оптимизации в продакшене DI контейнер компилируется из кучи конфигов (каждый бандл может что-то добавить в него от себя) в один большой файл и кладется в кеш.

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

Аноним 2016/05/11 17:11:22  №740467 567
>>740441

У меня подозрение что автоматические миграции могут быть рассчитаны на случаи, когда особой оптимизации БД не требуется, может на этапе разработки прототипа. Но чем доктрина и хороша, что не заставляет тебя их использовать и разрешает тебе саму управлять базой. Тем более что в Doctrine DBAL есть средства для ручных миграций.

>>740456

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

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

Хотя конечно у авторского права есть свои проблемы - например малопопулярные книги или аудиозаписи могут со временем исчезать, так как переиздавать их нерентаьельно, а бесплатно их не отдадут. Теряется чей-то интеллектуальный труд. Надеюсь, в будущем придумают какое-нибудь решение, какую-нибудь библиотеку, хранящую копии всех старых произведений.
Аноним 2016/05/11 17:58:26  №740489 568
Ребят, застрял на задаче "Числа прописью". Парюсь уже второй день. И бросать не хочу, и решения не могу подобрать. Мог бы кто нибудь объяснить как следует к ней подойти или поэтапно рассказать ход выполнения.
Аноним 2016/05/11 18:07:01  №740501 569
>>740489

Надо разбить задачу на составные части. Там вроде в уроке написано, напомню еще раз:

- функция spellSmallNumber(), принимает на вход число от 0 до 999 и возвращает его текстовую форму: spellSmallNumber(123) → 'сто двадцать три'
- функция выбора формы слова, принимает на вход число и 3 формы слова и возвращает подходящую: getWordForm(23, 'кот', 'кота', 'котов') → 'кота'. С ее помощью склоняются слова вроде "тысяч".
- основная функция spellNumber(), которая принимает на вход большое число, разбивает его на части по 3 цифры и вызывая указанные выше функции, получает число прописью.

Первую и вторую функцию можно сделать отдельно, проверить, и если все ок, делать третью функцию.

Что именно тебе непонятно? На чем застрял?
Аноним 2016/05/11 18:23:49  №740521 570
Ещё раз вопрос по архитектуре студентов. Я прочитал про SOLID и теперь чуть лучше понимаю DI, IoC.
Итак, если я хочу использовать DataMapper в контроллере, то есть такие варианты:
1. Захардкодить в контроллере $studentMapper = new StudentMapper. Плохо, мне нужно будет лезть в класс контроллера, если нужно поменять маппер + здесь ещё нужно объект PDO передавать в StudentMapper.
2. Передавать готовый StudentMapper в конструктор контроллера. Лучше, но контроллер по-прежнему знает, что ему передаётся не просто маппер, а StudentMapper.
3. Использовать IoC, конструктор контроллера будет выглядеть примерно так: __construct(IMapper $mapper), а для всех мапперов указать implements IMapper, чтобы у них были одинаковые методы. Контроллер не знает, что за маппер ему передали, классы стали менее связаны.

А теперь если я хочу передать несколько мапперов в контроллер? Нужны ServiceLocator или DI-контейнер. Но как будет выглядеть тело конструктора контроллера теперь? Примерно так:
$this->studentMapper = $mapperLocator->getMapper('Student');
Это плохо?
Аноним 2016/05/11 18:43:55  №740546 571
14629814352200.png (4, 194x83)
83x194
>>740501
Начал решение задачи с написания третьей функции и сразу же застопорился на моменте с разбиением: на пике процесс разбиения если число имеет длину от 7 до 9 знаков, то есть для миллионов. Только подходит от не для всех чисел. Если например число будет иметь вид 900000000 то выведет 0 0 900 вместо 000 000 900. И я вот не могу уловить, как потом это учитывать в функции перевода в текстовую форму.
Аноним 2016/05/11 19:02:36  №740569 572
>>740546

> то выведет 0 0 900 вместо 000 000 900
А чем отличается 000 от 0? Это просто неправильная форма записи нуля. В PHP, как и в математике, число не может быть равно 000.

в php возможна строка "000" (обрати внимание на кавычки), но в данной задаче надо все решать через числа.

И я не понимаю, как это тебе мешает.

Отвечая на твой вопрос: ничего с этим делать не надо, числа бывают и меньше 3 разрядов и это нормально.
Аноним 2016/05/11 19:19:03  №740586 573
14629835436960.png (333, 1366x737)
737x1366
шо это с ним? Доки не двач, не должны лежать.

На память может кто-нибудь помнит, как сменить драйвер в доктрине?
Для mysql это pdo_mysql, а для постгрес?
pdo_postrgres? postgres? postgresql?

Миграции через doctrine:migrations:diff генерируют оказывается голый sql, ну в смысле
$this->addSql('ALTER TABLE ...');
Диалекты-то сильно отличаются?

Причины, по которой мне не очень охота писать миграции вручную, во-первых это кол-во букв
(мне вот сейчас нужно создать около 8 таблиц, в каждой в среднем 5-7 колонок, куча индексов и ключей, я заколебаюсь писать
$table = $schema->createTable('first'); $table->addColumn('abc', 'string', [options])),
во-вторых опять отсутствие внятной документации.
Вот мне нужно сделать nullable колонку, ну в смысле чтобы она могла принимать значение null.
Пишу $table->addColumn('abc', 'string', ['nullable'=>true]) как в аннотациях, все равно генерирует NOT NULL.
Синтаксис другой походу, не как в аннотациях.
Вместо GeneratedValue нужно писать
'autoincrement' => true
Откуда я об этом узнаю? Из какого-то левого примера
http://docs.doctrine-project.org/projects/doctrine-migrations/en/latest/reference/generating_migrations.html#without-the-orm
А все остальные опции? Что, опять придется как лох читать исходный код?
Аноним 2016/05/11 19:28:59  №740603 574
Аноним 2016/05/11 19:32:50  №740607 575
>>740586

> (мне вот сейчас нужно создать около 8 таблиц, в каждой в среднем 5-7 колонок, куча индексов и ключей, я заколебаюсь писать
Ну не смеши, по 2 минуты на таблицу = 16 минут.

Как вариант можно генерировать и потом править SQL вручную.

> Пишу $table->addColumn('abc', 'string', ['nullable'=>true]) как в аннотациях, все равно генерирует NOT NULL.
Видимо такой опции нет или ты что-то напутал.

> Синтаксис другой походу, не как в аннотациях.
Видимо

Доки: http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/schema-representation.html

Ссылка на них стоит в самом начале страницы http://docs.doctrine-project.org/projects/doctrine-migrations/en/latest/reference/generating_migrations.html



Аноним 2016/05/11 19:33:32  №740608 576
>>740586

И мне кажется чистый SQL удобнее этих createtable, он читается лучше.
Аноним 2016/05/11 19:48:00  №740614 577
>>740608
Так драйвер же не получится сменить.
Я не знаю postgres, но наверное там есть отличия в диалекте. Например только что нагуглил вместо auto_increment используется какой-то serial.
Квери билдер это абстракция.

По 2 минуты на таблицу это когда знаешь наизусть апи, а я пока даже не знаю где это само апи искать.
Буду надеяться, что тут все есть
http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/schema-representation.html

Я думал за сегодня успею полностью написать кусок с прохождением тестов, ты тут со своими миграциями и постгресом.
Аноним 2016/05/11 21:46:01  №740746 578
>>740408
Спасибо, пойду думать
Аноним 2016/05/11 21:52:28  №740754 579
>>740614

Я сегодня разворачивал твой проект на c9.io, и после замены конфига он мне сгенеирировал нужный SQL для постгрес, который тот с радостью принял.

> Например только что нагуглил вместо auto_increment используется какой-то serial.
Вообще, в постгресе генерация id отвязана от таблиц.Там есть отдельный объект - SEQUENCE который умеет генерировать последовательно возрастающие id. Ты можешь использовать его как хочешь. Тип SERIAL просто создает sequence и привязывает ее к полю таблицы.

Аноним 2016/05/11 22:26:47  №740817 580
14629948071390.jpg (40, 640x480)
480x640
>>740521
Почему не захуярить логику работы с данными в модели?
Допустим есть класс Student
private $mapper;
В нем конструктор
public function __construct()
{

$this->mapper = new StudentMapper();
}
и дальше уже дохерачить методы save, delete, load
ну?
Аноним 2016/05/11 22:35:14  №740830 581
>>740521
Зачем делать привязку контроллеров к определенному классу? Почему бы просто не передавать контейнер в конструктор, а потом уже извлекать из него все что тебе нужно? Это конечно не очень хороший способ, потому что в больших приложениях ты можешь передавать 200+ элементов в контроллер, когда тебе нужен только один, но в студентах это вполне подойдет, наверное.
>>740817
Это называется Active Record. В данном случае код работы с базой и модель в одном классе, хотя модель вполне может существовать сама по себе. Решением этой проблемы является как раз Data Mapper который хочет использовать анон.
Аноним 2016/05/11 22:36:30  №740832 582
14629953905480.jpg (22, 526x564)
564x526
>>740817
Так суть DataMapper (насколько я понял) в том, что мы разделяем слой модели (которая теперь является точной проекцией содержимого строки таблицы) от слоя, который этой моделью манипулирует.
Это в ActiveRecord модель может сама себя удалять и записывать в БД.

Вспомнил и прилепил забавную картинку.
Аноним 2016/05/11 22:47:18  №740839 583
14629960380440.jpg (170, 1261x700)
700x1261
>>740830
Так ведь можно вынести код работы именно с базой в StudentMapper таким образом полностью отделив саму базу от модели. Допустим в классе маппера тоже будут, save только он уже принимает данные из модели и сейвает их в базу.

Сорян, я сам то ни разу не очень опытен в проектировании, но по мне это логично и удобно
Аноним 2016/05/11 22:55:16  №740846 584
>>740832
Какой язык на кружке?
Функции не как в РНР и ещё Coffee coffee - что, простите?
Аноним 2016/05/11 22:59:49  №740849 585
>>740846
Здесь суть в coffee.drink() и сoffee.refill()
Кофе пьёт и кофе наполняет.

Язык может быть Java или C#, для этих языков нужно при инициализации указывать тип данных переменной. Тип данных в данном случае - Сoffee.
Аноним 2016/05/11 23:02:55  №740854 586
14629969760120.jpg (162, 760x1080)
1080x760
>>740846
Где ты там функции то увидел полуумный?
Аноним 2016/05/11 23:03:27  №740855 587
>>740849
Спасибо.

>>740854
Ну, я подумал, что это типа $coffee->drink() и $coffee->refill() в ООП на РНР.
Аноним 2016/05/11 23:07:18  №740857 588
Аноним 2016/05/11 23:07:37  №740858 589
>>740832
Явно не по PSR, скобки перенесены после условия на новую строку, название свойства с большой буквы, методы с большой буквы.
Аноним 2016/05/11 23:09:49  №740860 590
PSR - это PHP Standards Recommendations. Очевидно, что другой язык их соблюдать не должен.
Аноним 2016/05/11 23:15:08  №740865 591
>>740858
Есть два стиля форматирования кода основных, лол, в одном из них скобки по разному после условия
Аноним 2016/05/11 23:29:36  №740883 592
Аноним 2016/05/11 23:46:01  №740895 593
>>740858
Ага, потому, что это ебучий php стандарт, но кроме его существует еще хуевая туча различных стилей под различные цмс и фреймворки, пошел нахуй.

И кроме того, в различных языках в стандартах прослеживаются вот именно 2 стиля.
Аноним 2016/05/12 07:29:48  №741080 594
>>740849
Это C#, у Java методы с маленькой буквы пишут.
Аноним 2016/05/12 08:31:27  №741103 595
>>740521

> Итак, если я хочу использовать DataMapper в контроллере, то есть такие варианты:
- передать DM через конструктор
- передать DI контейнер через конструктор

> . Захардкодить в контроллере $studentMapper = new StudentMapper. Плохо, мне нужно будет лезть в класс контроллера, если нужно поменять маппер + здесь ещё нужно объект PDO передавать в StudentMapper.
Плохо тем что если DM нужен где-то еще, придется копипастить код его создания. Плюс, нет гарантий что DM существует в одном экземпляре. Да и вообще, создание сервисов лучше сделать где-то в одном месте.

> Передавать готовый StudentMapper в конструктор контроллера. Лучше, но контроллер по-прежнему знает, что ему передаётся не просто маппер, а StudentMapper.
Норм

> 3. Использовать IoC, конструктор контроллера будет выглядеть примерно так: __construct(IMapper $mapper), а для всех мапперов указать implements IMapper
Неправильно. Если ты пишешь IMapper то это значит что контроллер готов работать с любым маппером, но ведь это не так, верно? Если ты решил сделать внедрение зависимостей через интерфейсы, то надо писать IStudentMapper тогда.

> А теперь если я хочу передать несколько мапперов в контроллер?
Либо передать их по отдельности либо передать DI контейнер.

>>740817

Потому что класс Student отвечает за хранение данных о студенте. Работать с БД не его обязанность. Ты предлагаешь смешать 2 обязанности в одном классе.

Ну и когда студент отвязан от Бд, это делает код более универсальным. Например, у нас есть функция которая что-то делает со студентом:

function doSomething(Student $student)

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

Подход когда код работы с БД засунут в модель, называется active Record - это вроде было в моем уроке по паттернам работы с БД.

Аноним 2016/05/12 08:40:11  №741108 596
>>740817

Также, ты заметил что в твоем коде явно проблемы с DI? Ты создаешь маппер, а где ты берешь объект PDO для него?

>>740830

> Зачем делать привязку контроллеров к определенному классу?
Это как раз логично так как контроллеру конкретный класс и нужен. Явно обозначить зависимость, что ему нужны классы X и Y - это хорошо.

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

>>740832

Код на картинке сомнительный. Кофе само себя выпило? Само себя наполнило?

Логичнее было бы

human.drink(coffee);

или если нам не важно кто его выпил то

coffee.decreaseVolume(10);

>>740846

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

>>740854

Метод в каком-то смысле функция в классе.

>>740895

А вот в C# как я помню стандарта оформления нет и каждый пишет как хочет.

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

Аноним 2016/05/12 10:51:12  №741208 597
Аноним 2016/05/12 11:19:17  №741225 598
>>741108
Оп-кун, я предлагаю не совсем Active Record. Да и я знаю, что такое ActiveRecord только я уже здесь почти не учусь, а больше года работаю ;)

Я предлагал что-то в духе Magento.

Student - модель, а StudentMapper ресурс для работы с базой данных, вот к примеру метод в Magento:
/
Load object data

@param integer $id
@return Mage_Core_Model_Abstract
*/
public function load($id, $field=null)
{
$this->_beforeLoad($id, $field);
$this->_getResource()->load($this, $id, $field);
$this->_afterLoad();
$this->setOrigData();
$this->_hasDataChanges = false;
return $this;
}
Аноним 2016/05/12 11:33:27  №741229 599
14630420072080.jpg (47, 321x480)
480x321
Аноним 2016/05/12 11:58:32  №741250 600
>>741225

Что значит "не совсем active record". Если модель сама себя загружает из базы - это Active Record. Это я не сам придумал, названия и описания паттернов я взял у Фаулера.

Пример который ты привел это Active Record. Причем еще и с каким-то нездоровым количеством подчеркиваний. Им PHP5 все еще не завезли что ли?

Аноним 2016/05/12 12:20:06  №741258 601
Интересует такой момент: есть ли в PHP функции высшего порядка как в javascript'е и "замыкания"? Развито ли функциональное программирование?
Аноним 2016/05/12 12:42:31  №741276 602
Аноним 2016/05/12 13:03:08  №741295 603
>>741276
Там можно определять функцию внутри функции/возвращать функцию из вызова функции? Интересно посмотреть пример
Аноним 2016/05/12 13:27:29  №741317 604
>>741295

function x() {
return function () {

};
}

гугли анонимные функции.
Аноним 2016/05/12 15:13:32  №741396 605
>>741250
Ты о Magento не слышал? ;) Это наверное лучшая e-commerce cms.

Это не классический ActiveRecord, а все потому, что работы с базой в модели нет, вся связь с базой вынесенна в ресурсные модели
Аноним 2016/05/12 15:36:47  №741405 606
Подскажите по антикризисным мерам, как логичнее делать, создавать четыре одинаковых компании, и к трем из них применить соответственно 3 разные анткр меры, применять их к одной и тойже компании поочередно, откатывая измения после вывода таблицы результатов, или каким-то образом клонировать исходную компанию, что по сути первый вариант?
Аноним 2016/05/12 16:02:18  №741429 607
>>741396

А это не важно, вынесена она или нет. Важно что у модели есть ссылка на классы работы с БД и метод load.

>>741405

Клонировать компанию. Надо сделать чтобы при клонировании компании клонировались бы все ее департеманты и сотрудники. Сделать это удобнее всего с помощью магического метода __clone.
Аноним 2016/05/12 16:38:11  №741457 608
Задача Студенты
https://github.com/TheSidSpears/Students

1. Правильно ли я реализовал MVC?
2. Слышал о подходе, когда в классе все свойства закрытые, а обращаются к ним/изменяют через getter'ы/setter'ы. Нужно ли это?
3. Критикуйте полностью. Пока у меня нет уверенности, что я на верном пути, поэтому пока не оценят, дальше делать боюсь
Аноним 2016/05/12 16:42:55  №741462 609
>>741429
Важно же, с ресурсными моделями нивелируется недостаток абстрактных источников данных, ресурсные модели могут работать с любыми абстракциями будь то json,csv,db,api
Аноним 2016/05/12 16:46:55  №741466 610
Ребят, а может кто посоветовать каких нибудь курсов годных по пыхе на всяких coursera'ах и edx'ах.
Аноним 2016/05/12 16:48:42  №741467 611
Аноним 2016/05/12 16:49:54  №741468 612
>>741466
Почему тебе не нравится ОП-курс? Чем курсеры лучше?
Аноним 2016/05/12 16:54:29  №741472 613
Аноним 2016/05/12 16:58:04  №741477 614
>>741466
На хекслете по SICP есть курс на пыхе, вот годнота
Аноним 2016/05/12 16:58:26  №741478 615
>>741468
Возможно больше абстракции
Аноним 2016/05/12 17:07:02  №741488 616
14630620224730.png (16, 593x271)
271x593
14630620224741.png (16, 612x295)
295x612
14630620224742.png (17, 663x367)
367x663
>>741477
>хекслет
>годнота

Скрины сделаны тогда, когда я проходил там один из тестов.
А ОП упоминал, что данные из инпутов нужно trim'ить, это азы. На хекслете об этом не знают.
Аноним 2016/05/12 18:50:58  №741605 617
>>741488
Забавно, бредово.
Но вообще пока присматриваюсь к Хекслету и Гикбрейнс, к бесплатным курсам.
Так вот Гикбрейнс - просто плохо, всё просто ужасно с бесплатными курсами. Настолько плохо, что платные даже не хочется смотреть. А на Хекслете вроде получше всё.

Другой аноним
Аноним 2016/05/12 19:05:54  №741628 618
>>741605
Ну а ты не задавался вопросами, откуда ребята из видеоуроков знают то, что знают? Наверняка они не по видеоурокам учились. Читали доки, маны, книги, скорее всего на инглише, экспериментировали, пробовали. Но точно не безучастно смотрели за тем, как кто-то на видео, с трудом связывая слова и запинаясь в объяснениях, пишет код.
Рахим в своём курсе по ОС так примерно так и говорит: "Этот курс это выжимка из Таненбаума. Хотите лучше что-то понять - читайте его".
Аноним 2016/05/12 23:10:02  №741852 619
14630838026000.jpg (99, 540x492)
492x540
>>741628
Проблема в том, что надо с чего-то начинать.
ОП даёт хорошую базу знания синтаксиса, всяких массивов и регулярок, а вот после ООП (не считаю HTML+CSS) начинается мрак и тьма, пришедшая со Средиземного моря.
В какой-то момент важно не просто получить огромный список того, что нужно знать, а хотя бы посмотреть и пощупать небольшой рабочий проект, пусть даже простую гостевую книгу или небольшой блог с минимумом функционала.
Для углубления - разумеется, читать нужно много.
Но для старта что-то пошаговое в создании гостевой либо блога было бы неплохим подспорьем для того, кто идёт с нуля.
Я вот сейчас прорабатываю Роберта Никсона "Создаём динамические сайты на PHP..." (>>737470), хотя ОП и не одобряет эту книгу.
Но можно делать то, что делает Никсон, и анализировать это с подходом ОПа - никто же не запрещает.
Я пока очень доволен всем, потому как там объяснения уровня начальных страниц учебника ОПа или даже выше.
Но вот хочется посмотреть и на то, как в нескольких уроках по 10-15 минут от начала до конца создают какой-нибудь динамический сайт.
Аноним 2016/05/12 23:11:16  №741853 620
*Робина Никсона
Ответы 3 марта, Вектор Аноним 2016/05/12 23:13:01  №741855 621
>>733196

> Поиск пути: http://ideone.com/33ROxP

> function show_shortest_way($paths,$from,$where,$time,$way,$pointNames,$transportName){
time и way всегда одинаковые, зачем их передавать?

> $GLOBALS['ways']
Что еще за использование глобальных переменных? Тут можно было бы использовать return например вместо этого.

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

....
для каждой соседней точки:
- пути[] = проложить путь через точку

лучшийПуть = выбратьЛучшийИз(пути)
вернуть лучшийПуть

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

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

> if (isset($GLOBALS['ways']))
> return ($GLOBALS['ways']);
А если переменная не существует, что вернет функция? null? Почему она разные типы данных возвращает?

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

> Текст по кругу: http://ideone.com/2q1F4N

> $sina=
надо писать кемелкейсом, например $sinA

> rad2deg(sin($alpha));
Это непраивльно. Синус возвращает не угол, а число от -1 до 1. И переводить его бессмысленно.

> for($x=0;$x<80;$x++){
> echo $screen[$y][$x];
Тут можно использовать implode

> На вашем счету n рублей: http://ideone.com/JXvVHa

> if(($number%100)<=20) //если два посл. числа <=20, то сравниваем их
> $n=$number%100;
надо ставить фигурные скобки в ифе

> $n=$number%100;
> $n=$number%10;
Это усложняет код, когда ты одну переменную используешь для разных целей. Надо было просто сделать что если число от 11 до 19 то возвращаем определенный вариант - было бы проще.

> return $text." ";
Это нелогично. Функция inclineWord выбирает подходящую форму слова. С какой стати она должна добавлять к нему пробелы? Это не ее задача, а того кто ее вызвал.

> $n[1]=$number;
Выглядит странно так как начальное значение переменной $n нигде не присваивается.

> if ($number==0) //при нуле сразу пишем результат
> $text.=$spelling[0]." ";
тут логичнее сразу было ставить return

Сам алгоритм в общем верный, но код оформлен неаккуратно.

> ООО Вектор: http://ideone.com/MbL6Pb

> if(!in_array($department,$this->departments)){
Почитай описание in_array в мануале. Ты исопльзуешь неточное сравнение, которое сравнивает не идентичность объектов, а содержимое их полей. Это в общем плохо, в ООП в 99% случаев надо проверять именно идентичность, то есть хранят ли 2 переменных ссылку на один и тот же или разные объекты.

> public function countEmployees(){
Кстати эту функцию можно попробовать записать через array_reduce и анонимную функцию, может выйдет чуть короче. То есть у тебя верно сделано, но если тебе интересно попробовать другой вариант, то можно попробовать.

> $empls
Не стоит так сокращать. Либо $employees, либо $count, либо $c.

> foreach($this->departments as $k=>$v){
> $k=>$v
Это плохой выбор названий так как $k и $v вообще ничего не значат (как и key/value). Тем более, ты еще и не используешь $k, зачем ее вообще писать тогда?

> public function newEmployee(
Названия функций начинаются с глагола, сделайЧтоТО(), например addEmployee

> public function delEmployee(int $i){
Неправильно выбран аргумент. Вот я хочу удалить сотрудника. Как я узнаю его ключ? Это внутренняя деталь реализации, которая спрятана в классе Department, которую я не знаю и не хочу знать. Надо передавать не индекс, а сам объект-сотрудника.

> public $employees=array(); //сотрудники класса Employee
Тут наверно стоит закрыть доступ, чтобы нельзя было делать с массивом что угодно и добавлять туда что угодно.

> public static $rate; //int
Ой, статические публичные поля. Я думаю, это плохая идея так как они например не позволят индивидуально регулировать зарплату. Ну или например, представь что в разных корпорациях разные базовые ставки. Из-за статических полей у тебя все сотрудники намертво связаны общей ставкой хотя они могут работать в разных компаниях.

Плюс, там легко ошибиться, использовав self:: вместо static::, и трудно обнаружить такую ошибку. Это "позднее статическое связывание" - какая-то очень мутная штука и я бы избегал его исопльзования вообще. Если тебе надо переопределять что-то в наследнике, для этого подойдут обычные поля.

В качестве решения можно:

- сделать ставку обычным полем
- сделать отдельный объект, знающий про зарплаты (тогда впрочем ставку нельзя задать индивидуально)

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

> for($i=0;$i<3;$i++){
> $employee[0][]=new Manager(2,false);
> }
> for($i=0;$i<2;$i++){
> $employee[0][]=new Manager(3,false);
тут идет копипаста, нельзя ли это упростить, положив например информацию о сотрудниках в массив:

$people = [
[$marketing, Manager::class, 3, false],
[$marketing, Engineer::class, 5, false],
...

И потом по массиву насоздавать работников.

Антикризисные меры надо поместить в класс, а не писать код стеной.

> $vector=clone $vector_orig; //возвратили исходные данные
А вот и нет. Департаменты при таком подходе не копируются. а копируется ссылка на тот же самый департамент. надо использовать магический метод __clone.

> foreach($depClass->employees as $empNum=>$empClass){
> if(get_class($empClass)=="Engineer"){
лучше сделать в департаменте метод отбора по каким-то критериям

> if(get_class($empClass)=="Engineer"){
> $engArr["id"]=$empNum;
> $engArr["range"]=$empClass->range;
Это неправильно. У тебя есть объект-работник со всей нужной информацией, а ты зачем-то городишь массивы. Ты может быть ООП не любишь?

> foreach($engineers as $depNum=>$depEmpls){
Ужасные названия переменных. Возьми себе какую-нибудь IDE с автодополнением.

> array_multisort($range, SORT_ASC,$engineers[$depNum]);
Слишком сложно. Лучше выбрать обычный 1-мерный массив инженеров и отсортировать их через usort. Взять 40% можно через array_slice.

> Analyst::$rate = 1100;
Этим ты меняешь ставку во всех копиях компании, а надо только в одной

В общем, код надо рефакторить.
Аноним 2016/05/12 23:14:34  №741856 622
>>741852

1) есть недоделанный урок https://github.com/codedokode/pasta/blob/master/soft/web-server.md
2) есть туториал в php мануале
3) есть задача на студентов

Ты конечно можешь почитать книгу, но потом посмори задачу на студентов и увидишь насколько в той книге все отсталое.
Аноним 2016/05/12 23:20:30  №741859 623
14630844307880.webm (597, 640x360)
360x640
>>741856
Спасибо, я опять пропустил этот урок среди прочих паст...
Ответы 3-4 мая Аноним 2016/05/12 23:56:43  №741895 624
>>733360

О, понадеемся что удача выразится в том что ты сможешь решить все задачи.

>>733712

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

>>733728

> Разбивать не explode(), а регулярками? Но в таком случае удобнее воспользоваться parse_url(). Не понял.
Не разбивать, а анализировать. Вроде того:

если URL соответствует шаблону /news/\d+ то ...
если URL соответствует шаблону /news/by-year/\d+ то ...

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

> Конструкции на пикрелейтед допустимы?
да

> Почему DataMapper, а не, к примеру, наследование модели Student от класса Model, которая соединяется с БД
это называется active record, недостаток в том что в одном классе смешивается 2 задачи: хранение информации о студенте и работа с БД. Ну и как следствие студент не может существовать без БД что нелогично.

>>733885

Вроде из задач там ничего особо не добавилось, добавилась только теория.
Ответы 4-5 мая Аноним 2016/05/12 23:57:06  №741896 625
>>734308

Тем что быстро превращается в трудночитаемую и трудноподдерживаемую лапшу. Плюс, если ты используешь массивы вместо объектов то в коде трудно разобраться так как неизвестно какие поля есть в этом массиве. В классах методы и поля сгруппированы вместе, в процедурном коде функции и массивы разбросаны как придется. Глядя на класс, понятно что с ним можно сделать, а вот имея массив непонятно какие функции с ним работают.

>>735032

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

>>735210

копать в сторону фасетного поиска. В сфинксе есть что-то для этого, в Elastic Search есть.

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

>>735262

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

>>735297

Нет, не легко если там сотни тысяч товаров.

Аноним 2016/05/13 00:12:56  №741909 626
>>741855
Огромнейшее спасибо за такой развёрнутый ответ! Завтра буду исправлять
Аноним 2016/05/13 01:27:10  №741926 627
>>741896
>Вообще, мне кажется, если товар закончился, а в фильтре пункт остался - это не так и страшно.
Страшно. Фильтр вываливает 1000 брэндов, пользователь начинает их по очереди тыкать, и везде вываливается - продуктов такого брэнда не найдено. Еще хуже, если комбинация из фильтров, например в каждом из 1000 брэндов может не быть одежды для девочек или маек красного цвета. Через 3-4 тычка пользователь уходит. Поэтому и нужны динамически обновляемые фильтры.
Аноним 2016/05/13 01:36:11  №741930 628
>>741488
Так-с авторы самого сайта с разработчиками платформы не корелируют чуть мения чем никак, тем более, что курс то по SICP, что таки годнота.
Аноним 2016/05/13 04:53:23  №741980 629
https://github.com/someApprentice/Students/

https://github.com/someApprentice/Students/blob/master/app/Model/Helper/RegistrationHelper.php
Я решил что не только ПомощникРегистрации должен заниматься ридеректом, и решил вынести функции редиректа в отдельный родительский класс https://github.com/someApprentice/Students/blob/master/app/Model/Helper/Helper.php
Теперь сам класс ПомощникаРегистрации стал совершенно не нужен, и ридеректом теперь занимается вовсе класс аутентификации https://github.com/someApprentice/Students/blob/master/app/Controller/RegisterAction.php#L42
Не портит ли это модель?

https://github.com/someApprentice/Students/blob/master/app/Model/Entity/Student.php#L113
https://github.com/someApprentice/Students/blob/master/app/Model/Entity/RegisterStudentForm.php#L34
https://github.com/someApprentice/Students/blob/master/app/Controller/RegisterAction.php#L36
Не допустил ли я здесь ошибку с передачей авторайзера? Не должен ли он содержаться в классе студента изначально? И правильно ли я назвал эту переменную? Ведь авторизация, в отличие от аутентификации, отвечает за предоставление прав к данным, а не за вспомогательные функции к ней.

https://github.com/someApprentice/Students/blob/master/app/Model/Entity/LoginStudentForm.php#L9
https://github.com/someApprentice/Students/blob/master/app/Model/Entity/Student.php#L20
https://github.com/someApprentice/Students/blob/master/app/Model/Entity/RegisterStudentForm.php#L18
Здесь присутствует копипаста метода. Будет ли лучше вынести этот метод в отдельный класс Entity (https://github.com/someApprentice/Students/blob/master/app/Model/Entity/Entity.php), а переменную содержащую разрешенные поля ($allowed) вынести в отдельное свойство, и затем наследовать этот класс? Не портит ли вынесенное свойство $allowed сущность Студента?

>>738044
>> Логика такова, что мало вероятно что имя и пароль будут совпадать у разных людей.
>Имя в принципе не уникально так как Иванов много. Не надо полагаться на это вот "маловероятно".
Тогда фамилии и пароль тоже могут совпасть. Похоже все таки это плохая идея, но может в рамках условности мы не будем обращать на это внимание? Мне могут помочь в будущем знания о том как сделать авторизацию с помощью разных данных. Ведь за место имени/фамилии мог бы быть обычный логин или номер телефона.

>>738044
>> А разве я не должен спросить у пользователя хочет ли он оставаться залогиненым?
>не знаю. Можешь спрашивать, я не против. Но и в этом случае сессия не нужна.
Сессиями больше не пользуются?

>>738044
>> $_SESSION['id'] = $student->getId();
>> $_SESSION['name'] = $student->getName();
>> $_SESSION['surname'] = $student->getSurname();
>> $_SESSION['token'] = $student->getToken();
>Зачем класть так много данных?
Если бы я пользовался куками, данные, такие как Имя, Фамилия, Возраст и так далее, тоже были бы лишними?

>>738044
>> $loginStudentForm->getError('login', "Incorrect username or password")
>Непонятно почему этот код внутри цикла. Ты хочешь несколько раз ошибку добавить?
Потому что когда все возможные студенты, после неудачной проверки на пароль, закончатся, нужно будет сообщить что соответствий не найдено. А как это сделать вне цикла? Ведь проверка на правильный пароль находится внутри него.
С этим вообще у меня возникает много проблем. Даже после того как я переработал код мне приходиться несколько раз перезадавать значение ошибки.

https://github.com/someApprentice/Students/blob/master/app/Controller/LoginAction.php#L71
https://github.com/someApprentice/Students/blob/master/app/Controller/LoginAction.php#L77
https://github.com/someApprentice/Students/blob/master/app/Controller/LoginAction.php#L63

>>738044
>> Перефразирую вопрос: Что становится с кодом после ридеректа?
>Можно die можно return, так даже аккуратнее мне кажется.
Так это нужно вызывать в ручную? Я собираюсь прямо по среди цикла делать ридерект, даже если я пропишу break или die после этого, ридерект не сломает мой код?

>>738044
>Если ты это поместишь в валидатор то получается чтобы поставить студенту пароль надо вызывать валидатор даже если мы не хотим ничего проверять?
Тогда придется вызывать авторайзер, всё равно придётся что-то вызывать.

>И как в твоем сценарии проверить праивльность логина и пароля не имея формы? Ведь пароль можно и не только в форму логина ввести, и вообще не в форму. А например в консоли или через API. Ты сможешь в этих случаях его проверить?
В консоли или через API обычно передают $_POST? Если да, то смогу - контроллер всегда вызывает валидатор если есть $_POST. Если нет, то мне придется переделывать контроллер чтобы он принимал в аргументы логин и пароль или еще что-то поменять. Ведь контролер же занимается пришедшими данными из вне?

>Потому выгоднее может быть сделать что валидатор лишь проверяет соответсвие данных опредленному формату, а за проверку пароля отвечает не он. Но можешь делать как хочешь, если сделаешь неправильно я все равно увижу ошибку.
Да, теперь я вижу чем этот метод отличается от обычных методов валидации. Просто было не понятно, ведь по сути этот метод отвечает за проверку, да и в контроллере вызывается как и класс авторизации так и класс валидатора.
Аноним 2016/05/13 09:21:01  №742020 630
Нужно ли отделять результаты поиска студентов от таблицы со студентами на главной странице? Или нужно, чтобы найденных студентов тоже можно было сортировать? Просто я не знаю, как сделать второй случай без Query Builder. Получается в зависимости от GET параметров допустимы запросы вида getAll()->whereLike($search)->orderBy($column)->order($order)->get()
Или если без поиска getAll()->orderBy($column)->order($order)->get()

Маппер же не может делать такие запросы? А формировать голый SQL в контроллере не выход.
Аноним 2016/05/13 09:29:37  №742023 631
И чтобы не юзать цепочные вызовы, можно ли в контроллере сделать так:
$mapper->build([
'search' => $search,
'orderBy' => $orderBy,
'order' => $order,
]);
Аноним 2016/05/13 12:39:42  №742159 632
14631323827380.jpg (35, 604x463)
463x604
>>741930
>чуть мения чем никак
Аноним 2016/05/13 14:50:43  №742260 633
Помогите определить сущности: есть почтовая рассылка которая зависит от действий-бездействий юзера: я вижу
1. User. (пользователь и действия)
2. Mail (Почта)
3. Trigger (событие в ответ на действие User, использует Mail для отправки) тут не совсем уверен, может это больше к User относится
Аноним 2016/05/13 17:16:13  №742406 634
>>742260
Фабрика для создания писем, письмо, юзер принимается на фабрику и там происходит магия. Отправление в контроллерах

Не плоди лишних, заебешься кодить
Аноним 2016/05/13 17:54:11  №742443 635
А как подключить php скрипт к html файлу?
Хотя бы хеллоуворлд написать.
Аноним 2016/05/13 18:11:18  №742455 636
Аноним 2016/05/13 19:12:17  №742527 637
Как получить данные по ссылке в PHP?
У меня есть одна ссылка, при переходе на которую мне открывается массив. Как его записать в переменную?
Аноним 2016/05/13 19:14:19  №742530 638
>>742527
Ты плохо объяснил. Точнее опиши, что за ссылка и что за массив.
Аноним 2016/05/13 19:19:12  №742537 639
>>742530
Я тот кун который насчет ВК АПИ пару дней назад спрашивал.
Там можно сгенерировать ссылку и получить по ней некоторые данные.

https://api.vk.com/method/groups.getById?group_id=22751485&fields=members_count

Вот например я хочу достать отсюда количество подписчиков паблика двача.
Аноним 2016/05/13 19:23:14  №742542 640
Аноним 2016/05/13 19:39:51  №742569 641
Такая беда: на хостинге ограничен объем памяти и таймаут короткий, как можно выгрузить пользователю огромный XLS из базы - и быстро и без превышений по памяти?
Аноним 2016/05/13 22:05:33  №742770 642
Аноним 2016/05/13 22:22:59  №742788 643
Гайс, залейте, плез, кто нибудь решение к задаче "Числа прописью". Я не осилил, а посмотреть решение очень интересно
Аноним 2016/05/13 22:49:24  №742813 644
14631689645750.png (5, 792x149)
149x792
Аноны, еще понадоедаю с АПИ ВК немного.
Кто с ним работает, не знаете, сейчас обращения возможны только через приложение?
А то пытаюсь по ссылке, которую они в документации дают, обращаться.
Например то же.
https://api.vk.com/method/groups.getById?group_id=22751485&fields=members_count
В браузере вижу результат, но если попытаюсь использовать file_get_contents то пишет что failed to open stream: Connection refused in...
Или я рукожоп где-то ошибся в коде?
Аноним 2016/05/13 22:56:12  №742819 645
>>742813
Насколько я знаю file_get_contents не работает с https. Тебе нужен CURL.
>Кто с ним работает, не знаете, сейчас обращения возможны только через приложение?
Есть список открытых и закрытых методов (закрытые - те которым нужен токен авторизации чтобы работать). Открытые методы это те которым такой токен не нужен, но это только основные, вроде запроса для получения основной информации о пользователе. Токен можно получить через OAuth, полный список методов можешь найти тут http://vk.com/dev/methods
Там же написано какие из них закрыте, какие открытые.
Аноним 2016/05/13 23:06:14  №742825 646
14631699743270.png (9, 720x75)
75x720
>>742813
Как видишь. Пример с количеством подписчиков в группе ru2ch.
Аноним 2016/05/13 23:24:57  №742835 647
>>742825
А что я тут должен увидеть? Не понял ничего, если честно.
Аноним 2016/05/13 23:27:07  №742837 648
>>742835
Запущен PHP в интерактивном режиме из консоли. Введена команда. Внизу нужный тебе результат - количество подписчиков группы.
Аноним 2016/05/13 23:53:47  №742860 649
14631728277550.jpg (107, 750x1000)
1000x750
Аноним 2016/05/14 04:24:10  №742971 650
14631890508970.png (14, 311x363)
363x311
Закончил кусок приложения с прохождением теста.
Вроде было много вопросов, но уже ничего не помню, сплю до воскресенья.
https://github.com/nsdvw/TestHub
Аноним 2016/05/14 14:24:20  №743187 651
14632250600700.png (113, 1165x599)
599x1165
Ну и какого члена оно пишет, что нет ключа, если он есть?

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