Этого треда уже нет.
Это копия, сохраненная 9 марта 2016 года.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
33 Кб, 500x500
157 Кб, 1024x683
34 Кб, 650x384
194 Кб, 1024x768
Чат изучающих PHP #70 #649329 В конец треда | Веб
Добро пожаловать в наш уютный чатик. Тут мы ~~флудим~~ изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет научиться программировать, кто-то - делать сайты, кто-то - просто размять мозги и заняться чем-то полезным.

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

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

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

Предыдущий тред был тут: >>639138 (OP) (больше 1000 постов!)

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

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

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

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

Учебник дает основы языка PHP, но чтобы делать сайты, этого недостаточно. Если ты его прошел, то надо переходить в более серьезным задачкам, которые научат тебя как выдавать страницы в браузер, работе с таблицами в БД, работе с формами, MVC.

- Для начала установи Апач + PHP (советы ниже) и читай туториал http://php.net/manual/ru/tutorial.php
- Учи HTML/CSS и SQL, хотя бы основы
- Далее простая, но полезная задача сделать список студентов: 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

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

https://gist.github.com/codedokode/10774100
https://gist.github.com/codedokode/7054af4a03865c4cc863

Может тебе понадобится пользоваться командной строкой, вот гайд https://gist.github.com/codedokode/10539568

Вот небольшой туториал по тому как начать использовать PHP на сервере для отдачи странички в браузер: https://php.net/manual/ru/tutorial.php Увы, уроков плавно подводящих к тому, как сделать задачи выше, пока нет, так что если что, задавай вопросы.

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

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

- HTML/CSS: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
- 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? — Да, однозначно. Посмотри любую вакансию.
Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.net/45000175 и получи личную немного устаревшую копию сайта
Оформляй код аккуратно!!! — например пропусти через 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) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.
56 Кб, 500x644
72 Кб, 1022x575
47 Кб, 636x400
Стой всяк сюда входящий #2 #649337
Код нужно писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.

Если тебе лень выравнивать код руками, закачай его на 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, то рассказать об этом стоит в каком-нибудь другом треде.

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

Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
56 Кб, 500x644
72 Кб, 1022x575
47 Кб, 636x400
Стой всяк сюда входящий #2 #649337
Код нужно писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.

Если тебе лень выравнивать код руками, закачай его на 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, то рассказать об этом стоит в каком-нибудь другом треде.

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

Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
#3 #649354
Вот если я допустим занимать одно временно фронт и эндом, то что мне нужно учить?
>>649356>>649369
#4 #649356
>>649354
ёбаный автоввод
#5 #649361
В старом треде >>639138 (OP) даны ответы на все посты до 7 февраля. Кто постил 8, 9, 10 - погодите чуть-чуть.

Если вас пропустили - напомните о себе в этом треде.
#6 #649369
>>649354

HTML/JS/CSS и PHP/SQL/ООП/MVC/фреймворки. Можно параллельно.
#7 #649395
>>649350
Ничего не понял.

>COUNT(колонка) считает число строк в одной группе, где колонка не равна NULL. Потому там получается либо 0 либо одинаковые числа


Одинаковые с чем? При группировке ведь они не одинаковые. По отдельности джоины показывают нормальную инфу, почему два джоина одновременно из одной и той же таблицы дают противоречивый результат? По моему каждый джоин должен расценивать лайки как отдельную таблицу и мы выбираем число совпадений из первой заджоиненой таблицы лайков, группируем по айди, затем тоже самое по второй, хотя это та же самая таблица. А как мне поможет число уникальных значений, если у меня в поставленных и полученных лайках хранится айди пользователя, соответственно число уникальных значений для каждого всегда будет 1?
>>649417>>649430
#8 #649406
>>649317

>Кнопка "отметить все" не инветирует цвета, а заливает все черным.


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

>> var firstClicked = ""+x+y;


>Тут явно ошибка, что если числа двухзначные? Или одно двухзначное, а другое нет?


А в чем проблема с двухзначными числами?
>>649420
#9 #649417
>>649395

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

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


Сделай селект (юзер), (лайки1), (лайки2) без COUNT и GROUP, но с джойнами и посмотри. Тебе надо разобраться как выполняется запрос.

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


Неверно. Сначала мы делаем джойны и получаем все возможные комбинации записей которые соответствуют условиям ON и WHERE (если они есть). Потом мы группируем строки. Потом считаем COUNT.

Почитай хотя бы тут https://ru.wikipedia.org/wiki/Join_(SQL)

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


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

Сделай селект без группировки и каунтов, посмотри что он выберет.
#10 #649420
>>649406

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


Отчего же? Это можно сделать средствами CSS

> А в чем проблема с двухзначными числами?


В том что "1" + "21" дает то же что и "12" + "1". Плюс у тебя там в коде заложено что ширина и высота поля меньше 10, таких ограничение не дложно быть.

И вообще это выглядит как запутывание и усложнение. Двумерное поле удобюно реализовать двумерным массивом, зачем усложнять код не очень понятно.
>>649426
#11 #649426
>>649420
Добавляем класс таблице - перекрашиваем её в черное. Убираем класс - обратно в белое. Видимо я плохо знаю ксс, но я не понимаю, как можно, назначив ксс-атрибут таблице, изменять цвета её ячеек в зависимости от их текущего цвета.
>>649430
#12 #649430
>>649426

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

>>649395

Вообще, в джойнах и декартовых произведениях очень важно разобраться. Многие задачи решаются именно джойном нескольких таблиц с дальнейшим отсевом записей по условиям.
#13 #649523
Я с файлообменником пришел - https://github.com/lexdss/file-sharing-on-Silex

Пока правда только самый основной функционал запилил
>>654338
#14 #649577
>>649622
#15 #649590
Друзья, как закрепляете пройденный материал? И заучиваете ли вы наименования команд?
>>649596>>649613
#16 #649596
>>649590
Пишу короткие куски кода на пройденную тему без использования справочников и автозаполнения кода в IDE. Вроде помогает, но через пару месяцев все равно много забывается, повторять надо.
#17 #649613
>>649590
Я не прохожу мимо решённых задач у анонов, почти каждую форкаю, исправляю, пытаюсь помочь решить и братишкам.
Довольно много нового узнал именно таким образом, а старое - крепко усвоил.
#18 #649617
Кто-нибудь совмещает с основной работой? Если да, то как, удачно? Кто-то уже ушёл со своей специальности на кодера?
#19 #649618
>>649617
Какие кодеры, тут дальше айфонов дело идет у единиц
>>649632
#20 #649622
>>649577
Замени myisam на innodb и расставь внешние ключи.
Поставь первичный ключ у `likes`(составной, на обе колонки)
>>649644
#21 #649632
>>649617
Я работаю пять дней в неделю, но уделяю два часа в день - обязательно.
Пришлось перестать читать художественную литературу и смотреть фильмы, пока об этом не жалею. Гуляю три часа в день.
С 10-го декабря вот только дошёл до бонусных задач в учебнике ОПа, ничего не пропускал.
Считаю, что пока всё вполне успешно.
>>649618
Да, задача действительно переломная. Или не справляются и бросают, или справляются - и пропадают. Ещё регулярные выражения, когда ОП или братишки начинают их разбирать, - почти так же действуют.
>>649643
#22 #649635
>>649617
пытался совмещать, зафейлил(забывал всё постоянно), с прошлой недели уволился. Счстлив. Теперь учу по 10 часов в день.
>>649647
#23 #649641
>>649617
Устроился кодером, полгода пашу уже. С тех пор уровень не подрос особо, на работе все задания однотипные.
#24 #649643
>>649632

>Я работаю пять дней в неделю


>уделяю два часа в день - обязательно


>Гуляю три часа в день.

>>649690
#26 #649647
>>649635
А живёшь на что?
>>649656
#27 #649654
Что означает //u в задаче про строки, где ОП переводит текст в массив? Вроде внимательно пересмотрел записи, не нашёл ничего.
#28 #649656
>>649647
так копил. Денег хватит по рассчётам до конца года и ещё останется
>>649658
#29 #649658
>>649656
но я надеюсь, конечно, найти работу до лета хотя бы
>>649662
#30 #649660
Не понял суть конструкции <<<EOF. Для чего это надо, когда в конце в эхо вписывается переменная? Почему бы переменной просто не назначить большой текст? Ведь разницы в записи нет. <<<EOF выглядит, как лишнее действие
>>649683>>649793
#31 #649662
>>649658
Удачи тебе!
>>649664
#32 #649664
>>649662
И всем стремящимся
#33 #649668
По поводу программы про палиндром: в какой теме из учебника было про то, как вырезать что-то из строки? Помню только, что можно было выкинуть элемент из массива.
Думал, что для начала надо построить массив, потом выкинуть из него пробел, но ОП рекомендует такой алгоритм:

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



Я где-то просмотрел команду на вырез символа?
>>649673>>649690
231 Кб, 1799x1199
#34 #649669
ОПушка, решаю задачи на ООП:

1. простая очень, не буду отвлекать ею
2. http://ideone.com/GmqSWk - табличка по сотрудникам.
3. http://ideone.com/hFXfAz - "Вектор" впервые пишу такого монстра, охуеть

подписывал тебе комментариями все места, чтобы легче было проверять.
В векторе сделал манагеров-маркетологов и т.п. как классы, а департаменты как функции, надеюсь, всё правильно.

Буду ждать по ним комментариев, пока примусь за следующую.

*=======
Также: задача на лайки SQL (ты в прошлом треде дал комментарии по улучшению)
http://sqlfiddle.com/#!9/8264a7/2

Есть вопросы:
1. поменял TEXT на VARCHAR. Но зачем? Разве TEXT не универсальней?
2. Добавил референс (внешний ключ), и почитал по ссылке, но не очень понял, зачем он тут? И без этого работало же.
3. Ты советовал во вторую таблицу(likes) добавить PRIMARY KEY тоже, но для чего? Я пытался сделать одну из колонок праймери ки, но пишет ошибку.
Спасибо заранее.
#35 #649673
>>649668
мб замена? str_replace
#36 #649680
>>649654
unicode вроде
#37 #649683
>>649660
<<<EOF нужно, чтобы текст не надо было разбивать готовый. Если кавычки используешь, надо весь текст проверять, их искать и экранировать, или разбивать на куски. Тут нет. Если большой текст, то удобнее с <<<EOF. С небольшими удобнее с кавычками.
#38 #649684
Ничего если с дб прямо из виджета работать или обязательно только в контроллерах?
>>649795
#39 #649690
Что-то меня разнесло, извините.
Обстоятельность никому не нужная и разговоры о жизни, ничего важного.

>>649643
У меня работа связана с постоянным вниканием в текст, я три часа гуляю обязательно, причём с семьёй, иначе давно бы свихнулся. Хожу в тренажёрный зал, хожу на открытую площадку в парке, там тоже тренажёры. Катаюсь раз в неделю на коньках, бегаю на лыжах.
Я не считаю хорошим отдыхом сидение за компьютером и просмотр всякой ерунды.
Часа полтора перед сном, полчаса в общей сложности на работе - вот и всё моё обязательное время для изучения РНР.

>>649669
Оо, старый знакомый. Перешёл уже к ООП, неплохо.
А я доделал "Числа прописью", но там много несуразностей, ОП уже разобрал сегодня. Как-нибудь поправлю.

>>649668
Preg_replace.
Советую искать в учебнике ОПа каждый раз на этом этапе - так ты лишний раз всё просматриваешь, многое дополнительно усваиваешь.
>>649693>>649704
#40 #649692
>>649654
Это регулярка же с пустым символом и флагом u для корректной работы с кириллицей: '//u'.
Эта регулярка находит все пропуски между символами, с её помощью можно, например, разбить слово на отдельные буквы и наполнить ими массив.
>>649694
#41 #649693
>>649690
Учебник ОПа - это изображения "из пейнта", в которых теория описана?

Братцы, это совсем безнадёга? http://ideone.com/hTLms6
#42 #649694
>>649692
Дополнение: поставь вот такую регулярку - '/ /u' - найдёт пробелы (аналогично и '/\\s/u').
#43 #649695
>>649693

>Учебник ОПа - это изображения "из пейнта", в которых теория описана?


Да. Теория с задачами и кучей толковых советов.
#44 #649698
>>649693
Нет, всё в порядке, просто разберись с функцией mb_substr:
1. Как получить первый символ в тексте с её помощью?
2. Как получить последний символ в тексте с её помощью?
Основная проблема с этим.
Далее символы у тебя получаются строковые, они не могут быть больше или меньше, они могут быть только равны друг другу или не равны. Поэтому ($symb1 <> $symb2) не будет работать в этой ситуации.
>>649701>>655572
#45 #649699
>>649693
А ещё на каждом шагу делай var_dump - чтобы убедиться, что функции дают то, что ты задумывал.
#46 #649701
>>649698
Спасибо, завтра разберусь
#47 #649704
>>649690
Да-да, помню тебя, анон. Молодец, я так и не доделал две последние задачи из php (тригонометрия и расчёт маршрута), всё лелею надежду вернуться к ним, но решил для начала добить ООП (интересная тема на самом деле).
>>650278
#48 #649724
Надо вывести определённый блок вёрстки на печать на принтере, с учётом всех стилей, делаю так в файле css

@media print {

....код CSS для этого блока

}

Всёравно выводит на печать документ без учёта стилей, как это можно исправить?
#49 #649732
Как веб-программисты получают по 2К долларов в месяц? Я уже 3 день пишу один функционал на сайт, у заказчика меняется ТЗ каждый день, он просит добавить что-нибудь ещё, в итоге если завтра я доделаю всё это, то получу 1500 рублей. Я конечно куплю себе Биг Мак, а может и даже два, но с такой работой больше 15К рублей не заработать в месяц.
#50 #649734
>>649732
Зачем ты на русскоговорящих работаешь? И вообще это не по теме треда.
>>649746
#51 #649739
>>649732
где и как ты такого заказчика взял?
#52 #649745
>>648489
По поводу "keep-alive" (постоянное соединение, знаю). А сколько одновременных соединений может выдержать сервер?
Что если с тысяч компов будет установлено соединение, и каждую секунду высылаться по одному байту, лишь бы держать соединение вечно. Что-то похожее на дудос. Сервера как-то умеют от этого защищаться?

>разбей заголовок на 2 строки


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

Остальное получилось средствами curl.

С этим ssl и https все-таки непонятно. Что это, зачем это, как оно мне пригодится на практике. Если на собеседовании спросят "что такое https и чем отличается о http?", я могу сказать только "ну типа че-то там шифруется". Наверное, это не очень полный ответ. Как бы ты на него ответил?
#53 #649746
>>649734
Ты предлагаешь мне заставить его выучить английский язык, а что делать если он его уже знает?
>>649782
#54 #649782
>>649746
Если знает, пишешь цену в долларах.
#55 #649792
>>649654

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

Для разбиения на буквы можно использовать

$letters = preg_split("//u", $text, null, PREG_SPLIT_NO_EMPTY);

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

Если вдаваться в детали, то работает это так:

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

Ну например вот дана такая строка:

$x = preg_split("/[0-9]+/u", "a123b456");

- проверяется совпадение строки начиная с первого символа, "a123b456", с регуляркой. Совпадения нет, так как регулярка требует наличия 1 или более цифр, потому preg_split переходит к следующему символу строки
- проверяется совпадение строки, начиная со второго символа ("123b456"), c регуляркой. Совпадение есть - регулярка соответствует символам 123 (квантификатор плюс жадный и всегда стремится захватить максимум символов). Так как совпадение есть, то preg_split проскакивает совпавшую часть ("123"), а то что шло перед ней, добавляет в массив результатов ("a").
- проверяется совпадение оставшейся части строки "b456" с регуляркой - совпадения нет, потому preg_split переходит к следующему символу
- проверяется совпадение строки "456" с регуляркой. Совпадение есть, потому preg_split добавляет в массив результатов "b", проскакивает цифры
- обнаружен конец строки. Preg_split добавляет в массив результатов, все что от нее осталось, это пустая строка, и получается результат ["a", "b", ""]

Теперь вернемся к хаку.

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

Обрати внимание на флаг u. Он говорит что текст в utf-8 и заставляет разбивать строку именно на буквы по границам utf-8 символов, а не на куски по 1 байту (в utf-8 1 символ кодируется несколькими байтами).
#55 #649792
>>649654

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

Для разбиения на буквы можно использовать

$letters = preg_split("//u", $text, null, PREG_SPLIT_NO_EMPTY);

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

Если вдаваться в детали, то работает это так:

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

Ну например вот дана такая строка:

$x = preg_split("/[0-9]+/u", "a123b456");

- проверяется совпадение строки начиная с первого символа, "a123b456", с регуляркой. Совпадения нет, так как регулярка требует наличия 1 или более цифр, потому preg_split переходит к следующему символу строки
- проверяется совпадение строки, начиная со второго символа ("123b456"), c регуляркой. Совпадение есть - регулярка соответствует символам 123 (квантификатор плюс жадный и всегда стремится захватить максимум символов). Так как совпадение есть, то preg_split проскакивает совпавшую часть ("123"), а то что шло перед ней, добавляет в массив результатов ("a").
- проверяется совпадение оставшейся части строки "b456" с регуляркой - совпадения нет, потому preg_split переходит к следующему символу
- проверяется совпадение строки "456" с регуляркой. Совпадение есть, потому preg_split добавляет в массив результатов "b", проскакивает цифры
- обнаружен конец строки. Preg_split добавляет в массив результатов, все что от нее осталось, это пустая строка, и получается результат ["a", "b", ""]

Теперь вернемся к хаку.

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

Обрати внимание на флаг u. Он говорит что текст в utf-8 и заставляет разбивать строку именно на буквы по границам utf-8 символов, а не на куски по 1 байту (в utf-8 1 символ кодируется несколькими байтами).
#56 #649793
>>649660

Это heredoc, он позволяет писать строку содержащую и одинарные, и двойные кавычки. Почитай мануал, обрати внимание, что там есть еще nowdoc: http://php.net/manual/ru/language.types.string.php#language.types.string.syntax.heredoc

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

>>649669

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

> поменял TEXT на VARCHAR. Но зачем? Разве TEXT не универсальней?


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

> Добавил референс (внешний ключ), и почитал по ссылке, но не очень понял, зачем он тут? И без этого работало же.


Внешние ключи определяют связи между таблицами. Это имеет такие преимущества:

1) любой кто читает твой код видит как связаны таблицы. А без внешних ключей как это понять?
2) база данных гарантирует целостность ссылок. то есть не разрешает вставить например id несуществующего юзера. Это позволяет обнаруживать ошибки в программе до того как в базу будет вставлены неправильные значения, а чем раньше обнаружена ошибка тем проще ее исправить. Что лучше: если ошибка выпадает сразу, или если прошло полгода, половина базы забита неправильными данным и тут ты обнаруживаешь что что-то не так?
3) база данных позволяет определить что делать при попытке удаления связанных друг с другом данных. Опять же это защищает от нарушения целостности связей.

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

База данных без внешних ключей - это просто свалка.

> Ты советовал во вторую таблицу(likes) добавить PRIMARY KEY тоже, но для чего?


1) чтобы запретить вставку одинаковых пар значений
2) чтобы показать что ссылаться на записи в этой таблице нужно через эти колонки

> Я пытался сделать одну из колонок праймери ки, но пишет ошибку.


Значит ты сделал неправильно. Погугли и ответь-ка, что такое первичный ключ? Что такое естественный и искуственный первичный ключ? Может ли в таблице сотрудников компании Фамилия быть первичным ключом? А сочетание Имя + Фамилия + Отчество + дата рождения? Что должно быть первичным ключом в таблице лайков?

Также, сходи ка в гугл и почитай еще про нормализацию базы данных, там есть статьи, написанные простым языком.
#56 #649793
>>649660

Это heredoc, он позволяет писать строку содержащую и одинарные, и двойные кавычки. Почитай мануал, обрати внимание, что там есть еще nowdoc: http://php.net/manual/ru/language.types.string.php#language.types.string.syntax.heredoc

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

>>649669

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

> поменял TEXT на VARCHAR. Но зачем? Разве TEXT не универсальней?


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

> Добавил референс (внешний ключ), и почитал по ссылке, но не очень понял, зачем он тут? И без этого работало же.


Внешние ключи определяют связи между таблицами. Это имеет такие преимущества:

1) любой кто читает твой код видит как связаны таблицы. А без внешних ключей как это понять?
2) база данных гарантирует целостность ссылок. то есть не разрешает вставить например id несуществующего юзера. Это позволяет обнаруживать ошибки в программе до того как в базу будет вставлены неправильные значения, а чем раньше обнаружена ошибка тем проще ее исправить. Что лучше: если ошибка выпадает сразу, или если прошло полгода, половина базы забита неправильными данным и тут ты обнаруживаешь что что-то не так?
3) база данных позволяет определить что делать при попытке удаления связанных друг с другом данных. Опять же это защищает от нарушения целостности связей.

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

База данных без внешних ключей - это просто свалка.

> Ты советовал во вторую таблицу(likes) добавить PRIMARY KEY тоже, но для чего?


1) чтобы запретить вставку одинаковых пар значений
2) чтобы показать что ссылаться на записи в этой таблице нужно через эти колонки

> Я пытался сделать одну из колонок праймери ки, но пишет ошибку.


Значит ты сделал неправильно. Погугли и ответь-ка, что такое первичный ключ? Что такое естественный и искуственный первичный ключ? Может ли в таблице сотрудников компании Фамилия быть первичным ключом? А сочетание Имя + Фамилия + Отчество + дата рождения? Что должно быть первичным ключом в таблице лайков?

Также, сходи ка в гугл и почитай еще про нормализацию базы данных, там есть статьи, написанные простым языком.
>>649872>>653002
#57 #649795
>>649669

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

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

>>649684

В моделях. Перечитай что такое MVC и зачем нужны контроллер и прочее.

>>649732

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

>>649745

Ты не читал пасту про архитектуру серверов? Нгинкс легко выдерживает медленные соединения по причине своей архитектуры. Апач - нет.

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

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

Эффективной мерой борьбы с ДДОС является сокрытие настоящего адреса сервера и установка фильтрующего реверс-прокси в дата центре с мощными каналами, которые атакующий забить не сможет.
>>653002
#58 #649796
>>649745

> >разбей заголовок на 2 строки


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


Надо передать фразу hello world 2 строками заголовка. Прочитай как можно передавать многострочные заголовки.

> Правда непонятно, зачем вообще разрывать заголовок на две строки?


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

> С этим ssl и https все-таки непонятно. Что это, зачем это, как оно мне пригодится на практике. Если на собеседовании спросят "что такое https и чем отличается о http?", я могу сказать только "ну типа че-то там шифруется". Наверное, это не очень полный ответ. Как бы ты на него ответил?


Я бы почитал теорию, как минимум про сертификаты и как они проверяются. Про виды шифрования. Вот например если твой провайдер или спецслужбы вклиниваются в трафик - могут ли они вставить рекламу на https сайт? Могут ли узнать на какие сайты ты заходишь? Твой логи и пароль? Какие ты комментарии оставляешь?

А что знает о тебе https сайт? Знает ли он в каком городе ты находишься например? Откуда ты перешел на этот сайт?

Или допустим поставь себя на место этих самых спецслужб. Можно ли определить, заходит ли пользователь на сайт ИГИЛ? Смотрит ли видеоролики на этом сайте? Оставляет ли комментарии? Можно ли определить с кем он ведет переписку в gmail? Ну или хотя бы узнать его адрес e-mail? Какие способы получить эти данные ты можешь предложить?

Или допустим есть некий нехороший https сайт, распространяющий запрещенную информацию, размещенный в другой стране и неподконтрольный тебе. Как можно получить какие-то данные о его пользователях?
>>650815
#59 #649797
>>649760

> ты по этой теме вышку получал или нет?


Получал

>Можешь посоветовать каких-нибудь тем веб-проектов в качестве дипломной работы бакалавра?


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

Ну вот создатели Гугла например делали в ВУЗе работу по разработке алгоритма индексирования и ранжирования документов в интернете. Ну конечно чтобы такие передовые вещи делать надо много знаний. Но с другой стороны, набыдлокодить обычный сайт на PHP - это уровень колледжа, а не ВУЗа.

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

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


Это потому что ты его плохо знаешь. Изучай лучше и пиши на нем хороший, аккуратный код.
>>649818
#60 #649799
>>649745

Или вот еще интересный вопрос: допустим ты спецслужба западной страны (A) и установил перехватывающее трафик оборудование в дата центре другой страны (B). При каких условиях ты сможешь перехватывать и подменять https трафик пользователей из страны B заходящих на сайт размещенный в стране B?

Или еще вопрос: допустим ты руководство одной восточной страны и хочешь запретить трансграничную передачу данных по протоколу HTTPS. Возможно ли заблокировать именно этот протокол, оставив возможность передачи данных без шифрования?
>>649846>>650815
#61 #649806
Ребятки, поясните за сокеты. Насиловал статьи по теме, но мало что понял. Можете сказать доступным языком, для каких целей они используются в php? Если не трудно, приведите пример.
#62 #649808
>>649806
Понял, что есть сокет клиента и сокет сервера. Но зачем? Для чего они? Почему бы просто не передавать данные обычным POST?
>>654384
#63 #649809
>>649806

Сокеты unix или вебсокеты?
>>649829
#64 #649818
>>649797

>Разработка автоматизированной системы для чего нибудь связанного с обучением или наукой.


А чего именно автоматизировать-то? Всякие сдаватели тестов онлайн уже написаны.
И вот ишшо:

>Если бы сейчас сам начинал учить, пошел бы в PHP или в питон/ноду, скажем? Думаю, туда ли направил стопы.

>>650345
#65 #649829
>>649809
Веб сокеты.
>>654384
#66 #649846
>>649799

> Возможно ли заблокировать именно этот протокол, оставив возможность передачи данных без шифрования?


http
>>649851
#67 #649851
>>649846

Это не ответ на вопрос. Именно принуждение к переходу на HTTP и подразумевалось в вопросе.
>>649856
#68 #649856
>>649851
Ну порезать на магистралях всё остальное и всего делов.
>>649860
#69 #649860
>>649856

Вопрос включает в себя подвопрос, есть ли возможность отличить HTTPS трафик от других видов трафика. Как иначе его резать?
#70 #649867
Анон, нид хелп. Третий день ебусь над регулярками. Задание на граммар:
https://ideone.com/EVFKtn
Сразу поясню, массив matches я оставил на потом, чтобы выводить где именно ошибка.
>>650030>>650078
#71 #649872
>>649793

>> Ты советовал во вторую таблицу(likes) добавить PRIMARY KEY тоже, но для чего?


>1) чтобы запретить вставку одинаковых пар значений


>2) чтобы показать что ссылаться на записи в этой таблице нужно через эти колонки


ОПушка, я понял наконец, почему мне выдавало ошибки, когда я пытался PRIMARY KEY в таблицу лайки поставить: у меня ведь 1 и тот же юзер ставил лайки разным пользователям и повторяется много раз. А PRIMARY KEY ругается и пишет ошибку, если значение более 1 раза повторяется. Ты уверен, что в данной задаче необходимо праймери ставить? У нас же лайков может быть сколько угодно
>>649886
#72 #649886
>>649872

Один пользователь не может лайкнуть второго дважды.
>>650157
82 Кб, 709x600
#73 #649898
Няши, у меня вордпресс генерирует в одну определённую страницу неизвестный Javascript код. Мне нужно сделать правку в этом коде, но я не пойму, откуда он берётся. Когда захожу в окно редактирования страницы в самом ВП, то его там нет, файла с таким содержимым я тоже не нашел (смотрел с wp-content/themes... и wp-included.
Сам ньюфаг в вордпрессе, взял задание на JS, а заказчик не сказал, что у него сайт на ЦМС.
С меня няши :з
>>649934>>649935
#74 #649934
>>649898

Поиском по файлам попробуй найти.
#75 #649935
>>649898

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

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

Если этот код часть вордпресса - тоже нельзя.

Ты должен умело изменять поведение страницы, а не лепить костыли, из-за которых потом нельзя обновить библиотеку или вордпресс.
>>649944
#76 #649944
>>649935
Я и не собирался, просто это сделали для меня. Я думал, он будет в enqueue script, но нет.
Там плагин jquery и его инициализация, причём не отдельными файлами, а скопипащенным минифицированным кодом плагина + парой строк для его инициализации.
>>649947
#77 #649947
>>649944

Исходники jquery править нельзя.
>>649992
#78 #649992
>>649947
Думаю, кто из нас наркоман и не понимает другого?
#79 #650030
>>649867
Ну же, народ. Помогите пожалуйста
>>650064
#80 #650064
>>650030

>[\\,\\.\\!\\?\\:\\;]


>[^\\,\\.\\!\\?\\:\\;]


В квадратных скобках только специальные символы надо экранировать.
Также в последней регулярке не вижу логики: "отсутствует любой из указанных символов перед буквой "а"" - сработает и на "Лалка азаза".
Ты и сам бы увидел, что не срабатывает последняя регулярка - сделай var_dump($matches), там нет результатов от неё.
>>650097
#81 #650068
хелло антуаны, я еще в прошлом треде решал задачу на кредиты, и меня попросили допилить с бесконечным циклом. допилил, кек. проверяйте
https://ideone.com/BzsFRy
>>650075
#82 #650069
HTML/CSS
Задание 2: https://jsfiddle.net/gLx7vewr/
Задание 3: https://jsfiddle.net/t3jsdb4x/
>>650087
#83 #650075
>>650068

>$percent - 1


Что это и для чего?

>$creditBalance < 0


Такого не должно быть, чтобы $creditBalance был меньше нуля. Попробуй вывести промежуточные платы - развернуть всё, как в задаче про Айфон. Наверняка там в минус всё уходит.
>>650080
#84 #650078
>>649867
А телефон-то не доделал по-человечески?
Куда скачешь как конёк-горбунок?
>>650097
#85 #650080
>>650075
потому что процент перемножается с суммой кредита, и чтобы не плюсовать потом, берется сразу с 1, но чтобы высчитать чистый процент, нужна либо отдельная переменная либо просто вычесть еденичку.
там он и не будет меньше нуля, как только он ниже нуля становится, то остаток складывается с прошлыми выплатами.
ну или я чет путаю. нужен третий
>>650128
#86 #650087
>>650069

Во второй задаче нет рамки и зеленого блока. Первый раз вижу решение с настолько минималистичным дизайном
#87 #650097
>>650064

>в последней регулярке


Вот и вопрос - там я пробел поставил, он разве не считается? И чому у меня первая регулярка не не выводит 2 раза сообщение?
>>650078
Телефон доделал, просто забыл ссылку сохранить, она дома в браузере открыта, а я на работе сейчас.
>>650128
#88 #650128
>>650080
Ну как сработало бы такое условие, если бы $creditBalance был хотя бы даже равен нулю? А не сработало бы в таком виде. А значит, там в какой-то момент ныряет в минус, а потом плюсуется к $paymentTotal и становится правильной суммой.
>>650097
Так он и считается. Но у тебя же циркумфлекс в квадратных скобках - значит, "все указанные символы должны отсутствовать". Поэтому и не срабатывает на ",а", асработает на "лалка азаза" и подобном.
>>650131
#89 #650131
>>650128

>циркумфлекс в квадратных скобках


Ну да, идея такова что если идет что угодно кроме знаков препинания, потом пробел и "а" или "но" - то выводить ошибку.
>>650135>>650137
#90 #650132

>"Чат изучающих PHP"


Ай, малаца! Только сейчас заметил.
#91 #650135
>>650131
А если слово начинается с "а"?
Попытка номер 3
>>650136
#92 #650136
>>650135
Во блин, спасибо. Тугой я, извини. Но тем не менее, я все равно не понимаю почему правило в целом не работает.
#93 #650137
>>650131
Тебе нужно более точно обозначить "а" и "но" как союзы. Подумай.
>>650143
#94 #650143
>>650137
Сделал \\b , должно исправить ситуацию, но не работает.
#95 #650156
Блядь, лол. Короче у меня в правиле (а|но) - буква "а" была в английской раскладке.
>>650249
#96 #650157
>>649886
покажи, как в моём примере добавить PRIMARY KEY, пожалуйста
>>650180
#97 #650180
>>650157

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

Для начала, погугли что вообще такое первичный ключ и какие они бывают. Найди ответы на вопросы: что такое первичный ключ? Что такое естественный и искуственный первичный ключ? Может ли в таблице сотрудников компании Фамилия быть первичным ключом? А сочетание Имя + Фамилия + Отчество + дата рождения? Что должно быть первичным ключом в таблице лайков?
#98 #650226
Если я не новичок в кодинге, то можно сразу начинать с php5 в подллинике, миную 1 сайт в шапке?
#99 #650249
>>650156
https://ideone.com/9Xn3LQ - по-прежнему не работает правильно эта регулярка.
>>650254
#100 #650254
>>650249
Вот - https://ideone.com/EVFKtn
Сейчас ебусь со "сдесь" и т.д.
>>650277
#101 #650277
Алгоритм задачи "Чай с тортиком".
1. Одномерный массив с учениками.
2. Переменная с количеством слогов - 5.
3. Цикл с for, в котором увеличивается переменная $i и условием поставлено, что оставшееся число учеников больше количества слогов.
4. Вложенный цикл с foreach, в котором массив с учениками раскладывается на ключи и значения.
5. Когда переменная $i становится равной переменной с количеством слогов - удаляем соответствующие ключ и значение из массива с учениками.
6. Когда переменная $i становится меньше переменной с количеством слогов - выводим результат.
Вот только сегодня подумал об unset, до этого хотел дополнительный массив набивать найденными ключами, а потом как-то вырезать их из исходного массива с учениками в дополнительном цикле.
Сейчас многое вижу и ощущаю последствия, неплохо.
Но, к сожалению, обдумывать задачу всегда приятнее, чем садиться за написание кода, но какой-то мандраж перед написанием быстро проходит, становится интересно, вхожу во вкус.

>>650254
https://ideone.com/BLdeie - регулярку для "а" ты не изменил, получается?
Если поставить слово с ошибкой в начало текста - не видит его регулярка.
Немного неверный подход у тебя, братишка.
"Сдесь", "координально" и т.п. - просто оставь в этой регулярке и обозначь, что с обеих сторон могут быть или не быть символы пробела, могут быть или не быть другие слова.

>(координально|сдесь|зделаю)


>зделаю


А также надо бы "зделано", "зделал", "зделала", "зделали".
Но это лучше потом, когда с основным разберёшься, чтобы лучше все принципы понять.
>>650286>>650292
#102 #650278
>>649704
Нет, братишка, это ты молодец - начинал в январе, а вон куда уже продвинулся, какие штуки уже делаешь.
Я отстаю намного.
#103 #650283
Есть ли способ как-то создавать массив, просто указав первое значение и последнее?
$array = array(1 ... 30)
Вот такого типа.
Не могу найти, как. Но что-то такое встречалось не в учебнике ОПа, не могу вспомнить.
>>650302
#104 #650286
>>650277
По поводу "а" - я нахожу часть текста где идет - что угодно но не знаки препинания, потом пробел и потом "а" или "но". Добавил пробел после "а", теперь не должно находить слова начинающиеся на "а".
"координально", просто убрал .{3}? в начале и все заработало, ссылка - https://ideone.com/EVFKtn актуальна.
>>650295
#105 #650292
>>650277
Добавил слова на "а" в пример, их не находит как ошибки. Другие слова (зделано и т.д.) я так понимаю будут работать так-же как и координально. Ну разве что можно выделить начало "зд" и добавить окончания разные.
#106 #650295
>>650286
Так лучше. Но там по условию задачи надо как-то обозначать и контекст ошибки.
Подумай, как.
Вспомни про спецсимволы +, *, ?, про буквы, складывающиеся в слова, это должно помочь.
>>650298>>650300
#107 #650298
>>650295
То есть надо захватывать и окружающий текст, если он есть (слово может быть и в начале, и в конце).
>>650300
#108 #650299
ОП, ты тут? Немного углубился в ООП для прохождения Кошек-Мышек, там всякие подклассы бывают, абстрактные классы и т.п. Решать всё с той инфой, что ты в уроке даёшь, или инфу из самостоятельного чтения можно использовать?
>>651236>>657616
#109 #650300
>>650295>>650298
Так я пытался. Исползую в других регулярках .{3}? - любой символ может встретиться, а может и нет. Но с ним не работало какого- то хуя.
>>650440>>655612
#110 #650302
>>650440
#111 #650305
http://ideone.com/daxPMz
Оцените задачу с кредитом на айфон.
Объясните как сделать так , что бы показывало сумму с которая больше миллиона ?
#112 #650316
>>650305
Добавь в if с выводом поздравлений ещё один вывод текущего баланса.
#113 #650317
бля не могу. А можно просто ебашить запросы к майсоклу прямо в виджетах без использования всяких моделей и дата провайдеров? Там просто связанные таблицы, на хабре какая-то крипота, типа третью таблицу создавать и инсертить в нее данные из двух таблиц и делать ее моделью, но это же херня какая-то.
https://habrahabr.ru/sandbox/89573/
>>650342
#114 #650342
>>650317
Для юи наверняка уже написаны готовые экстеншены на любой случай жизни, хоть closure table, хоть nested sets. Там даже думать не нужно, тебе понравится.
>>650362
#115 #650345
>>649818
Аноний, скажи же что-нибудь.
>>654384
108 Кб, 1223x424
#116 #650349
Почему так криво выводит? Пробовал вручную строку переписывать, ничего не вышло.
>>651046
#117 #650362
>>650342
Да, для уи написан виджет, выводящий пагинированную дату, вот только он написан для ОДНОЙ таблицы, на основе одной модели. А у меня две таблицы и выборка из двух. Вот сижу думаю, как это все побысрее сговнокодить и запихнуь в лисвью.
#118 #650421
>>650305
С каким кредитом на Айфон? Там задача про вклад 10к в банке.
Решена неверно, там должно 49 лет быть и конечная сумма 1060 000 с чем-то.
#119 #650440
>>650300
Не работает в начале текста такое. Как я понимаю, знак "?" в этом случае не относится к "точке" и не учитывается. Просто берётся три разных символа. То же самое будет и в конце текста.
Поэтому я и говорю о знаках +, , ?, кое-какие тут помогут.

>>650302
Огромное спасибо, это именно то, что нужно!

>>650305

>$balance=$balance$annualPercentage


В данном случае неправильно выражение ставить в цикл, потому что условие $balance<=10000000 проверяется после каждой итерации, цикл тут же обрывается, когда $balance становится больше миллиона, не успевает вывести последний раз echo.
Попробуй это выражение поместить в тело цикла - сразу всё заработает, как надо.
>>655612
#120 #650616
Решил задачу на Айпад в кредит.
Подскажите, пожалуйста, все верно?
http://ideone.com/EOYZQx
>>650710>>650712
#121 #650676
Есть тут пхп аноны из Белоруссии ?
#122 #650710
>>650616
Ответ не правильный, где- то в математике ошибка. Сейчас гляну.
#123 #650712
>>650616

>$pay = $sumCredit;


>$sumCredit = 0;


А где проценты за последний месяц?
>>650723
#124 #650723
>>650712
Т.е нужно?

>$pay = $sumCredit * $percent;


>$sumCredit = 0;


?
>>650741
#125 #650741
>>650723
И комиссия за пользование кредитом - тоже.
#126 #650748
Тут 1 анон выкладывал ссылки, где он использовал такие выражения, как '+=' и '-=' (без кавычек)
Пробовал гуглить и как то нет ничего.
Может кто наводку дать или обьяснить что это такое ?
>>650763>>657605
#127 #650763
>>650748
http://php.net/manual/en/language.operators.assignment.php

Кратко - смешанные операторы равенства.

$a += 10; // $a == 10
$a += 5; // $a == 15
>>651574
123 Кб, 1024x1024
#128 #650775
Доброй ночи, вкатываюсь в тред успешных людей.
Хочу рассказать свою историю.
Программист, уже 23 года, заканчиваю профильный вуз.

Ранее пробовал искать работу на c#, но не прошел собес на джуна, к которому очень готовился, и перепутал паттерных. Меня не взяли. Потом было одно тестовое задание, но я не успел поднять asp.net mvc, и не смог его сделать.

Сейчас я работаю на php + html + js, пишу под один популярный шаблон магазинов, не важно. Делаю я это бесплатно, проект долгий, как закрою наверное заплатят.
Мне интересен веб, я прошел курсы по html + js, но из - за того что в моей работае эти почти не используется, я почти все уже забыл.

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

Вот так и сижу на тухлом стартапе с обещаниями золотых гор, и забываю то что знал ранее.
Сейчас хотя бы пишу дипломы на c# подзаказ, надеюсь смогу оплатить арендное жилье.
#129 #650777
>>650775
Поныть можно в соседнем перезвоним-треде, тут люди решают задачи и идут к успеху.
#130 #650784
Это какой-то кошмар - почти два часа провозился с задачей "Чай с тортиком": http://ideone.com/sugCcD
В голове всё было стройно и понятно, стал переводить в код - ни черта не работает верно.
Долго возился с тем, чтобы правильно по порядку обозначать учеников в массиве через range() - оказалось совсем и не обязательно это делать.
Цикл в цикле - и постоянно срабатывало условие if ($i == $rhyme), какого чёрта, еле с
этим разобрался. Помогло использование continue - переносит нас в начало основного цикла, всё обновляется и начинает правильно идти.
Похоже, тут вообще надо было делать через switch или через while - я только сейчас об этом, блин, подумал. Я их просто мало использовал, сразу думаю о for и foreach, тем более, что тут нужна была $i для подсчёта и сравнения.

>>650775
Поменяй местами циферки в числе своих лет - мне уже почти столько.
Так, к слову.
Не знаю, чем помочь. Кроме как ненужным советом брать деньги вперёд и всё-таки посещать собеседования, выполнять тестовые задания.
>>651093>>657605
#131 #650815
>>649796
>>649799
Ты всегда отвечаешь вопросом на вопрос?
Ладно, попробую сам из той каши, что насобирал по разным статьям, составить хоть какую-то картину алгоритма защищенных соединений.

После установки соединения сервер высылает клиенту публичный ключ. Публичный ключ это такая строка, которая выступает в качестве параметра некой функции, шифрующей данные. Наверное можно провести аналогию с соленым хешем: мы используем соль, конкатенируем с паролем, затем пропускаем через md5 или sha1.
Публичный ключ это что-то вроде соли, он участвует в зашифровке данных.
Клиент для начала как-то там проверяет сертификат сервера, если он самоподписанный, то пользователю выдается предупреждение.
Сертификат вообще нужен для борьбы с "man in the middle" атакой, то есть перехватом пакетов третьей стороной и их подменой.
Сообщение клиента шифруется при помощи этого открытого ключа. Для расшифровки нужен секретный ключ, он создается при помощи хитрого использования односторонней функции (алгоритм Хеллмана). Этот момент неплохо объясняется в статье https://intsystem.org/security/asymmetric-encryption-how-it-work/ К сожалению другие моменты типа проверки сертификата там не проясняются.
На сервере сообщение клиента расшифровывается при помощи секретного ключа. Высылается ответ, который клиент расшифровывает тем же закрытым ключом.

>Я бы почитал теорию


Где?

>провайдер или спецслужбы вклиниваются в трафик - могут ли они вставить рекламу на https сайт?


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

>Могут ли узнать на какие сайты ты заходишь?


Думаю да. Клиенту и серверу ведь сначала нужно обменяться открытым ключом. А может и нет. Без понятия короче.

>Смотрит ли видеоролики на этом сайте? Оставляет ли комментарии? Можно ли определить с кем он ведет переписку в gmail? Ну или хотя бы узнать его адрес e-mail?


Нет наверное.

>Какие способы получить эти данные ты можешь предложить?


Не знаю.
#131 #650815
>>649796
>>649799
Ты всегда отвечаешь вопросом на вопрос?
Ладно, попробую сам из той каши, что насобирал по разным статьям, составить хоть какую-то картину алгоритма защищенных соединений.

После установки соединения сервер высылает клиенту публичный ключ. Публичный ключ это такая строка, которая выступает в качестве параметра некой функции, шифрующей данные. Наверное можно провести аналогию с соленым хешем: мы используем соль, конкатенируем с паролем, затем пропускаем через md5 или sha1.
Публичный ключ это что-то вроде соли, он участвует в зашифровке данных.
Клиент для начала как-то там проверяет сертификат сервера, если он самоподписанный, то пользователю выдается предупреждение.
Сертификат вообще нужен для борьбы с "man in the middle" атакой, то есть перехватом пакетов третьей стороной и их подменой.
Сообщение клиента шифруется при помощи этого открытого ключа. Для расшифровки нужен секретный ключ, он создается при помощи хитрого использования односторонней функции (алгоритм Хеллмана). Этот момент неплохо объясняется в статье https://intsystem.org/security/asymmetric-encryption-how-it-work/ К сожалению другие моменты типа проверки сертификата там не проясняются.
На сервере сообщение клиента расшифровывается при помощи секретного ключа. Высылается ответ, который клиент расшифровывает тем же закрытым ключом.

>Я бы почитал теорию


Где?

>провайдер или спецслужбы вклиниваются в трафик - могут ли они вставить рекламу на https сайт?


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

>Могут ли узнать на какие сайты ты заходишь?


Думаю да. Клиенту и серверу ведь сначала нужно обменяться открытым ключом. А может и нет. Без понятия короче.

>Смотрит ли видеоролики на этом сайте? Оставляет ли комментарии? Можно ли определить с кем он ведет переписку в gmail? Ну или хотя бы узнать его адрес e-mail?


Нет наверное.

>Какие способы получить эти данные ты можешь предложить?


Не знаю.
>>657608
#132 #650823
ОП, а можешь что-нибудь сказать про реализацию на PHP всяких WebDAV, CalDAV, SyncML... статьи, маны, инфа?
>>657612
9 Кб, 719x171
#133 #650853
Господа, могу ли я начинать цепочку методов на следующей строке, вот так? А то у меня после JS крыша совсем едет, бзднуть боюсь, что интерпретатор задымит.
#134 #650856
>>650853
Можешь.
>>650865
#135 #650858
>>649329 (OP)
Попробую вкатится, помню годика 2 назад пробовал с++ учить, обосрался на циклах и массивах, что ж попытка номер два.
всем похуй
>>650877>>650908
#136 #650861
Впервые в этом разделе, прочитал ОП-пост, не понял одного: почему нет ни слова про самый лучший PHP-фреймворк на планете?
Имеется в виду Laravel.
Втираете неокрепшим умам начинающих разработчиков говнофреймворки, вроде Yii.
#137 #650865
>>650856

Благодарю.
#138 #650867
>>650853
У меня в пхп 5.2 такой синтаксис не работает.
>>650872
#139 #650868
>>650861

Потому, что ОП работает с другими фреймворками, очевидно, хотя поддержу это мнение, потому что Laravel сделал для PHP то же самое, что Rails сделал для Ruby. Никогда мне еще не было так радостно писать на PHP.
#140 #650872
>>650867

PHP 7, полёт нормальный. На версии ниже использовать не планирую.
#141 #650877
>>650858
Также, в переменной можно сохранить (присвоить переменной значение, говорят программисты) строку $name = "Ivan"; или результат вычисления какого-то выражения: $balance = 1000 + 1000;.
поехавшая хуитка.
>>650883
#142 #650883
>>650877
Обоснуй.
>>650886
#143 #650886
>>650883
"Зачем" присваивать переменной строку если можно присвоить Ivan и пиздец, суть таже. 100+1000? Нахуя усложнять? Поясни как это можно использовать эти поехавшие штуки "с умом"?
>>650888>>657612
#144 #650888
>>650886

>"Зачем" присваивать переменной строку если можно присвоить Ivan и пиздец


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

>100+1000? Нахуя усложнять?


Пример иллюстрирует то, что в переменную можно записывать результат вычисления. Он не обязательно должен быть таким примитивным.
112 Кб, 1600x900
#145 #650908
>>650858
Короче спатки пойду и завтра продолжу, по идее задачу верно сделал. http://archive-ipq-co.narod.ru/l1/conditions.html
Днем допилю рулетку и пойду дальше.
всем похуй
>>650909>>657612
#146 #650909
>>650908
Ах да вопрос, обязательно ли при выводе переменной эти скобочки? echo "вывести {текст}"

И маст хев ли exit()?
>>651038>>657612
#147 #650946
>>649329 (OP)
Господа, заходите в уютную конфочку в телеге:
https://telegram.me/joinchat/AFkjiQbZ-ih1sNDznEmoxQ
#148 #650978
>>650861
Давно смотрю в его сторону.
Расскажи пожалуйста, что там крутого и интересного.
Я пробовал Симфони и Yii.
От первого лучше впечатления, но он действительно монструозен. Говорят что Ларавель похож на него, только проще.

Я так то теку от Рельсов и Руби магии, но не верю в такой комфорт на ПХП.
>>657614
#149 #650985
До сих пор не совсем понимаю нужду в интерфейсах и абстрактных классах.
Может кто, объяснить на примерах?

Это просто, как шаблон реализовав по которому класс, он точно будет верно работать ?
>>651227
#150 #650999
Вопрос: Куда выкладывать решение js задачек?
>>651003
#151 #651003
>>650999

jsfiddle, codepen, jsbin
#152 #651025
Нормально? http://ideone.com/3VrYkN
>>651029>>651054
#153 #651029
>>651025
Попробуй убрать повторяющиеся участки кода используя цикл
#154 #651034
Есть ли возможность конструировать объявление namespace динамически? Из строки например?
Или можно ли как-то сделать, чтобы неймспейсы по дефолту задавались в соответствии с путем к файлу, а не в глобал пихались?
>>651100
#155 #651035
>>649806
Никто не может пояснить? Мда.
#156 #651038
>>650909
Да, так оно выводит значение переменной.
57 Кб, 644x340
#157 #651046
>>650349
Заметил ещё, что он знает, что находится в строке. Видит же это Buffy, но вывести не может.
>>651103
#158 #651054
>>651025
Нет.

> слово1 слово2 слово3


> слово1 слово2 слово3


> Я слово4 слово5


В условии стоит так, а значит - надо добиваться такого, а не просто выводить разные повторяющиеся слово1, слово2 и т.п.
>>651089
#159 #651089
>>651054
да у него и есть так
>>651133
#160 #651092
Анон, как пользоваться sublime text? Я вот скачал, установил и все. Написать я в нем могу, а как запустить этот скрипт?
>>651104
#161 #651093
>>650775
>>650784
Я вот как почитаю подобные посты, что-то неуютно становиться.
мимо-студент-20 лвл
>>651133
#162 #651100
>>651034

Нельзя. Каждый класс относится к какому-то неймспейсу и это определяется еще до выполнения кода.

Что значит "в глобал пихались"? Ты ничего не путаешь?

Если тебе тяжело руками писать неймспейсы и use, поставь плагин к редактору, который это делает.
>>651101
#163 #651101
>>651100
Тут дело в версионировании модулей.
Неймспейсы меняются абсолютно везде при создании новой версии, руками можно править, но это пиздец долго и шанс накосячить ебливый.
>>651108
#164 #651103
>>651046

Ты файл в блокноте создавал или в редакторе? Надо для конца строк выбрать вариант "unix", чтобы в конце строки ставился только символ \n, а не \r\n. А так у тебя в значения полей попал символ \r который значит "поставить курсор в начало строки" и при выводе все портится.

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

Это если конечно я не ошибаюсь. Проверить можно, выведя значения колонки remark в 16-чном виде.

Кстати обрати внимние, у тебя \N не превратился в NULL - это плохо.
>>651448
#165 #651104
>>651092

Редактор для редактироания кода, а не запуска скриптов. Запускать скрипт надо из консоли:

php d:\temp\1.php

Почитай пасту про консоль из ОП поста.

Также, можно настроить саблайм чтобы он по какой-то кнопке запускал PHP, гугли как именно.
#166 #651106
И я вкачусь. Студент-механик ИТТ, 23 года. Заканчиваю магистратуру по направлению механика. Год проработал на заводике инженером-исследователем, думал пойти в науку, но что то совсем не идет у меня это дело. Все время хотел вкатиться в айти, но только начав изучать какой нибудь ЯП через день - два желание пропадало.
У вас тут уютненько в тредике, буду пытаться сделать студентиков!
>>657614
#167 #651108
>>651101

Что значит версионирование модулей? Тебе надо в одной программе иметь 10 копий одного класса? Ты явно делаешь что-то не так.

Заменить неймспейс в большом количестве файлов можно также функцией "поиск/замена" в твоем редакторе кода.

Но я ни разу с таким не сталкивался и интуиция подказывает мне что ты делаешь что-то неправильно. Какое еще версионирование, наркоман?
>>651111
#168 #651111
>>651108
Какое затребовали, с обратной совместимостью.
>>651115
#169 #651115
>>651111
Типа когда версия апнулась и изменилась какая-нибудь мелочь - хуяк и старые версии приложений начинают отваливаться, пока не обновятся. То есть старые версии затребовали оставлять на случай этого как-раз. Старые приложения работают со старым апи, обновятся - работают с новым. Как-то так.
>>657614
#170 #651133
Алгоритм задачи "Алфавит по кругу".
Не думал, что возьмусь за неё, но вот так вот.
Почитал подсказку, переспал с обдумыванием алгоритма - вроде бы всё в пределах досягаемости даже для такого застарелого филолога, как я.
Итак:
1. Подсчитываем количество букв в нужной строке и делим 360 градусов в круге на это число - устанавливаем угол (a), на котором должны располагаться буквы. Переводим градусы в радианы, с которыми работает PHP.
2. Устанавливаем радиус круга (LO) самостоятельно, как советует ОП. Наверное, как-то можно его и приблизительно определять, исходя из количества букв в нужной строке.
3. У нас sin(a) = LK / LO, а cos(a) = KO / LO. LO - это радиус круга.
Получается, координата x буквы (KO) будет равна радиус (LO) умножить на sin(a). А координата y буквы (LK) будет равна радиус (LO) умножить на cos(a). Попутно округляем получившиеся результаты до целого числа (sin даёт дробный результат), поскольку иначе мы не сможем наполнить результатами массивы в массиве. Также ОП предупреждает, что надо домножить координату x на опытным путём подобранное число, иначе круг будет неровным.
4. Создаём массив с массивами, наполненными ключами и пробелами в значениях:
$screen = array();
$screen[0] = array(0 => ' ', 1 => ' ', 2 => ' ', ...);
$screen[1] = array(0 => ' ', 1 => ' ', 2 => ' ', ...);
С количеством массивов пока не вполне ясно. Некоторые буквы у нас располагаются в линию, от этого зависит многое, как я понял.
5. $screen[0] - это первая строка, а $screen[0][0] - первая буква первой строки. У нас имеются $x и $y, мы можем обойти созданные массивы в массиве в двух циклах, вложенных один в другой, установить координаты соответствующих букв.
6. Далее остаётся вывести строки из массива одна за другой.
ОП также предупреждает, что может понадобиться отрицательное значение у некоторых координат; с этим пока совсем неясно, выяснится при написании кода.
Опять выглядит вроде бы совсем и не сложно, когда так вот всё распишешь.
Но у меня и задача "Чай с тортиком" в текстовом виде отлично смотрелась, а потом шла совсем даже не по маслу.

>>651089
Нет. У него:

> echo "{$jj} {$kk} {$ll}\n{$qq} {$ww} {$ee}\nЯ {$cc} {$vv}";


А должно быть как-то так:

>{$jj} {$kk} {$ll}\n


>{$jj} {$kk} {$ll}\n


>Я {$cc} {$vv}";


Нужен цикл, который выведет два раза строку {$jj} {$kk} {$ll}\n, а потом один раз строку Я {$cc} {$vv}"; - и оборвётся.

>>651093
Чому неуютно? У тебя же куча жизни впереди, да как и у меня. Тут люди и за полгода активного изучения находят работу (вполне верю в это). Кто ищет и не ленится - всегда найдёт.
Я изучать начал в конце прошлого года, мне только для собственного проекта это всё нужно.
Так что мой возраст никак ни с чем не связан в этой ситуации.
#170 #651133
Алгоритм задачи "Алфавит по кругу".
Не думал, что возьмусь за неё, но вот так вот.
Почитал подсказку, переспал с обдумыванием алгоритма - вроде бы всё в пределах досягаемости даже для такого застарелого филолога, как я.
Итак:
1. Подсчитываем количество букв в нужной строке и делим 360 градусов в круге на это число - устанавливаем угол (a), на котором должны располагаться буквы. Переводим градусы в радианы, с которыми работает PHP.
2. Устанавливаем радиус круга (LO) самостоятельно, как советует ОП. Наверное, как-то можно его и приблизительно определять, исходя из количества букв в нужной строке.
3. У нас sin(a) = LK / LO, а cos(a) = KO / LO. LO - это радиус круга.
Получается, координата x буквы (KO) будет равна радиус (LO) умножить на sin(a). А координата y буквы (LK) будет равна радиус (LO) умножить на cos(a). Попутно округляем получившиеся результаты до целого числа (sin даёт дробный результат), поскольку иначе мы не сможем наполнить результатами массивы в массиве. Также ОП предупреждает, что надо домножить координату x на опытным путём подобранное число, иначе круг будет неровным.
4. Создаём массив с массивами, наполненными ключами и пробелами в значениях:
$screen = array();
$screen[0] = array(0 => ' ', 1 => ' ', 2 => ' ', ...);
$screen[1] = array(0 => ' ', 1 => ' ', 2 => ' ', ...);
С количеством массивов пока не вполне ясно. Некоторые буквы у нас располагаются в линию, от этого зависит многое, как я понял.
5. $screen[0] - это первая строка, а $screen[0][0] - первая буква первой строки. У нас имеются $x и $y, мы можем обойти созданные массивы в массиве в двух циклах, вложенных один в другой, установить координаты соответствующих букв.
6. Далее остаётся вывести строки из массива одна за другой.
ОП также предупреждает, что может понадобиться отрицательное значение у некоторых координат; с этим пока совсем неясно, выяснится при написании кода.
Опять выглядит вроде бы совсем и не сложно, когда так вот всё распишешь.
Но у меня и задача "Чай с тортиком" в текстовом виде отлично смотрелась, а потом шла совсем даже не по маслу.

>>651089
Нет. У него:

> echo "{$jj} {$kk} {$ll}\n{$qq} {$ww} {$ee}\nЯ {$cc} {$vv}";


А должно быть как-то так:

>{$jj} {$kk} {$ll}\n


>{$jj} {$kk} {$ll}\n


>Я {$cc} {$vv}";


Нужен цикл, который выведет два раза строку {$jj} {$kk} {$ll}\n, а потом один раз строку Я {$cc} {$vv}"; - и оборвётся.

>>651093
Чому неуютно? У тебя же куча жизни впереди, да как и у меня. Тут люди и за полгода активного изучения находят работу (вполне верю в это). Кто ищет и не ленится - всегда найдёт.
Я изучать начал в конце прошлого года, мне только для собственного проекта это всё нужно.
Так что мой возраст никак ни с чем не связан в этой ситуации.
>>651143>>651408
#171 #651136
В Yii/Yii2 нет возможности сгенерить миграцию по модели?
>>657614
#172 #651143
>>651133

>5. $screen[0] - это первая строка, а $screen[0][0] - первая буква первой строки. У нас имеются $x и $y, мы можем обойти созданные массивы в массиве в двух циклах, вложенных один в другой, установить координаты соответствующих букв.


Хм, скорее всего, даже одного цикла будет достаточно. У нас ведь уже будут иметься готовые $x и $y - просто в одном цикле сразу сможем заполнить $screen[$x][$y], он у нас и так перед этим будет заполнен пробелами, не нужен дополнительный цикл для заполнения, это я с "Лиличкой" пересёкся мысленно.
#174 #651212
2) Доделай расшифровку зашифрованного текста.

http://ideone.com/XlFEBr

помогите аноны не могу понять что я делаю не так .
>>651213
#175 #651213
>>651212
у тебя опечатка на 30 строке
$c = strtr($ciphe, $code);
$c = strtr($cipher, $code);
>>651218
#176 #651217
Мне тут говорили через цикл сделать, так нормально http://ideone.com/kmVS9u ?
>>651221
#177 #651218
>>651213
серьезно блин спасибо
мне надо быть внимательней
#178 #651221
>>651217
попробуй еще оптимизировать цикл.
Посмотри внимательно какие куски кода делают одну и туже операцию. и не забывай у цикла есть счетчик используй его. Попробуй использовать многомерный массив
>>651263
#179 #651227
>>650985
Ну смотри, допустим у тебя в приложении есть форма логина, пишешь для нее класс.
Затем тебе понадобилась форма регистрации, пишешь для нее класс.
Тут замечаешь, что добрая половина методов и свойств первой и второй формы совпадает.
Если ты быдлокодер и тебе насрать на качество твой работы, ты так и оставишь, тем более что ты никогда не писал приложение с более чем 2-3 формами.
Но если ты ответственный программист, то догадываешься, что копипастить куски кода из одного класса в другой наверное неправильно. Тем более что в серьезных приложениях родственных классов будет не 2-3, а десятки-сотни.
Пишешь абстрактный класс, который содержит в себе все общее, что есть у классов форм, называешь AbstractForm.
Наследуешь LoginForm и RegisterForm от AbstractForm, в них прописываешь только уникальные для данного класса свойства и методы.

Что касается интерфейса, то это набор требований к классу, то есть буквально мы пишем: "у всех классов, которые имплементируют данный интерфейс, должен быть определенный функционал (метод), неважно как они будут реализованы, но они должны быть". Пример не знаю какой привести.
Вот чувак приводит пример со столами https://toster.ru/q/10682

>Связью же интерфейсов и классов Вы описываете свойства. Например, стол можно катить: Table_Abstract implements Rollable. Деревянный стол, например, можно сложить: Table_Wood implements Foldable.


Обрати внимание, что Rollable (с колесиками) может быть не только стол, но и стул, кровать, то есть совершенно другие типы объектов. Метод roll() будет у них всех реализован по-разному, поэтому мы не используем тут абстрактный класс типа НечтоКатящееся. Тем более что один класс может реализовывать множество интерфейсов, а абстрактный класс можно унаследовать только один. Стол должен быть одновременно с колесиками и складывающимся. Мы не можем создать абстрактный класс НечтоКатящееся, затем НечтоСкладывающееся, и создать класс Стол наследующий оба абстрактных класса. Да и не для этого они придуманы, класс всегда описывает объект, а интерфейс функционал. Абстрактный класс это обобщенное описание категории объекта, допустим стол, или стул, или кровать. От него наследуем уже какую-то конкретную разновидность, например СтолПисьменный расширяет АбстрактныйСтол реализует Складывающийся интерфейс.
А можно и оба интерфейса, пусть стол будет Складывающийся и Катящийся.
Затем создаем класс КроватьДвуспальная расширяет АбстрактнуюКровать реализует Катящийся интерфейс.

Короче абстрактный класс это обобщение, чтобы не копипастить общие методы и свойства по всем классам-наследникам, мы их группируем в одном классе.
Интерфейс это описание функционала, один класс может реализовывать множество интерфейсов. И один и тот же интерфейс может быть использован множеством классов.
Интерфейс не имеет реализации, он только декларирует, что у класса обязан быть определенный метод, а реализация может быть какая угодно, нас это не интересует, она инкапсулирована внутри.
#179 #651227
>>650985
Ну смотри, допустим у тебя в приложении есть форма логина, пишешь для нее класс.
Затем тебе понадобилась форма регистрации, пишешь для нее класс.
Тут замечаешь, что добрая половина методов и свойств первой и второй формы совпадает.
Если ты быдлокодер и тебе насрать на качество твой работы, ты так и оставишь, тем более что ты никогда не писал приложение с более чем 2-3 формами.
Но если ты ответственный программист, то догадываешься, что копипастить куски кода из одного класса в другой наверное неправильно. Тем более что в серьезных приложениях родственных классов будет не 2-3, а десятки-сотни.
Пишешь абстрактный класс, который содержит в себе все общее, что есть у классов форм, называешь AbstractForm.
Наследуешь LoginForm и RegisterForm от AbstractForm, в них прописываешь только уникальные для данного класса свойства и методы.

Что касается интерфейса, то это набор требований к классу, то есть буквально мы пишем: "у всех классов, которые имплементируют данный интерфейс, должен быть определенный функционал (метод), неважно как они будут реализованы, но они должны быть". Пример не знаю какой привести.
Вот чувак приводит пример со столами https://toster.ru/q/10682

>Связью же интерфейсов и классов Вы описываете свойства. Например, стол можно катить: Table_Abstract implements Rollable. Деревянный стол, например, можно сложить: Table_Wood implements Foldable.


Обрати внимание, что Rollable (с колесиками) может быть не только стол, но и стул, кровать, то есть совершенно другие типы объектов. Метод roll() будет у них всех реализован по-разному, поэтому мы не используем тут абстрактный класс типа НечтоКатящееся. Тем более что один класс может реализовывать множество интерфейсов, а абстрактный класс можно унаследовать только один. Стол должен быть одновременно с колесиками и складывающимся. Мы не можем создать абстрактный класс НечтоКатящееся, затем НечтоСкладывающееся, и создать класс Стол наследующий оба абстрактных класса. Да и не для этого они придуманы, класс всегда описывает объект, а интерфейс функционал. Абстрактный класс это обобщенное описание категории объекта, допустим стол, или стул, или кровать. От него наследуем уже какую-то конкретную разновидность, например СтолПисьменный расширяет АбстрактныйСтол реализует Складывающийся интерфейс.
А можно и оба интерфейса, пусть стол будет Складывающийся и Катящийся.
Затем создаем класс КроватьДвуспальная расширяет АбстрактнуюКровать реализует Катящийся интерфейс.

Короче абстрактный класс это обобщение, чтобы не копипастить общие методы и свойства по всем классам-наследникам, мы их группируем в одном классе.
Интерфейс это описание функционала, один класс может реализовывать множество интерфейсов. И один и тот же интерфейс может быть использован множеством классов.
Интерфейс не имеет реализации, он только декларирует, что у класса обязан быть определенный метод, а реализация может быть какая угодно, нас это не интересует, она инкапсулирована внутри.
>>651232>>651236
#180 #651232
>>651227
Спасибо
С абстрактным классов всё ясно.

Ну а для чего и когда используют и стоит использовать интерфейс, я так и не понял особо?
В том случае когда мы не знаем какой объект ожидать и хотим что бы это был хотя бы наследник интерфейса?
>>651531>>651534
#181 #651236
>>651227
ответь на >>650299
>>657616
#182 #651257
Сап, решил вспомнить пэхэпэ, а вот идей что сделать нету, посоветуйте что нибудь
>>651380
#183 #651263
>>651221
Это все что я могу http://ideone.com/GuS1Pe
>>651289>>657616
#184 #651289
>>651263
у тебя там скобка одна лишняя. Но вообще норм, иди дальше, тут добивать нечего
#185 #651332
Задачка на палиндром http://ideone.com/nABChI Правильно ли работает ребят?
#186 #651336
>>651332
нет.
1. код некрасивый
2. ну и самое главное - проверяет ток 1 и посл букву
>>651368
#187 #651358
>>651332

>$ch1=mb_substr($text,0,1);


Даст один раз самый первый символ с начала текста. И всё.

>$ch2=mb_substr($text,-1);


Не даст самый последний символ в тексте. А если бы и дало - только один раз можно было бы сравнить первый и последний символы в тексте в таком виде.
У тебя есть изменяющаяся при прохождении цикла переменная $i - вот и используй её, подставляя туда, куда нужно. От переменной можно отнимать в функции, можно прибавлять, можно ставить знак "минус" перед ней - и она станет с отрицательным значением.
Там должно быть, как минимум, два условия, а лучше даже три:
1. Буквы спереди и сзади текста совпадают - продолжаем цикл, можем вывести эти буквы с начала и с конца.
2. Буквы с начала текста и с конца не совпадают - выводим результат "Это не палиндром" и обрываем цикл.
3. Переменная $i равняется переменной $halflength - выводим результат "Это палиндром".
#188 #651368
>>651336

>код некрасивый


Yep. Я даже сразу не увидел в предыдущей задаче, где закрывается цикл, тут тоже всё в кучу.
Это не дело, от такого надо избавляться.
#189 #651380
>>651257
Бочку.
#190 #651387
>>651332
Аа, да: не забывай, что числа -0 не бывает!
>>651389>>651395
#191 #651389
>>651387
Да вроде не ставил )
>>651393
#192 #651393
>>651389
Сейчас ставишь, судя по коду.
#193 #651395
>>651387
Чому? Проверил только что, 0 == -0 == +0

также 4-0 == 4+0 == 4
>>651420
#194 #651408
>>651133
ну я кодингом давно занимаюсь, но теперь пересел на пыху. Так что за полгода-год реально пойти на джуна.
А неуютно читать подобное и думать что я стану 30-летним старпёром лол
>>651411>>651420
#195 #651411
>>651408
да у меня багор от вас, прекратите
гуманитарий 25-лвл, задрачиваю пыху для того, чтобы преуспеть
>>651420
#196 #651420
>>651395
Аа, точно, да. В программировании есть -0.
Ну, я имел в виду, что с -0 в этой функции ничего не будет работать, там такого не может и не должно быть.

>>651408
Стартапером, ты хотел сказать? Тридцатилетним стартапером, всё нормально.
Когда-нибудь каждый станет стартапером, если повезёт и если доживёт.

>>651411
Вполне реально так-то.
#197 #651448
>>651103
Поменял окончание строк в нотпаде. Помогло. И \N всё-таки стал NULL. Спасибо
#198 #651468
Сап, приглашаем в нашу конфу, посвященную пограммированию. Мы обсуждаем всё, так или иначе связанное с различными сферами разработки. У нас есть отдельные каналы про функциональные языки(Scala, Clojure, Haskell), про С++, про JavaScript, про Ruby, про Python, про PHP, про Java, есть development для обсуждения остальных языков и вопросов, связанных с разработкой, есть jobs для обсуждения вакансий, собеседований и рабочих вопросов, есть unix для обсуждения Linux- и BSD-based операционных систем и есть random для неформального лампового общения, плюс планируется ещё несколько каналов для других языков, которые вскоре будут созданы. У нас нет ограничений по уровню скила, мы рады как тотал нубам, так и синьорам ˜помидорам˜.

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

Пригласить себя можно здесь:https://invite-me-to-2chpr.herokuapp.com

Если инвайт не пришёл в течении 5 минут, попробуйте другую почту.
>>651470
#199 #651470
>>651468
идите нахуй, мрази
#200 #651507
Я тут немного переделал задачу, но все равно не могу допереть до ответа http://ideone.com/zPkbDi
>>651537
#201 #651522
>>649329 (OP)
Короче на циклах обосрался, на задаче про айфон, двойка по математике в школе дает о себе знать.
>>651627>>651643
#202 #651531
>>651232

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

Ну или если попробовать придумать более серьезный пример, например в какой-нибудь соцсети можно ставить лайки фотографиям, постам и пользователям. Классы, которые описывают эти сущности (Photo, User, Post), можно пометить интерфейсом Likeable. Допустим в этом интерфейсе определены 2 метода: добавить лайк (addLikeFrom(User $user)) и убрать лайк (removeLikeFrom(User $user)). Каждый класс может реализовать эти методы по своему, лишь бы они были реализованы.

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

function setLikeTo(Likeable $object)
{
...
}

Теперь любому программисту понятно какие объекты можно подать на вход этой функции. С другой стороны, функция получает гарантию что у переданного ей объекта есть методы addLikeFrom, removeLikeFrom.

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

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

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

Интерфейсы позволяют объединять не связанные наследованием классы.

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

ООП в первую очередь делался для больших проектов, где очень много кода. Без соблюдения правил ООП код станет настолько запутанным, что любые правки будут вызывать ошибки и будет уходить много времени на их исправление. В коде на 100 или 1000 строчек конечно это не заметно. А например, код ОС андроид содержит тысячи классов (хоть они и не на PHP, а на Яве, но ООП там примерно такой же).

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

Если ты не уверен где надо применять интерфейсы, не применяй их пока.
#202 #651531
>>651232

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

Ну или если попробовать придумать более серьезный пример, например в какой-нибудь соцсети можно ставить лайки фотографиям, постам и пользователям. Классы, которые описывают эти сущности (Photo, User, Post), можно пометить интерфейсом Likeable. Допустим в этом интерфейсе определены 2 метода: добавить лайк (addLikeFrom(User $user)) и убрать лайк (removeLikeFrom(User $user)). Каждый класс может реализовать эти методы по своему, лишь бы они были реализованы.

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

function setLikeTo(Likeable $object)
{
...
}

Теперь любому программисту понятно какие объекты можно подать на вход этой функции. С другой стороны, функция получает гарантию что у переданного ей объекта есть методы addLikeFrom, removeLikeFrom.

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

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

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

Интерфейсы позволяют объединять не связанные наследованием классы.

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

ООП в первую очередь делался для больших проектов, где очень много кода. Без соблюдения правил ООП код станет настолько запутанным, что любые правки будут вызывать ошибки и будет уходить много времени на их исправление. В коде на 100 или 1000 строчек конечно это не заметно. А например, код ОС андроид содержит тысячи классов (хоть они и не на PHP, а на Яве, но ООП там примерно такой же).

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

Если ты не уверен где надо применять интерфейсы, не применяй их пока.
#203 #651534
>>651232

Вообще, в ООП много средств, которыми ты задаешь правила работы со своим классом:

- с помощью тайп хинтов ты указываешь что надо передать на вход функции
- с помощь конструктора ты определяешь обязательные аргументы, без которых не создать объект
- с помощью public/protected/private ты определяешь, какие методы откуда можно вызывать и инкапсулируешь данные внутри объекта
- с помощью abstract методов ты определяешь правила наследования от данного класса
- с помощью интерфейсов ты помечаешь классы

Важно пользоваться всеми этими возможностями правльно. Их мы изучаем в задачах про Вектор и кошки-мышки.
>>651535
#204 #651535
>>651534
Хм. Но дело в том, что у ОПа в главе про ООП нет этой информации и предлагается решать их не зная всего этого
>>657616
#205 #651537
>>651507

>$ch2=mb_substr($text,-1-$i);


Вот это, по-твоему, что означает?
Разберись с тем, как получить один символ с конца строки с помощью этой функции.
Сделай var_dump($ch2), тогда должен будешь понять, что нужно указывать и количество символов, которые ты вырезаешь.
Ведь с начала же когда берёшь символ - ты указываешь, сколько символов, а с конца почему не указываешь - непонятно.
Вот у тебя и получается, что "р не совпадает с ра".
>>651599
#206 #651574
>>650763
Какие еще операторы равенства, это операторы присвоения.
#207 #651599
>>651537
Проверь еще раз пожалуйста. http://ideone.com/zPkbDi
>>651685
#208 #651611
Исправление задач на DOM
https://jsfiddle.net/mqdkab0q/3/
https://jsfiddle.net/7bvx9hwa/2/
>>657616
#209 #651627
>>651522
ну и пошел нахуй тогда
#210 #651643
>>651522
Старайся, у меня с математикой тоже все очень фигово, 5 дней мучился, но сделал.
#211 #651685
>>651599
Всё хорошо.
Последнее условие if ($ch1==$ch2) можно и внутрь цикла поставить, но сравнивать не буквы, а $i с $halfLength - если они равны, то палиндром.
Чтобы избежать -1-$i, можно было просто $i = 1 поставить в цикл, а в $ch1=mb_substr($text,$i,1); просто поставить $i - 1.
>>651781
#212 #651730
В перл есть заебательский оператор "my", а что в php?
>>651731
#213 #651731
>>651730
И что он делает?
>>651736
#214 #651736
>>651731
Он идет в паре с "use strict;"

Позволяет объявлять переменные только явно "my $result", и избежать ошибки типа "return $reslt;". Сегодня решил попробовать пых, мне такого очень не хватает.
>>651753
#215 #651753
>>651736

>мне такого очень не хватает


Там надо добавить error handler - функцию для обработки ошибок. И по ошибке "встретилась необъявленная переменная" что-нибудь сделать, например, выбросить исключение.
Но не надейся там особо. Ни один из динамических языков лучше от этого не станет. Проверено уже.
>>657616
#216 #651754
Довольно интересное задание, оп может добавить себе в задачник, а то там всего 2 задачи на sql, про лайки и кинотеатр.
http://sqlfiddle.com/#!9/bc54e/14

Это из тестового, которое вован вбрасывал в прошлом треде >>646033
Наверное уже не актуально, так что можно спалить решение.
#217 #651759
>>651754
Если интересно, то я решил вот так.
http://pastebin.ru/GQr52pHu
>>651778
#218 #651763
http://ideone.com/tJRcIL
Молю о помощи, как сделать что бы работало?
Уже пытался и через array_count_values , нихуя не помогает
>>651778
#219 #651764
>>651754
И сам ты вован, школосучка тупая.
>>651778>>655825
#220 #651767
Ребят, как это http://ideone.com/LKPRu6 заставить работать? Задумка такова - создание файла в пхп, с хтмл расширением и текст внутри файла - собственно код.
>>651771>>651796
#221 #651771
>>651767
Тебе же написало ошибку о том что он не может создать файл, нет прав. Пробуй у себя на сервере.
>>651772
#222 #651772
>>651771
У меня на апаче вот что получается - документ благополучно создаёт, как и нужно(что очень здорово, я кажется придумал как буду реализововать задание по вебке на создание блога с админкой), но вот именно от этого пхп файла, что я бросил код, там не открывается страница.

Не подскажешь что с этим делать?

Судя по всему, права тут не причём.
>>651779
#223 #651778
>>651759
Во втором задании не помешал бы джойн, чтобы вывести имя и прочую инфу по менеджеру.

В третьем

>объедините значения first_name и last_name в одно поле full_name


Функция concat.
ASC в order by можно не писать, это поведение по умолчанию.

В четвертом подзапрос, дальше можно не смотреть.

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

>>651764
Ну ты ведешь себя как долбоеб, поэтому так тебя и назвал.

>>651763

>PHP Parse error: syntax error, unexpected ')' on line 19

>>651780>>651793
21 Кб, 1526x693
#224 #651779
>>651772
У меня все работает, пикрелейтед.

>но вот именно от этого пхп файла, что я бросил код, там не открывается страница


Вот это не совсем понял, ты хочешь создать html файл и сразу открыть его? Или по другому?
>>651782
#225 #651780
>>651778

>PHP Parse error: syntax error, unexpected ')' on line 19


Это я заметил , но когда я прошу вывести рост мне выводит 1 , что не так?
#226 #651781
>>651685
Хм... не додумался как-то до этого. Спасибо за помощь.
#227 #651782
>>651779

>ты хочешь создать html файл и сразу открыть его?


Да. Сам файл создан, отлично.

Можно ли его сразу открыть?
>>651783
#228 #651783
>>651782
Можно перенаправить браузер клиента на этот файл header("Location: file.html"); или прочитать файл и вывести его пользователю.

Но ты строишь велосипед, легче и удобнее будет выводить html разметку через php-скрипт, без создания дополнительных файлов. И еще я не совсем понимаю зачем ты это делаешь.
>>651787
#229 #651787
>>651783
Зачем я это делаю?:)

Понимаешь, нам в шараге задали сделать что-то вроде тематического блога с админкой.

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

Нам сказали что всякими cms пользоваться нельзя(к слову я и не пользовался ими никогда). Учат пхп нас плоховато(в основном дают задания а мы уже сами ищем информацию), и уровень у меня не большой. Но данный метод заполнения, чтоб через админку, мне показался вполне удобным.
>>651789>>651791
#230 #651789
>>651787
Еще можно будет шаблон для всех веб-страниц не писать вручную а считывать с другого файла или везде использовать одну переменную, тут еще не придумал.

Проект еще не скоро сдавать, я просто обдумываю функционал и как всё будет работать. Даже на листочке в клеточку начертил условную схему, лол
#231 #651791
>>651787
Твой способ неэффективный потому что на сайте может быть 100 новостей, и уже в этом случае в корне диска будет приличный бардак, а если новостей будет не 100 а 1000? Ну и копировать\восстанавливать такое количество файлов будет проблематично и долго. Создавать новый файл на каждую запись это какая-то порнография. Ты с тем же успехом можешь сделать файл шаблона, а потом через один php скрипт подставлять туда информацию из базы.

Например есть файл record.php, при передаче ему GET параметра id (id новости), он будет искать новость в базе данных с таким id, если она присутствует этот файл будет выводить пользователю файл шаблона и заполнять его данными, если новости в базе с таким айди нет, он будет выводить ошибку 404. При пустом GET параметре id можно выводить последнюю новость, к примеру. И никаких операций с файлами, в данном случае вместо 1000 файлов у тебя все время их будет два.
>>651797
#232 #651792
Как то так.

if ($anonHeight<$classmates[$name]) $number=$number+1;

И если уже выложил ссылку на идеон, то больше её не изменяй. Создавай новую.
#233 #651793
>>651778
А я думал подзапрос это все равно один запрос.
#234 #651794
>>651792

>$number=$number+1;


Проще $number++;
#235 #651796
#236 #651797
>>651791
Т.е. ты хочешь сказать, что можно банально хранить всё в одном файле и по кусочкам показывать, перепроверяя айди? А что, неплохая идея, надо подумать.
>>651799>>651801
#237 #651799
>>651797
Хранить ты будешь в базе, файл будет только доставать оттуда записи и показывать их пользователю.
#238 #651800
Как вованы и долбоебы себя тут только школьники, не могущие сохранить файл и сделать регулярки пятый год, ведут.
>>651802
#239 #651801
>>651797
Правильно ли я понял, что в таком случае банально будет с помощью админки текст забиваться изначально в один большой файл со всеми новостями и при нажатии на нужную новость оно будет ее подбирать?
>>651805
31 Кб, 459x497
#240 #651802
>>651800
Иди почитай шапку треда, невежда.
#241 #651803
Что ты за хуйню тут циклично наджойнил, ты хоть сам понял, что написал?
COUNT(DISTINCT c2.id) AS 'chief_claim_count'
FROM manager m1
JOIN claim c1 ON m1.id = c1.manager_id
JOIN manager m2 ON m1.chief_id = m2.id
JOIN claim c2 ON m2.id = c2.manager_id
GROUP BY m1.id
HAVING COUNT(c1.id) > COUNT(DISTINCT c2.id);
#242 #651805
>>651801
Хранить информацию в файлах неудобно, для этого лучше использовать базу данных (MySQL, например). Ты вообще знаешь что это?
>>651807
#243 #651807
>>651805
Да, я сейчас активно изучаю запросы, кстати. Просто пока не использовал особо, в консольке разве что тестил, но не думал об этом.

Тоже хорошая идея. Я же сейчас только обдумываю как лучше сделать.
>>651842
#244 #651810
>>651792
Огромное спасибо!!!
#245 #651842
>>651807
Почитай это https://gist.github.com/codedokode/10539213 и попробуй сделать задачки оттуда, если хочешь быть хорошим разработчиком очень важно уметь хорошо работать с базой данных.
#246 #651867
Посмотрите модули. В админке создаются новости, в дисплей выводятся. Там вывод новостей (сортировка по годам и месяцам и категориям) через виджет реализована и запросы в бд прямо из веджеат, это наверное неправильно, но если не в виджете, то где их делать? Из контроллера ведь неудобно будет потом всю дату пихать в индекс, а из него опять в виджет а потом обратно.
#248 #651883
Нужно вставить определённый функционал на вордпресс, функционал должен выводиться в виде отдельной страницы, функционал в своей работе использует только яваскрипт и jQuery, но требует стилей и некоторых библиотек яваскрипт. Как его можно и лучше вывести? Создать отдельный шаблон страницы и вставить туда, а потом просто создать страницу?Если делать так, то всё работает, кроме правого сайдбара, потому что я не понимаю как его подключить, если его подключать то ломается вся структура. Есть ли другие варианты?
>>657618
38 Кб, 336x389
#249 #651943
Ребята, я решил задачу "Алфавит в круге", вы себе это представляете?!
http://ideone.com/rBa0Aj
Просто тысяча плюсов к мотивации сразу, хочется помолотить грушу на ночь глядя, ущипнуть спящую жену за ягодицу, так легко на душе.
Но мне показалось, ОП слегка дал маху в описаниях решения: там перемножать надо не координату x, которая у нас идёт от cos(), а координату y, которая идёт от sin().
По-другому не получается у меня, подставлял целую кучу возможных значений, сидел больше часа над одним этим моментом, когда уже круг более-менее получился.
И вот какой момент: я что-то напутал с синусоидами, у меня алфавит начинается не сверху, а сбоку, не с 12-ти часов, а с 3-х.
Вот это, возможно, и имел в виду ОП, когда говорил об отрицательных значениях у координат и как-то хитро перемноженной координате x?
Просто так внести отрицательно значение в $screen[$x][$y] мы не можем.
Наверное, надо как-то формулой переворачивать синусоиду, что-то такое, тут что-то слишком сложное для меня сейчас (помню, что-то такое делал в школе).
Послушаю ваших советов.
Как же я всё-таки рад, ребята, братишки, друзья.
До того момента, как смотрю на следующую, последнюю, бонусную задачу...
Но глаза боятся, а руки трясутся и потеют делают.
Завтра начну обдумывать и эту задачу.
>>652040>>659241
#250 #651974
test
#251 #651976
Как вкатиться в верстку? Начал c html academy, когда закончу с основами html,css,js что делать дальше?
>>651979
#252 #651979
>>651982>>651986
#253 #651982
>>651979
шапку я читал, но я ведь не буду всерьёз писать страницу вручную тэгами, потому хочу понять всю картину целиком как всё раотает с фреймворками и без них
>>651983
#254 #651983
>>651982

>но я ведь не буду всерьёз писать страницу вручную тэгами


Будешь и не одну.

>потому хочу понять всю картину целиком как всё раотает с фреймворками и без них


Какими фреймворками? JS фреймворки типа react и другие модные вещи сделаны прежде всего для построения удобных адаптивных интерфейсов с няшными анимациями. Верстать в любом случае нужно уметь.
>>651986
#255 #651986
>>651979
>>651983
но когда я эти задания сделаю, это мне даст умение вручную писать сайты, но не эффективно, потому и спрашиваю что дальше учить. Как ставить на домен, как вставлять рекламу, как делать его видимым в гугле и всякие штуки типа WordPress и т.д. Это всё я знаю по наслышкам, но ведь кроме перечисленного есть же ешё куча всего, что мне нужно будет знать. А откуда?
>>651997>>659241
#256 #651997
>>651986

>когда я эти задания сделаю


Главные слова.
Дальше стоит свой сайт запустить какой-нибудь на HTML+CSS. А далее уже поймёшь, что нужно.
На фрилансах заказы по вёрстке посмотри - вот то и начни изучать после основ.
>>651999
#257 #651999
>>651997
ок, спс
#258 #652010
Хром ругаицо на HTML Geolocation api.

> getCurrentPosition() and watchPosition() are deprecated on insecure origins, and support will be removed in the future. You should consider switching your application to a secure origin, such as HTTPS.


Типа настойчиво рекомендует перейти на https.
FF не возникает, опера тоже (впрочем вежливо заставила принять какое-то соглашение).
Или эта фигня только на локалхосте?
Что с этим делать? Может есть другая альтернатива для определения местоположения?
>>659241
#259 #652040
>>651943
У тебя $angle изменяется в диапозоне от 0 до 360 градусов. А нужно от -90 до 270. Если начальный $angle = -1.5 (в твоем решении, методом тыка подобрано). То все развернется. http://ideone.com/BiZdLf

Еще можно не менять $angle, а повернуть матрицу на -90 градусов. Я считаю, это более лучше помужски, хоть и можно сказать что костыль. + популярная задачка в обучении алгоритмам.

А вообще можно считать координаты только для одной восьмой круга. Потом делать два "отражения" по осям и поворот на 90 градусов. Так делают в рисовании примитивных фигур для экономии процессорного времени.
>>652345>>659242
#260 #652120
Проверьте пожалуйста вроде бы правильно но почему-то выводит не все варианты

http://ideone.com/yE5mZ0
#261 #652129
Блять. Начал учить хтмл/ксс.
Понимаю что дальше будет пхп.
Захожу на двач спросить советов мудрых.
И что я вижу? Синусы, косинусы, какой-то ебанутый синтаксис, вычесленея.
Так и хочется положить на эту затею.
>>652130>>652345
#262 #652130
>>652129
положи, братик, положи.
>>652136>>652158
#263 #652136
>>652130
Ну так жалко же своих уже приобретенных сакральных знаний.
Ладно, как закончу курсы на хтмлакадеми, буду вас здесь доебывать.
#264 #652156
>>652120
тут есть кто живой??
#265 #652158
#266 #652167
>>652120
PHP Notice: Undefined variable: randomWor4 in /home/w40oSf/prog.php on line 30
>>652169
Бложек #267 #652168
Увидел на странице рекламу:

> Как установить игру?


> На компьютер или телефон. Смотрите прямо в поиске Яндекса! 0+


> yandex.ru/Игры_на_Яндексе


(ссылка кстати не работает)

Не удержался от того, чтобы кликнуть - происходит переход на hxxps://yandex.ru/set/games_minecraft/4?from=adwords_gdn_games&utm_source=google&utm_medium=gdn&utm_campaign=Games_Russia&utm_term=&utm_content=ideone.com&gclid=CI-w4dqt9MoCFSUMcwody9MKQw

На этой странице написано:

> Полезное про игры


> Попробуйте Яндекс, просто установив расширение.


> Оно настроит поиск по умолчанию и стартовую страницу в вашем браузере.



То есть реклама - полный обман:

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

Вот такая реклама ничем не отличается например от тех, кто размещает фальшивые кнопки "скачать" на файлообменнике или фальшивые видео, при клике по которым тебе пишут что надо скачать "кодек". Разница только в том что к таким обманным методам прибегает "белая" компания. Видимо сомнительные методы распространения вредоносных программ настолько эффективны что даже яндекс не может от них удержаться.
>>652172>>652345
#268 #652169
>>652167
http://ideone.com/yE5mZ0#stdin

не все выводится не все варианты
>>659242
#269 #652172
>>652168
Держи нас в курсе.
Опрос #270 #652176
Аноны, а просто любопытно, как вы читаете тред?

- заходите на главную, ищете тред, переходите в него?
- сохраняете в закладкти?
- просто держите открытым постоянно и обновляете (я так делаю)

И как находите ответ на свою задачу если ОП часто их проверяет только несколько дней спустя, и за этой время успевают запостить 300-400 постов?
>>652178>>652543
#271 #652178
>>652176
Тред открыт постоянно, куклоскрипт оповещает если на мой пост ответили.
>>652194
#272 #652182
>>652120
$randomWord1 = array_rand($word1,3);
PHP 5.2.10 - Возвращаемый массив ключей больше не возвращается в случайном порядке.

$word1[$randomWord1[1]] - Выводит второй случайный элемент. В этом примере сюда не попадут как минимум первый и последний элемент
#273 #652194
117 Кб, 1444x1024
#274 #652215
Поясните неофиту почему невыводится сообщение о дабле. Нужно ли писать exit(); в каждом блоке?
>>652217>>652254
#275 #652217
>>652215
Прочитал внимательно - вопрос про дабл отпадает.
#276 #652226
Напомню себе проверить https://github.com/V3N0m21/Uppu4

В старом треде даны ответы на все посты, проверены все решения:

Задачи про калькулятор, номера, кредит, банкомат, стихи за 7-8 февраля >>652214
Список номеров для задачи проверки номера >>652216
верстка integer64, лиличка >>652219
Почему не работает регулярка в граммар наци >>652221
номера телефонов, лиличка >>652222
лиличка, сброс буфера, опечатки >>652223

Если вас пропустили или не ответили в стром треде - напомните о себе тут. Старый тред закрыт.
#277 #652231
>>652226

>https://github.com/V3N0m21/Uppu4


Я надеюсь он знает что закомиттил на гитхаб что-то подозрительно напоминающее его настоящий пароль от базы данных?
>>652544
#278 #652232
https://github.com/V3N0m21/Uppu4 - а зачем ты сделал 3 репозитория с 3 версиями? Почему бы не использовать один репозиторий, а версии помечать метками гит?
>>652544
#279 #652254
>>652215
А то такое exit()?
>>652255
#280 #652255
>>652254
exit — Выводит сообщение и прекращает выполнение текущего скрипта
#281 #652345
>>652040
Ого, спасибо!

>У тебя $angle изменяется в диапозоне от 0 до 360 градусов. А нужно от -90 до 270.


Вот в чём тут было дело, действительно. Получается, от -180 до 180 - круг будет начинаться с 9 часов.
Я просто уцепился за подсказку ОПа, что надо координаты x и y менять, ставить минус где-то там, - и насиловал безуспешно эти моменты.
Получается, как раз пытался матрицу повернуть таким образом, но не вышло ничего.
Я потом чуть-чуть поправлю число, на которое надо домножить, поиграюсь с десятыми значениями угла - круг не совсем ровный получается из-за этого, нет золотых сечений в тех числах.
А вообще можно ли как-то это всё вычислять из количества букв, как мы делаем с углом? Может, тоже как-то надо к 360-ти градусам привязать?

>>652120
Количества выбираемых элементов в array_rand необязательно указывать. По умолчанию будет один из номеров, нам это и нужно.

>$word5[$randomWord5[1]]


Не имеет смысла. У нас массив $word5, в котором [$randomWord5] как раз будет нужным нам случайным числом. Значит, выводим массив с этим вот случайным числом.
Var_dump делай почаще, смотри на то, что выходит.

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

>>652168
Ещё они тулбары в разный официальный софт пихают, договариваясь с разработчиками (например, KMPlayer). Но так многие поступают. Например, Adobe так распространяет антивирус McAfee. Яндекс потом своего советчика запускает, показывает более низкие цены в интернет-магазинах. Причём для конечного пользователя это достаточно удобно.
Я нейтрально отношусь к Яндексу в этом плане.
Это вот Мейл.ру и Вебальта скатываются до того, что значения не имеет, убираешь или нет ты "галочку", - всё равно тулбар установится.
Но там партнёрские программы в приоритете, оплата за количество установленных Спутников, надстроек в браузер и т.п.
>>660197
#282 #652355

>Но там партнёрские программы в приоритете, оплата за количество установленных Спутников, надстроек в браузер и т.п.


То есть переложив на чужие плечи поиск пользователей, Мейл.ру и Вебальта закрыли глаза на то, как именно это всё будет распространяться. А партнёрки с вебмастерами и рады.
#283 #652541
Почему у нас, пхпшников, нет такого набора модных и гламурных книжечек, как у рубистов??
>>652513
Как можно выучиться красивому коду без современных и структуированных книжек на английском от профессионалов?
>>660197
#284 #652543
>>652176
Открываю раздел, прокручиваю до самого низа, чтобы найти тред.
Ответы на свои посты ищу по заголовкам с названием гитхаба.
#285 #652544
>>652231
Теперь знает
>>652232
Gitbook я прочитал уже после того как все это насоздавал
>>652572
#286 #652549
бляя, я тоже в тестовом отправил ведь фреймворк вместе с паролем для дб. надеюсь им похуй...
#287 #652572
>>652544
В истории-то все равно видно.
#288 #652617
Правильно ли я понимаю что похапе устаревшая бекэнд штука для связи с БД формочек, обычный информационный(редкообновляемый) сайт можно написать без нее, верно?
>>652620>>660197
#289 #652620
>>652617
Нет, не верно.
>>652632
#290 #652632
>>652620
А как верно? Почему в оп-посте нету строк о позиционировании и применении
#291 #652764
ОП, ты здесь? Можешь подкинуть идею, как справиться с кошками-мышками? Уже второй день ломаю голову, а ничего практически не написал. Я создаю класс животные, подкласс Мыши. Класс Поле. Как.... как... заставить это взаимодействовать? Не понимаю...
>>652826>>652866
#292 #652816
Хай аноны. Недавно заинтересовался программированием(в универе прохожу VB, вот получается не очень и не нужен мне бейсик). Хочу изучить PHP, для того, чтобы запилить другу сайт(в прочем, он админ паблика вк с 10к+ подписоты и срубает за рекламу не плохо). Вопрос. Что лучше сделать, сайт или борду?(по мне борда удобнее и пилить я хотел бы именно ее, Kusaba работает на PHP). Не кидайтесь сразу ссаными тряпками, я нубяра во всех этих делах, а тред именно для нубов. Так вот я хотел бы узнать, что нужно знать для использование Кусабы и дальнейшего проддвижения борды. Или это хуевая идея и нужно просто запилить сайт?
В общем, где можно доступно прочитать про запилы сайтов/борд и что для этого нужно(языки программирования, сервак) и как это все реализовать?
Сразу извиняюсь, если вопрос нубский/идиотский, но, псес объясните кто-нибудь.
>>660197
#293 #652826
>>652764

>Как.... как... заставить это взаимодействовать


Кошка движется к ближайшей мышке. Сравнивай координаты.
Если координаты мышки и кошки совпадают, то мышка уничтожается.
>>652834>>652837
#294 #652834
>>652826
Ты оп? Мне бы от тебя совет по реализации идеи, иными словами по... самой сущности ,что ли. Это-то я в условии прочёл, я не совсем понимаю как заставить всё это работать... Ладно, сейчас буду опять думать
>>652841
#295 #652837
>>652826
посмотришь пока мой код, скажешь, что уже неверного напридумывал?
#296 #652841
>>652834
У тебя какие-то туманные вопросы, аля "сделайте всё за меня". Ты по существу задавай, в каком конкретно месте проблема?
>>652862>>652874
#297 #652854
Ребята, помогите плез. Почему эта хуйня не работает?

Код короткий, поэтому закину прямо сюда.

if(isset($_POST['val']))
{
$val = file_get_contents("red.txt");
print($val);
};

В index.html ajax запрос методом POST. Консоль разработчика показывает, что запрос совершается, но PHP ничего не возвращает, if конструкция даже не отрабатывает.
>>652881
#298 #652862
>>652841
да в самом начале.

Смотри. Делаю мышь. У неё координаты. Располагаю её в массиве - игровом поле. Как заставить игру "ходить" и мышь "ходить"? Нужен отельный класс, что-то вроде "гейм энджин"? Как задать вот эту последовательность ходов?
>>652865
#299 #652865
>>652862
У меня был класс поля и метод сделать ход.
#300 #652866
>>652764

Взаимодейстовать так:

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

Каждый ход мы берем список животных и просим каждого из них сделать свой ход.

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

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

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

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

Что скажешь?
>>652874
#301 #652874
>>652841
Логично. Сначала тоже сделал его как класс, но потом засомневался, нужен ли он там.
>>652866
Спасибо за объяснение. Попробую сейчас на основе этого порешать...

Я ещё почитал книгу из ОП-поста про классы и ООП (Мэтт Зандстра) там он рассказывает про abstract классы и наследование. Решать используя это?
>>652879
#302 #652879
>>652874

Если наследование применять уместно (есть классы которые расширяют друг друга, и обозначают однотипные сущности), его надо применять. Если неуместно - не применять.
#303 #652881
>>652854
Сделай
var_dump($_POST);
перед условием.
>>652923
#304 #652886
Кстати, те кто пропускает задачи Вектор (с кризисом) и Кошки-Мышки, вы много теряете. Вы не разберетесь в тонкосятх ООП и вам трудно будет потом писать ООП-код или разбираться в ООП-фреймворках.
>>652900
#305 #652900
>>652886
что за кризис? Кстати, если ты ОП, когда посмотришь>>649669 ? оче жду оценки, сенсей
>>652982
#306 #652923
>>652881
Отвечает empty. Может я чего не понимаю в запросах?
Вот аякс код:

$.ajax({
type: 'post',
url: 'post.php',
data: 'val',
success: function( data ) {
var currentValue = data;
var slider = document.getElementById("red");
slider.value = currentValue;
}});

Суть кода:
Возвращаемая из php информация идёт на элемент <input type="range"/> и меняет в нём параметр value, это обычный слайдер.
>>652951
16 Кб, 684x542
#307 #652943
Возникла проблема с jQuery, есть вот такая страница, представленная на пикче. Контент меняется при нажатии на табы, внизу этого, есть кнопка, при нажатии на которую, второй таб должен становиться активным и показываться второй слайд. Я написал код для jQuery, чтобы при нажатии на кнопку добавлялся класс табу и переключался слайд, но когда слайд переключается я оказываюсь внизу этого слайда, и внизу всей страницы, а мне надо оказаться в верху, как это организовать?
>>653064>>653072
#308 #652951
>>652923

Ребята, заработало, всем спасибо. D аякс сделал так: data: "val=1"
А в php:

if(isset($_POST['val']))
{
$red_v=$_POST['val'];
if($red_v = "1"); {
someCode;
}
>>652959
#309 #652959
>>652951

А почему ты не читаешь офииальную документацию по $.ajax? http://api.jquery.com/jquery.ajax/

Посмотри что там написано про data

Обычно там словарь (хеш) значений указвают.
Сумма Прописью #310 #652979
ОП, проверь это убожество.

http://ideone.com/GUhfyk
#311 #652982
>>652900
Дык ведь ОП уже ответил.

>>652979
Ох щи, неплохо как!
Сколько сидел над задачей? Интересно придумал с регулярками для замены "один тысяча" и т.п., но это костыль, мне кажется.
Но в условии задачи стоит сумма в сотнях миллионов, твоё решение не обрабатывает ещё одну цифру: http://ideone.com/BiZdLf
Также не обрабатывает 0.
Расскажи о себе, как долго изучаешь РНР, почему не сидел над задачей три недели, почему начал её решать вообще? Обычно торопятся пройти учебник ОПа и перепрыгнуть к ООП и так далее. Впервые вижу, что кто-то ещё её делает в треде...
>>652999>>653016
#312 #652985
>>652979
Ещё:

>На вашем счету[ ]один рубль


Два пробела внутри в этом случае.
Регуляркой можно вырезать, конечно, но я бы шёл другим путём.
#313 #652999
>>652982

>Дык ведь ОП уже ответил.


То есть? Не ответил же
>>653002
#314 #653002
>>652999
Вот же: >>649793, >>649795.
>>653003
#315 #653003
>>653002
Ну там ОП ответил только по на последнюю, БД, а задачи на ООП не посмотрел.
#316 #653007
Кстати, раз уж я тут бушую, хочу уточнить у знатоков: я правильно понял, что в абстрактом классе лучше прописать абстрактно все методы, которые буду раскрывать в каждом подклассе?

Т.е. он выступает в роли своеобразного "шаблона" для подклассов?
>>653101
#317 #653010
Что делать с этими бесконечными калбеками в js? Подскажите как с ними бороться, по каким хоть словам гуглить.
https://jsfiddle.net/b0ypfuef/2/
>>653044>>660197
#318 #653016
>>652982
Ой, я перепутал ссылку, вот твои числа прописью с подставленной цифрой: http://ideone.com/FRfw1Y
#319 #653030
>>652979
Нет, бро, там ошибок куча вылезает: http://ideone.com/gFfCFD - На вашем счету[__]сто двадцать три тысячи ноль один рубль + PHP Notice: Undefined variable: million in /home/Dq0nbr/prog.php on line 104

http://ideone.com/B1iQIu - На вашем счету[__]сто двадцать три тысячи двенадцать рубля + PHP Notice: Undefined variable: million in /home/Ntusl2/prog.php on line 104

http://ideone.com/VFeRgF - На вашем счету[__]сто ноль тысяч + PHP Notice: Undefined variable: million in /home/tDoq3U/prog.php on line 104

http://ideone.com/4s4cqK - На вашем счету.

Такое нельзя считать решением задачи, согласись.
>>653059
#320 #653044
>>653010
Я пока выкрутился костылями, но так не годится. Потом надеюсь кто-то ответит как правильно поступать в такой ситуации, хочу писать хороший код.
Суть такова.
Мне нужно получить координаты пользователя. Берем из navigator.geolocation

navigator.geolocation.getCurrentPosition(geolocationSuccess, geolocationError, options);

Внутри success-функции нужен аякс-запрос к php-скрипту, который обработает эти данные и вернет результат.
function geolocationSuccess(position) {
var latitude = position.coords.latitude;
var longitude = position.coords.longitude;
$.ajax('/handler.php', {
data: "lng=" + longitude + "&ltd=" + latitude,
...
success: ajaxSuccess
});
}

После успешного завершения запроса нужно выполнить еще одну функцию, которая будет принимать в качестве аргумента и текст аякс-респонса, и переменные полученные в другом колбеке.
function ajaxSuccess(data) {
foo(data, latitude, longitude);
}
>>660200
#321 #653059
>>653030
Да, согласен, поэтому и написал "убожество". А что значит "PHP Notice: Undefined variable: million in /home/Ntusl2/prog.php on line 104"?
>>653081
#322 #653064
>>652943
Покажи код, не понятно где ты мог запутаться.
Может забываешь у предыдущего таба класс убрать?
#323 #653072
>>652943
Что то ты мудришь.
Почему не сделаешь средствами css?
как тут http://cssdeck.com/labs/full/css-responsive-tabs
#324 #653081
>>653059
Значит перемнная million не определена.
#325 #653101
>>653007

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

Вот представь что ты пишешь абстрактный класс, а наследника пишет кто-то другой. И твоя задача сделать так, чтобы он при всем желании не мог написать его неправильно.
#326 #653252
Господа, я так понял генерировать миграции по моделям умеет только Doctrine в Symfony, остальные фреймворки предлагают делать это рука, что разумеется после symfony2 или даже после PMA, делать не хочется.

Я прав? Есть ли решения для Yii, Laravel ?
В каких фреймворка еще, есть такая возможность?
>>653459
#327 #653303
>>649806
сокеты лучше изучать на жаве. у пхп плохо с хайлоадом.
#328 #653336
Как сделать чтобы файл (например login.php) не мог открыться никак кроме из index.php через инклуд?
>>653547>>653599
#329 #653459
>>653252
Прикрути доктрину к Yii, Laravel.
Сумма Прописью #331 #653550
ОП, аноны, посмотрите, пожалуйста.
http://ideone.com/oIPteO
#332 #653570
Что за fork? Как им пользоваться?
#333 #653576
>>653570
Вилка)
Втыкаешь в еду и ешь)))
#334 #653578
>>653570
Ей также можно чистить говно.
#335 #653579
Котаны, объясните дилетанту. Установил apache2 и php как модуль для апача, потестил web-приложение - все работает. Теперь мне необходимо дописать некоторую функциональность. И тут хуйня происходит. Пишу я код, например, в саблайме, а стек трейс смотрю в логах апача. Неудобняк. То же самое и с phpshtorm'ом. Как вы живете с этим, котаны?
#336 #653590
>>653579
tail -f
#337 #653595
>>653579

на небоевом (тестовом) сервере можно включить display_errors= On
#338 #653599
>>653336
определай дефайном в index.php какую нибудь константу и в своем файле login.php, например, если она не определена или не тру - дай.
#339 #653600
>>653550
Почему все пыхеры так любят злоебучие массивы? массивы массивов массивов и ассоциативные массивы ассоциативных массивов. Неужели не существует других структур данных?
#340 #653601
>>653600
Он просто еще не дошел до ООП.
>>653605
#341 #653602
>>653600
у них классы то недавно появились, о чем ты
>>653605>>653629
#342 #653605
>>653601
>>653602
Да это проблема очень многих пхп- проектов.
Бомбануло просто. По работе имею дело с кучей легаси, и это просто убивающая хуйня.
Ладно, в пыхе действительно с этим сложновато. Те классы есть, но коллекций, контейнеров и прочей хуйни нет. Да даже нормального переопределения конструктора нет.
>>653629
#343 #653620
>>653550
1)
function smallNumberToText($number) {

if ($number == 0) {
echo "На вашем счету ноль рублей";
exit;
}
}
Ну ты серьезно?
функция из трех строк, которую ты используешь один раз?
зачем exit? Может надо было exit ('На вашем счету 0 рублей');
#344 #653629
>>653600

Есть классы, тайп-хинты и ООП которых во многих хипстерских языках нет.

Что значит "все"? Откуда у тебя такие данные?

>>653602

Ложь.

>>653605

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

Коллекции какие-то есть в SPL, есть сторонние библиотеки.

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


Зачем?
>>653663
#345 #653657
>>651208
echo "bump";
>>660200
#346 #653663
>>653629

>Есть классы, тайп-хинты и ООП.



С каких пор Классы стали структурами для хранения данных?

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

То что вы даже например опишите в классе работы "Анальной структуры", то все равно это будет Массив, или Хеш-Массив, ну максимум FIFO Стек .(Кортежи из питона, нинужны, так как этот тот же массив)

Ну вообщем я что-то вам не понимаю. В чем еще хранить данные если не в массивах и не в хеш-таблицах?
>>653672
#347 #653672
>>653663

> С каких пор Классы стали структурами для хранения данных?


Чем объект не структура? Поля есть.

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


По моему у тебя каша в голове. Более того, я не понимаю, как особенности внутренней реализации хранения данных объекта мешает тебе его использовать.
>>653739
#348 #653678
Есть функционал для сайта на вордпресс, в своей работе он использует javaScript, скажите как его установить на вордпресс? первое что приходит в голову создать шаблон страницы и разместить весь код в шаблоне (кода вместе с хтмл довольно много, больше 2000 строк), но там стандартный шаблон страницы довольно сложноватый и я не понимаю как сделать так, чтобы не сместился боковой слайдер. Есть ли другие варианты установки такого функционала на сайт вордпресс?
>>660200
#349 #653683
>>653550
Почти все те же ошибки, что и были.
1000000 не видит.
http://ideone.com/DVLZjf
Это вот вообще забавно выглядит:

>$regexp = array(


0 => '/ десять один/u',
1 => '/ десять два/u',
2 => '/ десять три/u',
3 => '/ десять четыре/u',
4 => '/ десять пять/u',
5 => '/ десять шесть/u',
6 => '/ десять семь/u',
7 => '/ десять восемь/u',
8 => '/ десять девять/u'
);
Опять же ты даже если бы и работало всё правильно - где сотни миллионов? Второй раз ведь напоминаю про них. Там должно быть девять девяток, в mt_rand, а не восемь. С девятью девятками не работает.
http://ideone.com/wXdCpC - На вашем счету сто две тысячи двенадцать рубля + PHP Notice: Undefined variable: million in /home/eiP3X6/prog.php on line 109
http://ideone.com/ceh6Jd - На вашем счету два миллиона двести тридцать одна тысяча[пропали рубли]- при $number = 1231000.
Куча такого вылезает.
Думаю, что не годится это решение и само по себе (работает неправильно, не заложено даже то, что есть в условии - 999 миллионов), и с костылями-регулярками.

>>653620
Я вообще не пойму, зачем ОП говорил, что ноль рублей надо дополнительно проверять, - у нас всё и так уже есть в массиве $spelling. Его вот надо дополнительно уничтожать, когда три цифры в середине состоят из нулей, это да. А то будут вылезать те же ошибки, что и у анона.
>>653729
#350 #653704
>>653579
На этот счёт в юниксах есть команда tee.
Она будет в отдельном окне печатать тебе логи апача.
Теперь в другом окне запускай хоть midc хоть vi и не нужен тебе никакой phpstorm.
>>653710
#351 #653710
>>653704
Перепутал, "tail -f" я имел в виду, "tee" для другого.
#352 #653722
Говнокод инкоминг!
Grammar Nazi http://ideone.com/uGD7O1
Что можно сделать для улучшения, чужие решения пока не смотрел.
#353 #653726
>>653722
а нахуя так текст вставлять?
>>653738
2 Кб, 271x43
#354 #653729
>>653683
Спасибо, исправлю. Просто я ориентировался на эти строки, а там 8 девяток
#355 #653738
>>653726
А что не так с текстом?
>>653745
#356 #653739
>>653672

>Чем объект не структура? Поля есть.



А эти самые "поля", это что?
>>660200
#357 #653745
>>653738
нахуя хир-ограничители? Они настолько колхозные что нахуй не нужны.
>>653750>>660203
#358 #653750
>>653745
Убрал, а что по поводу выражения?
>>653754
#359 #653754
>>653750
тут хз, лень разбираться, дедлайн. Одно могу сказать - собирай условия в массив, а не блять по циферкам в переменной.
>>653757
#360 #653757
>>653754
окай
#361 #653761
>>653620
Так функция не кончается на проверке на 0
#362 #653850
Чет не пойму, как проверять код на ошибки то? Например пишу скрипт с вызовом функцияКоторойНихуяНет();

php -l ... говорит что No syntax errors detected in ...

Это норма?
>>660203
5 Кб, 294x107
#363 #653855
Cап. Не программист, но у меня возникла ошибка. Кто-нибудь может разобраться, в чём проблема?
>>653858>>653865
#364 #653858
>>653855
быстрофикс
foreach($sections AS $key=>$section) {
$results = $tc_db->GetAll("SELECT FROM `" . KU_DBPREFIX . "boards` WHERE `section` = '" . $section['id'] . "' ORDER BY `order` ASC, `name` ASC / MENU.CLASS.PHP */");
foreach($results AS $line) {
$sections[$key]['boards'][] = $line;

Забыл код
#365 #653859
>>653858
дамп $sections перед форычем в студию
#366 #653863
>>653858
Это что, кусок кусабы? Лол.
>>653869
5 Кб, 294x107
8 Кб, 590x193
#367 #653865
>>653855
>>653858
Ёпт, хз как такое говно получилось. Короче, на 1м пике ошибка, на 2м сам код.
>>653870>>660204
#368 #653869
>>653863
Извини, что? Я вообще не шарю
>>653863
Да кусабы, каким-то невиданным образом исправлял туеву хучу ошибок, пока пилил, а ща бошка на бекрень уже
#369 #653870
>>653865
Скорее всего $sections не является массивом и там что-то вроде Null, сделай дамп переменной до этого цикла
>>653874>>660204
#371 #653874
>>653870
Тоже, можешь пояснее объяснить, что надо исправить?
>>653880
#372 #653879
>>653869
Последняя версия кусабы должна работать без исправлений. Это значит что ты что-то не так настроил\поставил.
#373 #653880
>>653874
Перед 49 строчкой где у тебя цикл foreach напиши var_dump($sections) и покажи результат
>>653918
204 Кб, 1149x756
#374 #653914
PDO не хочет ничего в базу добавлять, выбирать, делать бочку. Что не так? Mysqli функции все делали.
>>653933>>654006
#375 #653918
>>653880
Parse error: syntax error, unexpected 'foreach' (T_FOREACH) in /home/u117865029/public_html/kusabax_0.9_full/inc/classes/menu.class.php on line 49
>>653924
#376 #653924
>>653918
точку с запятой после var_dump($sections) поставь
>>653926>>653936
#377 #653926
>>653924
var_dump($sections) и foreach на одной строке писать или var_dump($sections) на отдельной?
>>653933
#378 #653933
>>653914
У пдо отображение ошибок в запросах отключено, сам постоянно ломал голову, когда что-то не так с запросом было. Включи отображение и смотри что в ошибки записывается. Я правда не помню какая именно команда за это отвечает.
>>653926
На отдельной
#379 #653936
>>653924
Записал так
var_dump($sections); foreach($sections AS $key=>$section) {
...
Ошибка всё таже
bool(false)
Warning: Invalid argument supplied for foreach() in /home/u112465029/public_html/kusabax_0.9_full/inc/classes/menu.class.php on line 49
>>653942>>660204
#380 #653942
>>653936
Как я и говорил, у тебя не массив в переменной sections, а булево значение false.
>>653944
#381 #653944
>>653942
Ну, это, так что мне делать?
>>653947
#382 #653947
>>653944
Я не знаю, я не экстрасенс. Где ты взял этот код, что ты в нём менял?
>>653960
66 Кб, 1645x890
#383 #653960
>>653947
Взял код из Кусабы Х, вообще не хуя не менял, кроме как в config
>>653967
134 Кб, 1645x890
#384 #653967
>>653960
Очевидно, что этот запрос возвращает ошибку. Больше ничем помочь не могу.
>>653972
#385 #653972
>>653967
Очевидно что он просто её настроил неправильно, и мануалы не читал. Скрипт работает без всяких редактирований исходников.
>>653987>>653990
#386 #653987
>>653972
Мануалы я читал (Точнее 1 на инглише, 2-й коряво переведённый). В основдом проблема была подключить её к Базе Данных. Дальше я уже обрадовалось, но тут появилась эта ошибка. Можете нормальный мануал скинуть?
#387 #653990
>>653972
Я зарегал хостинг и поддомен, там же создал БД(как её заполнять я хз, могу просто таблицу составить), В настройках Кусабы вводил всякое говно, типо Имя БД, хост БД
>>653992
#388 #653992
>>653990
Скрипт установки запускал?
http://kusabax.cultnet.net/wiki/installation_guide читай.
>>654009
#389 #654006
>>653914

Объясни зачем ты написал ERRMODE_SILENT? Где такому учат?

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

Раз так, я тебе помогать не собираюсь. Решил поиграть в экстрасенса - играй сам.
>>654086
#390 #654009
>>653992
Да именно это я и читал. Установку запускал прямо на сайте, и следовал дальнейшим действиям. Опять же там были проблемы с БД, которые я исправил, затем появилось окно, где мне велели удалить загрузочные файлы, и кстати, уже в этом окне была эта ошибка.
>>654025
#391 #654025
>>654009
В админке доску создал?
>>654033
#392 #654033
>>654025
Кстати, в админский Акк тоже не удалось войти.admin/admin
>>654076
#393 #654076
>>654033
Значит база данных заполнилась неправильно или совсем не заполнлась.
>>654104
#394 #654086
>>654006
Заменил на ERRMODE_EXCEPTION. Ошибка такая: SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected
>>654095
#395 #654095
>>654086
Ну он же тебе пишет - не выбрана база данных. Посмотри на свой dsn, там нет параметра dbname.
http://php.net/manual/en/pdo.connections.php посмотри в мануале.
>>654106
13 Кб, 348x145
#396 #654097
Проблема такая. В корневой папке файл file инклюдит autoload.php пикрелейтед и файл file2 из папки src, где будет создаваться объект некого класс foo. Этот класс уже описан в папке src и если я объявлю его в file1 файле, то проблем не будет. Однако, при его объявлении в file2 появляется ошибка Class 'foo' not found. Почему? Ведь инклюд это по сути копипаст, т.е. код file2 копируется в file1, однако автолоада не происходит.
>>654278>>654279
21 Кб, 1109x297
#397 #654104
>>654076
Вот такую шнягу он мне выдает.
#398 #654106
>>654095
Да, ты прав, спасибо, все работает теперь. У меня не dbname, а name было.
#399 #654236
Как лучше сделать простенький контейнер сервисов?
>>654274
126 Кб, 1280x692
#400 #654237
>>649329 (OP)
Сап, котаны.
Нужен скрипт, который будет заливать файлы из локальной директории на google drive, при заливке файла имя остается, как у локального, описание берется из переменной. После заливки файл нужно расшарить, чтобы могли видеть все пользователи инета и сохранить ссылочку в файл.
Нужно именно на пхп. На гитхабе есть несколько скриптов - хз рабочие или нет, можете их использовать. На быдлокод пох.
Сколько будет стоить такой скрипт?
>>654254
#401 #654254
>>654237
2к. Если устраивает оставляй контакты.
>>654298
#402 #654274
>>654236

Например с методами has($name), get($name) и set(callable $factory).

Примеры: Pimple

Также, можно захардкодить код создания объектов в класс и тогда останутся только методы get: getStudentMapper(), getValiadtor() и тд.
#403 #654278
>>654097

Не копипаст. Инклюд выполняет код в указанном файле. Если там описан класс или функция, они создаются.

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

Также, гугли require_once.
#404 #654279
>>654097

Проверь также регистр букв в названии класса. Также, замени относительный путь к файлу на абсолютный.
#405 #654298
>>654254
Устраивает, но сейчас без бабок. Зп получу - напишу тебе, скинь свое мыло плиз.
>>654317
#406 #654317
>>654298
anonf8Zxake26.anonANUSyaN&2ndexPUNCTUMp0~ru
Отпиши сейчас, завтра могу тебе рабочую демку сделать.
#407 #654338
>>649523

Сразу же первый совет - вынеси отдельно папку с публичными файлами, как описано тут https://github.com/codedokode/pasta/blob/master/student-list.md#Выносим-код-за-корень-сервера

> $app['debug'] = true;


Надо в конфиг добавить опция отвечающую за включение отладки

> define('UPLOAD_DIR', ROOT_DIR . '/upload/'); //Директория для файлов загрузок


> define('UPLOAD_PATH', '/upload/'); //Путь к папке загрузок для урлов


Мне не нравятся константы так как они у тебя где-то висят сами по себе и не способствуют инкапсуляции. Предлагаю убрать, а для получения пути и УРЛ файла сделать методы в сервисе или помощнике для работы с файлами.

> $db_config


Для переменных в PSR рекомендуют испльзовать camelCase, а не подчеркивания

> $app['file_service'] = function(){return new App\Service\FileService();};


Не экономь строчки в ущерб читабельности

> $app['autoloader']->add("App",ROOT_DIR);


Давай лучше автозагрузку сделаем добавив описание в composer.json

https://github.com/codedokode/pasta/blob/master/php/autoload.md
https://getcomposer.org/doc/04-schema.md#autoload

> https://github.com/lexdss/file-sharing-on-Silex/blob/master/App/Controller/IndexController.php


А нужен ли нам этот файл? Я думаю, нет. У нас всего 6 обработчиков в индексе.пхп, и каждому из них допустим надо 6-8 строк. Не так и много, чтобы создавать отдельный контроллер. Это же микрофреймворк.

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

Ну вот пример:

> https://github.com/lexdss/file-sharing-on-Silex/blob/master/App/Controller/IndexController.php#L71


В этой функции очевидно код можно разделить на 2 части:

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

> $this->app['file_service']


Это у тебя повторяется раз 10, значит стоит сделать приватное поле и заполнить его в конструкторе.

Отдачу файла надо переделать, чтобы было 2 варианта:

- если доступен модуль X-SendFile, испльзуем его
- если нет - отдам неэффективно средствами PHP, но не как у тебя, странным велосипедом, а стандартной функцией вроде readfile()

Я тут погуглил, и нашел кое-что интересное: http://symfony.com/doc/current/components/http_foundation/introduction.html#serving-files

По моему нужный функционал уже написан.

> fread($fr, filesize($file_path))


Для этого есть file_get_contents. Это правда имеет тот недостаток что файл целиком читатся в память.

> $this->app['file_service']->getName($uploaded_file->getClientOriginalName());


Неудачное название getName не говорит что делает функция

> $file->width = $this->app['file_service']->getWidth($file_info);


Ошибка: ты сваливаешь в file_service все подряд. Для разбора массива от getId3 правильнее сделать отдельный класс, который будет инкапсулировать его внутри, а наружу предоставлять нужные методы. Далее, можно сохранять объект этого класса в поле объекта File, и сделать в доктрине поддержку сохранения этого класса в БД в закодированном в виде json формате.

> $file->upload_date = date('Y-m-d', time());


Почему upload_date хранитяс строкой, а не таймпстампом или объектом DateTime?

> $uploaded_file->move(UPLOAD_DIR, $file->id . '.txt')


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

> https://github.com/lexdss/file-sharing-on-Silex/blob/master/App/Controller/IndexController.php#L60


Уменьши число веток в ифе с двух до одной

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

> $response->headers->setCookie(new Cookie($file_id, null, time() - 1));



https://github.com/lexdss/file-sharing-on-Silex/blob/master/App/Mapper/FileMapper.php
Раз уж ты взял Доктрину, может быть нормально натсроить маппинг и сохранять/загружать в базу объекты File?

Также, зачем ты тут используешь Query Builder? Тут выгоднее сделать обычный SQL запрос, а у тебя тот же запрос записан с кучей скобок и кавычек что затрудняет его чтение. Query BUidelr дял тех случаев где запрос собирается по частям, а у тебя он всегда одинаковый.

https://github.com/lexdss/file-sharing-on-Silex/blob/master/view/audio_info.html
Тут у шаблонов расширение стоит поменять на .html.twig

> <a href="/download/{{ file.id }}">


Генерацию ссылки стоит вынести в какой-нибудь сервис или хелпер а не копипастить по всему коду
#407 #654338
>>649523

Сразу же первый совет - вынеси отдельно папку с публичными файлами, как описано тут https://github.com/codedokode/pasta/blob/master/student-list.md#Выносим-код-за-корень-сервера

> $app['debug'] = true;


Надо в конфиг добавить опция отвечающую за включение отладки

> define('UPLOAD_DIR', ROOT_DIR . '/upload/'); //Директория для файлов загрузок


> define('UPLOAD_PATH', '/upload/'); //Путь к папке загрузок для урлов


Мне не нравятся константы так как они у тебя где-то висят сами по себе и не способствуют инкапсуляции. Предлагаю убрать, а для получения пути и УРЛ файла сделать методы в сервисе или помощнике для работы с файлами.

> $db_config


Для переменных в PSR рекомендуют испльзовать camelCase, а не подчеркивания

> $app['file_service'] = function(){return new App\Service\FileService();};


Не экономь строчки в ущерб читабельности

> $app['autoloader']->add("App",ROOT_DIR);


Давай лучше автозагрузку сделаем добавив описание в composer.json

https://github.com/codedokode/pasta/blob/master/php/autoload.md
https://getcomposer.org/doc/04-schema.md#autoload

> https://github.com/lexdss/file-sharing-on-Silex/blob/master/App/Controller/IndexController.php


А нужен ли нам этот файл? Я думаю, нет. У нас всего 6 обработчиков в индексе.пхп, и каждому из них допустим надо 6-8 строк. Не так и много, чтобы создавать отдельный контроллер. Это же микрофреймворк.

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

Ну вот пример:

> https://github.com/lexdss/file-sharing-on-Silex/blob/master/App/Controller/IndexController.php#L71


В этой функции очевидно код можно разделить на 2 части:

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

> $this->app['file_service']


Это у тебя повторяется раз 10, значит стоит сделать приватное поле и заполнить его в конструкторе.

Отдачу файла надо переделать, чтобы было 2 варианта:

- если доступен модуль X-SendFile, испльзуем его
- если нет - отдам неэффективно средствами PHP, но не как у тебя, странным велосипедом, а стандартной функцией вроде readfile()

Я тут погуглил, и нашел кое-что интересное: http://symfony.com/doc/current/components/http_foundation/introduction.html#serving-files

По моему нужный функционал уже написан.

> fread($fr, filesize($file_path))


Для этого есть file_get_contents. Это правда имеет тот недостаток что файл целиком читатся в память.

> $this->app['file_service']->getName($uploaded_file->getClientOriginalName());


Неудачное название getName не говорит что делает функция

> $file->width = $this->app['file_service']->getWidth($file_info);


Ошибка: ты сваливаешь в file_service все подряд. Для разбора массива от getId3 правильнее сделать отдельный класс, который будет инкапсулировать его внутри, а наружу предоставлять нужные методы. Далее, можно сохранять объект этого класса в поле объекта File, и сделать в доктрине поддержку сохранения этого класса в БД в закодированном в виде json формате.

> $file->upload_date = date('Y-m-d', time());


Почему upload_date хранитяс строкой, а не таймпстампом или объектом DateTime?

> $uploaded_file->move(UPLOAD_DIR, $file->id . '.txt')


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

> https://github.com/lexdss/file-sharing-on-Silex/blob/master/App/Controller/IndexController.php#L60


Уменьши число веток в ифе с двух до одной

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

> $response->headers->setCookie(new Cookie($file_id, null, time() - 1));



https://github.com/lexdss/file-sharing-on-Silex/blob/master/App/Mapper/FileMapper.php
Раз уж ты взял Доктрину, может быть нормально натсроить маппинг и сохранять/загружать в базу объекты File?

Также, зачем ты тут используешь Query Builder? Тут выгоднее сделать обычный SQL запрос, а у тебя тот же запрос записан с кучей скобок и кавычек что затрудняет его чтение. Query BUidelr дял тех случаев где запрос собирается по частям, а у тебя он всегда одинаковый.

https://github.com/lexdss/file-sharing-on-Silex/blob/master/view/audio_info.html
Тут у шаблонов расширение стоит поменять на .html.twig

> <a href="/download/{{ file.id }}">


Генерацию ссылки стоит вынести в какой-нибудь сервис или хелпер а не копипастить по всему коду
#408 #654361
if ($stable_work) {
print "<meta http-equiv=Refresh content='$start_script_in_sec' url='index.pp?monster=$monidinv' />";

}

Почему игнорирует параметр url (src тоже пробовал)?
>>657514>>657517
40 Кб, 604x422
ТАКС ТАКС #409 #654377
Такие дела, малята. Есть у меня одна идея. Выношенная и здоровая. Мне нужно реализовать, а я в меру чайник и знаний у мя маловато.
При входе на сайт пользователь должен ввести/выбрать данные на нескольких чекбоксах/спиках/формах. Все эти данные записываются в базу данных как один участник (т.е. ему пприсваевается айди). После заполнения полей жмакает далее и ему показывается изображение и форма (или поле хз как называется это у вас) куда он должен записать текст и нажать далее. И так далее будут продолжаться картинки. У каждой картинки в базе есть айди и к ней приписывается каждый ответ пользователя.
Я в пэхапэ нихуя не знаю, но вообще немношк умею в БД и знаю вообще простейшие возможности некоторых ЯП.
Нужно минимально затратно по времени. Хотелось бы вообще какой-то готовый скрипт, потому что самому писать это слишком дохуя придется учить.
Болгадорю
>>660204
#410 #654383
>>649644

Ок, база сделана хорошо, а где селекты выбирающие данные?

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

>>649669

> http://ideone.com/GmqSWk



> $normalHours += $weeks;


> } elseif($weeks > 40) {


> $normalHours = $normalHours + 40;


У тебя в одной ветке стоит += , а в другой просто =, это меня сбило с толку

Также, от этого ифа можно избавиться используя min/max.

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

> $encoding = $encoding === NULL ? mb_internal_encoding() : $encoding;


Зачем это? Достаточно в начале программы поставить mb_internal_encoding с нужной кодировкой.

> Вектор



> class Managment


> class Marketing


> getStatsOfBuying


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

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

> $ko2 = 1;


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

Департамент тоже стоит сделать отдельным объектом, у тебя этого нет, и куча кода размазана по функциям.

Также, к этой задаче есть дополнительное задание:

### Антикризисные меры

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

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

1. Сократить в каждом департаменте 40% (округляя в большую сторону) инженеров, преимущественно самого низкого ранга. Если инженер является боссом, вместо него надо уволить другого инженера, не босса.

2. Увеличить в целях стимуляции умственной деятельности базовую ставку аналитика с 800 до 1100 тугриков, а количество выпиваемого им кофе с 50 до 75 литров. В тех департаментах, где руководитель не является аналитиком, заменить его на аналитика самого высшего ранга из этого департамента (а бывшего руководителя вернуть к обычной работе)

3. В каждом департаменте повысить 50% (округляя в большую сторону) менеджеров 1-го и 2-го ранга на один ранг с целью расширить их полномочия.

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

------

Также, есть паста в помощь:

------

## Вектор

Когда ты решаешь задачу на ООП, ты должен ответить на вопросы:

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

Также, сразу скажу еще один совет: гораздо удобнее сделать не один класс Сотрудник, а 4 класса: Инженер, Менеджер, и т.д. Тогда мы можем легко менять например правила расчет зарплаты или кофе для каждой профессии. Естественно, копипастить одинаковый код в 4 класса не надо — создай базовый абстрактный класс Сотрудник и унаследуй от него 4 класса-профессии. Правда в этом случае мы не можем поменять профессию сотрудника.

Наследование позволяет создавать класс не с нуля. а расширяя сущетсвующий класс: http://php.net/manual/ru/language.oop5.inheritance.php

«Абстрактный» — это класс, объект которого нельзя создать. Он предназначен для наследования от него других классов: http://php.net/manual/ru/language.oop5.abstract.php

Также, ты должен для всех полей и методов расставить модификаторы доступа (pubic, private, protected - они определяют, откуда можно обращаться к полю или методу). Ты должен подумать логически и для каждого поля/метода определить: это часть кода, которая относится к внутренней логике класса и не должна быть доступна снаружи, или же это часть кода, которая должна быть доступна. Ну к примеру, в Департаменте метод посчитатьОбщиеЗатратыНаЗарплату() должен быть публичным - для этого мы и пишем класс, чтобы считать затраты.

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

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

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

> Также: задача на лайки SQL


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

>>649693

Ошибка тут

> $symb2 = mb_substr($text, -$i);



Ты берешь не один символ, а кусок до конца строки.
#410 #654383
>>649644

Ок, база сделана хорошо, а где селекты выбирающие данные?

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

>>649669

> http://ideone.com/GmqSWk



> $normalHours += $weeks;


> } elseif($weeks > 40) {


> $normalHours = $normalHours + 40;


У тебя в одной ветке стоит += , а в другой просто =, это меня сбило с толку

Также, от этого ифа можно избавиться используя min/max.

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

> $encoding = $encoding === NULL ? mb_internal_encoding() : $encoding;


Зачем это? Достаточно в начале программы поставить mb_internal_encoding с нужной кодировкой.

> Вектор



> class Managment


> class Marketing


> getStatsOfBuying


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

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

> $ko2 = 1;


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

Департамент тоже стоит сделать отдельным объектом, у тебя этого нет, и куча кода размазана по функциям.

Также, к этой задаче есть дополнительное задание:

### Антикризисные меры

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

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

1. Сократить в каждом департаменте 40% (округляя в большую сторону) инженеров, преимущественно самого низкого ранга. Если инженер является боссом, вместо него надо уволить другого инженера, не босса.

2. Увеличить в целях стимуляции умственной деятельности базовую ставку аналитика с 800 до 1100 тугриков, а количество выпиваемого им кофе с 50 до 75 литров. В тех департаментах, где руководитель не является аналитиком, заменить его на аналитика самого высшего ранга из этого департамента (а бывшего руководителя вернуть к обычной работе)

3. В каждом департаменте повысить 50% (округляя в большую сторону) менеджеров 1-го и 2-го ранга на один ранг с целью расширить их полномочия.

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

------

Также, есть паста в помощь:

------

## Вектор

Когда ты решаешь задачу на ООП, ты должен ответить на вопросы:

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

Также, сразу скажу еще один совет: гораздо удобнее сделать не один класс Сотрудник, а 4 класса: Инженер, Менеджер, и т.д. Тогда мы можем легко менять например правила расчет зарплаты или кофе для каждой профессии. Естественно, копипастить одинаковый код в 4 класса не надо — создай базовый абстрактный класс Сотрудник и унаследуй от него 4 класса-профессии. Правда в этом случае мы не можем поменять профессию сотрудника.

Наследование позволяет создавать класс не с нуля. а расширяя сущетсвующий класс: http://php.net/manual/ru/language.oop5.inheritance.php

«Абстрактный» — это класс, объект которого нельзя создать. Он предназначен для наследования от него других классов: http://php.net/manual/ru/language.oop5.abstract.php

Также, ты должен для всех полей и методов расставить модификаторы доступа (pubic, private, protected - они определяют, откуда можно обращаться к полю или методу). Ты должен подумать логически и для каждого поля/метода определить: это часть кода, которая относится к внутренней логике класса и не должна быть доступна снаружи, или же это часть кода, которая должна быть доступна. Ну к примеру, в Департаменте метод посчитатьОбщиеЗатратыНаЗарплату() должен быть публичным - для этого мы и пишем класс, чтобы считать затраты.

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

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

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

> Также: задача на лайки SQL


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

>>649693

Ошибка тут

> $symb2 = mb_substr($text, -$i);



Ты берешь не один символ, а кусок до конца строки.
>>654386>>654781
Ответы #411 #654384
>>649808

Вебсокеты поддерживают постоянное соединение с сервером в то время как HTTP рассчитан на однократную отправку овтета на запрос.

>>649829

Чтобы изучать вебсокеты, надо изучить обычные сокеты и сетевое программирование. По твоим вопросам я вижу что ты не знаешь этих тем. Хочешь изучать? Надо будет много гуглить и писать код. Для начала, чтобы не тратить время, погугли про протокол TCP.

>>650345

C научным руководителем поговори.
#412 #654386
>>654383

>Ок, база сделана хорошо, а где селекты выбирающие данные?


Ох лол, а я и не заметил, что они при форке куда-то потерялись.
http://sqlfiddle.com/#!9/7451e2/1
>>654411
#413 #654411
>>654386

Ок, правильно.
#414 #654752
>>649329 (OP)
Всю ночь сидел над задачами на циклы (про айфон и миллион за годовые) так и не решил, нихуя не понятно мне.
>>654795>>660204
#415 #654781
>>654383

>Странно что ты нашем треде не первый день, а делаешь такие ошибки. Не делай так больше.


Да я тогда ещё не знал про наследование, делал только по имеющимся знаниям. Буду переделывать.

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


прошу
#416 #654795
>>654752
На Идеоне покажи, что получилось, задай конкретный вопрос.
Скакать с задачи на задачу не надо.
#417 #654856
>>653722
Реквестирую проверку вчерашнего говнокода.
>>654881
66 Кб, 720x389
#418 #654869
Итак, алгоритм задачи "Навигатор", она же "Поиск пути", она же "Расчёт маршрута".
Вдруг осознал, что именно подобные задачи придётся решать и в том проекте, ради которого я всё это затеял изучать.
Немного волнуюсь от того, что многое кажется очевидным в ней, но некоторое вообще непонятно, мне остаётся только гадать и просить совета.
1. Имеем заготовленный ОПом код с массивами, в которых идентификаторы с названиями станций в ключах и описания в значениях, указание времени для достижения той или иной станции пешком, на автобусе или метро и тут же вызов функции для нахождения времени достижения близлежащих станций, а также способов достижения.
2. Создаём ту самую функцию, которая будет устанавливать время для достижения следующей станции, а также способ достижения.
У нас имеется массив с координатами «время» и «способ» пути из одной станции в другую.
Запускаем цикл foreach, который раскладывает массив на ключи и значения. Запускаем другой цикл foreach, который раскладывает на ключи и значения вложенный массив с названиями близлежащих станций в ключах, «временем» и «способом» пути в значениях. Если у нас ключ во вложенном массиве совпадает с названием пункта прибытия – выводим «время» и «способ». «Время» мы плюсуем к переменной $time, она у нас будет находиться в значении ключа ‘time’ массива $result. Далее мы сможем вывести $result[‘time’], $result[‘path’] или $result[‘by’], когда это будет нужно. Об этом говорит ОП, также я встречал такие интересные выкрутасы у братишки при решении какой-то задачи, взял на заметку.
Если до нужного нам пункта назначения всего один шаг – всё срабатывает. Если шагов несколько – дальше функция будет вызывать саму себя, переходя от пункта к пункту, складывая «время», «локацию» и «способ» в массив.
В итоге мы получаем несложную функцию, которая просто выводит время и способ пути из одного пункта в другой близлежащий.
3. Однако нам надо иметь чёткий проложенный путь, чтобы функция понимала, какие соответствия искать, не вела нас в сторону от точки назначения. При этом надо выбирать кратчайший путь (например, сравнивая «время»). Также желательно избежать советов, допустим, ехать 3 минуты на автобусе, затем ехать 5 минут на метро, а потом идти 5 минут пешком, если на автобусе ехать 15 минут из пункта в пункт. Если такое возможно.
Нужна функция для прокладывания пути. Каким-то образом надо точно узнавать, какие точки находятся между пунктом отправления и пунктом прибытия.
Например, пустой массив, который должен наполняться нужными для достижения конечной цели пунктами. Далее каждый пункт мы пропустим через предыдущую функцию, плюсующую «время» и выводящую «способ». Но необходимо добиться того, чтобы пункты выбирались строго подходящие. И я вхожу в ступор на этом месте…
Как избежать блуждания по карте? Если у нас между пунктом убытия и пунктом прибытия ещё хотя бы один пункт – я уже пугаюсь того, сколько работы нужно будет, чтобы проверить, где будет именно этот пункт.
Вот какая есть мысль: в массиве $paths у нас имеются вложенные массивы с названиями пунктов в ключах и с функцией, находящей «время» и «способ» достижения этого пункта из пункта, указанного в общем массиве. Например:
$paths = array(
'pet' => array(
'chk' => canGet(10, BUS),
'gor' => canGet(3, SUBWAY)
) ... );
Из 'pet' мы можем добраться до 'chk' за 10 минут на автобусе, до 'gor' за 3 минуты на метро.
У нас известен пункт прибытия, и мы можем его найти в этом массиве $paths.
Нужно как-то сравнивать ключи во вложенных массивах со всеми ключами основных массивов и с ключами в их вложенных массивах, находя точки соприкосновения, которые и будут пунктами нашего пути.
Допустим, у нас начальная точка пути – 'kre', а конечная точка – 'let' . Это ключ в массиве
'let' => array(
'dvo' => canGet(6, FOOT),
'gos' => canGet(7, FOOT)
);
Мы получаем две соседние точки: 'dvo' и 'gos'. Далее раскладываем массивы 'dvo' и 'gos' на их соседние пункты. И так до того, пока в каком-нибудь массиве не окажется у нас 'kre'.
Далее считаем, в каком пути у нас меньше всего получилась переменная «время» – $time.
Сохранённые в массив пункты самого меньшего по времени пути и будут нашей картой маршрута.
Не будет ли это всё бесконечным и нереализуемым? Звучит всё достаточно сложно: несколько циклов с поиском соответствия одних ключей другим, подсчёт наименьшего «времени» в проложенных путях (как-то эти поиски надо отличать один от другого, создавая разные массивы с данными; в принципе, просто создавать вложенные массивы при каждом цикле с поисками соответствий ключей ключам, а затем найти min() в этих получившихся вложенных массивах, вполне всё возможно, наверное).
Нужен ваш совет.
4. Допустим, путь у нас всё-таки проложен, функция, подыскивающая «время» и «способ» для пошагового достижения цели, запускается, переменные $time и $by набиваются нужными значениями, выводятся в массиве $result через echo в каждом цикле. Цикл ограничен количеством пунктов в проложенном маршруте.
Вроде бы это уже вполне понятно.
Требуется ваша помощь, ОП и братишки.
В принципе, и так для меня уже всё отлично, я вообще не ожидал, что дойду до этой задачи так быстро, думал вообще бонусные задачи перескочить, а сегодня уже начать повторять HTML и CSS.
Но сейчас хочется и в этой задаче разобраться, тут ещё и константы, с которыми я пока дел не имел.
66 Кб, 720x389
#418 #654869
Итак, алгоритм задачи "Навигатор", она же "Поиск пути", она же "Расчёт маршрута".
Вдруг осознал, что именно подобные задачи придётся решать и в том проекте, ради которого я всё это затеял изучать.
Немного волнуюсь от того, что многое кажется очевидным в ней, но некоторое вообще непонятно, мне остаётся только гадать и просить совета.
1. Имеем заготовленный ОПом код с массивами, в которых идентификаторы с названиями станций в ключах и описания в значениях, указание времени для достижения той или иной станции пешком, на автобусе или метро и тут же вызов функции для нахождения времени достижения близлежащих станций, а также способов достижения.
2. Создаём ту самую функцию, которая будет устанавливать время для достижения следующей станции, а также способ достижения.
У нас имеется массив с координатами «время» и «способ» пути из одной станции в другую.
Запускаем цикл foreach, который раскладывает массив на ключи и значения. Запускаем другой цикл foreach, который раскладывает на ключи и значения вложенный массив с названиями близлежащих станций в ключах, «временем» и «способом» пути в значениях. Если у нас ключ во вложенном массиве совпадает с названием пункта прибытия – выводим «время» и «способ». «Время» мы плюсуем к переменной $time, она у нас будет находиться в значении ключа ‘time’ массива $result. Далее мы сможем вывести $result[‘time’], $result[‘path’] или $result[‘by’], когда это будет нужно. Об этом говорит ОП, также я встречал такие интересные выкрутасы у братишки при решении какой-то задачи, взял на заметку.
Если до нужного нам пункта назначения всего один шаг – всё срабатывает. Если шагов несколько – дальше функция будет вызывать саму себя, переходя от пункта к пункту, складывая «время», «локацию» и «способ» в массив.
В итоге мы получаем несложную функцию, которая просто выводит время и способ пути из одного пункта в другой близлежащий.
3. Однако нам надо иметь чёткий проложенный путь, чтобы функция понимала, какие соответствия искать, не вела нас в сторону от точки назначения. При этом надо выбирать кратчайший путь (например, сравнивая «время»). Также желательно избежать советов, допустим, ехать 3 минуты на автобусе, затем ехать 5 минут на метро, а потом идти 5 минут пешком, если на автобусе ехать 15 минут из пункта в пункт. Если такое возможно.
Нужна функция для прокладывания пути. Каким-то образом надо точно узнавать, какие точки находятся между пунктом отправления и пунктом прибытия.
Например, пустой массив, который должен наполняться нужными для достижения конечной цели пунктами. Далее каждый пункт мы пропустим через предыдущую функцию, плюсующую «время» и выводящую «способ». Но необходимо добиться того, чтобы пункты выбирались строго подходящие. И я вхожу в ступор на этом месте…
Как избежать блуждания по карте? Если у нас между пунктом убытия и пунктом прибытия ещё хотя бы один пункт – я уже пугаюсь того, сколько работы нужно будет, чтобы проверить, где будет именно этот пункт.
Вот какая есть мысль: в массиве $paths у нас имеются вложенные массивы с названиями пунктов в ключах и с функцией, находящей «время» и «способ» достижения этого пункта из пункта, указанного в общем массиве. Например:
$paths = array(
'pet' => array(
'chk' => canGet(10, BUS),
'gor' => canGet(3, SUBWAY)
) ... );
Из 'pet' мы можем добраться до 'chk' за 10 минут на автобусе, до 'gor' за 3 минуты на метро.
У нас известен пункт прибытия, и мы можем его найти в этом массиве $paths.
Нужно как-то сравнивать ключи во вложенных массивах со всеми ключами основных массивов и с ключами в их вложенных массивах, находя точки соприкосновения, которые и будут пунктами нашего пути.
Допустим, у нас начальная точка пути – 'kre', а конечная точка – 'let' . Это ключ в массиве
'let' => array(
'dvo' => canGet(6, FOOT),
'gos' => canGet(7, FOOT)
);
Мы получаем две соседние точки: 'dvo' и 'gos'. Далее раскладываем массивы 'dvo' и 'gos' на их соседние пункты. И так до того, пока в каком-нибудь массиве не окажется у нас 'kre'.
Далее считаем, в каком пути у нас меньше всего получилась переменная «время» – $time.
Сохранённые в массив пункты самого меньшего по времени пути и будут нашей картой маршрута.
Не будет ли это всё бесконечным и нереализуемым? Звучит всё достаточно сложно: несколько циклов с поиском соответствия одних ключей другим, подсчёт наименьшего «времени» в проложенных путях (как-то эти поиски надо отличать один от другого, создавая разные массивы с данными; в принципе, просто создавать вложенные массивы при каждом цикле с поисками соответствий ключей ключам, а затем найти min() в этих получившихся вложенных массивах, вполне всё возможно, наверное).
Нужен ваш совет.
4. Допустим, путь у нас всё-таки проложен, функция, подыскивающая «время» и «способ» для пошагового достижения цели, запускается, переменные $time и $by набиваются нужными значениями, выводятся в массиве $result через echo в каждом цикле. Цикл ограничен количеством пунктов в проложенном маршруте.
Вроде бы это уже вполне понятно.
Требуется ваша помощь, ОП и братишки.
В принципе, и так для меня уже всё отлично, я вообще не ожидал, что дойду до этой задачи так быстро, думал вообще бонусные задачи перескочить, а сегодня уже начать повторять HTML и CSS.
Но сейчас хочется и в этой задаче разобраться, тут ещё и константы, с которыми я пока дел не имел.
>>657391>>657400
#419 #654870
Не передается нуль(0) в базу данных в столбец name tinyint(1). Я хочу использовать его как булевое значение. Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens' in C:\... Не говорите что количество токенов не совпадает в запросе, ибо все остальное кроме нуля передается.
>>657391
#420 #654881
>>654856
Сумбур у тебя там какой-то.
1. Сделай var_dump($math) - у тебя там ничего не передаётся.
2. Попробуй, чтобы заработало хотя бы на одной ошибке. Например, у тебя там нет сочетаний "жы" или "шы" - в самом тексте. Поставь такую ошибку и попробуй только для одной первой регулярки сделать всё рабочим.
3. (жы|шы) - попробуй сократить, ведь буква "ы" у нас повторяется.
4. Ставь дополнительный флаг i - чтобы всё работало, когда буквы прописные.
5. Незачем называть ключи переменными: $reg1=>"Жи Ши пиши через И". Это только запутывает. Можно просто в массив подставить сами регулярки на место ключей.
>>654927>>654961
#421 #654916
https://jsfiddle.net/fbv25bmh/ переписал сапёра. Я только не понял, ОП, какой цикл ты хотел, чтобы я сделал в getNeighbours.
>>657385>>660204
#422 #654927
>>654881
Не передаётся потому-что в тексте не было ошибок, на намеренно допущенные срабатывает вроде как надо, остальное поправлю.
>>654957
#423 #654935
Есть какая-нибудь функция универсальная для сравнения двух элементов? Не МИН МАКС, и не тыща операторов больше, меньше, а даю две переменные и она даёт что-то типа "1 больше второго" и наоборот?
>>654938>>654941
#424 #654938
>>654935

>, < всего два оператора. Не благодари.

#425 #654941
>>654935
Ну ты можешь сам написать функцию своей мечты.
#426 #654944
Ребята, а как узнать что в Pimple делает метод share()? Поиск по гитхабу не дал результатов.

https://github.com/silexphp/Pimple/tree/1.1

https://habrahabr.ru/post/199296/

>По умолчанию при каждом вызове Pimple возвращает новый объект сервиса. Если же требуется один экземпляр на всё приложение, всё, что вам необходимо сделать – обернуть объявление в метод share():


>$container['session'] = $container->share(function ($c) {


> return new Session($c['session_storage']);


>});

>>654985
#427 #654945
function x(){
if($x == 1){
return "hui";
break;
} else {
return "ne hui";
}
}
нужно ли в данном случае добавлять break? или это избыточно?
>>654946>>654985
#428 #654946
>>654945
break тут вообще не причем. Почитай что он делает.
>>654947
#429 #654947
>>654946
Но почему тогда в switch надо каждый раз добавлять break?
>>654949>>654985
#430 #654949
>>654947
Потому-что если не добавить он продолжит сравнивать значение переменной после совпадения.
#431 #654957
>>654927
Там полно ошибок было с пробелами перед знаками препинания.
#432 #654961
>>654881
http://ideone.com/6PnlPq
Вот , поправил по рекомендациям, парочка ошибок в тексте допущена, все отлавливает.
>>655000>>660204
#433 #654963
Аноны, что можете сказать про этот скрипт? Если бы вы писали такой скрипт, во сколько бы его оценили для заказчика? http://blankionline.ru/prikaz-priem-na-rabotu-forma-t-1
>>660204
#434 #654985
>>654944

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

В большинстве случаев тебе именно share и нужен.

>>654945

break можно использовать только внутри цикла или switch. Тут их нет, значит нельзя.

Также, нет смысла писать код после return так как он никогда не выполнится.

>>654947

Потому что свитч так работает: по умолчанию код в нем выполняется сверху вниз.
>>655625
#435 #655000
>>654961
1. Слишком много захватывает текста. Если убрать символы перевода строки (сделать текст без абзацев), то будет подставлять его весь там, где нужно немного текста для обнаружения ошибки. Это надо обязательно исправить.
2. Код оформлен неряшливо. Лучше вот так: http://ideone.com/UwECQZ
3.

>echo "{$j}\n";


>echo "Вот в этой строке: \n" ;


>echo $math[0][1];


Не имеет смысла разносить echo по разным строкам, лучше сделать одной строкой.
4. Массивы, наоборот, лучше разносить по строкам для наглядности.
5. foreach($allreg as $i=>$j) - лучше давать осмысленные названия переменным, чтобы сразу видеть, что они обозначают и как изменяются в цикле, что это даёт.
>>660204
#436 #655015
Можно ли использовать что-то типа -99999, если нужно циклом перебирая найти наибольшее значение и необходимо сравнивать их. Иными словами, первое сравниваем с -99999 и пошло-поехало. Или есть лучше вариант?
>>655016
#437 #655016
>>655015

1) брать первое значение в кач-ве минимального/максимального
2) брать бесконечность, INF или -INF.
>>655017
#438 #655017
>>655016

>брать бесконечность, INF или -INF.


блин, логично, спасибо. Даже не подумал, что с константами можно играть
#439 #655019
>>651870
>>651867
Оп, не забудь модули посмотреть.
>>657617
173 Кб, 1080x866
#440 #655024
Сап. Спрошу еще раз.
Хочу запилить АИБ на Кусабе.
Все делал по инструкции.
Вылезает такая ошибка. Я хз что делать.
Поскажите плес.
>>655025>>655026
#441 #655025
>>655024

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

Из советов - могу посоветовать очистить базу данных, удалить файлы и заново с нуля все внимательно переустановить.
>>655166
#442 #655026
>>655024
Этих данных не достаточно, чтобы тебе помочь.
#443 #655061
Тут есть кто-то кто ковырял Magento и писал к ней дополнения?
>>660204
#444 #655166
>>655025
Обращаюсь сюда, потому что кусаба работает на PHP.
Уже переустанавливал.
Не можете подсказать, как базу данных составить? Я просто создал таблицу. Где ее составить, что бы все пахало, не написано.
>>657382
#445 #655349
>>662476
#446 #655431
Аноны, вот собираюсь начать с ребятами дубасить, ничего в нем особенного - регистрация, пара плюшек с редактированием фото, ввод и вывод бабосов через вебмани. Вопрос - есть ли разница в разработке ПО под облачные сервисы и просто сервер? Или принципиальных отличий нет?
>>655436>>657382
#447 #655436
>>655431
Как-то хуево вышло. Хочу делать ПО на пхп, смогу ли я запустить без проблем в облаке эту хрень, а потом без доработок на своем сервере?
>>657382
#448 #655548
Забыл, и нигде не могу найти, как называется функция пхп, которая понижмает уровень массива, то есть например из многомерного делает одномерный массив?
>>655550>>655652
#449 #655550
>>655548
По моему ты придумал существование такой функции. Я даже не могу себе представить зачем она нужна.
http://php.net/manual/ru/ref.array.php prove me wrong
>>655562
#450 #655557
есть функция, ничего не возвращает. В конце делает преобразование над переменной у(например).

Мне нужно, чтоб она делала ДРУГОЕ, в, если переменная о, переданная в неё имеет значение, скажем, 0. Пойдёт ли такой вариант, чтоб не доходила она до конца?

function x($o){
...
...
if($o == 0){ y=floor(у+8); return; }

y=floor(у);
}
>>655559>>655561
#451 #655559
>>655557
блин, объяснил, конечно, как неандерталец
#452 #655561
>>655557
Ничего не понял. Функция ничего не возвращает и не имеет никакого влияния на итоговый код, зачем тогда она вообще нужна?
>>655564
#453 #655562
>>655550
Например есть многомерный массив, с числовыми ключами, как превратить его в обыкновенный массив, со всеми значениями которые есть внутри него?
>>655567
#454 #655564
>>655561
да я как даун объяснил. Она ничего не возвращает, а делает преобразования над глобальной переменной у.

Мне нужно, чтоб при определённом условии она сделала другое преобразование над у и закрылась. Можно ли использовать для этого пустой return;?
>>655567>>655581
#455 #655567
>>655562
Все еще не ясно что ты хочешь получить в результате. Приведи пример изначального массива и результата твоей функции.
>>655564
return не нужен, если у тебя глобальная переменная.
>>655570
#456 #655570
>>655567
ты опять не понял. Мне нужно, чтоб она дальше не шла функция, и закончилась на ДОП действии.

function x($o){
...
...
if($o == 0){ y=ДОП ДЕЙСТВИЕ; return; }

у=ОСНОВНОЕ ДЕЙСТВИЕ
}
>>655573
#457 #655572
>>649698
Про палиндром решил задачу так: http://ideone.com/fhL0XB
>>655575>>655578
#458 #655573
>>655570
Ну тогда можешь использовать пустой return, он прекратит выполнение функции. Хотя если ты используешь глобальные переменные - ты уже делаешь что-то не так.
>>655574
#459 #655574
>>655573

>Хотя если ты используешь глобальные переменные


Почему?
>>655576>>655581
#460 #655575
>>655572
Меня смущает, что (-$i) печатает задом наперёд, хотя так делать не должен вроде... Ошибка?
#461 #655576
>>655574
Всегда можно обойтись без них. Глобальные переменные это дурной тон и с ними легко можно сломать код.
2705 Кб, 176x144
#462 #655578
>>655572
Сука, опять какая-то ебала получилась.
>>655579
#463 #655579
>>655578
Анончик, сори, только что вдуплил в твои советы:

Нет, всё в порядке, просто разберись с функцией mb_substr:
1. Как получить первый символ в тексте с её помощью?
2. Как получить последний символ в тексте с её помощью?
Основная проблема с этим.
Далее символы у тебя получаются строковые, они не могут быть больше или меньше, они могут быть только равны друг другу или не равны. Поэтому ($symb1 <> $symb2) не будет работать в этой ситуации.
>>655583>>655712
#464 #655581
>>655564

Можно.

>>655574

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

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

Такое часто бывает когда люди не имеют достаточной квалификации для работы в большом проекте. Написать простую функцию они могут, а организовать сложный код - нет. Им надо заниматься самообразованием, а не спешить писать код.
#465 #655583
>>655579
О, можно же отдельно отсчитывать от халфтекст и от текст!
>>655585
#466 #655585
>>655583
Вот так, например http://ideone.com/K9BQ0z
>>655586>>662524
#467 #655586
>>655585
Но всё-таки я не понял, как надо было правильно решить эту задачу. Призываю гуру ПХП на помощь.
>>655587
#468 #655587
>>655586
Нет, нихуя я не решил. Попробовал заменить буквы в фразе на случайные - всё равно выдаёт, что это палиндром
>>655591
#469 #655591
>>655587
>>655587
вывел по 1 букве, но всё равно не проверяет, если буквы заменить http://ideone.com/ufcowS
>>655594
#470 #655594
>>655591
не могу понять, почему $letter1 всегда принимает значение $letter2
>>655596
#471 #655596
>>655594
По идее вот так должно работать, но почему-то $letter1 всегда равняется $letter2

http://ideone.com/ZhowMf
>>655598>>655604
#472 #655598
>>655596
Я имею в виду, если задать текст

>$text = "А роза упала на лапу АзорG";



... то результат будет G = G
293 Кб, 1246x1024
100 Кб, 762x901
1793 Кб, 2530x2796
460 Кб, 1272x1133
#473 #655599
Примерно два года назад учёные доказали, что мозг шизофреника обмануть не удаётся . Это интересный случай, когда искажение реальности и самообман — признак здорового человека.

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

Интересно, что лишь небольшая часть людей способна видеть реальность без искажений, и это является стопроцентным признаком психического заболевания. Более того, как тогда классифицировать «галлюцинации», которые являются одним из клинических симптомов шизофрении?
#474 #655601
>>655599
Уйди обратно в б.
>>655608
#475 #655604
>>655596

Ты = и == перепутал. = не сравнивает а записывает значение одной переменную в другую, потому они всегда равны.
>>655610
733 Кб, Webm
#476 #655608
#478 #655610
>>655604
http://ideone.com/4Cvfvm

Теперь у меня кукушка окончательно поехала. переменная $from (извините, лучше название не придумал) не изменяется, если указать $from = $from +/- 1
>>655611
#479 #655611
>>655610
бля, я же их назначаю каждый раз по-новой
>>655615
#480 #655612
>>650300
>>650440

.{3}? - что ты хотел этим написать? Что может быть 3 любых символа, а может ни одного? тогда надо писать

(.{3})?

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

В данном случае вопрос отключил жадность у предыдущего квантифиактора, то есть стремление захватить как можно больше символов, и это не то что ты хотел.
#481 #655613
>>655599
Мы берем целевую последовательность (данную CASP) и делаем наилучший возможный прогноз, который мы можем сделать. Затем мы находим homologs-последовательность в базе данных и делаем наилучший возможный прогноз, который мы можем сделать также и для них .

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

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

Это и даст наш конечный прогноз.
>>655614
#482 #655614
>>655613
Извините что потревожили, простите нас.
Мы хотим донести полезную информацию
>>655860
#483 #655615
>>655611
Аноны, я решил наконец? http://ideone.com/4Cvfvm

Вроде да, но команда break не прерывает выполнение программы и в случае неравенства выходит результат "не палиндромпалиндром". В задаче про айфон команда break по-моему весь код останавливала, а не только цикл. Или я не прав?
#484 #655616
>>655615
Исправил. Вместо break вписал exit
>>655617
#485 #655617
>>655615
>>655616
Скиньте ссылку, как вы решили эту задачу. Ведь
Какое решение предполагал ОП? Как вы решили эту задачу?
#486 #655618
>>655599
Примечательно, что российское метро к 2068 году не изменилось. Скорее всего, реально не изменится.
>>655860
#487 #655625
>>654985

>Написано же, share позволяет указать что объект надо создать (вызывая функцию-фабрику) только первый раз, а во второй раз надо просто вернуть ранее созданный объект.


>


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


Я просто не смог найти код метода чтобы посмотреть как он работает. Мне показалось это странно, вызывать метод которого нет в классе. Как это работает? Или лучше спросить, где он написан чтобы посмотреть самому?
>>655719
#488 #655652
>>655548
Посмотри комментарии вот здесь:
http://php.net/manual/ru/function.array-values.php
#489 #655712
>>655615
Да, теперь всё решено правильно.
Интересно, что ты придумал обозначить начальные символы в mb_substr не через $i и -$i, а через $from1 = 0; и $from2 = -1;
С $i можно было сделать вот так: http://ideone.com/y5545w
Это избавляет от дополнительных переменных, мы делаем всё с помощью $i, которая в любом случае у нас есть.
Обрати внимание, что изначально я поставил в цикле $i = 1. Так проще добиться -$i для отсчёта с конца строки.
Но ты молодец, у тебя хорошее решение.

Мимо братишка с теми подсказками: >>655579
>>655742
#490 #655719
>>655625
Разобрался. Оказалось что этот метод теперь называется factory();
#491 #655728
>>655615
Аа, да: так выходит с break потому, что у тебя echo стоит за пределами цикла и в любом случае срабатывает.
Вот в чём опасность вынесения echo за пределы цикла, в больших скриптах надо быть осторожным с этим.
#492 #655742
>>655712
Спасибо.
стати, тоже пытался решить через $i, но программа не считала. Сейчас я думаю, что где-то в другом месте допустил ошибку и программа не работала из-за какого-то другого косяка.
Например, здесь выборка букв зависит от $i и -$i, но есть другая ошибка.
Так я запутался с $i и пришёл к "механическому" $from.
>>655756>>655822
#493 #655756
>>655742
Скорее всего, изначально ставил $i = 0 в цикл, а потом не обратил внимания, что там получается -0.
Обычно тут возникает затруднение.
Также теперь ты можешь попробовать сделать точно по тем моим советам - с условием, когда $i == $halfLength. Так можно избежать размещения echo за пределами цикла.
Но это если есть желание дополнительно разобраться.
Задачу ты и так решил уже правильно.
>>655822>>656745
#494 #655822
>>655832
#495 #655825
>>651764
Вовка, ты че такой агрессивный?
#496 #655832
>>655822

>$letter1 = mb_substr($text, $i, 1);


При $i = 1 в цикле что будет? А что должно быть?
#497 #655860
>>655614

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

>>655618

А что не так с метро-то?

>>651754

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

Первый запрос:

> JOIN claim c ON m.id = c.manager_id


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

> `sum` float NOT NULL,


Для денег лучше точные типы вроде INT или DECIMAL/NUMERIC.

> `first_name` varchar(32) CHARACTER SET latin1


Почему latin1?

> SELECT m1.first_name,


> m1.last_name,


> m1.chief_id,


> COUNT(c1.id) AS 'claim_count',


> COUNT(DISTINCT c2.id) AS 'chief_claim_count'



COUNT(c1.id) скорее всего выберет больше чем надо так как посчитает дублирующиеся ид. Попробуй убрать HAVING и проверь правильные ли цифры в этой колонке.

> HAVING COUNT(c1.id) > COUNT(DISTINCT c2.id);


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

> https://dev.mysql.com/doc/refman/5.0/en/group-by-handling.html


> In standard SQL, a query that includes a GROUP BY clause cannot refer to nonaggregated columns in the select list that are not named in the GROUP BY clause.



Имей это в виду, если например будешь какое-то тестовое задание делать именно на SQL, а не на диалект SQL который используется в MySQL.

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


А пустые месяцы без заявок выводить не надо?

> ORDER BY ROUND(AVG(c.sum), 3)


ROUND тут не нужен

> DATE_FORMAT(c.created_at, '%m %Y') = '07 2013'


Я бы записал created_at BETWEEEN ... AND ... - так и читабельнее и индексы позволяет задействовать.
#497 #655860
>>655614

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

>>655618

А что не так с метро-то?

>>651754

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

Первый запрос:

> JOIN claim c ON m.id = c.manager_id


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

> `sum` float NOT NULL,


Для денег лучше точные типы вроде INT или DECIMAL/NUMERIC.

> `first_name` varchar(32) CHARACTER SET latin1


Почему latin1?

> SELECT m1.first_name,


> m1.last_name,


> m1.chief_id,


> COUNT(c1.id) AS 'claim_count',


> COUNT(DISTINCT c2.id) AS 'chief_claim_count'



COUNT(c1.id) скорее всего выберет больше чем надо так как посчитает дублирующиеся ид. Попробуй убрать HAVING и проверь правильные ли цифры в этой колонке.

> HAVING COUNT(c1.id) > COUNT(DISTINCT c2.id);


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

> https://dev.mysql.com/doc/refman/5.0/en/group-by-handling.html


> In standard SQL, a query that includes a GROUP BY clause cannot refer to nonaggregated columns in the select list that are not named in the GROUP BY clause.



Имей это в виду, если например будешь какое-то тестовое задание делать именно на SQL, а не на диалект SQL который используется в MySQL.

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


А пустые месяцы без заявок выводить не надо?

> ORDER BY ROUND(AVG(c.sum), 3)


ROUND тут не нужен

> DATE_FORMAT(c.created_at, '%m %Y') = '07 2013'


Я бы записал created_at BETWEEEN ... AND ... - так и читабельнее и индексы позволяет задействовать.
#498 #655882
Не нахожу скл треда, спрошу здесь.
Надо подтянуть в таблицу (или создать новую таблицу на базе двух) фамилии из другой таблицы по ключу. Как это сделать? Merge, видимо, просто прилепляет новую колонку с её содержимым в том порядке, в каком оно было в исходной таблице.
>>655886>>662524
#499 #655886
>>655882
Забыл сказать, что Firebird. Констуркция UPDATE - SET - FROM не срабатывает.
#500 #656043
Надо подключить определённое количество js библиотек и скриптов в вордпресс, надо использовать wp_enqueue_script(), но в теме стоит фреймворк и файл functions.php представляет собой следующее:

$us_theme_supports = array(
'plugins' => array(
'переменная' => 'значение',
'переменная' => 'значение',
...
),
);

require dirname( __FILE__ ) . '/framework/framework.php';

Функции в этом файле не работают, как подключить .js и .css файлы в этом случае?
>>662524
#501 #656045
Ребята, дайте ответьте пожалуйста

class Foo {
//code
}

$foo = new Foo();

//$foo['var'] = ?

print_r($foo['var']);

Что нужно написать чтобы в $foo['var'] можно было положить что-то? И что там вообще может быть?
>>656052>>656063
#502 #656052
>>656045

Тестовое задание?
>>656074
#504 #656074
>>656052
Нет, просто пытаюсь разобраться в синтаксисе, вот что я уже нашел

1. Использовать SplObjectStorage()
class Foo {
}

$s = new SplObjectStorage();

$foo = new Foo();

$s->attach($foo);

$s[$foo] = "Something";

но это не то что я хотел понять, в ключе $s[$foo] указывается сам объект, а не номер или название ключаю

2. Использовать ArrayAccess

https://secure.php.net/manual/ru/class.arrayaccess.php

>Пример #1 Основы использования



но тут мне не понятно что присходит при вызове $obj['two']... Вызывается метод offsetGet('Two')?

>>656063
Спасибо, я не ожидал что вы меня опередите. Продолжим разбираться вместе?
#504 #656074
>>656052
Нет, просто пытаюсь разобраться в синтаксисе, вот что я уже нашел

1. Использовать SplObjectStorage()
class Foo {
}

$s = new SplObjectStorage();

$foo = new Foo();

$s->attach($foo);

$s[$foo] = "Something";

но это не то что я хотел понять, в ключе $s[$foo] указывается сам объект, а не номер или название ключаю

2. Использовать ArrayAccess

https://secure.php.net/manual/ru/class.arrayaccess.php

>Пример #1 Основы использования



но тут мне не понятно что присходит при вызове $obj['two']... Вызывается метод offsetGet('Two')?

>>656063
Спасибо, я не ожидал что вы меня опередите. Продолжим разбираться вместе?
#505 #656081
>>656074
Зачем мне разбираться в том что я и так знаю? Это твое задание, няш, тебе и делать.
>>656086
#506 #656086
>>656081
У меня нет задания, просто разбираюсь. Решил просто как-то поддержать разговор чтобы не оставлять твои старания без внимания. Добра в общем!
#507 #656149
>>656074

Интерфейс ArrayAccess позводяет работать с объектом используя синтаксис доступа к массиву. Это то, что нужно тебе.

> но тут мне не понятно что присходит при вызове $obj['two']... Вызывается метод offsetGet('Two')?



Да, читай мануал по методаам, например https://secure.php.net/manual/ru/arrayaccess.offsetget.php

Надо понимать что полноценным массивом твой объект не станет - например в array_keys его передать нельзя.
>>656234
#508 #656154
>>656074

SplObjectStorage реализован поверх ArrayAccess и это не то (это хранилище где в качестве ключей можно использовать объекты).
>>656234
#509 #656234
>>656149
>>656154
Блин ОПчик, я уже разобрался самостоятельно...

Я уже заканчиваю разбираться с Pimple, и если я правильно понимаю, что по коду нет замечаний >>641843 >>649314, то сегодня-завтра и всю неделю я буду доделывать задачу со Студентами. Там осталось самое элементарное, мы уже такое делали. Главное что я сейчас заканчиваю с пониманием ООП!

Кстати, хотел бы услышать малюсенький комментарии по этому поводу

>>649314

>> Мне кажется что вот так писать pdo будет не правильно:


>Почему?


Я недавно видел как писали в одном файле что-то вроде

Init.php
class Init {
...
}

$init = new Init();

...

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

Спасибо ♥♥♥
#509 #656234
>>656149
>>656154
Блин ОПчик, я уже разобрался самостоятельно...

Я уже заканчиваю разбираться с Pimple, и если я правильно понимаю, что по коду нет замечаний >>641843 >>649314, то сегодня-завтра и всю неделю я буду доделывать задачу со Студентами. Там осталось самое элементарное, мы уже такое делали. Главное что я сейчас заканчиваю с пониманием ООП!

Кстати, хотел бы услышать малюсенький комментарии по этому поводу

>>649314

>> Мне кажется что вот так писать pdo будет не правильно:


>Почему?


Я недавно видел как писали в одном файле что-то вроде

Init.php
class Init {
...
}

$init = new Init();

...

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

Спасибо ♥♥♥
>>662528
#510 #656287
проясните за гит/гитхаб. в гитхабе я создаю удаленный репозиторий на их сайте, тут все ок.
а в гите я типа создаю локальный на своей машине? и где его надо создавать в любой папке или в корне проекта который я потом буду загружать в удаленный репо?
>>656496
#511 #656304
пацаны, какого хуя она мне дурацкие ошибки выдаёт?
ideone.com/Qcm09n
>>656308
#512 #656308
>>656304

>ideone.com/Qcm09n


перечитай ещё раз, как делать конструкцию if else
>>656314
#513 #656314
>>656308
если скобочки к елсе добавляю, то она к скобочкам приебывается. ладно, буду пытаться.
>>656317
#514 #656317
>>656314
или говорит: ставь T-else or T-echo. зачем?
>>656322
#515 #656322
>>656317
простите за панику. оказывается у else не может быть условия, только elseif.
#516 #656384
Оп, ты мои модули проверил?
>>657382
#518 #656496
>>656287
В корневой проекта.

Вообще в любой папке, и эта папка становится репозиторием.
Если тебе нужен весь проект в гите то в корневой, если только, какая то конкретная часть, то в этой части.
>>656560
#519 #656503
>>652219
http://integer64.github.io/site-layout/exercise/mainTask/index.html

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



Пофиксил.
Походу глаз уже замылился. =)

>В ИЕ10 синяя рамка вокруг логотип


>В адресе, я думаю, ты переборщил с неразрывными пробелами.


Пофиксил.

> Иконки в блоке Consectetur


добавил блокам <div class="service-block"> классы отображения иконок. И все прекрасно встало и отцентрировалось, без

> pos: rel, добавить ему псевдоэлемент и абсолютно отпозиционировать его по центру (left 50% + отриц. маргин)



>>656418
И это проверь пжлста, тоже мое.
>>663571
#520 #656560
>>656496
А можно репозиторий создавать не в той папке которая в htdocs на сервере, а где-то отдельно на диске, завести допустим d:/git_repos/ куда копировать проект и уже оттуда все коммиты посылать? Мне эти лишние файлы и папки скрытые чет глаза мозолят.
>>656580>>656595
#521 #656580
>>656560
https://git-scm.com/book/ru/v1
Будет полезно изучить.
мимо проходил
#522 #656595
>>656560

Копировать не устанешь? Папка всего одна - .git в корне. Разумеется, на боевом сервере она не должна быть в публичной папке веб сервера.
#523 #656608
http://ideone.com/hdVBmQ
Проверьте задачку на палиндром , мне кажется я чего-то лишнего наделал и можно было уложиться в меньшее кол-во символов
>>656789>>663576
23 Кб, 1200x630
118 Кб, 1024x768
73 Кб, 270x426
131 Кб, 550x567
#524 #656637
Разобрался с Pimple. Хотелось кое что прокомментировать.

https://github.com/silexphp/Pimple/blob/master/src/Pimple/Container.php#L109
Мне кажется это очень странным алгоритмом, получается Контейнер вызывает Зависимый Класс, который обращается к Вспомогательному, через анонимную функцию, которая передает в аргумент этот же Контейнер, который вызывает Вспомогательный Класс через анонимную функцию.
Даже сейчас мне кажется что я всё не совсем понял. Почему мне кажется это таким запутанным и не очевидным? Я же знаю что здесь всё логично! Что я упускаю?

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

Я не жду ответов на этот пост, но если у вас появиться какие-то мысли, мне будет интересно.
>>657052
#525 #656745
>>655756

>Также теперь ты можешь попробовать сделать точно по тем моим советам - с условием, когда $i == $halfLength. Так можно избежать размещения echo за пределами цикла. Но это если есть желание дополнительно разобраться.



Вынес таким образом: http://ideone.com/VoO0A6
>>656789>>663576
#526 #656768
Задачка про кредит.
Типа, в банк положили 10к, и раз в год начисляется 10%.
Вопрос - как выглядит пример? Т.е. ума не приложу как в действии записать начисление этих 10%, и при этом что бы начислялось каждый раз на предыдущую сумму, а не на начальные 10к
>>656774>>656777
#527 #656774
>>656768
Функция. Функция это называется.
>>657382
#528 #656777
>>656768
10 000 * 0.10 = 1000
10% от 10 000 будет 1000.
>>656781
#529 #656781
>>656777
От я тупорылый дегенерат. Вот что значит сделать перерыв в неделю, больше не буду так делать. Спасибо.
#530 #656789
>>656608
Какое неожиданное решение, залюбовался прямо.
Нет, там меньше символов вряд ли возможно.

>>656745
Так гораздо лучше, хотя и с первым решением всё было в порядке.
Ну а я имел в виду что-то вроде этого: http://ideone.com/9YNYse
>>656952>>663576
#531 #656824
Что нужно уметь, чтобы устроиться на самую днищенскую пхп должность для набивания опыта? В моем городе есть вакансии где просят иметь "Начальное знание PHP, SQL, MySQL". Но я хз что они имеет в виду под эти Начальным Знанием.
#532 #656952
>>656789

>Ну а я имел в виду что-то вроде этого: http://ideone.com/9YNYse


А, там иерархия срабатывает. Супер.
#533 #656997
>>656824
Двачую вопрос.
>>657382
#534 #657033

> читаешь тему про функции


> увидел $exchangeRate = 30


> расплакался

#535 #657052
>>656637

Ты про метод offsetGet? Тут надо помнить, что в контейнере может храниться несколько видов значений:

- обычные значения вроде строк или чисел, которые просто надо вернуть как есть ($container['username'] = 'Ivan')
- значения, которые создаются функцией-фабрикой, при каждой попытке получить значение надо каждый раз вызывать функцию ($container->factory...)
- значения, которые создаются функцией-фабрикой, но которые надо создавать через функцию только в первый раз, а во второй раз возвращать ранее созданное и сохрненное значение ($container['x'] = function () {... }).

Зачем нужны функции? Они позволяют реализовать "ленивое" создание объектов, когда объект создается только если он кому-то нужен. Также, они облегчают получение зависимостей, когда для создания объекта A нам надо получить сначала объекты B и C. Без фабрик нам пришлось бы думать о порядке, в котором надо создавать объекты.

Это упомянуто в документации:

> http://pimple.sensiolabs.org/


> As objects are only created when you get them, the order of the definitions does not matter.



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

Логика там очень простая:

$this->values[$id] = $value;

Особняком стоит случай когда мы используем $con['x'] = $con->factory(function () {.. }) . Если мы посмотрим код метода factory, то увидим что этот метод делает единственную вещь: сохраняет функцию в коллекции $this->factories. Это используется чтобы определить: надо вызывать функцию только при первом обращении или каждый раз.

Также, там есть еще метод protect, оборачивая в который функцию мы говорим что надо не вызывать ее, а просто вернуть как значение. Он сохраняет функцию в коллекцию $this->protected

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

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

Теперь к твоему комментарию.

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


Не очень понимаю, что ты считаешь зависимым и вспомогательным классом тут? SplObjectStorage? Это коллекция, почти что массив в ООП-стиле. Или вызов $con->factory()?

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

$con['a'] = function ($c) {
return new A($c['b']);
};

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

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

$a = new Pimple;
$b = new Pimple;

// В $a функция будет сохранена в коллекию factories, но $b об этом ничего не знает!
$someFactory = $a->factory(function () {
echo "called\n";
return 1;
});

// Несмотря на то что мы использовали factory(), наша функция будет вызвана только в первый раз
$b['something'] = $someFactory;

$b['something']; // -> called
$b['something']; // ничего не выведется

То есть способ, которым реализована тут factory, позволяет неправильно ее исплоьзовать. Это нехорошо, правильнее было бы сделать так:

$container->setFactory('x', function ...);

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

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

Если что-то непонятно - задавай вопросы.
#535 #657052
>>656637

Ты про метод offsetGet? Тут надо помнить, что в контейнере может храниться несколько видов значений:

- обычные значения вроде строк или чисел, которые просто надо вернуть как есть ($container['username'] = 'Ivan')
- значения, которые создаются функцией-фабрикой, при каждой попытке получить значение надо каждый раз вызывать функцию ($container->factory...)
- значения, которые создаются функцией-фабрикой, но которые надо создавать через функцию только в первый раз, а во второй раз возвращать ранее созданное и сохрненное значение ($container['x'] = function () {... }).

Зачем нужны функции? Они позволяют реализовать "ленивое" создание объектов, когда объект создается только если он кому-то нужен. Также, они облегчают получение зависимостей, когда для создания объекта A нам надо получить сначала объекты B и C. Без фабрик нам пришлось бы думать о порядке, в котором надо создавать объекты.

Это упомянуто в документации:

> http://pimple.sensiolabs.org/


> As objects are only created when you get them, the order of the definitions does not matter.



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

Логика там очень простая:

$this->values[$id] = $value;

Особняком стоит случай когда мы используем $con['x'] = $con->factory(function () {.. }) . Если мы посмотрим код метода factory, то увидим что этот метод делает единственную вещь: сохраняет функцию в коллекции $this->factories. Это используется чтобы определить: надо вызывать функцию только при первом обращении или каждый раз.

Также, там есть еще метод protect, оборачивая в который функцию мы говорим что надо не вызывать ее, а просто вернуть как значение. Он сохраняет функцию в коллекцию $this->protected

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

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

Теперь к твоему комментарию.

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


Не очень понимаю, что ты считаешь зависимым и вспомогательным классом тут? SplObjectStorage? Это коллекция, почти что массив в ООП-стиле. Или вызов $con->factory()?

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

$con['a'] = function ($c) {
return new A($c['b']);
};

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

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

$a = new Pimple;
$b = new Pimple;

// В $a функция будет сохранена в коллекию factories, но $b об этом ничего не знает!
$someFactory = $a->factory(function () {
echo "called\n";
return 1;
});

// Несмотря на то что мы использовали factory(), наша функция будет вызвана только в первый раз
$b['something'] = $someFactory;

$b['something']; // -> called
$b['something']; // ничего не выведется

То есть способ, которым реализована тут factory, позволяет неправильно ее исплоьзовать. Это нехорошо, правильнее было бы сделать так:

$container->setFactory('x', function ...);

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

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

Если что-то непонятно - задавай вопросы.
>>657268
#536 #657215
У меня есть примерно 10 видов похожего функционала, который необходимо вставить в вордпресс, для каждого из них, есть свой файл css, как подключать для каждой страницы или записи только конкретный файл css, а остальные не подключать, потому что некоторые селекторы могут пересекаться.
>>657225>>657245
#537 #657225
>>657215
Функционалом ВП хз, а так просто создаешь несколько хидер.пхп или как его назовешь, в каждом подключаешь необходимые скрипты. И потом просто инклудишь его. А вообще лучше все же 1-2 файла цсс создать и нормально разобраться с селекторами.
#538 #657245
>>657215
У тебя именно страницы? Без плагина никак.

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

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

Если что, посмотри на код здесь: он хуевый немного, но там по сути работа как раз с post_meta
#539 #657268
>>657052

>Не очень понимаю, что ты считаешь зависимым и вспомогательным классом тут?


Dependent(Helper $helper); Helper();

>$container->setFactory('x', function ...);


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

>Вообще, кстати, хорошо, что ты современные ООП-библиотеки изучаешь, компоненты Симфони и Силекса могут многому полезному научить, там обычно с точки зрения ООП и проектирования все очень правильно сделано.


Я бы еще про какие-нибудь плагины почитал. Подозреваю что есть библиотеки где можно легко найти нужный, такие есть?
>>657368
#541 #657321
https://github.com/someApprentice/Students/tree/d179c49639ff3023225729c7b7d351e81f63c254
-Реализовал контейнер Pimple

>>636495

>https://github.com/someApprentice/Students/blob/master/app/config.php


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


Я правильно понимаю что писать нужно так
config.ini
db_user = root
db_password = ""

[db_dsn]
mysql:host=localhost
dbname=studentsdb

init.php
$config = parse_ini_file('config.ini');
$pdo = new PDO($config['db_dsn'], $config['db_user'], $config['db_password']);
>>657355>>657591
#542 #657353
А где обычно хранятся шаблоны? В __DIR__/templates/ или __DIR__/public/templates/?
>>657368>>663577
#543 #657355
>>657321

> Я правильно понимаю что писать нужно так


По моему ты все усложняешь. Ну зачем например писать mysql:host? Твой проект все равно кроме mysql ничего не поддерживает.

Логичнее сделать так:

[db]
host=
name=
user=
password=

> https://github.com/someApprentice/Students/blob/d179c49639ff3023225729c7b7d351e81f63c254/app/init.php#L12


> $container['PDO'] = $container->factory


В контейнере есть 2 варианта описания сервиса: когда он создает только при первом обращении, и далее возвращается существующий объект, или когда каждый раз создается новый объект. Какой вариант ты тут выбрал и почему?

> $query = $container['PDO']->prepare("SET sql_mode = 'STRICT_ALL_TABLES'");


> $query->execute();


Если этот код поместить в функцию, то вызываться он будет только если кому-то нужен PDO. А так он вызвается всегда (и всегда создается соединение с БД), независимо от того, нужен этот объект или нет.
>>657381>>663737
#544 #657368
>>657353

Не в публичной папке

>>657268

> Dependent(Helper $helper); Helper();


По моему у нас путаница в терминах - зависимостью называют объект который нужен другому объекту.

Ну то есть если

$b = new B;
$a = new A($b);

То класс A зависит от B.

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


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

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

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

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


Плагины к чему? Не очень понял вопрос. Если тебя интересует, где можно искать php библиотеки, то есть несколько сайтов:

- https://packagist.org/ - репозиторий из которого берет пакеты композер. Там можно искать по названию библиотеки или ключевым словам, например database

- http://phptrends.com/ - поиск по библиотекам с гитхаба, выстроенным по популярности

- http://pronskiy.com/php-digest/ - поиск по библиоеткам, упомянутым в рубрике php дайджест на хабре.

Или тебе что-то другое нужно?
#544 #657368
>>657353

Не в публичной папке

>>657268

> Dependent(Helper $helper); Helper();


По моему у нас путаница в терминах - зависимостью называют объект который нужен другому объекту.

Ну то есть если

$b = new B;
$a = new A($b);

То класс A зависит от B.

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


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

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

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

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


Плагины к чему? Не очень понял вопрос. Если тебя интересует, где можно искать php библиотеки, то есть несколько сайтов:

- https://packagist.org/ - репозиторий из которого берет пакеты композер. Там можно искать по названию библиотеки или ключевым словам, например database

- http://phptrends.com/ - поиск по библиотекам с гитхаба, выстроенным по популярности

- http://pronskiy.com/php-digest/ - поиск по библиоеткам, упомянутым в рубрике php дайджест на хабре.

Или тебе что-то другое нужно?
>>657389
#545 #657372
>>656824
Бампану вопрос.
#546 #657381
>>657355

>> https://github.com/someApprentice/Students/blob/d179c49639ff3023225729c7b7d351e81f63c254/app/init.php#L12


>> $container['PDO'] = $container->factory


>В контейнере есть 2 варианта описания сервиса: когда он создает только при первом обращении, и далее возвращается существующий объект, или когда каждый раз создается новый объект. Какой вариант ты тут выбрал и почему


У меня каждый раз создается новый объект. Если честно, я не думал об этом. Это же вопрос выбора более производительного варианта? Как лучше узнать какой вариант лучше? Замерять количество памяти\время выполнения скрипта? Вижу в этом подвох - в этом случае переписывать несколько раз код не очень продуктивно, поэтому должен быть какой-то алгоритм выбора лучшего варианта. Можно подсказку какой?
>>657403>>657407
#547 #657382
>>656824
>>656997

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

Начальные знания SQL тебе даст ссылка с задачами по SQL из ОП поста.

Также, думаю, надо знать HTML/CSS, опять же в ОП посте есть ссылка.

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

>>656774

Не, ты путаешь по моему.

>>656384

Напомни номер поста или ссылку. Если они в прошлом треде - то да, проверил, если в этом то я пока дошел только до 150 поста.

>>655436
>>655431

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

>>655166

В кусабе нет какого-нибудь SQL дампа который надо загрузить ли может скрипта который создает базу? Посмтри что в инструкции по установке написано.

Также, может быть ему нужна именно пустая база без данных.
#547 #657382
>>656824
>>656997

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

Начальные знания SQL тебе даст ссылка с задачами по SQL из ОП поста.

Также, думаю, надо знать HTML/CSS, опять же в ОП посте есть ссылка.

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

>>656774

Не, ты путаешь по моему.

>>656384

Напомни номер поста или ссылку. Если они в прошлом треде - то да, проверил, если в этом то я пока дошел только до 150 поста.

>>655436
>>655431

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

>>655166

В кусабе нет какого-нибудь SQL дампа который надо загрузить ли может скрипта который создает базу? Посмтри что в инструкции по установке написано.

Также, может быть ему нужна именно пустая база без данных.
#548 #657383
>>657286
Задача на составление имени содержит ошибку.
По умолчанию, в массиве элементы подсчитываются, начиная с нуля. Соответственно, в массиве последний элемент оказывается под номером 15.
Функция count($letters) подсчитывает элементы в массиве, начиная с единицы. Соответственно, в массиве оказывается 16 элементов.
Функция mt_rand(0,$len) выбирает числа от нуля до 16 - один элемент оказывается лишним в этой ситуации.
>>657390
#549 #657385
>>654916

Цикл, перебирающий клетки вокруг заданной. Твой код с 8 ифами громоздкий, однообразный и в нем легко допустить ошибку. Замени его на 2 вложенных цикла, по X (от pointX - 1 до pointX + 1) и по Y.
#550 #657389
>>657368

>По моему у нас путаница в терминах - зависимостью называют объект который нужен другому объекту.


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

>Или тебе что-то другое нужно?


Нет, я просто знаю что у php большое количество плагинов, которые смогут упростить работу. Просо хотелось бы знать как найти нужные.
>>657401
#551 #657390
>>657383
Спасибо, исправил
#552 #657391
>>654870

Код покажи

>>654869

Одна строчка кода иногда лучше тысячи слов. Надо прикладывать код в таких случаях.

> У нас имеется массив с координатами «время» и «способ» пути из одной станции в другую.


> Запускаем цикл foreach, который раскладывает массив на ключи и значения


Чтобы взять элемент по индексу, не нужен foreach

> Как избежать блуждания по карте? Если у нас между пунктом убытия и пунктом прибытия ещё хотя бы один пункт – я уже пугаюсь того, сколько работы нужно будет, чтобы проверить, где будет именно этот пункт.


Задач выглядит сложной, но ее можно упростиь если думать только на 1 шаг вперед. Вот смотри, что у нас есть (что передается на вход функции):

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

Нам надо:

- определить путь к цели.

Мы делаем 2 ветки:

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

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

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

Если точек не осталось, значит путь к цели из текущей точки построить нельзя.

Далее, мы можем сделать цикл и в цикле по очереди пробовать пройти к цели через каждую точку. То есть:

цикл по соседним точкам {
добавить точку к пути;
попробовать вызвать саму себя с этим путем и сохранить результат;
}

После этого цикла мы будем иметь список такого вида:

- через точку A можно дойти до цели за 10 минут
- через точку B до цели не дойти
- через точку C можно дойти за 5 минут

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

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

Это конечно очень неэффективный алгоритм, он делает очень много шагов. Если ты погуглишь стандартные алгоритмы вроде Дейкстры или А со звездочкой, то они намного эффективнее и доходят до цели быстрее, перебирая меньше вариантов.
#552 #657391
>>654870

Код покажи

>>654869

Одна строчка кода иногда лучше тысячи слов. Надо прикладывать код в таких случаях.

> У нас имеется массив с координатами «время» и «способ» пути из одной станции в другую.


> Запускаем цикл foreach, который раскладывает массив на ключи и значения


Чтобы взять элемент по индексу, не нужен foreach

> Как избежать блуждания по карте? Если у нас между пунктом убытия и пунктом прибытия ещё хотя бы один пункт – я уже пугаюсь того, сколько работы нужно будет, чтобы проверить, где будет именно этот пункт.


Задач выглядит сложной, но ее можно упростиь если думать только на 1 шаг вперед. Вот смотри, что у нас есть (что передается на вход функции):

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

Нам надо:

- определить путь к цели.

Мы делаем 2 ветки:

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

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

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

Если точек не осталось, значит путь к цели из текущей точки построить нельзя.

Далее, мы можем сделать цикл и в цикле по очереди пробовать пройти к цели через каждую точку. То есть:

цикл по соседним точкам {
добавить точку к пути;
попробовать вызвать саму себя с этим путем и сохранить результат;
}

После этого цикла мы будем иметь список такого вида:

- через точку A можно дойти до цели за 10 минут
- через точку B до цели не дойти
- через точку C можно дойти за 5 минут

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

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

Это конечно очень неэффективный алгоритм, он делает очень много шагов. Если ты погуглишь стандартные алгоритмы вроде Дейкстры или А со звездочкой, то они намного эффективнее и доходят до цели быстрее, перебирая меньше вариантов.
>>658572
#553 #657400
>>654869

> У нас известен пункт прибытия, и мы можем его найти в этом массиве $paths.


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

Идти от конца к началу то же самое что от начала к концу. Это ничего не меняет.

> Не будет ли это всё бесконечным и нереализуемым?


Число точек конечно. Если ты не заходишь в уже посещенные точки то рано или поздно они закончатся.

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

5 x 5 x 5 ... x 5 = 5 ^ 10 (5 в 10-й степени)

Более того, в 9-й точке у нас останется только один вариант - перейти в 10-ю.
В 8-й точке останется только 2 варианта перейти в 10-ю и в 9-ю.

С учетом этого, общее число вариантов путей будет меньше:

5 x 5 x 5 x 5 x 5 x 5 x 4 x 3 x 2 x 1

Это конечно очень много, потому можешь почитать про более эфффективные алгоримты поиска пути:

https://www.google.ru/search?q=алгоритмы+поиска+пути&newwindow=1&gbv=1&sei=cT_EVuviI6jU6ASQ7bi4Cg

> Звучит всё достаточно сложно: несколько циклов с поиском соответствия одних ключей другим, подсчёт наименьшего «времени» в проложенных путях (как-то эти поиски надо отличать один от другого, создавая разные массивы с данными; в принципе, просто создавать вложенные массивы при каждом цикле с поисками соответствий ключей ключам, а затем найти min() в этих получившихся вложенных массивах, вполне всё возможно, наверное).


Тут
#553 #657400
>>654869

> У нас известен пункт прибытия, и мы можем его найти в этом массиве $paths.


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

Идти от конца к началу то же самое что от начала к концу. Это ничего не меняет.

> Не будет ли это всё бесконечным и нереализуемым?


Число точек конечно. Если ты не заходишь в уже посещенные точки то рано или поздно они закончатся.

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

5 x 5 x 5 ... x 5 = 5 ^ 10 (5 в 10-й степени)

Более того, в 9-й точке у нас останется только один вариант - перейти в 10-ю.
В 8-й точке останется только 2 варианта перейти в 10-ю и в 9-ю.

С учетом этого, общее число вариантов путей будет меньше:

5 x 5 x 5 x 5 x 5 x 5 x 4 x 3 x 2 x 1

Это конечно очень много, потому можешь почитать про более эфффективные алгоримты поиска пути:

https://www.google.ru/search?q=алгоритмы+поиска+пути&newwindow=1&gbv=1&sei=cT_EVuviI6jU6ASQ7bi4Cg

> Звучит всё достаточно сложно: несколько циклов с поиском соответствия одних ключей другим, подсчёт наименьшего «времени» в проложенных путях (как-то эти поиски надо отличать один от другого, создавая разные массивы с данными; в принципе, просто создавать вложенные массивы при каждом цикле с поисками соответствий ключей ключам, а затем найти min() в этих получившихся вложенных массивах, вполне всё возможно, наверное).


Тут
#554 #657401
>>657389

> Нет, я просто знаю что у php большое количество плагинов, которые смогут упростить работу


У PHP есть расширения: http://php.net/manual/ru/funcref.php

Они добавляют функции и классы в PHP

Также есть сторонние библиотеки (вроде Pimple). Библиотеки можно искать на сайтах, которые я упомняул, также на хабре есть PHP дайджест, где пишут про всякие новинки.
#555 #657403
>>657381

> Это же вопрос выбора более производительного варианта?


Нет, вопрос логики и архитектуры: должен ли этот класс существовать в одном экземпляре или нам нужно несколько?

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

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

В случае с PDO каждый новый созданный объект открывает новое соединение с БД. Это нехорошо, можно быстрее упереться в выставленное ограничение на число соединений.
>>657432
#556 #657407
>>657381

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

$con['PDO']->beginTransaction(); // Получаем объект PDO и начинаем транзакцию

// Упс! Тут создается новое соединение и студент сохраняется в базу не внутри транзакции, а сразу
$con['StudentMapper']->saveStudent($student1);

// упс, третье соединение и студент опять же вставляется в базу не в рамках транзакции
$con['StudentMapper']->saveStudent($student2);

// уже четвертое соединение
$con['PDO']->beginTransaction();

То есть код работает не так как мы хотели из-за того что все время создаются новые объекты, ничего не знающие о предыддущей копии.
#557 #657432
>>657403

>Нет, вопрос логики и архитектуры: должен ли этот класс существовать в одном экземпляре или нам нужно несколько?


Тогда я должен сделать чтобы классы PDO, StudentGateway, RegistrationHelper и RegistrationHelper хранились в единственном экземпляре.
$container['...']= $container->protect(function () {...});
>>657470>>657604
#558 #657451
Как там в PHP 7?
#559 #657470
>>657432

>$container['...']= $container->protect(function () {...});


Не правильно, я должен написать по другому $container['...'] = function () {...};
>>657604
#560 #657495
Пытаюсь подключить js в запись вордпресс, делаю это через шорткод и произвольные поля, создаю в файле functions.php такой код:

function jscode_shortcode($attr, $text) {
global $post;
return get_post_meta($post->ID, $text, true);
}

@add_shortcode('jscode',' jscode_shortcode');

Создаю произвольное поле, куда вставляю нужный мне код, вывожу его в записе таким образом [jscode]имя поля[/jscode] мне выводит следующую ошибку:

Notice: Функция do_shortcode_tag вызвана неправильно. Попытка вывести шорткод без функции обработки: cft Дополнительную информацию можно найти на странице «Отладка в WordPress». (Это сообщение было добавлено в версии 4.3.0.) in C:\OpenServer\domains\wp-site\wp-includes\functions.php on line 3792
>>657501>>657604
#561 #657501
>>657495
Убери собачку от функции, может, узнаешь еще инфу.
#562 #657514
>>654361
бамп блять
#563 #657517
>>654361
Ты симулируешь отправку http-заголовка через meta-тег. У тебя должно быть два параметра: http-equiv="Имя-заголовка" и content="Содержимое заголовка".
Теперь думай, что ты делаешь не так.
>>657604
#564 #657591
>>657321
https://github.com/someApprentice/Students/tree/d54beb028faf8d1c14e0c07e019d3dce55bb0af8
Реализовал работу с формой

Дальше будет расширение формы и таблицы БД - добавление поля имени, фамилии, пола и т.д.
>>658248>>663578
#565 #657604
>>657432

да

>>657470

Да

>>657495

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

>>657517

Редирект вообще надо делать через код 3xx и location
ответы 12 фев #566 #657605
>>650748

Это объясняется у меня в учебнике во втором уроке

$a += $b; равносильно $a = $a + $b, то есть увеличить $a на $b.
$a++; равносильно $a += 1; или $a = $a + 1;, то есть увелчить значение $a на 1

>>650775

> я думаю что меня все равно не возьмут и не делаю его.


Какое отношение твои личные страхи имеют к изучению пхп? Другие учат и находят работу.

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

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

>>650784

> for ($i = 1; count($presentPupils) >= $rhyme; ) {


Так как это не цикл со счетчиком, лучше использовать while.

> foreach ($presentPupils as $key => $value) {


value - не годится как название для переменной

Ответ получается правильный.
HTTPS #567 #657608
>>650815

> Ты всегда отвечаешь вопросом на вопрос?


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

> После установки соединения сервер высылает клиенту публичный ключ. Публичный ключ это такая строка, которая выступает в качестве параметра некой функции, шифрующей данные.


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

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

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

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

https://ru.wikipedia.org/wiki/Криптосистема_с_открытым_ключом

При установке HTTPS соединения у клиента есть 2 основных задачи:

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

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

Если быть точнее, то эти задачи выполняет протокол SSL/TLS, HTTPS просто устанавливает защищенное SSL-соединение и передает по нему данные протокола HTTP. То есть HTTPS это просто HTTP поверх SSL-соединения.

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

https://ru.wikipedia.org/wiki/Протокол_Диффи_—_Хеллмана
https://ru.wikipedia.org/wiki/SSL

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

- браузер покажет предупреждение, но пользователь может продолжть соединение все равно
- если сервер использует Strict Trasport Security, клиент ранее заходил на него и знает об этом, то опции для продолжения соединения не будет

https://ru.wikipedia.org/wiki/Инфраструктура_открытых_ключей

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

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

Вот например Symantec (по их словам в тестовых целях) выпускал сертификаты для сайта google: http://arstechnica.com/security/2015/09/symantec-employees-fired-for-issuing-rogue-https-certificate-for-google/

Вот китайский центр сертификации выпустил поддельные сертификаты для google, по их словам для внутреннего тестирования (ага, мы поверили): http://arstechnica.com/security/2015/03/google-warns-of-unauthorized-tls-certificates-trusted-by-almost-all-oses/

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

Для борьбы с этим есть такие методы:

- certificate pinning - в браузере Хром и ФФ вписаны отпечатки ключей некоторых популярных сервисов вроде Google Mail, так что эти браузеры примут только сертификат от Гугла. https://en.wikipedia.org/wiki/HTTP_Public_Key_Pinning

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

- certificate transparency - идея в том, что центры сертификации будут перед выпуском сертификата писать информацию об этом в специальный криптографически подписанный лог. Браузеры откажутся принимать сертификаты, не указанные в логе. Третьи стороны могут мониторить эти логи и видеть выпуск поддельных сертификатов. http://www.certificate-transparency.org/ - тут впрочем тоже могут быть уязвимости. Например, центр сертификации может показывать разным пользователям разные версии лога.

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

Теперь вернемся к вопросам:

> К сожалению другие моменты типа проверки сертификата там не проясняются.


В большинстве случаев там сертификат сервера подписан центром сертификации. Корневые сертификаты центров сертификации встроены в браузер или ОС. Браузер проверяет подписи на цепочке сертификатов и убеждается что последний сертификат известен системе. Ты можешь увидеть эту цепочку, зайдя на https сайт и кликнув на замочек в браузере.

В Windows это вкладка "путь сертификации"

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

Например, у меня этот сайт исплоьзует:

- для обмена ключами ECDHE_RSA - судя по названию, там используются эллиптические кривые, Диффи-Хеллман и асиметричный шифр RSA
- для симметричного шифрования Salsa20: https://ru.wikipedia.org/wiki/Salsa20
- для потвеждения целостности соединения хеш-функцию https://en.wikipedia.org/wiki/Poly1305

Вот тут написаны названия современных алгоритмов в TLS http://security.stackexchange.com/questions/76993/now-that-it-is-2015-what-ssl-tls-cipher-suites-should-be-used-in-a-high-securit

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


Это интересный вопрос. Шифрование защищает от прочтения данных, но ведь оно не запрещает злоумышленнику подписать свои данные открытым ключом и вбросить в канал. Для защиты от этого используется хеш-функция: https://ru.wikipedia.org/wiki/HMAC

>>Могут ли узнать на какие сайты ты заходишь?


> Думаю да. Клиенту и серверу ведь сначала нужно обменяться открытым ключом. А может и нет. Без понятия короче.


Прочитай про SNI. Также, подумай: скрывает ли HTTPS IP адрес сервера?

>>Смотрит ли видеоролики на этом сайте? Оставляет ли комментарии? Можно ли определить с кем он ведет переписку в gmail? Ну или хотя бы узнать его адрес e-mail?


> Нет наверное.


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

Насчет отправки комментариев: подумай, отличается ли объем GET и POST запросов, отличается ли поведение сервера в ответ на такие запросы.

https://tools.ietf.org/html/draft-pironti-tls-length-hiding-01#section-1

В общем, предлагаю тебе почитать чуть подробнее и попробовать ответить на вопросы заново. Будешь хоть понимать что и как происходит при использовании HTTPS.
HTTPS #567 #657608
>>650815

> Ты всегда отвечаешь вопросом на вопрос?


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

> После установки соединения сервер высылает клиенту публичный ключ. Публичный ключ это такая строка, которая выступает в качестве параметра некой функции, шифрующей данные.


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

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

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

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

https://ru.wikipedia.org/wiki/Криптосистема_с_открытым_ключом

При установке HTTPS соединения у клиента есть 2 основных задачи:

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

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

Если быть точнее, то эти задачи выполняет протокол SSL/TLS, HTTPS просто устанавливает защищенное SSL-соединение и передает по нему данные протокола HTTP. То есть HTTPS это просто HTTP поверх SSL-соединения.

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

https://ru.wikipedia.org/wiki/Протокол_Диффи_—_Хеллмана
https://ru.wikipedia.org/wiki/SSL

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

- браузер покажет предупреждение, но пользователь может продолжть соединение все равно
- если сервер использует Strict Trasport Security, клиент ранее заходил на него и знает об этом, то опции для продолжения соединения не будет

https://ru.wikipedia.org/wiki/Инфраструктура_открытых_ключей

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

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

Вот например Symantec (по их словам в тестовых целях) выпускал сертификаты для сайта google: http://arstechnica.com/security/2015/09/symantec-employees-fired-for-issuing-rogue-https-certificate-for-google/

Вот китайский центр сертификации выпустил поддельные сертификаты для google, по их словам для внутреннего тестирования (ага, мы поверили): http://arstechnica.com/security/2015/03/google-warns-of-unauthorized-tls-certificates-trusted-by-almost-all-oses/

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

Для борьбы с этим есть такие методы:

- certificate pinning - в браузере Хром и ФФ вписаны отпечатки ключей некоторых популярных сервисов вроде Google Mail, так что эти браузеры примут только сертификат от Гугла. https://en.wikipedia.org/wiki/HTTP_Public_Key_Pinning

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

- certificate transparency - идея в том, что центры сертификации будут перед выпуском сертификата писать информацию об этом в специальный криптографически подписанный лог. Браузеры откажутся принимать сертификаты, не указанные в логе. Третьи стороны могут мониторить эти логи и видеть выпуск поддельных сертификатов. http://www.certificate-transparency.org/ - тут впрочем тоже могут быть уязвимости. Например, центр сертификации может показывать разным пользователям разные версии лога.

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

Теперь вернемся к вопросам:

> К сожалению другие моменты типа проверки сертификата там не проясняются.


В большинстве случаев там сертификат сервера подписан центром сертификации. Корневые сертификаты центров сертификации встроены в браузер или ОС. Браузер проверяет подписи на цепочке сертификатов и убеждается что последний сертификат известен системе. Ты можешь увидеть эту цепочку, зайдя на https сайт и кликнув на замочек в браузере.

В Windows это вкладка "путь сертификации"

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

Например, у меня этот сайт исплоьзует:

- для обмена ключами ECDHE_RSA - судя по названию, там используются эллиптические кривые, Диффи-Хеллман и асиметричный шифр RSA
- для симметричного шифрования Salsa20: https://ru.wikipedia.org/wiki/Salsa20
- для потвеждения целостности соединения хеш-функцию https://en.wikipedia.org/wiki/Poly1305

Вот тут написаны названия современных алгоритмов в TLS http://security.stackexchange.com/questions/76993/now-that-it-is-2015-what-ssl-tls-cipher-suites-should-be-used-in-a-high-securit

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


Это интересный вопрос. Шифрование защищает от прочтения данных, но ведь оно не запрещает злоумышленнику подписать свои данные открытым ключом и вбросить в канал. Для защиты от этого используется хеш-функция: https://ru.wikipedia.org/wiki/HMAC

>>Могут ли узнать на какие сайты ты заходишь?


> Думаю да. Клиенту и серверу ведь сначала нужно обменяться открытым ключом. А может и нет. Без понятия короче.


Прочитай про SNI. Также, подумай: скрывает ли HTTPS IP адрес сервера?

>>Смотрит ли видеоролики на этом сайте? Оставляет ли комментарии? Можно ли определить с кем он ведет переписку в gmail? Ну или хотя бы узнать его адрес e-mail?


> Нет наверное.


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

Насчет отправки комментариев: подумай, отличается ли объем GET и POST запросов, отличается ли поведение сервера в ответ на такие запросы.

https://tools.ietf.org/html/draft-pironti-tls-length-hiding-01#section-1

В общем, предлагаю тебе почитать чуть подробнее и попробовать ответить на вопросы заново. Будешь хоть понимать что и как происходит при использовании HTTPS.
Ответы 12 февр, кубики #568 #657612
>>650823

Думаю, есть готовые библиотеки

>>650853

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

Мне кажется, тут этот синтаксис не нужен. И лучше иметь 2 класса: класс File и метод $news->saveToLibrary($file)

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

>>650861

Возможно для других он не самый лучший

> говнофреймворки, вроде Yii.


А чем laravel отличается?

>>650886

Увидишь в следующих задачах

>>650908

Лучше еще давать ссылук на код, а то копипастить нельзя.

У тебя ошибка в задаче:

if ($anonDice1 && $anonDice2 ...)

Это так не работает. С помощью И/ИЛИ можно объединять только сравнения, например:

if ($a > 0 && $b < 0)

Дело в том что операторы сравнения берут 2 числа, сравнивают и возвращают true или false (истина/ложь) если условие выполняется.

5 > 0 -> дает true (истина)
5 < 0 -> дает false (ложь)

Подробнее:

http://php.net/manual/ru/language.operators.comparison.php
http://php.net/manual/ru/language.types.boolean.php

Логические операторы && и || берут на вход значения true/false и дают такое же значение на выходе:

true && true -> true
false && true -> false

Подробнее: https://secure.php.net/manual/ru/language.operators.logical.php

Когда ты пишешь

$anonDice1 && $anonDice2 > $compDice1 && $compDice2 то действия выполняются так (с учетом того что приоритет > выше чем у &&):

$anonDice1 && ($anonDice2 > $compDice1) && $compDice2

Это можно прочесть:

- если $anonDice1 не равно нулю, И $anonDice2 > $compDice1, И $compDice2 не равно нулю, то ...

Как видишь, получилось совсем не то, что ты хотел.

Задачу надо переделать. И проверь ее для разных чисел.

>>650909

Про скобочки - они не обязательны: http://php.net/manual/ru/language.types.string.php#language.types.string.parsing

exit тоже не обязателен, лучше без него
Ответы 12 февр, кубики #568 #657612
>>650823

Думаю, есть готовые библиотеки

>>650853

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

Мне кажется, тут этот синтаксис не нужен. И лучше иметь 2 класса: класс File и метод $news->saveToLibrary($file)

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

>>650861

Возможно для других он не самый лучший

> говнофреймворки, вроде Yii.


А чем laravel отличается?

>>650886

Увидишь в следующих задачах

>>650908

Лучше еще давать ссылук на код, а то копипастить нельзя.

У тебя ошибка в задаче:

if ($anonDice1 && $anonDice2 ...)

Это так не работает. С помощью И/ИЛИ можно объединять только сравнения, например:

if ($a > 0 && $b < 0)

Дело в том что операторы сравнения берут 2 числа, сравнивают и возвращают true или false (истина/ложь) если условие выполняется.

5 > 0 -> дает true (истина)
5 < 0 -> дает false (ложь)

Подробнее:

http://php.net/manual/ru/language.operators.comparison.php
http://php.net/manual/ru/language.types.boolean.php

Логические операторы && и || берут на вход значения true/false и дают такое же значение на выходе:

true && true -> true
false && true -> false

Подробнее: https://secure.php.net/manual/ru/language.operators.logical.php

Когда ты пишешь

$anonDice1 && $anonDice2 > $compDice1 && $compDice2 то действия выполняются так (с учетом того что приоритет > выше чем у &&):

$anonDice1 && ($anonDice2 > $compDice1) && $compDice2

Это можно прочесть:

- если $anonDice1 не равно нулю, И $anonDice2 > $compDice1, И $compDice2 не равно нулю, то ...

Как видишь, получилось совсем не то, что ты хотел.

Задачу надо переделать. И проверь ее для разных чисел.

>>650909

Про скобочки - они не обязательны: http://php.net/manual/ru/language.types.string.php#language.types.string.parsing

exit тоже не обязателен, лучше без него
Ответы 12 февр, яваскрипт #569 #657614
>>650978

> Я так то теку от Рельсов и Руби магии


Что там хорошего? Убогий актив рекорд, модели на 2000 строк с сотнями методов, статические методы и глобальные переменные везде, костылища (когда один модуль патчит другой, например https://habrahabr.ru/company/Voximplant/blog/269467/ - адский быдлокодинг), неумение в ООП.

>>651106

Хорошая идея, если что - задавай вопросы.

>>651115

Версионирование API это другое дело. Обычно в API действительно используют версию в URL, например:

/api/v2/cities

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

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

>>651136

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

>>651208

Роботом надеюсь тоже проверил? Я смотрю только код в общем, а мелочи вроде не там поставленной запятой - это к роботу.

> https://jsfiddle.net/v6jvkjpo/


> if (count == 1) {


Есть альтернативные подходы:

- уменьшить start в начале
- сохранить значение start, увеличить ее, вернуть старое значение

Так, решено верно

> https://jsfiddle.net/ct0ztq6j/


Все правильно

> https://jsfiddle.net/p0jv4maf/


Верно

> https://jsfiddle.net/dmejq61b/


> if (typeof(arguments[0]) != 'function') {


Не понимаю, зачем тут иф? Сделай универсальный код. То есть который передает аргументы всегда.

> https://jsfiddle.net/o0u0qc41/



> for (var i = 1; i < arguments.length; i++) {


> arr.push(arguments);


для преобразования псевдо-массива arguments в массив есть интересный хак с Array.prototype.slice, погугли.

> arr, ar


Что за названия? Давай нормальные, например inner, outer

> var fn = arguments[0];


Тогда лучше прописать fn в скобках в заголовке функции - чтобы было видно что она нужна

Объединить 2 массива можно с помощью concat.

> https://jsfiddle.net/j7dcvubc/



> for (; i < arr.length; i++) {


i = 0 логично вписать сюда

> for (; j < arguments.length;) {


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

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

> for (; j < arguments.length; j++) {


> ar.push(arguments[j]);


Это можно сделать через slice и concat
Ответы 12 февр, яваскрипт #569 #657614
>>650978

> Я так то теку от Рельсов и Руби магии


Что там хорошего? Убогий актив рекорд, модели на 2000 строк с сотнями методов, статические методы и глобальные переменные везде, костылища (когда один модуль патчит другой, например https://habrahabr.ru/company/Voximplant/blog/269467/ - адский быдлокодинг), неумение в ООП.

>>651106

Хорошая идея, если что - задавай вопросы.

>>651115

Версионирование API это другое дело. Обычно в API действительно используют версию в URL, например:

/api/v2/cities

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

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

>>651136

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

>>651208

Роботом надеюсь тоже проверил? Я смотрю только код в общем, а мелочи вроде не там поставленной запятой - это к роботу.

> https://jsfiddle.net/v6jvkjpo/


> if (count == 1) {


Есть альтернативные подходы:

- уменьшить start в начале
- сохранить значение start, увеличить ее, вернуть старое значение

Так, решено верно

> https://jsfiddle.net/ct0ztq6j/


Все правильно

> https://jsfiddle.net/p0jv4maf/


Верно

> https://jsfiddle.net/dmejq61b/


> if (typeof(arguments[0]) != 'function') {


Не понимаю, зачем тут иф? Сделай универсальный код. То есть который передает аргументы всегда.

> https://jsfiddle.net/o0u0qc41/



> for (var i = 1; i < arguments.length; i++) {


> arr.push(arguments);


для преобразования псевдо-массива arguments в массив есть интересный хак с Array.prototype.slice, погугли.

> arr, ar


Что за названия? Давай нормальные, например inner, outer

> var fn = arguments[0];


Тогда лучше прописать fn в скобках в заголовке функции - чтобы было видно что она нужна

Объединить 2 массива можно с помощью concat.

> https://jsfiddle.net/j7dcvubc/



> for (; i < arr.length; i++) {


i = 0 логично вписать сюда

> for (; j < arguments.length;) {


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

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

> for (; j < arguments.length; j++) {


> ar.push(arguments[j]);


Это можно сделать через slice и concat
>>662528
Ответы 12 февр #570 #657616
>>651263

> $randomWord = mt_rand(0,count($word1)-1);


В разных массивах разное число слов, потому придется сделать 3 переменных, для каждого массива свою. Или использовать array_rand().

>>650299
>>651236

> или инфу из самостоятельного чтения можно использовать?


Да, разумеется можно

>>651535

Самообразовывайся

>>651611

> https://jsfiddle.net/mqdkab0q/3/


> var klass = " " + node.className + " ";


> node.className = klass.replace(regExp, "");


Образуются лишние пробелы: a_b_c -> _a__c_

Также, часть регулярок использует флаг i, часть - нет, плохо.

> https://jsfiddle.net/7bvx9hwa/2/


Ок, теперь работает

>>651753

Код для этого кстати есть в мануале: http://php.net/manual/ru/class.errorexception.php
Ответы 12 февр #570 #657616
>>651263

> $randomWord = mt_rand(0,count($word1)-1);


В разных массивах разное число слов, потому придется сделать 3 переменных, для каждого массива свою. Или использовать array_rand().

>>650299
>>651236

> или инфу из самостоятельного чтения можно использовать?


Да, разумеется можно

>>651535

Самообразовывайся

>>651611

> https://jsfiddle.net/mqdkab0q/3/


> var klass = " " + node.className + " ";


> node.className = klass.replace(regExp, "");


Образуются лишние пробелы: a_b_c -> _a__c_

Также, часть регулярок использует флаг i, часть - нет, плохо.

> https://jsfiddle.net/7bvx9hwa/2/


Ок, теперь работает

>>651753

Код для этого кстати есть в мануале: http://php.net/manual/ru/class.errorexception.php
https://github.com/toppestkek/YiiModule/tree/master/modules #571 #657617
>>651867
>>651870
>>655019

https://github.com/toppestkek/YiiModule/blob/master/modules/display/models/News.php
Есть валидация theme_id? Или наджда на внешние ключи?

> https://github.com/toppestkek/YiiModule/blob/master/modules/display/models/NewsSearch.php#L86


В чем смысл поиска по каждому полю отдельно? Думаю, нужен общий поиск.

https://github.com/toppestkek/YiiModule/blob/master/modules/display/Display.php#L9
init можно убрать

> public function actionCategory2


Название плохое

> return $this->render('index', [


> 'year' => $year,


> 'month' => $month,


А где там фильтр по месяцам? Это вообще работает?

https://github.com/toppestkek/YiiModule/blob/master/modules/display/controllers/NewsController.php#L118
Почему SQL в контроллере ?

> $model


Название плохое, надо $news

> $theme_id = $model->theme_id;


Почему связь Новости-Темы не налажена? Должно быть примерно так:

$theme = $news->theme;

> $themes=Yii::$app->db->createCommand('SELECT FROM themes')->queryAll();


Почему SQL тут? Сделай метод в модели, более того, он там наверно уже есть.

> https://github.com/toppestkek/YiiModule/blob/master/modules/display/views/news/index.php#L20


> if(!isset($year)){


Что за ерунда? Как это переменная может быть, а может не быть?

https://github.com/toppestkek/YiiModule/blob/master/modules/display/views/news/view.php#L25

> 'value' => $theme_title[0],


Что еще за ноль? Это запутывает

https://github.com/toppestkek/YiiModule/blob/master/modules/display/components/NWidget.php
Почему SQL запросы в виджете? Лапша какая-то поулчается. Запросы должны быть только в модели, более того, в 90% случаев там хватает встроенных методов актив рекорд.

https://github.com/toppestkek/YiiModule/blob/master/modules/display/components/NWidget.php#L13

> public $query;


Почему паблик?

> WHERE DATE_FORMAT(date, '%Y') = :year


Это неэффективно и не позволяет использовать индексы. Надо искать через BETWEEN

> AND theme_title = :category


Неправильно, надо исплоьзовать id категории а не название

> public function getParams($month, $year, $category){


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

> GROUP BY theme_title";


Надо группировать по id

> group_concat(DISTINCT theme_title)


Зачем

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

https://github.com/toppestkek/YiiModule/blob/master/modules/admin/controllers/NewsController.php#L40

> $themes=Yii::$app->db->createCommand('SELECT FROM themes'


Не копипасть

https://github.com/toppestkek/YiiModule/blob/master/modules/admin/models/News.php
Зачем вторая копия модели? Не копипасть.

https://github.com/toppestkek/YiiModule/blob/master/modules/admin/views/news/_form.php
Такие формы нельзя создавать полностью атоматически, не описывая каждое поле? Наверняка можно.

https://github.com/toppestkek/YiiModule/blob/master/modules/admin/views/news/create.php
Можно объединить с update.php

https://github.com/toppestkek/YiiModule/blob/master/modules/admin/views/news/view.php
Не уверен что нужна вторая страница просмотра новости.

Ну и универсален ли твой модуль? Можно ли его подключить к любому сайту, можно ли расширять, например, добавить картинку для новости?
https://github.com/toppestkek/YiiModule/tree/master/modules #571 #657617
>>651867
>>651870
>>655019

https://github.com/toppestkek/YiiModule/blob/master/modules/display/models/News.php
Есть валидация theme_id? Или наджда на внешние ключи?

> https://github.com/toppestkek/YiiModule/blob/master/modules/display/models/NewsSearch.php#L86


В чем смысл поиска по каждому полю отдельно? Думаю, нужен общий поиск.

https://github.com/toppestkek/YiiModule/blob/master/modules/display/Display.php#L9
init можно убрать

> public function actionCategory2


Название плохое

> return $this->render('index', [


> 'year' => $year,


> 'month' => $month,


А где там фильтр по месяцам? Это вообще работает?

https://github.com/toppestkek/YiiModule/blob/master/modules/display/controllers/NewsController.php#L118
Почему SQL в контроллере ?

> $model


Название плохое, надо $news

> $theme_id = $model->theme_id;


Почему связь Новости-Темы не налажена? Должно быть примерно так:

$theme = $news->theme;

> $themes=Yii::$app->db->createCommand('SELECT FROM themes')->queryAll();


Почему SQL тут? Сделай метод в модели, более того, он там наверно уже есть.

> https://github.com/toppestkek/YiiModule/blob/master/modules/display/views/news/index.php#L20


> if(!isset($year)){


Что за ерунда? Как это переменная может быть, а может не быть?

https://github.com/toppestkek/YiiModule/blob/master/modules/display/views/news/view.php#L25

> 'value' => $theme_title[0],


Что еще за ноль? Это запутывает

https://github.com/toppestkek/YiiModule/blob/master/modules/display/components/NWidget.php
Почему SQL запросы в виджете? Лапша какая-то поулчается. Запросы должны быть только в модели, более того, в 90% случаев там хватает встроенных методов актив рекорд.

https://github.com/toppestkek/YiiModule/blob/master/modules/display/components/NWidget.php#L13

> public $query;


Почему паблик?

> WHERE DATE_FORMAT(date, '%Y') = :year


Это неэффективно и не позволяет использовать индексы. Надо искать через BETWEEN

> AND theme_title = :category


Неправильно, надо исплоьзовать id категории а не название

> public function getParams($month, $year, $category){


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

> GROUP BY theme_title";


Надо группировать по id

> group_concat(DISTINCT theme_title)


Зачем

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

https://github.com/toppestkek/YiiModule/blob/master/modules/admin/controllers/NewsController.php#L40

> $themes=Yii::$app->db->createCommand('SELECT FROM themes'


Не копипасть

https://github.com/toppestkek/YiiModule/blob/master/modules/admin/models/News.php
Зачем вторая копия модели? Не копипасть.

https://github.com/toppestkek/YiiModule/blob/master/modules/admin/views/news/_form.php
Такие формы нельзя создавать полностью атоматически, не описывая каждое поле? Наверняка можно.

https://github.com/toppestkek/YiiModule/blob/master/modules/admin/views/news/create.php
Можно объединить с update.php

https://github.com/toppestkek/YiiModule/blob/master/modules/admin/views/news/view.php
Не уверен что нужна вторая страница просмотра новости.

Ну и универсален ли твой модуль? Можно ли его подключить к любому сайту, можно ли расширять, например, добавить картинку для новости?
>>661516>>661519
#572 #657618
>>651883

Не знаю, это надо разбираться.
#573 #657723
>>654781
ОП, дай задачу-то, пожалуйста
#574 #657761

>чат изучающих


вы чего, где мой легетимный "клуб любителей изучать"?
не был уже около полугода, и смотрю у вас тут много поменялось, поясните пожалуйста
>>663580
САПЁР #575 #657766
https://jsfiddle.net/bdasr1y7/ переписал с циклом.
>>663580
#576 #657773
>>657723

кинотеатр уже решил?
>>657792
#577 #657786
Ничего если на всех цмсках реализовать одно и то же приложение (например, вывод новостей под датам). А то у меня уже идей для этого веба нет.
>>658128
#578 #657792
>>657773
нет ещё. пока ООП доделываю ты, я смотрю, последнюю задачу оттуда "для джуниора". Почему?
>>657808>>657813
#579 #657800
('/^([\\.\\w-]{2,127})@([a-zA-Z0-9-.]{2,122})\\.([a-zA-Z]{2,5})$/' - это хорошее регулярное выражение для проверки имейла?
>>657804>>658128
#580 #657804
>>657800

>[\\.\\w-]


Точку в квадратных скобках можно не экранировать, потому что квадратные скобки - это "один любой из указанных символов в любой последовательности". Там только спецсимволы надо экранировать.
#581 #657808
>>657792

>последнюю задачу удалил


fix
>>657810
#582 #657810
>>657808
И правда удалил. Зачем?
>>663581
#583 #657813
>>657792

Я просто пересортировал 2 последних урока и переставил местами - так логичнее. Соответственно задача перекочевала в последний урок "Учим сами". Да и вообще, она мне не очень нравится, еще никто с первого раза не понял что надо сделать.
>>657814
#584 #657814
>>657813
Понятно, я прост кошек-мышек доделалскоро вброшу, шлифую пока и удивился, т.к. помнил, что там ещё одна задача была
#585 #657815
Еще я кстати переставил злополучную задачу про кредит, дописал немного пояснений в уроки про массивы и регулярки, дописал подсказки к некоторым задачам. Хороший повод вернуться и перечитать учебник!
#586 #657840
>>657723
>>654781

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

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

1) спроектируй базу данных для анонимного форума. Форум состоит из тредов, треды из постов. Для каждого поста хранятся:

- идентификатор автора
- ид поста
- заголовок
- текст
- время размещения

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

Постинг в тред поднимает его вверх. Треды сортируются по убыванию даты последнего поста в него.

Напиши запросы:

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

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

2) Спроектируй базу данных для доски объявлений. Доска разбита на категории, категории могут быть вложенными (например Автомобили -> Запчасти для авто). Доска работает в нескольких странах и городах. Добавлять объявления могут только зарегистрированные пользователи.

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

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

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

Напиши запросы для:

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

Для начала попробуй следовать принципам нормализации. Далее, предложи изменения, которые бы позволили оптимизировать часто используемые запросы.
#586 #657840
>>657723
>>654781

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

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

1) спроектируй базу данных для анонимного форума. Форум состоит из тредов, треды из постов. Для каждого поста хранятся:

- идентификатор автора
- ид поста
- заголовок
- текст
- время размещения

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

Постинг в тред поднимает его вверх. Треды сортируются по убыванию даты последнего поста в него.

Напиши запросы:

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

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

2) Спроектируй базу данных для доски объявлений. Доска разбита на категории, категории могут быть вложенными (например Автомобили -> Запчасти для авто). Доска работает в нескольких странах и городах. Добавлять объявления могут только зарегистрированные пользователи.

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

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

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

Напиши запросы для:

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

Для начала попробуй следовать принципам нормализации. Далее, предложи изменения, которые бы позволили оптимизировать часто используемые запросы.
#587 #657843
>>654781
>>657723

Про оптимизацию запросов можно начать читать здесь: http://ruhighload.com/post/Работа+с+индексами+в+MySQL

И еще задачка:

- некто сделал большой анонимный форум вроде reddit (пользователи постят интеесные ссылки и обсуждают их). На этом форуме миллионы тредов. Выборка N-й страницы форума с помощью LIMIT начинает занимать все больше времени. Предложи варианты оптимизации постраничной выборки.
#588 #657868
Решил задачку на айпад в кредит
Посмотрите, пожалуйста, все верно?
http://ideone.com/NyfRoV
>>663581
59 Кб, 604x453
#589 #657873
Моё первое сообщение на этой доске, а может и последнее.

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

скорей бы сдохнуть
#590 #657877
>>657873
Можешь попробовать, ты ничего не теряешь. Но морально готовься к тому что учить нужно будет много, для того чтобы речь шла о каком-то заработке, ты должен будешь потратить на обучение как минимум пол года это в лучшем случае. Ну и если застрял на какой-то задаче, или просто что-то непонятно - пиши сюда, тут почти всегда помогают.
>>657892>>658113
#591 #657878
>>657873
Ну так мотивируй себя чем-нибудь. Если нет интереса к программированию, ищи интерес к чему-то другому. А так, попробовать стоит, конечно.
>>657892
#592 #657888
>>657873
пробуй
>>657892
33 Кб, 420x560
#593 #657892
>>657877
>>657878
>>657888
Спасибо за поддержку, ребят, просто, вбив в гугл "обучение php" мне выдают какую-то неудобоваримую хрень, вот эти учебники составленные самоучками без чёткой структуры и дружелюбного вступления, где сразу же заваливают непонятными мне терминами, что напрочь отбивает желание вникать в эту сферу дальше. Может просто порекомендуете учебник, с которого начинали сами, знаю, в ОП-посте есть все ссылки для новичков, а я уж решу, браться за это дело самостоятельно или бросать к чертям и оставаться говном по жизни.
#594 #657896
>>657892

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

>>657897
#595 #657897
#596 #657898
>>657892
Запасайся огромным количеством терпения. Без этого никак.
#597 #657900
>>657873
Ну попробуй может понравится.

>низкая обучаемость


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

З.ы. Рекомендую http://lifehacker.ru/2015/05/28/all-about-pomodoro/
#598 #657935
Друзья, в задаче про айпад, которая про функции, ОП запретил 3 раза копипастить код. Скажите, должна быть на всю задачу только одна единственная функция?
#599 #657938
>>657892
я это ты полтора месяца назад. Не имел представления о том, что такое переменная в погромировании и что такое пхп вообще. Короче, вообще никак. Сегодня доделал Кошек-Мышек, задачу в 600+ строк, скажи мне тогда, никогда бы не поверил
#600 #657952
>>657935
Можете своими словами пояснить, для чего служит return $deposit?
Не могу понять, зачем возвращать $deposit, ведь эта переменная не используется в дальнейшем. ОП использует в дальнейшем наименование функции, а не переменную $deposit, которую возвратил:

>$balance = getBalanceInFuture (1, 2, 3);



http://archive-ipq-co.narod.ru/l1/functions.html
#601 #657959
>>657952
Бля, второй день всё перечитываю, чёт вообще никаких мыслей, что в функцию записывать.
>>657962
#602 #657962
>>657959
А, наверно просто процент и комиссия
#603 #657964
>>657952
Что значит "не используется в дальнейшем"? return это главная часть функции, без неё ты не вытащишь из функции никакое значение во внешний код.
>>657966
#604 #657966
>>657964
не используется переменная $deposit
>>657971
#605 #657971
>>657966
Где не используется?
>>657977
111 Кб, 750x2360
#606 #657977
>>657971
Здесь во втором примере
>>657981
#607 #657981
>>657977
Подчеркни, что на картинке, по твоему, второй пример.
#608 #658113
>>657873

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

>>657877

Полгода слишком оптимистично

>>657935

Да

>>657952

return "возвращает" значение из функции в место ее вызова:

// Создаем (определяем) функцию sum с 2 аргументами
function sum($a, $b) {
return $a + $b; // функция считает сумму переданных ей чисел и возвращает ее
}

$a = sum(10, 20); // вызывается функция sum, ей передаются числа 10 и 20, она их складывает и возвращает результат, в итоге в переменную $a запишется 30

echo sum(50, 50); // выведет 100
>>659139
#609 #658118
>>657952

> Не могу понять, зачем возвращать $deposit


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

$balance = getBalanceInFuture (1, 2, 3);

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

То есть через аргументы в скобках мы передаем значения в функцию, с помощью return возвращаем из функции.

Сами переменные никуда не передаются. Более того, пеоеменные изолированы: код внутри функции не видит внешние переменные, а код снаружи не видит переменые внутри функции. Это упрощает код и делает его более надежным.
>>659157
#610 #658123
>>657935

Тебе надо поместить расчет кредита в функцию. То есть ты передаешь ей параметры кредита, а она возвращает например общую выплату по нему. Имея такую функцию, ты можешь вызвать ее несколько раз с разными аргументами и получить выплату по каждому банку.
>>659159
#611 #658128
>>657786

Ты замучаешься делать это под каждую CMS. Их же сотни. Да и во многих уже есть новости.

Зачем тебе это? Если ты хочешь учиться лучше делать учебные задачи, если для себя что-то сделать - делай что тебе интересно.

>>657800

Не очень. почитай статьи

https://habrahabr.ru/post/175375/
https://habrahabr.ru/post/55820/
https://habrahabr.ru/post/224623/
#612 #658248
>>657591
https://github.com/someApprentice/Students/tree/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f
Расширил функционал формы

Несколько вопросов:

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

https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/app/Controller/RegisterAction.php#L54
https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/app/Controller/RegisterAction.php#L61-L71

В чем моя ошибка? Нужно Студента тоже добавлять в контейнер?

====

https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/app/Controller/RegisterAction.php#L61-L70
https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/app/Controller/RegisterAction.php#L26-L34

https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/app/Model/Essence/Student.php#L18-L29
https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/app/Model/Essence/Student.php#L32-L118

https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/app/Model/Gateway/StudentGateway.php#L61-L72
https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/app/Model/Gateway/StudentGateway.php#L74-L85
https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/app/Model/Gateway/StudentGateway.php#L90-L100

Мне не нравится такая стена текста. Как я могу писать меньше? Может быть есть какой нибудь-плагин?
#612 #658248
>>657591
https://github.com/someApprentice/Students/tree/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f
Расширил функционал формы

Несколько вопросов:

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

https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/app/Controller/RegisterAction.php#L54
https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/app/Controller/RegisterAction.php#L61-L71

В чем моя ошибка? Нужно Студента тоже добавлять в контейнер?

====

https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/app/Controller/RegisterAction.php#L61-L70
https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/app/Controller/RegisterAction.php#L26-L34

https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/app/Model/Essence/Student.php#L18-L29
https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/app/Model/Essence/Student.php#L32-L118

https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/app/Model/Gateway/StudentGateway.php#L61-L72
https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/app/Model/Gateway/StudentGateway.php#L74-L85
https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/app/Model/Gateway/StudentGateway.php#L90-L100

Мне не нравится такая стена текста. Как я могу писать меньше? Может быть есть какой нибудь-плагин?
>>658275
#613 #658275
>>658248

>


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

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

Мне тоже не нравится стена текста - надо ее упрощать.

Контроллеры вообще должны быть "тонкими", они лишь управляют процессом, а не делают все сами.

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

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

> protected $errors = array();


Зачем сохранять список ошибок в поле?

> if ($this->studentgtw->getStudentByEmail($email)) {


Это тоже часть функции валидации

> $salt = $this->reghelper->generateSalt(); //getRegHelper() будет лучше?


> $hash = $this->reghelper->hashPassword($password, $salt);


У нас же вроде в задаче не надо указывать пароль при регистрации.

> $student = new Student($name, $surname, $gender, $grupnumber, $email, $satscores, $yearofbirth, $location, $hash, $salt, $token);


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

$x = new News;
$x->title = 'Название новости';

или так

$x->setTitle('Название новости');

И кстати пример такой класс описан тут https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md#Сущности

> $name = isset($_POST['name']) && is_scalar($_POST['name']) ? $_POST['name'] : '';


> $surname = isset($_POST['surname']) && is_scalar($_POST['surname']) ? $_POST['surname'] : '';


> $gender = isset($_POST['gender']) && is_scalar($_POST['gender']) ? $_POST['gender'] : '';


Вместо копипасты надо использовать цикл.

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

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

Вот, можешь почитать как сделаны формы в Симфони:

http://symfony-gu.ru/documentation/ru/html/book/forms.html
http://symfony.com/doc/current/book/forms.html
https://habrahabr.ru/post/149444/

там конечно сложновато, но вдруг что найдешь.
#613 #658275
>>658248

>


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

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

Мне тоже не нравится стена текста - надо ее упрощать.

Контроллеры вообще должны быть "тонкими", они лишь управляют процессом, а не делают все сами.

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

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

> protected $errors = array();


Зачем сохранять список ошибок в поле?

> if ($this->studentgtw->getStudentByEmail($email)) {


Это тоже часть функции валидации

> $salt = $this->reghelper->generateSalt(); //getRegHelper() будет лучше?


> $hash = $this->reghelper->hashPassword($password, $salt);


У нас же вроде в задаче не надо указывать пароль при регистрации.

> $student = new Student($name, $surname, $gender, $grupnumber, $email, $satscores, $yearofbirth, $location, $hash, $salt, $token);


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

$x = new News;
$x->title = 'Название новости';

или так

$x->setTitle('Название новости');

И кстати пример такой класс описан тут https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md#Сущности

> $name = isset($_POST['name']) && is_scalar($_POST['name']) ? $_POST['name'] : '';


> $surname = isset($_POST['surname']) && is_scalar($_POST['surname']) ? $_POST['surname'] : '';


> $gender = isset($_POST['gender']) && is_scalar($_POST['gender']) ? $_POST['gender'] : '';


Вместо копипасты надо использовать цикл.

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

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

Вот, можешь почитать как сделаны формы в Симфони:

http://symfony-gu.ru/documentation/ru/html/book/forms.html
http://symfony.com/doc/current/book/forms.html
https://habrahabr.ru/post/149444/

там конечно сложновато, но вдруг что найдешь.
>>658383>>658467
#614 #658296
Помогите определится, хочу соскочить с пхп, сначала хотел в руби так как с ним знаком, потом решил в более масштабную Ноду.
Но понял что проблематично и долго осваивать новый язык и совмещать с работой.
В пхп я далеко не ПРО и сомневаюсь в том стоит ли изучать новую технологию или лучше качать скил пхп до максимума.

Что думаете господа?
>>663581
#615 #658355
Приветствую.
Задача стандартная.
Есть ajax фильтр по параметрам(форма с чекбоксами, полями и прочее). После наложения фильтра, отображаются записи. При клике на любую запись, переход на эту запись. В этой записи должна быть кнопка НАЗАД, которая возвращает обратно на страницу фильтра с уже ранее выбранными параметрами. Как это реализовать? Голову сломал уже. Вроде есть history API, но как это применить к моему примеру не нашел. Есть библиотеки jquery, но тоже не понимаю, как их применить.
Устроит даже тупо при нажатии кнопки фильтровать (аjax вызова) формирование урла в строке браузера
вроде http://site.ru?hui=4,5,7&pizda=000, то есть в гет параметрах будут сохранятся данные из инпутов форме, и потом по этому урл http://site.ru?hui=4,5,7&pizda=000 можно воспроизвести страницу с наложенными фильтрами?
Есть какой-нибудь нормальный мануал от а до я по этой теме, можно на англ. В инете все кусками, с jquery не особу дружу.
>>658359>>659234
#616 #658358
Почему задачка не выполняется?
ideone.com/Tyalfv
>>658369
#617 #658359
>>658355

1) не использовать аякс при преходе на запись или вообще не использовать
2) history api
#618 #658369
>>658358
все, понял
#619 #658383
>>658275

>Например валидация - это явно отдельная функция, которую ты почему-то не вынес отдельно. Мы даем функции на вход объект-студента и получаем ответ, правильно ли заполнения информация в нем или нет.


https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/app/Controller/RegisterAction.php#L61-L71
https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/app/Controller/RegisterAction.php#L73-L80
https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/app/Controller/RegisterAction.php#L73-L80
Это тоже относиться к валидации?

>>658275

>> \tprotected $errors = array();


>Зачем сохранять список ошибок в поле?


Чтобы можно было передать их в шаблон как я это сделал здесь:
https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/templates/registration.phtml#L13

Это неправильно?

>>658275

>> if ($this->studentgtw->getStudentByEmail($email)) {


>Это тоже часть функции валидации


А не функцией базы данных? Она же работает именно с ней.

>>658275

>У нас же вроде в задаче не надо указывать пароль при регистрации.


Ничего если я добавлю в свою? Так интересней будет.

>>658275

>Вместо копипасты надо использовать цикл.


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

>>658275

>там конечно сложновато


Много читать, много изучать надо - проще ознакомиться с этим сразу начав изучать всю симфони.
#619 #658383
>>658275

>Например валидация - это явно отдельная функция, которую ты почему-то не вынес отдельно. Мы даем функции на вход объект-студента и получаем ответ, правильно ли заполнения информация в нем или нет.


https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/app/Controller/RegisterAction.php#L61-L71
https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/app/Controller/RegisterAction.php#L73-L80
https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/app/Controller/RegisterAction.php#L73-L80
Это тоже относиться к валидации?

>>658275

>> \tprotected $errors = array();


>Зачем сохранять список ошибок в поле?


Чтобы можно было передать их в шаблон как я это сделал здесь:
https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/templates/registration.phtml#L13

Это неправильно?

>>658275

>> if ($this->studentgtw->getStudentByEmail($email)) {


>Это тоже часть функции валидации


А не функцией базы данных? Она же работает именно с ней.

>>658275

>У нас же вроде в задаче не надо указывать пароль при регистрации.


Ничего если я добавлю в свою? Так интересней будет.

>>658275

>Вместо копипасты надо использовать цикл.


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

>>658275

>там конечно сложновато


Много читать, много изучать надо - проще ознакомиться с этим сразу начав изучать всю симфони.
>>659230>>659278
#620 #658467
>>658275

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


Кстати, почему заместо пароля плохо держать хэш в классе Student, и на прямую передавать его в базу данных?
>>659232
#621 #658470
Анон, я решил задачку ОПа, порадуйся за меня.
Его: http://codepad.org/nm9jPcpd
Моя: http://codepad.org/tpaMAb0J
>>658483
#622 #658483
>>658470
Неправильно. Всего ты должен заплатить 61к с копейками.
>>658501
#623 #658501
>>658507>>663581
#624 #658507
>>658501
Теперь считает правильно, но ты копипастишь один и тот же код два раза. Так делать нехорошо, попробуй эту копипасту как-нибудь убрать.
>>658546
#625 #658546
>>658507
копипаста из if в elseif?
>>658556
#626 #658549
http://ideone.com/e.js/ByAqm1" type="text/javascript
Мне надо было запихнуть в массив рандомные числа и достать их оттуда отсортированными наоборот, но вот незадача
>>658552>>658564
55 Кб, 427x604
#627 #658552
>>658549
ааааааа даже ссылку не могу написать не бейте
#628 #658556
>>658546
echo у тебя два раза, paymentTotal считает два раза. Подумай как сделать код компактнее.
#629 #658564
>>658549
tak ya vse ponyal ne shlite nahuy pojaluysta
>>658567
32 Кб, 427x604
#630 #658567
>>658564
http://ideone.com/e.js/ByAqm1
Все равно не работает
>>658569
#631 #658569
>>658567
Почитай что такое функции и как они работают.
#632 #658572
>>657391
Огромное спасибо за советы и помощь, ОП!

>Одна строчка кода иногда лучше тысячи слов. Надо прикладывать код в таких случаях.


Пока ещё не разобрал твои советы, а начальный код у меня сейчас вот так выглядит: http://ideone.com/WGyvkd
Не получается даже на один шаг пройти по-человечески, не могу оборвать цикл после этого, не могу вытащить набитый пройденными пунктами массив...
Я тупо не могу добиться, чтобы уже имеющийся к этому моменту массив вставлялся в другой массив - мне постоянно выдаёт NULL.
Что я делаю тут не так? Такая вроде бы простая вещь, с которой я уже давно вроде бы разобрался, а сделать не могу.
Пробовал через array_push, через array_fill, array_fill_keys - толку нет.
Просто так массив набиваю, а при следующем вызове функции он уничтожается, наполняется заново.
Не могу добиться, чтобы целиком имеющийся массив входил как вложенный в состав другого. Просто под очередным ключом.
Какая-то каша выходит.
Я, честно говоря, отчаялся в понедельник и вторник с этой задачей и начал уже повторять HTML с CSS, решил несколько задач, которые потом скопом покажу.
Сейчас буду разбирать твои советы и подсказки, братишка. В голове пока туман.
>>663587
#633 #658649
Вобщем, тот хуй который вчера хныкался, репортинг ин. Дошол до задачек с переменными и кароче забил на всю эту чушь, там пошли какие-то изогнутые скобочки, знаки доллара, типа какието переменные, вобщем ебался с этим синтаксисом 4 часа наверное, и так не понял что к чему. Кароче за бил я на попытки стату тру кодером, не по моим силам это всё, и устроился на SEOsprint. Заработал там 5 рублей тыкая мышкой по картинкам за 4 часа и понял, что и это занятие мне не по зубам, лол. Задания дают какие-то вычурные, заёбистые, пытался выполнить и заваливал задания не понятно опчему. Кароче я настолько недееспособен, что мне даже стыдно стало, что пришёл сюда за советом и помощью. Буду дальше гнить у мамке на шее, пусть страдает из=за меня, эта сука, пусть жалеет о том дне когда выпердела меня на этот свет, блядина ебучая.
#634 #658651
>>658649
Зачем это здесь?
#635 #658661
>>658649
Поныть можешь в соседнем треде, тут люди задачки решают.
#636 #658709
>>658649
Как можно быть таким тупым?
#637 #658729
>>658649

>Винить других в том что не можешь сам

#638 #658732
http://ideone.com/dghMkv
Помогите тупому, плиз
#639 #658740
>>658732
Вроде бы уже до продвинутых задач дошел, а не можешь самостоятельно мелкие баги справить. Там же написано, что в 45ой строчке ошибка. Ты зачем-то к массиву как к функции обращаешься.
>>658751
#640 #658751
>>658740
Спасибо, анон, какой же я дибил, пиздец, заработало!
>>658755
#641 #658755
>>658751
А толку-то, переводит многое неправильно.
>>658756>>658767
#642 #658756
>>658755
Я заметил, уже работаю над этим.
#643 #658767
>>658755
Заработался, я и забыл, что к массивам скобки квадратные (и не смутило же, что в крестах квадратные, и здесь вроде как должны быть такие же...). Вроде всё исправил, спасибо.
>>658773
#644 #658769
>>658732
Ох щи, как люди делают.
Ну, утешаю себя тем, что моё трёхнедельное и двухсотстроковое решение хотя бы без ошибок абсолютно все числа переводит.
Братишка недавно пытался сделать с кучей регулярок, а потом пропал. Или ты он и есть?
Надо мне моё решение сократить.
Хотя бы строк до ста пятидесяти.
>>658772>>663771
#645 #658772
>>658769
Нет, я не тот братишка, я только сегодня сел делать.
Теперь вроде всё правильно переводит, аль нет?
#646 #658773
>>658767
http://ideone.com/Kf3k05
Вообще чувствуется, что у тебя опыт.
Пока даже толком не могу разобрать, как ты там всё навертел.
>>658775>>658783
#647 #658775
>>658773
Спс, я сейчас
#648 #658783
>>658773
Вроде всё, но если ошибки, переделывать не буду, только завтра.
>>658791>>658805
#649 #658791
>>658783

>переделывать не буду


ну пожалста
#650 #658793
Сделал первую задачу по циклам, рейтаните и укажите на ошибки:
http://ideone.com/83cTUk
>>658795>>663771
#651 #658795
>>658793
1. {$age} - фигурные не обязательны
2. (1*2) - скобки не обязательны(алё, матеша 2-го класса)
3. задачка СЛИШКОМ простая, смело иди вперёд и вкидывай в тред уже посложнее, айфон можешь стартовой точкой считать.
#652 #658800
>>658795

>айфон можешь стартовой точкой считать


Ок, сейчас буду пробовать.
>>658803
#653 #658801
>>658795

>задачка СЛИШКОМ простая, смело иди вперёд и вкидывай в тред уже посложнее, айфон можешь стартовой точкой считать.


Двачую, сделал задачу про айфон, считай что сдал ЕГЭ и поступил в Инстик. По сложности тоже самое. Можно даже считать что это некий тест на IQ.
#654 #658803
>>658800
ты только пропускать не вздумай. Решай всё, я имею в виду, что реальная оценка кода(если ты не даун как >>658649) тебе понадобится к задаче на айфон
>>658806
#655 #658805
>>658783
Да, теперь вроде всё без ошибок.
У меня полыхает, поскольку я очень долго решал в лоб эту задачу и дошёл до кошмара http://ideone.com/UfX9rN
ОП уже разобрал, пояснил, как можно дополнительно сократить, но всё равно это решение топорное.
Буду теперь твоё решение разбирать, пока не пойму, как всё работает, спасибо.

>>658795
На памяти полтреда, когда объясняли анону именно эту задачу.
>>658815>>658871
#656 #658806
>>658803

>если ты не даун как >>658649


Хватит о нем! Надо желать лучшего а не травить!
>>658808
#657 #658808
>>658806

>Надо желать лучшего


ему вчера и желали
>>658811
#658 #658811
>>658808
Это не его проблема, это тебе не хватает терпения
#659 #658815
>>658805
Тебе спасибо. На рандомных числах не всегда видно ошибку.
#660 #658864
Как можно вставить в массив другой массив?
Но только так, чтобы этот массив был вложенным?
Вот есть такой цикл, например:
for ($i = 0; $i <= 5; $i++) {
array_push($filled[$i], $fillingUp);
}
Почему не получается массив вида
array(
0 => array (1, 2, 3),
1 => array (1, 2, 3),
2 => array (1, 2, 3),
3 => array (1, 2, 3),
4 => array (1, 2, 3),
5 => array (1, 2, 3),
)
Как можно такого добиться?
Я заткнулся на этом месте и не могу сдвинуться, что ты будешь делать.
>>658870>>658879
#661 #658870
>>658864

$fillingUp - что там?

Для того что ты хочешь есть array_fill()
>>658900
#662 #658871
>>658805

>На памяти полтреда, когда объясняли анону именно эту задачу.


Да вы здесь самые терпеливые люди на всей борде.
#663 #658879
>>658864
А зачем тебе push, почему бы не сделать вот так
http://ideone.com/9QAdrj ?
>>658900
#664 #658900
>>658870
Там array (1, 2, 3).
Хм, почему с array_fill такое выходит: http://ideone.com/JA3lfg ?
Там же с самого начала $i = 0?

>>658879
Спасибо, забыл о таком совсем.
Стоит какое-то время застрять на других задачах - забывается пройденное.
Вот так работает с array_push: http://ideone.com/QlbE2t

У меня просто никак не получается наполнить массив вот тут: http://ideone.com/WGyvkd
Он, похоже, каждый раз обновляется, не понимаю.
>>658911
#665 #658908
Вот вроде бы сейчас массив $allTraversedPaths наполняется массива с пройденными пунктами, а делаю в самом конце - получаю NULL по лбу с оттягом.
#666 #658909
*а делаю в самом конце var_dump($allTraversedPaths);
#667 #658911
>>658900

Твой код неправильный.

array_push($filled[$i], $fillingUp); - это не значит "положить в массив filled под индексом i". Это значит "создать массив $filled[$i] и в него положить еще массив"

Это равносильно

$filled[$i][] = $fillingUp;

а не

$filled[$i] = $fillingUp;

Также ,второй твой код тоже плохо написан:

> for ($i = 0; $i <= 5; $i++) {


> $filled = array_fill($i, $i, $fillingUp)



Тут не нужен цикл - array-fill может заполнить сколько угодно элементов.
>>658925
#668 #658925
>>658911
Хм, спасибо, всё прояснело теперь.
А почему в итоге у меня весь массив пустым оказывается?
Боже, как я тормознул...
Я же не делаю return с этим массивом, а он у меня в функции...
Что ты будешь делать...
Поэтому у меня и
array(0) {
}
- функция не возвращает этот массив.
Как же быть в этой ситуации? Мне нужны два отдельных массива в итоге: $traversedPath и $allTraversedPaths (чтобы у него найти min() для самого краткого пути).
Сделать массив с разными переменными?
$result = array ('traversedPath' => $traversedPath, 'allTraversedPaths' => $allTraversedPaths);
Спасибо, друзья, немного всё прояснилось.
Стоит с кем-то переброситься парой слов, сам часто не вижу банальных вещей.
>>659231
#669 #659089
Какой движок лучше всего использовать для интернет магазина?
>>663774
#670 #659113
А уроки ОПа по html\css\javascript научат меня делать такие дизайны сайтов?
http://alexandergronsky.com/#/portfolio/works/prints/18
>>659116>>659119
#671 #659116
>>659113
Уроки ОПа дают базу, а потом на модных фреймворках ты и не такое сможешь делать, если желание будет.
#672 #659119
>>659113

Что там делать-то? Верстка примитивная + JS для переключения картинок.

Алсо дизайн плох: ссылки next/prev сделаны очень бледными, маленькими и почти не видны у меня.
>>659121
#673 #659121
>>659119

>Алсо дизайн плох: ссылки next/prev сделаны очень бледными, маленькими и почти не видны у меня.


Я тоже обратил на это внимание, но в остальном примитивная верстка делает дизайн максимально минималистичным, что всегда радовало мне глаз.
#674 #659139
>>658113
Спасибо огромное за объяснение функции!
#675 #659157
>>658118
И тебе спасибо!
#676 #659159
>>658123
И тебе!
#677 #659230
>>658383

> Это тоже относиться к валидации?


Нет, создание и заполнение студента из POST данных это не валидация. Это чтение данных пришедших из формы.

> Чтобы можно было передать их в шаблон как я это сделал здесь:


> https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/templates/registration.phtml#L13


> Это неправильно?



Вот это вот:

> $container['RegisterAction']


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

$this->render('some.phtml', [
'a' => 1,
'b' => 2
]);

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

>>Это тоже часть функции валидации


> А не функцией базы данных? Она же работает именно с ней.


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

>>У нас же вроде в задаче не надо указывать пароль при регистрации.


> Ничего если я добавлю в свою? Так интересней будет.


Хорошо, пусть будет.

>>Вместо копипасты надо использовать цикл.


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


Хорошая библиотека для работы с формами это Symfony Forms про которую я написал раньше.
#677 #659230
>>658383

> Это тоже относиться к валидации?


Нет, создание и заполнение студента из POST данных это не валидация. Это чтение данных пришедших из формы.

> Чтобы можно было передать их в шаблон как я это сделал здесь:


> https://github.com/someApprentice/Students/blob/4f18d610a16ee4aadb9d78eddca1ac48c1189e0f/templates/registration.phtml#L13


> Это неправильно?



Вот это вот:

> $container['RegisterAction']


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

$this->render('some.phtml', [
'a' => 1,
'b' => 2
]);

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

>>Это тоже часть функции валидации


> А не функцией базы данных? Она же работает именно с ней.


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

>>У нас же вроде в задаче не надо указывать пароль при регистрации.


> Ничего если я добавлю в свою? Так интересней будет.


Хорошо, пусть будет.

>>Вместо копипасты надо использовать цикл.


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


Хорошая библиотека для работы с формами это Symfony Forms про которую я написал раньше.
>>659278
#678 #659231
>>658925

> Мне нужны два отдельных массива в итоге: $traversedPath и $allTraversedPaths (чтобы у него найти min() для самого краткого пути).


Я думаю, что не нужно возвращать список всех путей. Во-первых, он будет огромный, во-вторых можно в самой же функции выбрать кратчайший и вернуть только его.
>>659322
#679 #659232
>>658467

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


Хеш можно, я писал про то что пароль не надо хранить в студенте так как его нет в базе данных. Хеш есть в БД потому можно.
#680 #659234
>>658355

Есть еще вариант куда-то сохранять опции фильтра (куки/локалсторадж), но это не позволит открыть несколько разных фильтров в вкладках. Надо все же чтобы при запуске фильтра менялся УРЛ страницы - либо через отправку GET формы либо через history API.
Ответы 13 февраля #681 #659241
>>651943

> Произвольно устанавливаем длину радиуса - вычисляем её опытным путём. Желательно иметь возможность каким-либо образом вычислить длину радиуса из длины фразы.


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

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

> for ($x = 0; $x < $phraseLength; $x++) {


> $screen[$x] = array_fill(0, 75, ' ');


Кстати цикл можно заменить второй функцией array_fill

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

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


> прибавлять опять же полученное опытным путём число


Прибавлять надо половину высоты поля, так чтобы круг был точно по центру. Для x - прибавлять половину ширины.

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

> $screen[$x][$y]


По моему ты путаешь переменные - первой идет y, ведь у нас массив строк, а строки это массивы символов.

> Но мне показалось, ОП слегка дал маху в описаниях решения: там перемножать надо не координату x, которая у нас идёт от cos(), а координату y, которая идёт от sin().


По моему ты перепутал x и y

> И вот какой момент: я что-то напутал с синусоидами, у меня алфавит начинается не сверху, а сбоку, не с 12-ти часов, а с 3-х.


Это нормально, в компьютерной графике обычно угол 0 градусов как раз на 3 часах находится (и угол отсчитыается против часовой, так что 90 градусов получаются на 12 часах). Это исправляется знаком минус перед синусом или косинусом.

> Просто так внести отрицательно значение в $screen[$x][$y] мы не можем.


Мы меняем знак у косинуса/синуса и прибавляем половину ширины/высоты поля. За счет этого даже с отрицательным косинусом/синусом итоговое значение остается в пределах поля.

Синус/косинус дает число от -1 до 1. Допустим радиус у нас 15, получается после домножения от -15 до 15. Если у нас высота поля 40, то можно прибавить к этому например 20, и получается итоговое число от 5 до 35 - в пределах поля. Главное чтобы высота/ширина была не менее 2 радиусов круга.

>>651986

> Как ставить на домен, как вставлять рекламу, как делать его видимым в гугле


Вообще это намного проще чем верстка, погугли - информации в сети полно.

>>652010

Переходить на https
Ответы 13 февраля #681 #659241
>>651943

> Произвольно устанавливаем длину радиуса - вычисляем её опытным путём. Желательно иметь возможность каким-либо образом вычислить длину радиуса из длины фразы.


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

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

> for ($x = 0; $x < $phraseLength; $x++) {


> $screen[$x] = array_fill(0, 75, ' ');


Кстати цикл можно заменить второй функцией array_fill

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

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


> прибавлять опять же полученное опытным путём число


Прибавлять надо половину высоты поля, так чтобы круг был точно по центру. Для x - прибавлять половину ширины.

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

> $screen[$x][$y]


По моему ты путаешь переменные - первой идет y, ведь у нас массив строк, а строки это массивы символов.

> Но мне показалось, ОП слегка дал маху в описаниях решения: там перемножать надо не координату x, которая у нас идёт от cos(), а координату y, которая идёт от sin().


По моему ты перепутал x и y

> И вот какой момент: я что-то напутал с синусоидами, у меня алфавит начинается не сверху, а сбоку, не с 12-ти часов, а с 3-х.


Это нормально, в компьютерной графике обычно угол 0 градусов как раз на 3 часах находится (и угол отсчитыается против часовой, так что 90 градусов получаются на 12 часах). Это исправляется знаком минус перед синусом или косинусом.

> Просто так внести отрицательно значение в $screen[$x][$y] мы не можем.


Мы меняем знак у косинуса/синуса и прибавляем половину ширины/высоты поля. За счет этого даже с отрицательным косинусом/синусом итоговое значение остается в пределах поля.

Синус/косинус дает число от -1 до 1. Допустим радиус у нас 15, получается после домножения от -15 до 15. Если у нас высота поля 40, то можно прибавить к этому например 20, и получается итоговое число от 5 до 35 - в пределах поля. Главное чтобы высота/ширина была не менее 2 радиусов круга.

>>651986

> Как ставить на домен, как вставлять рекламу, как делать его видимым в гугле


Вообще это намного проще чем верстка, погугли - информации в сети полно.

>>652010

Переходить на https
>>659322
Ответы 13 февр #682 #659242
>>652040

> Если начальный $angle = -1.5 (в твоем решении, методом тыка подобрано)


Угол там меряется в радианах, Пи радиан = 180 градусов (из чего можно догадаться что 1 радиан это такой угол для которого длина дуги круга равна радиусу). Соответственно надо писать не магическое число 1.5, а либо Пи пополам, либо deb2rad(90), в любом случае логика откуда в коде взялось число, должна быть понятна.

> А вообще можно считать координаты только для одной восьмой круга. Потом делать два "отражения" по осям и поворот на 90 градусов. Так делают в рисовании примитивных фигур для экономии процессорного времени.


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

>>652169

> $randomWord1 = array_rand($word1,3);


Ты генерируешь 3 случайных ключа, а используешь ниже только один. зачем? Генерируй тогда 1 случайный ключ, тебе же удобнее будет так как он вернется не массивом, а сразу числом.
#683 #659278
>>658383>>659230

>>Например валидация - это явно отдельная функция, которую ты почему-то не вынес отдельно. Мы даем функции на вход объект-студента и получаем ответ, правильно ли заполнения информация в нем или нет.


>> Это тоже относиться к валидации?


>Нет, создание и заполнение студента из POST данных это не валидация. Это чтение данных пришедших из формы.


Тогда я не могу понять что я не вынес отдельно. Или все дело в том что в контроллере не должно делаться это? Все должно сразу передаваться в класс Студента и проверяться уже там?
>>662796>>663774
#684 #659306
Ну-ка мои друзья пхп-макаки ответьте мне, я пишу вебморду для игрового сервера, у него есть свой апи, запросы принимает гетом и возвращает джсон, так вот, хочу делать запросы не чаще чем раз в минуту, это просто по времени отрегулирую, но как мне лучше получать инфу, в первом контроллере при costruct или каждый раз по-новому, учитывая что при загрузке главной страницы нужно сделать, как минимум, два запроса.
>>663774
#685 #659307
ОП, ты не забыл про мой файлообменник?
https://github.com/V3N0m21/Uppu4

Еще вопрос, что ты думаешь по поводу Magento 2? Годно, или нет? Мне тут дали тестовое задание в контору которая работает с магентой, достаточно сложное как мне кажется, учитывая что я сказал что с магентой никогда не работал. И вот очень многие вещи мне там совсем не очевидны. В роутинге я так до конца и не разобрался, в отображениях. Мне вот интересно, это я такой глупый, или она реально сложная такая?
>>659310>>663774
#686 #659310
>>659307

>Мне вот интересно, это я такой глупый, или она реально сложная такая?


А может просто в ней плохая архитектура?
#687 #659322
>>659231
Но ведь всё равно надо будет набивать массив $allTraversedPaths всеми пройденными путями, получается, чтобы потом сделать min($allTraversedPaths)?
Не совсем представляю, как это сделать в самой функции.
Мне нужно возвращать каждый раз $traversedPath, чтобы функция саму себя вызывала, $allTraversedPaths я могу из функции в функцию передавать, каждый раз набивая новыми полностью пройденными путями.
А вот как остановить это всё? Поставить условие
if ($traversedPath == NULL) {
$traversedPath = min($allTraversedPaths);
return $traversedPath;
}
Нет, не срабатывает.
Вообще не понимаю, почему в итоге у меня обрывается скрипт, там же не все возможные пути проходит?
Недостаточно памяти на Ideone?
Наверное, пока отложу решение этой задачи, я слишком ни черта не понимаю, что делать дальше.

>>659241

>радиус получается делением длины окружности на (2 x Пи)


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

>Кстати цикл можно заменить второй функцией array_fill


Хм, не соображу сейчас сходу, как.

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


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

>Прибавлять надо половину высоты поля, так чтобы круг был точно по центру. Для x - прибавлять половину ширины.


>Желательно сделать переменные для высоты/ширины поля и использовать их, а не писать магические непонятно как появившиеся числа.


Хм, сложновато мне всё сообразить сейчас.

>По моему ты путаешь переменные - первой идет y, ведь у нас массив строк, а строки это массивы символов.


>По моему ты перепутал x и y


Почему? У меня x - это косинус, а y - это синус. Вроде так и должно быть, судя по твоим подсказкам? Я уже не помню алгебру, я даже не смотрел в Сети ничего дополнительно - просто подставил формулы из твоей подсказки, всё вроде бы сработало. Но потом долго возился с числом для того, чтобы домножить, и т.п.

>Мы меняем знак у косинуса/синуса и прибавляем половину ширины/высоты поля.


Вот никак не соображу, что там с половиной ширины/высоты, ну что ты будешь делать.
Я просто всё совсем по-другому себе представил, сейчас сложно вникнуть в другое, нужно засесть и разобраться.
Спасибо за такие подробные и толковые советы, брат!
#687 #659322
>>659231
Но ведь всё равно надо будет набивать массив $allTraversedPaths всеми пройденными путями, получается, чтобы потом сделать min($allTraversedPaths)?
Не совсем представляю, как это сделать в самой функции.
Мне нужно возвращать каждый раз $traversedPath, чтобы функция саму себя вызывала, $allTraversedPaths я могу из функции в функцию передавать, каждый раз набивая новыми полностью пройденными путями.
А вот как остановить это всё? Поставить условие
if ($traversedPath == NULL) {
$traversedPath = min($allTraversedPaths);
return $traversedPath;
}
Нет, не срабатывает.
Вообще не понимаю, почему в итоге у меня обрывается скрипт, там же не все возможные пути проходит?
Недостаточно памяти на Ideone?
Наверное, пока отложу решение этой задачи, я слишком ни черта не понимаю, что делать дальше.

>>659241

>радиус получается делением длины окружности на (2 x Пи)


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

>Кстати цикл можно заменить второй функцией array_fill


Хм, не соображу сейчас сходу, как.

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


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

>Прибавлять надо половину высоты поля, так чтобы круг был точно по центру. Для x - прибавлять половину ширины.


>Желательно сделать переменные для высоты/ширины поля и использовать их, а не писать магические непонятно как появившиеся числа.


Хм, сложновато мне всё сообразить сейчас.

>По моему ты путаешь переменные - первой идет y, ведь у нас массив строк, а строки это массивы символов.


>По моему ты перепутал x и y


Почему? У меня x - это косинус, а y - это синус. Вроде так и должно быть, судя по твоим подсказкам? Я уже не помню алгебру, я даже не смотрел в Сети ничего дополнительно - просто подставил формулы из твоей подсказки, всё вроде бы сработало. Но потом долго возился с числом для того, чтобы домножить, и т.п.

>Мы меняем знак у косинуса/синуса и прибавляем половину ширины/высоты поля.


Вот никак не соображу, что там с половиной ширины/высоты, ну что ты будешь делать.
Я просто всё совсем по-другому себе представил, сейчас сложно вникнуть в другое, нужно засесть и разобраться.
Спасибо за такие подробные и толковые советы, брат!
>>663775
#688 #659325
Как кошерно отдавать данные в браузер используя связку slim+twig? В студентах я просто подключал шаблон через include('template.html'), здесь я так понимаю нужно что-то типа такого http://pastebin.com/uWZTuR4A ?
>>659338
#689 #659338
>>659325

Просто пиши

$app->render(....);
>>659342>>659826
#690 #659342
>>659338
Блин, надо доки читать внимательнее. Спасибо, анон.
#691 #659425
Не работает str_ireplace с кирилицей, как лечить? http://ideone.com/aWWBDa
#692 #659447
>>659425
либо сам пиши функцию, либо гугли mb str replace. Вангую, что её уже двадцать раз написали.
https://github.com/V3N0m21/Uppu4/ #693 #659478
>>652226

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

В случае попытки обхода CSRF надо поступать так:

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

https://github.com/V3N0m21/Uppu4/blob/master/Uppu4.sql#L37

> `parent` int(11) DEFAULT NULL


Где внешний ключ?

https://github.com/V3N0m21/Uppu4/blob/master/public/index.php#L32

> $app->redirect("/login?from=$route&notify=authorization_required");


Почему данные не экранируются при подстановке в параметры URL? Урок https://github.com/codedokode/pasta/blob/master/network/urls.md

https://github.com/V3N0m21/Uppu4/blob/master/public/index.php#L49

> if (file_exists($_FILES['load']['tmp_name']) && $_FILES['load']['error'] == 0) {


Там должен быть не 0, а константа http://php.net/manual/ru/features.file-upload.errors.php

https://github.com/V3N0m21/Uppu4/blob/master/public/index.php#L51

> $fileHelper = new FileHelper($app->em);


Это лучше сделать сервисом в слиме

> $fileHelper->fileValidate($_FILES['load']);


> if (empty($fileHelper->errors)) {


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

https://github.com/V3N0m21/Uppu4/blob/master/public/index.php#L74

> $errors = $validation->validateUserData($app->request->post());


> $user = $app->userHelper->saveUser($user, $app->request->post());


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

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

https://github.com/V3N0m21/Uppu4/blob/master/public/index.php#L91

> $redirect = $app->request->get('from');


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

> $notification = $app->request->get('notify');


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

> https://github.com/V3N0m21/Uppu4/blob/master/public/index.php#L125


> $list[$count[1]] = $count[2]


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

http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#query-result-formats

Также, эти 2 запроса

> $users = $app->em->getRepository('Uppu4\Entity\User')->findBy([], ['created' => 'DESC']);


> $filesCount = $app->em->createQuery('SELECT IDENTITY(u.uploadedBy), count(u.uploadedBy) FROM Uppu4\Entity\File u GROUP BY u.uploadedBy');


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

https://github.com/V3N0m21/Uppu4/blob/master/public/index.php#L132

> $user = $app->em->getRepository('Uppu4\Entity\User')->findOneById($id);


> $files = $app->em->getRepository('Uppu4\Entity\File')->findByUploadedBy($id);


В доктрине это делается так: $files = $user->getFiles(), надо только настроить связи между сущностями, у тебя они вроде есть.

> $app->em->getRepository('Uppu4\Entity\User')->findOneById($id);


$app->em->find('Uppu4\Entity\User', $id);

И кстати чтобы не писать везде эти Uppu4\Entity, можно настроить в доктрине алиасы, и будет например 'uppu:User': http://stackoverflow.com/questions/5208044/what-are-the-entities-namespaces-and-alias-in-doctrine2/5276687#5276687

> $app->delete('/view/:id/'


Вот попробуй это прочитать: DELETE /view/:id. Как минимум нелогично. Логичнее было бы DELETE /file/:id - нет? переименуй-ка. В REST путь обозначает не действие (view), а ресурс над которым можно делать операции (file).

https://habrahabr.ru/post/251193/
Также, раз ты изучаешь REST, почитай про HATEOAS - может пригодится на собеседовании или вдруг тебе поручат проектировать какое-нибудь АПИ.

Ну и на хабре про REST много статей: https://www.google.ru/search?q=habr+rest+api&btnG=Поиск&newwindow=1&gbv=1

https://github.com/V3N0m21/Uppu4/blob/master/public/index.php#L172

> $user = $app->em->find('Uppu4\Entity\User', $app->request->params('userId'));


Это что? Можно от имени любого пользователя постить?

> $validation = new \Uppu4\Helper\DataValidator;


> $commentHelper = new CommentHelper($app->em);


Это надо сделать сервисом в Слиме. А то сейчас куча нью раскидана по коду.

https://github.com/V3N0m21/Uppu4/blob/master/public/index.php#L181

> $app->render('comments.html', array('comments' => $comments));


Почему в ответ на ПОСТ рендерится страница? Если это не-аякс то надо редиректить. Если аякс - то рендерить всю страницу незачем. Надо лишь отрендерить массив новых, отредактированных или удаленных комментов и отправить его на клиента. Клиент вставляет их в нужные места дерева ДОМ.

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

Да и взять так и удалить 300 комментариев чтобы вставить назад 301 - довольно неэффективно, сильно нагружает браузер. Создание и удаление узлов ДОМ в больших количествах далеко не бесплатное.

https://github.com/V3N0m21/Uppu4/tree/master/public/js
Не надо перемешивать свой код и код бутстрапа. Бутстрап надо поместить в отдельную папку, где кроме него ничего нет. Это облегчает как анализ кода так и обновление сторонней библиотеки.
https://github.com/V3N0m21/Uppu4/ #693 #659478
>>652226

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

В случае попытки обхода CSRF надо поступать так:

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

https://github.com/V3N0m21/Uppu4/blob/master/Uppu4.sql#L37

> `parent` int(11) DEFAULT NULL


Где внешний ключ?

https://github.com/V3N0m21/Uppu4/blob/master/public/index.php#L32

> $app->redirect("/login?from=$route&notify=authorization_required");


Почему данные не экранируются при подстановке в параметры URL? Урок https://github.com/codedokode/pasta/blob/master/network/urls.md

https://github.com/V3N0m21/Uppu4/blob/master/public/index.php#L49

> if (file_exists($_FILES['load']['tmp_name']) && $_FILES['load']['error'] == 0) {


Там должен быть не 0, а константа http://php.net/manual/ru/features.file-upload.errors.php

https://github.com/V3N0m21/Uppu4/blob/master/public/index.php#L51

> $fileHelper = new FileHelper($app->em);


Это лучше сделать сервисом в слиме

> $fileHelper->fileValidate($_FILES['load']);


> if (empty($fileHelper->errors)) {


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

https://github.com/V3N0m21/Uppu4/blob/master/public/index.php#L74

> $errors = $validation->validateUserData($app->request->post());


> $user = $app->userHelper->saveUser($user, $app->request->post());


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

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

https://github.com/V3N0m21/Uppu4/blob/master/public/index.php#L91

> $redirect = $app->request->get('from');


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

> $notification = $app->request->get('notify');


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

> https://github.com/V3N0m21/Uppu4/blob/master/public/index.php#L125


> $list[$count[1]] = $count[2]


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

http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#query-result-formats

Также, эти 2 запроса

> $users = $app->em->getRepository('Uppu4\Entity\User')->findBy([], ['created' => 'DESC']);


> $filesCount = $app->em->createQuery('SELECT IDENTITY(u.uploadedBy), count(u.uploadedBy) FROM Uppu4\Entity\File u GROUP BY u.uploadedBy');


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

https://github.com/V3N0m21/Uppu4/blob/master/public/index.php#L132

> $user = $app->em->getRepository('Uppu4\Entity\User')->findOneById($id);


> $files = $app->em->getRepository('Uppu4\Entity\File')->findByUploadedBy($id);


В доктрине это делается так: $files = $user->getFiles(), надо только настроить связи между сущностями, у тебя они вроде есть.

> $app->em->getRepository('Uppu4\Entity\User')->findOneById($id);


$app->em->find('Uppu4\Entity\User', $id);

И кстати чтобы не писать везде эти Uppu4\Entity, можно настроить в доктрине алиасы, и будет например 'uppu:User': http://stackoverflow.com/questions/5208044/what-are-the-entities-namespaces-and-alias-in-doctrine2/5276687#5276687

> $app->delete('/view/:id/'


Вот попробуй это прочитать: DELETE /view/:id. Как минимум нелогично. Логичнее было бы DELETE /file/:id - нет? переименуй-ка. В REST путь обозначает не действие (view), а ресурс над которым можно делать операции (file).

https://habrahabr.ru/post/251193/
Также, раз ты изучаешь REST, почитай про HATEOAS - может пригодится на собеседовании или вдруг тебе поручат проектировать какое-нибудь АПИ.

Ну и на хабре про REST много статей: https://www.google.ru/search?q=habr+rest+api&btnG=Поиск&newwindow=1&gbv=1

https://github.com/V3N0m21/Uppu4/blob/master/public/index.php#L172

> $user = $app->em->find('Uppu4\Entity\User', $app->request->params('userId'));


Это что? Можно от имени любого пользователя постить?

> $validation = new \Uppu4\Helper\DataValidator;


> $commentHelper = new CommentHelper($app->em);


Это надо сделать сервисом в Слиме. А то сейчас куча нью раскидана по коду.

https://github.com/V3N0m21/Uppu4/blob/master/public/index.php#L181

> $app->render('comments.html', array('comments' => $comments));


Почему в ответ на ПОСТ рендерится страница? Если это не-аякс то надо редиректить. Если аякс - то рендерить всю страницу незачем. Надо лишь отрендерить массив новых, отредактированных или удаленных комментов и отправить его на клиента. Клиент вставляет их в нужные места дерева ДОМ.

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

Да и взять так и удалить 300 комментариев чтобы вставить назад 301 - довольно неэффективно, сильно нагружает браузер. Создание и удаление узлов ДОМ в больших количествах далеко не бесплатное.

https://github.com/V3N0m21/Uppu4/tree/master/public/js
Не надо перемешивать свой код и код бутстрапа. Бутстрап надо поместить в отдельную папку, где кроме него ничего нет. Это облегчает как анализ кода так и обновление сторонней библиотеки.
>>663774
https://github.com/V3N0m21/Uppu4/ #694 #659479
>>652226

https://github.com/V3N0m21/Uppu4/blob/master/public/js/comments.js#L2

> $(document).ready(function(){


> $("#commentButton").click(function(){


У этого подхода есть недостаточек: обработчик будет повешен только когда загрузится весь HTML файл и появляется окно между появлением кнопки и назначением на нее обработчика. Я вижу тут такие решения:

- назначать обработчик через атрибут onclick=""
- скрывать/дизаблить кнопку до назначения на нее обработчика

> $("#commentButton").remove();


> $(".commentReply").remove();


Что за странные вещи? Зачем удалять кнопки? Их надо блокировать на время отправки запроса, а не удалять. В случае с кнопкой "ответить", которых может быть сотни, искать их всех через $(".commentReply") крайне неэффективно. Вместо этого надо вешать CSS класс на блок комментариев, например 'comment-reply-disabled'.

Вообще, с JS все плохо. Паста

---------

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

- индикатор прогресса операции
- вывод сообщений об ошибках
- возможность повторить операцию

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

- индикацией прогресса ( http://www.ajaxload.info/ http://preloaders.net/ ). Пользователь должен (не только при аякс запрсе, а всегда) иметь обратную связь и видеть состояние системы: идет обработка данных, успешно обработано, произошла ошибка. Ты можешь не показывать индикатор прогресса только в случаях когда обработка запроса происходит очень быстро (менее 100 мс) - тогда можно сразу показать сообщение с результатом операции.

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

- возможность при некоторых ошибках повторить запрос

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

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

---------

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

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

От робота:

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

В файле ./app/bootstrap.php:
В функции createDoctrineConfig аргумент $cache можно пометить тайп хинтом с именем класса.

В файле ./app/bootstrap.php:
В функции bootstrapAddTreeExtension аргумент $evm можно пометить тайп хинтом с именем класса.

В файле ./app/Entity/MediaInfo.php:
В методе MediaInfo#setMediaInfo аргумент $finfo можно пометить тайп хинтом с именем класса.

В файле ./app/Helper/DataValidator.php:
В методе DataValidator#validateUserData аргумент $data можно пометить тайп хинтом array.

В файле ./app/Helper/FileHelper.php:
В методе FileHelper#fileValidate аргумент $data можно пометить тайп хинтом array.

В файле ./app/Helper/FileHelper.php:
В методе FileHelper#fileSave аргумент $data можно пометить тайп хинтом array.

В файле ./app/Helper/UserHelper.php:
В методе UserHelper#saveUser аргумент $postParams можно пометить тайп хинтом array.

В файле ./app/templates/list.html:
Слеш в конце одиночного тега (<input type="hidden" name="_ME…TE"/>) используется только в XHTML и XML, в HTML он не ставится.

В файле ./app/templates/users.html:
Слеш в конце одиночного тега (<input type="hidden" name="_ME…TE"/>) используется только в XHTML и XML, в HTML он не ставится.

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

https://github.com/V3N0m21/Uppu4/blob/master/app/Entity/File.php#L86
пустой метод

https://github.com/V3N0m21/Uppu4/blob/master/app/Entity/User.php#L103
Вот такое преобразование к цифре не всегда хорошая вещь - например можно не так использовать объект, а он будет молча преобразован в строку вместо выдачи ошибки. Или костыль для doctrine extensions?

https://github.com/V3N0m21/Uppu4/blob/master/app/templates/comments.html#L15

> <p><span>ответить</span></p>


> <h4>Нажмите чтоб написать комментарий</h4>


Для кнопок есть тег button. И вообще, что-то у тебя верстка слабоватая, может тебе задачки на HTML стоит порешать?

> https://github.com/V3N0m21/Uppu4/blob/master/app/templates/comments.html#L25


> <p style="color:green">>


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

https://github.com/V3N0m21/Uppu4/blob/master/app/templates/list.html#L20
Смесь английского и русского в интерфейсе

https://github.com/V3N0m21/Uppu4/blob/master/app/templates/login_form.html#L10

> "/login?from={{redirect}}


Нет экранирования. Лучше наверно через скрытый инпут это передавать.

https://github.com/V3N0m21/Uppu4/blob/master/app/templates/register.html
В форме кроме required можно исопльзовать и другие атрибуты валидации: pattern, макс. длина. Используй title чтобы задать сообшение при ошибке.

В комментарии пользователя к файлу - везде ли сохраняются переводы строк?
https://github.com/V3N0m21/Uppu4/ #694 #659479
>>652226

https://github.com/V3N0m21/Uppu4/blob/master/public/js/comments.js#L2

> $(document).ready(function(){


> $("#commentButton").click(function(){


У этого подхода есть недостаточек: обработчик будет повешен только когда загрузится весь HTML файл и появляется окно между появлением кнопки и назначением на нее обработчика. Я вижу тут такие решения:

- назначать обработчик через атрибут onclick=""
- скрывать/дизаблить кнопку до назначения на нее обработчика

> $("#commentButton").remove();


> $(".commentReply").remove();


Что за странные вещи? Зачем удалять кнопки? Их надо блокировать на время отправки запроса, а не удалять. В случае с кнопкой "ответить", которых может быть сотни, искать их всех через $(".commentReply") крайне неэффективно. Вместо этого надо вешать CSS класс на блок комментариев, например 'comment-reply-disabled'.

Вообще, с JS все плохо. Паста

---------

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

- индикатор прогресса операции
- вывод сообщений об ошибках
- возможность повторить операцию

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

- индикацией прогресса ( http://www.ajaxload.info/ http://preloaders.net/ ). Пользователь должен (не только при аякс запрсе, а всегда) иметь обратную связь и видеть состояние системы: идет обработка данных, успешно обработано, произошла ошибка. Ты можешь не показывать индикатор прогресса только в случаях когда обработка запроса происходит очень быстро (менее 100 мс) - тогда можно сразу показать сообщение с результатом операции.

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

- возможность при некоторых ошибках повторить запрос

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

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

---------

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

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

От робота:

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

В файле ./app/bootstrap.php:
В функции createDoctrineConfig аргумент $cache можно пометить тайп хинтом с именем класса.

В файле ./app/bootstrap.php:
В функции bootstrapAddTreeExtension аргумент $evm можно пометить тайп хинтом с именем класса.

В файле ./app/Entity/MediaInfo.php:
В методе MediaInfo#setMediaInfo аргумент $finfo можно пометить тайп хинтом с именем класса.

В файле ./app/Helper/DataValidator.php:
В методе DataValidator#validateUserData аргумент $data можно пометить тайп хинтом array.

В файле ./app/Helper/FileHelper.php:
В методе FileHelper#fileValidate аргумент $data можно пометить тайп хинтом array.

В файле ./app/Helper/FileHelper.php:
В методе FileHelper#fileSave аргумент $data можно пометить тайп хинтом array.

В файле ./app/Helper/UserHelper.php:
В методе UserHelper#saveUser аргумент $postParams можно пометить тайп хинтом array.

В файле ./app/templates/list.html:
Слеш в конце одиночного тега (<input type="hidden" name="_ME…TE"/>) используется только в XHTML и XML, в HTML он не ставится.

В файле ./app/templates/users.html:
Слеш в конце одиночного тега (<input type="hidden" name="_ME…TE"/>) используется только в XHTML и XML, в HTML он не ставится.

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

https://github.com/V3N0m21/Uppu4/blob/master/app/Entity/File.php#L86
пустой метод

https://github.com/V3N0m21/Uppu4/blob/master/app/Entity/User.php#L103
Вот такое преобразование к цифре не всегда хорошая вещь - например можно не так использовать объект, а он будет молча преобразован в строку вместо выдачи ошибки. Или костыль для doctrine extensions?

https://github.com/V3N0m21/Uppu4/blob/master/app/templates/comments.html#L15

> <p><span>ответить</span></p>


> <h4>Нажмите чтоб написать комментарий</h4>


Для кнопок есть тег button. И вообще, что-то у тебя верстка слабоватая, может тебе задачки на HTML стоит порешать?

> https://github.com/V3N0m21/Uppu4/blob/master/app/templates/comments.html#L25


> <p style="color:green">>


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

https://github.com/V3N0m21/Uppu4/blob/master/app/templates/list.html#L20
Смесь английского и русского в интерфейсе

https://github.com/V3N0m21/Uppu4/blob/master/app/templates/login_form.html#L10

> "/login?from={{redirect}}


Нет экранирования. Лучше наверно через скрытый инпут это передавать.

https://github.com/V3N0m21/Uppu4/blob/master/app/templates/register.html
В форме кроме required можно исопльзовать и другие атрибуты валидации: pattern, макс. длина. Используй title чтобы задать сообшение при ошибке.

В комментарии пользователя к файлу - везде ли сохраняются переводы строк?
#695 #659480
>>659425

preg_replace + i
#696 #659487
Палиндром

ребят объясните пожалуйста что делает (/2)

$hanfLenght = floor($length/2);
#697 #659489
ОП, а что случилось с http://archive-ipq-co.narod.ru/l1/reading-list.html, куда делись все задачки на знание HTML, все эти выровнять блоки так и сяк?

>>659425
preg_replace, флаг i и u в регулярках.
Также у тебя там не регулярки подставляются, а символы, поэтому не работает.
>>659498
#698 #659491
>>659487
или это знак дроби ? тип $length.2
#699 #659492
>>659487
Што? Делит число на 2.
А floor() округляет его до целого.
>>659494
#700 #659493
Пытался поставить по отдельности apache, php, mysql, но в процессе меня отвлекли и получилось продолжить только через большой промежуток времени. Разбираться заново было лень и хотелось поскорее приступить непосредственно к самому программированию, а не заниматься настройками, поэтому я удалил всё и поставил xampp. Однако столкнулся вот с такой ошибкой.

Apache Service detected with wrong path
Change XAMPP Apache and Control Panel settings or
Uninstall/disable the other service manually first
Found Path: "C:\Apache24\bin\httpd.exe" -k runservice
Expected Path: "c:\xampp\apache\bin\httpd.exe" -k runservice

Папка удалена, в настройках переменных среды я такого пути не нашел, в процессах httpd.exe тоже не светится. Помогите решить.
>>659501
#701 #659494
>>659492
то есть он его делит а потом округляет как-то так?
>>663775
#702 #659496
Кстати, некоторые тут пишут что они хотят изучить CMS или написать свою. Пожалуйста, вот для вас задача:

Представьте что вы делаете обычные сайты компаний в больших количествах и вам нужна для них CMS. Готовые почему-то вам не подошли и вы решили написать свою. Напишите ее.

Возможности:

- админка с закрытым доступом
- добавление/удаление/блокировка администраторов
- статьи, визуальный редактор, древовидное дерево, по которому автоматически строится меню на сайте, человекопонятные URL
- легкий загрузчик картинок для редактора
- управление меню для добавления кастомных страниц и разделов
- модуль новостей

Для реализации надо использовать минимум самописных велосипедов. Рекомендую набор:

- для БД - доктрина
- для авторизации - что-нибудь из симфони
- для админки - sonata

Как альтернатива можно попробовать сделать то же на Юи 2.
#703 #659498
>>659489

> Чтобы научиться верстать, я сделал для тебя курс задач для изучения HTML и CSS: https://github.com/codedokode/pasta/blob/master/html/html.md. Начинается он с простых задач, а заканчивается версткой полноценного макета сайта.



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


preg_quote + разделители

>>659487

деление, читай первый урок в учебнике.
>>659504
#704 #659501
>>659493

Ты апач не удалил из сервисов. Алсо советую удалить XAMPP и поставить все же настоящий апач.
>>659510
#705 #659504
>>659498
Спасибо. Очень удобно.
#706 #659510
>>659501
Спасибо.

>Алсо советую удалить XAMPP и поставить все же настоящий апач


Почему?
>>659529
778 Кб, 1199x1799
#707 #659518
ОП. Прошу проверить:
1. Задача "Вектор" + Антикризисные меры (полностью переделал вектор после твоих комментариев, теперь намного лучше всё скомпоновано). Читаю из ОП-поста Мэтт Зандстра(хорошая книга, спасибо), пытался использовать оттуда знания почерпнутые(в частности, static и new static), оцени, уместно ли это сделал.
Антикризисные меры заккоментированы, их надо по одному расскоментировать для использования.
http://ideone.com/qq6I8O

2. Кошки-мышки Уж не мог и помыслить, что когда-нибудь решу такую задачу. Оче понравилась, провёл много часов настраивая и играя с ней. Прямо душа радуется.
Сразу хочу сказать, что: a) не расставлял закрытость переменных(все public) и b) не заканчивал игру на смерти мышей, т.к. мне так понравилась программа, что я решил её усовершенствовать и добавить новые правила, персонажей и т.п. Проверь так пока, пожалуйста. Должна работать на любом поле с любыми условиями, очень много времени убил на устранение всех багов. как думаешь, такую задачу можно в своё будущее резюме вставлять? Или для нормальных погромистов это ерунда элементарная?
http://ideone.com/wIy9wF

Также вопрос: готов ли я после всего этого к Студентам? (задачу на Лайки в sql сделал, ты проверял).
#708 #659529
>>659510

Потому что так тебе надо изучать только особенности апача, а в случае xampp еще и его особенности. Я не использую сборки и по ним ничего сказать не могу.
#709 #659530
>>659518

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



Надо чтобы выводились все сценарии, а не один.
>>659556
#710 #659556
>>659530
>>659518
Тогда вот вариант, где выводятся все сценарии вместе: http://ideone.com/Hc03lt
>>659567
#711 #659567
>>659556

> public function setSalary($x) { $this->salary = $x; }


Не надо так экономить место

> //использую статичесую функцию со new static для создания экземпляров класса.


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

> $arrayOfMen


лучше просто men или employees

> public function getStatistic()


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

> public static function makeHimBoss(array $arrayOfMen)


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

> public function addNewStaffMember(array $men)


А где метод добавления одного работника? Неудобно же без него.

> public function __clone()


зачем пустая функция clone?

> в итоге использую "===" для проверки того, идентичные ли объекты. Правильно всё?


Да только искать можно через array_search с нужным параметром

> if($spaces>0) { $string=mb_str_pad($string, mb_strlen($string) + $spaces, " ", STR_PAD_RIGHT); }


Это надо писать в 3 строки

> $AdsDep = new Department();


> $men = Marketing::create(1, 15);


> $AdsDep->addNewStaffMember($men);


> $men = Marketing::create(2, 10);


Нужно бы убрать эту копипасту, описать работников массивом и создавать из него.

> function showTable($BuyingDep, $SellingDep, $AdsDep, $LogisticsDep)


Лушче передвать массив департаментов или объект Компания. Надо переделать функцию чтобы она работала с любым числом департаментов.

Антикризисные меры надо реализовать в ООП стиле. Например, мы можем сделать класс АнтикризисныйМенеджмент, у него методы применить1Вариант, он получает на вход Компанию или Департаменты и делает над ними манипуляции.

> $BuyingClone = clone $BuyingDep;


Этого недостаточно. Ты клонируешь объект департамента, но работники в нем остаются те же (копируются ссылки на них, а не делается новая копия), так как в php клонирование не глубокое. Надо использоать магический метод clone.

Также, непонятно почему клонированием занимается фукнция антикризисных мер?

> if ($man === $fired) {


> unset($department->staff[$id]);


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

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

Получить часть массива удобно с помощью array_slice.
#711 #659567
>>659556

> public function setSalary($x) { $this->salary = $x; }


Не надо так экономить место

> //использую статичесую функцию со new static для создания экземпляров класса.


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

> $arrayOfMen


лучше просто men или employees

> public function getStatistic()


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

> public static function makeHimBoss(array $arrayOfMen)


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

> public function addNewStaffMember(array $men)


А где метод добавления одного работника? Неудобно же без него.

> public function __clone()


зачем пустая функция clone?

> в итоге использую "===" для проверки того, идентичные ли объекты. Правильно всё?


Да только искать можно через array_search с нужным параметром

> if($spaces>0) { $string=mb_str_pad($string, mb_strlen($string) + $spaces, " ", STR_PAD_RIGHT); }


Это надо писать в 3 строки

> $AdsDep = new Department();


> $men = Marketing::create(1, 15);


> $AdsDep->addNewStaffMember($men);


> $men = Marketing::create(2, 10);


Нужно бы убрать эту копипасту, описать работников массивом и создавать из него.

> function showTable($BuyingDep, $SellingDep, $AdsDep, $LogisticsDep)


Лушче передвать массив департаментов или объект Компания. Надо переделать функцию чтобы она работала с любым числом департаментов.

Антикризисные меры надо реализовать в ООП стиле. Например, мы можем сделать класс АнтикризисныйМенеджмент, у него методы применить1Вариант, он получает на вход Компанию или Департаменты и делает над ними манипуляции.

> $BuyingClone = clone $BuyingDep;


Этого недостаточно. Ты клонируешь объект департамента, но работники в нем остаются те же (копируются ссылки на них, а не делается новая копия), так как в php клонирование не глубокое. Надо использоать магический метод clone.

Также, непонятно почему клонированием занимается фукнция антикризисных мер?

> if ($man === $fired) {


> unset($department->staff[$id]);


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

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

Получить часть массива удобно с помощью array_slice.
>>659575>>659597
#712 #659575
>>659567

>Надо использоать магический метод clone.


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

можно ли так сделать:
__clone(){
foreach ($this->staff as & $man){
$manClone = clone $man;
}

будет работать?
>>659577>>659593
#713 #659577
>>659575
т.е.
__clone(){
foreach ($this->staff as & $man){
$man = clone $man;
}
>>660339
#714 #659593
>>659575

создать новый массив содержащий клоны всех сотрудников.
#715 #659597
>>659567
cпасибо за разбор. И не думал, что так много ошибок наворочу.

Буду разбираться
>>664773
#716 #659662
палиндромом

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

После этого мы проходим от края до середины посимвольно, на каждом шаге берем по 1 символу с начала и конца строки и сравниваем.
>>659839
#717 #659826
>>659338

>$app->render(....);


В slim 3 это не работает. Документация предлагает какие-то шаманства с контейнерами http://www.slimframework.com/docs/features/templates.html
Бесит.
Ушёл читать.
>>659837
#718 #659837
>>659826

Там теперь каждый обработчик должен вернуть в итоге Response из PSR-7. Логично: на вход получаешь Request + заготовку Response, на выходе даешь Response.

http://www.slimframework.com/docs/objects/response.html

Для использования шаблониатора надо (один раз) сделать сервис View, и рендерить шаблон через него

return $this->view->render($response, ....)

http://www.slimframework.com/docs/features/templates.html
>>661256
#719 #659839
>>659662

Как делаются повторяющиеся действия? Циклом конечно.

на 1-м шаге цикла берешь и сравниваешь 1-й с начала и 1-й с конца символы
на 2-м шаге цикла берешь и сравниваешь 2-й с начала и 2-й с конца символы
...

Получить N-й символ с конца или начала можно через mb_substr, вроде она описана в уроке.
#720 #659966
Решаю вот эту задачу - http://archive-ipq-co.narod.ru/l1/loops.html

Мое решение - http://pastebin.com/tvDLvEK0

Насколько всё плохо?
>>664773
#721 #660028
Надо вставить на сайт на вордпресс, примерно 50 страниц с дополнительным функционалом, который использует в своей работе jQuery, функционал будет добавляться по мере его написания, сам функционал довольно похожий. Как это лучше организовать? Создавать для каждой такой страницы отдельный шаблон страницы? Или как-то вставлять через через записи?
>>660193
#722 #660193
>>660028

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

Копипаста почти всегда дает на выходе неподдерживаемый код. Избегай ее.

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

> Создавать для каждой такой страницы отдельный шаблон страницы? Или как-то вставлять через через записи?
Не знаю, зависит от ситуации. Код вставлять в админку по моему глупая затея, код должен быть в файлах на диске. И без копипасты.
Ответы 13-14 февр #723 #660197
>>652345

> А вообще можно ли как-то это всё вычислять из количества букв, как мы делаем с углом? Может, тоже как-то надо к 360-ти градусам привязать?


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

>>652541

Напиши

>>652617

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

>>652816

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

> В общем, где можно доступно прочитать про запилы сайтов/борд


Не знаю, попробуй погуглить.

Чтобы написать свой сайт, надо как минимум знать HTML/CSS/JS + серверная часть: SQL + PHP, чтобы настраивать сервер, нужно изучать линукс, командную строку, bash, ssh.

>>652979
>>653550

> function inclineWord($discharge, $key) {


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

Также ты не учел что числа 11...19 склоняются особо, не так же как 1..9

> 11 => ' одиннадцать',


Мне не нравится этот пробел, непонятно почему в одних словах он есть, а в других нет.Добавляй его в другом месте.

> $hundred = mb_substr($number, -3);


Для работы с числами надо использовать математику, а именно $x % ... и floor($x/...).

> 0 => '/ десять один/',


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

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

Функция smallNumberToText слишком большая, разбей ее хотя бы на 2 функции.

В общем, программу надо переделывать. Чтобы все было просто и логично.

>>653010

А в чем проблема-то? Не вижу. Просто называй функции нормально, не success, а например didReceiveGeolocation или handleGeolocationSuccess

Так есть промизы, но в твоем случае они не нужны.
Ответы 13-14 февр #723 #660197
>>652345

> А вообще можно ли как-то это всё вычислять из количества букв, как мы делаем с углом? Может, тоже как-то надо к 360-ти градусам привязать?


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

>>652541

Напиши

>>652617

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

>>652816

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

> В общем, где можно доступно прочитать про запилы сайтов/борд


Не знаю, попробуй погуглить.

Чтобы написать свой сайт, надо как минимум знать HTML/CSS/JS + серверная часть: SQL + PHP, чтобы настраивать сервер, нужно изучать линукс, командную строку, bash, ssh.

>>652979
>>653550

> function inclineWord($discharge, $key) {


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

Также ты не учел что числа 11...19 склоняются особо, не так же как 1..9

> 11 => ' одиннадцать',


Мне не нравится этот пробел, непонятно почему в одних словах он есть, а в других нет.Добавляй его в другом месте.

> $hundred = mb_substr($number, -3);


Для работы с числами надо использовать математику, а именно $x % ... и floor($x/...).

> 0 => '/ десять один/',


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

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

Функция smallNumberToText слишком большая, разбей ее хотя бы на 2 функции.

В общем, программу надо переделывать. Чтобы все было просто и логично.

>>653010

А в чем проблема-то? Не вижу. Просто называй функции нормально, не success, а например didReceiveGeolocation или handleGeolocationSuccess

Так есть промизы, но в твоем случае они не нужны.
>>663855
Ответы 13-14 февр #724 #660200
>>653044

Надо нормально именовать функции. Вместо success: ajaxSuccess пиши success: function () { handleAjaxResponse(a, b, c, d ); }

> data: "lng=" + longitude + "&ltd=" + latitude,


Читай мануал по функции ajax. Непраивльно так делать.

>>653570

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

>>653620

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

Там должен быть return, а не echo или exit.

>>653657

Отвечал выше

>>653739

В википедии написано, если не знаешь: https://ru.wikipedia.org/wiki/Поле_класса

>>653678

JS код логично выносить в JS файл и подключать стандартной функцией вордпресса.

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


Я тут вряд ли могу чем-то помочь
Ответы 13-14 февр #724 #660200
>>653044

Надо нормально именовать функции. Вместо success: ajaxSuccess пиши success: function () { handleAjaxResponse(a, b, c, d ); }

> data: "lng=" + longitude + "&ltd=" + latitude,


Читай мануал по функции ajax. Непраивльно так делать.

>>653570

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

>>653620

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

Там должен быть return, а не echo или exit.

>>653657

Отвечал выше

>>653739

В википедии написано, если не знаешь: https://ru.wikipedia.org/wiki/Поле_класса

>>653678

JS код логично выносить в JS файл и подключать стандартной функцией вордпресса.

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


Я тут вряд ли могу чем-то помочь
Ответы 13-14 февр, граммар наци #725 #660203
>>653722

> $allreg=array($reg1=>"Жи Ши пиши через И",$reg2=>"нет пробела после знака препинания",$reg3=>"нет запятой после а или но",$reg4=>"Присутствует слово «координально» или «сдесь», «зделал», «зделаю», «зделан»");


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

> foreach($allreg as $i=>$j){


Нужны нормальные названия вместо i и j, например search/replace. Ну как читать код когда там однобуквенные переменные и непонятные сокращения?

Ошибку в слове "жызнь" твой код не видит: http://ideone.com/NPAlzF - ты забыл про регистр букв и флаг i.

[^\\s] это то же самое что и \\S

> [^,](\\s+(а|но))\\s+


Эта регулярка может срабоать например если перед "но" стоит 2 пробела: [^,] захватит первый пробел, а \\s+ - второй. Вдобавок, оно вообще не работает: http://ideone.com/oHizDK

Границу слова лучше определять не по пробелу, а по \\b - иначе выражение не сработает если после "но" идет запятая.

> .$math[0][1]


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

Также, preg_match_all может найти несколько непраивльных слов, но ты выводишь только первое. Вот например: http://ideone.com/JhpgP8 (опять, почему-то не нашел ошибки)

> [^\\s][!,;:?.]


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

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

>>653745

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

>>653850

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

Можешь погуглить статические анализаторы кода, но в твоем случае наверно проще запустить скрипт.
Ответы 13-14 февр, граммар наци #725 #660203
>>653722

> $allreg=array($reg1=>"Жи Ши пиши через И",$reg2=>"нет пробела после знака препинания",$reg3=>"нет запятой после а или но",$reg4=>"Присутствует слово «координально» или «сдесь», «зделал», «зделаю», «зделан»");


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

> foreach($allreg as $i=>$j){


Нужны нормальные названия вместо i и j, например search/replace. Ну как читать код когда там однобуквенные переменные и непонятные сокращения?

Ошибку в слове "жызнь" твой код не видит: http://ideone.com/NPAlzF - ты забыл про регистр букв и флаг i.

[^\\s] это то же самое что и \\S

> [^,](\\s+(а|но))\\s+


Эта регулярка может срабоать например если перед "но" стоит 2 пробела: [^,] захватит первый пробел, а \\s+ - второй. Вдобавок, оно вообще не работает: http://ideone.com/oHizDK

Границу слова лучше определять не по пробелу, а по \\b - иначе выражение не сработает если после "но" идет запятая.

> .$math[0][1]


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

Также, preg_match_all может найти несколько непраивльных слов, но ты выводишь только первое. Вот например: http://ideone.com/JhpgP8 (опять, почему-то не нашел ошибки)

> [^\\s][!,;:?.]


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

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

>>653745

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

>>653850

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

Можешь погуглить статические анализаторы кода, но в твоем случае наверно проще запустить скрипт.
>>663054
Ответы 14 февр, граммар наци #726 #660204
>>653865
>>653870
>>653869
>>653870
>>653936

Скорее всего там ошибка в SQL запросе или нет таблицы, или доступа к БД, база ругается, но код игнорирует ошибку и просто возвращает $results = false, а уже из-за нее ошибка в foreach. Насколько я знаю, тот же mysqli по умолчанию скрывает ошибки от базы данных - может это тот случай?

>>654377

Я не знаю таких готовых скриптов.

>>654752

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

>>654916

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

>>654961

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

Отформатируй код роботом из второго поста.

> 45 %


> до 6. 5


Зачем тут пробел?

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

>>654963

Не знаю

>>655000

> Не имеет смысла разносить echo по разным строкам, лучше сделать одной строкой.


Можно и так, почему нет.

>>655061

я нет
Ответы 14 февр, граммар наци #726 #660204
>>653865
>>653870
>>653869
>>653870
>>653936

Скорее всего там ошибка в SQL запросе или нет таблицы, или доступа к БД, база ругается, но код игнорирует ошибку и просто возвращает $results = false, а уже из-за нее ошибка в foreach. Насколько я знаю, тот же mysqli по умолчанию скрывает ошибки от базы данных - может это тот случай?

>>654377

Я не знаю таких готовых скриптов.

>>654752

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

>>654916

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

>>654961

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

Отформатируй код роботом из второго поста.

> 45 %


> до 6. 5


Зачем тут пробел?

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

>>654963

Не знаю

>>655000

> Не имеет смысла разносить echo по разным строкам, лучше сделать одной строкой.


Можно и так, почему нет.

>>655061

я нет
#727 #660339
>>659577
Ты разобрался с этим? А то я тоже делаю эту задачу, но таким способом не получается. IDE даже показывает, что первая переменная не используется
>>660407
#728 #660367
Анон, мучаюсь не могу скомпилить. Помоги пожалуйста.
http://ideone.com/yuixH0
>>660374
#729 #660374
>>660367
Фигурная скобка пропала снизу.
>>660376
#730 #660376
>>660374
Добра тебе, анон
#731 #660407
>>660339
Всё, нашёл. Перед значением в условии нужно амперсанд поставить
>>660489
#732 #660489
>>660407
Покажи, как ты сделал, я так и не смог заставить нормально работать
>>660511
#733 #660511
>>660489
А, так у тебя сеть амперсанд. Сразу что-то не заметил. http://ideone.com/6sJjTZ
>>660548
#734 #660539
Fatal error: Call to a member function fetch() on a non-object in A:\home\localhost\www\project\models\News.php on line 26
http://ideone.com/C9iOyS
Анон выручай.
>>660547
#735 #660547
>>660539
Он же пишет что переменная $result не является объектом. Делай вар_дамп, смотри что у тебя там. От этого отталкивайся и исправляй.
>>660557
#736 #660548
>>660511
Да, у меня в принципе так же, на самом деле, работает моя версия clone(), не знаю, почему сначала показалось ,что не работает.
#737 #660557
>>660547
bool(false)- вардамп вернул
Я так понимаю, нихуя там нет. А должен біть запрос с БД...
>>660567
#738 #660567
>>660557
А теперь идешь в мануал и читаешь http://php.net/manual/en/pdo.query.php

>PDO::query() returns a PDOStatement object, or FALSE on failure.


Значит, очевидно произошла ошибка.
Поставь PDO в режим выбрасывания исключений при ошибках вот так
$pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
И смотри в чем ошибка у тебя в запросе.
>>660596
#739 #660596
>>660567
Это прям в этом классе можно написать, или в заголовочном ?
>>660600>>660650
#740 #660600
>>660596
После того как объект PDO создаешь.
$db = new PDO("mysql:host=$host;dbname=$dbname", $user, $password);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
>>660618>>660634
#741 #660618
>>660600
Нифига не выводит
>>660637
#742 #660634
>>660600
Я уже думаю, а может все дело в ошибке подключения ?
>>660637
#743 #660637
>>660618
Что именно не получается? Должно исключение выбросить.
>>660634
Может быть и в этом, попробуй localhost на 127.0.0.1 поменять.
>>660643
#744 #660643
>>660637
Попробовал, тогда точно нет. Как проверить успешность соединения с БД ?
>>660646>>660653
#745 #660646
>>660643
В случае любой ошибки PDO выбросит исключение.

>If there are any connection errors, a PDOException object will be thrown.


http://php.net/manual/en/pdo.connections.php
#746 #660650
>>660596

Включи отображение ошибок

display_errors = On в php.ini
#747 #660653
>>660643

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

У тебя просто отображение ошибок не включено.

Вообще по моему ты рановато за базы данных взялся, разберись сначала как ошибки отображать хотя бы или логи почитай.
>>660658
#748 #660658
>>660653
Да пытаюсь свою первую недоMCV сделать, опыта 0, но имеется опыт ООП на крестах.
>>660677
#749 #660677
>>660658

> $newsList['id'] = $row['id'];


Почему нормальную модель не сделаешь, зачем городишь много мерные массивы? Еще и скопипастил 4 строки подряд.

> while($row = $result->fetch()){


Есть fetchAll, в твоем случае вообще достаточно $result = ...fetchAll

Создание ПДО надо вынести из класса наружу.

> 'SELECT id, title, date, short_content'


> .'FROM news'


В php можно вставлять переводы строк

Вот зря ты основы языка пропускаешь, зря.
>>660801
#750 #660749
Товарищи помогите пожалуйста

Палиндром
Напиши программу, проверяющую, является ли строка палиндромом.

http://ideone.com/Z7XlvP

Вроде бы все правильно но почему-то не работает
>>660754>>660763
#751 #660754
>>660749
тут есть кто живой???
>>660760
#752 #660760
>>660754
Попробуй var_dump проверить что у тебя в $letter1 и $letter2
#753 #660761
>>660760
$letter1 и $letter2 вытаскивает буквы из строки
>>660763
#754 #660762
>>660760
(42) "арозаупаланалапуазора"
string(2) "а"
>>660763
#755 #660763
>>660749

>$letter1 = mb_substr($a,0);


Какой символ это даёт?

>$letter2 = mb_substr($a,-1);


А это какой символ даёт?
Делай >>660760 и разберись с тем, какие параметры надо указывать в mb_substr(), чтобы получить символ с начала текста и символ с конца.
>>660761
Это переменные, в которые записывается результат работы функции, а у тебя там неправильно даны ориентиры для вырезания букв.
Также у тебя цикл for и переменная $i - её надо использовать в этой функции, чтобы последовательно в каждом цикле проходить по строке с начала и с конца, сравнивая символы.
Попробуй для начала хотя бы простого сравнения двух символов добиться.
>>660762
Это означает, что в $letter1 ты сразу записываешь всю строку - и дальше без изменений, а в $letter2 записываешь только конечную букву "а" - и тоже без изменений.
Ориентиры для работы функции не верны, разберись с ними.
>>660766>>660930
#756 #660766
>>660763
хорошо спасибо буду разбираться
#757 #660767
Почему не игнорится блядский .htacces ?

*.log
composer.phar
public/.htaccess

Мне нужно что бы я его больше не видел в Changed и он ни когда больше не изменился в репозитории.
>>664773
#758 #660769
Поворчу немного.
Тредом ранее >>639969 меня ругали за if ($debug) error_reporting(-1).

Сегодня открыл учебник ОПа. inb4: давно пора И что я вижу?

> Далее идет инструкция error_reporting(-1);. Эта команда включает отображение всех возможных предупреждений (без нее выводятся не все).



У меня всё.
>>661090
#759 #660801
>>660677
Тогда посоветуй что-то для быстрого старта.
>>664773
#760 #660930
проверьте задачку на палиндром

http://ideone.com/Z7XlvP

>>660763
я не много не понел где я должен был использовать $a кроме как в сомом цикле ну всм в ()

но сейчас все вроде работает
#761 #660932
сомом уфффф
самом*
#762 #660933
#763 #660943
>>660930
http://ideone.com/Z7XlvP
исправил еще кое-что
>>661032>>661039
#764 #661032
>>660930
>>660943
http://ideone.com/K5OpQl
Ты немного не уловил суть того, что нужно сделать.
Тебе нужно брать символ с начала текста ("а" в твоём примере), брать символ с конца текста (тоже "а"), сравнивать их - и в зависимости от результата либо продолжать цикл, либо обрывать и выводить "Не палиндром".
После того как ты проверил первые символы с начала и конца текста, тебе надо передвигаться на один символ к середине с обеих сторон текста.
Надо проверять "р" в слове "роза" и "р" в слове "Азора" - конкретно и грубо говоря. У тебя там образуется последовательность букв после пропускания через все эти mb_strtolower и preg_replace, там у тебя "арозаупаланалапуазора". Вот по этому тексту ты и должен идти с начала и с конца до середины, сравнивая буквы.
У тебя есть изменяющаяся при прохождении цикла переменная $i - вот и используй её, подставляя туда, куда нужно, в функцию mb_substr. От переменной можно отнимать в функции, можно прибавлять, можно ставить знак "минус" перед ней - и она станет с отрицательным значением.
В самом цикле должно быть, как минимум, два условия, а лучше даже три:
1. Буквы спереди и сзади текста совпадают - продолжаем цикл, можем вывести эти буквы с начала и с конца в echo для наглядности.
2. Буквы с начала текста и с конца не совпадают - выводим результат "Это не палиндром" и обрываем цикл.
3. Переменная $i равняется переменной $halflength - выводим результат "Это палиндром".
>>661294
#765 #661039
>>660943
У тебя же получилось в таком виде, что раз двадцать в цикле сравнилась "а" первая с "а" последней. В середине можно писать что угодно, получается, всё равно посчитает это палиндромом.
#766 #661081
https://dash.generalassemb.ly - интересные и простые уроки.
Посоветуйте подобного побольше.
На codeacademy не такое всё, htmlacademy и т.п.
Может, что-то ещё есть подобное?
#767 #661090
>>660769

Ты не так понял. Нелогичным мне показалось что error_reporting(-1) стоит внутри ифа. Получается, если режим отладки не включен, часть ошибок можно игнорировать? Почему? Разве не абсурдно? Ошибка - это всегда ошибка и нельзя ее игнорировать.

Если ты поставишь просто

error_reporting(-1);

это в общем ок, хотя лучше конечно еще в php.ini это продублировать.
>>661131
#768 #661098
Не работает placeholder для order by в mysql. Из-за этого все placeholder'ы после него ломаются. Что делать, товарищи?
$query = "SELECT * FROM abiturient ORDER BY $sort DESC LIMIT :recordsPerPage OFFSET :recordNumber";
$stmt = $this->pdo->prepare($query);
$stmt->bindValue(':recordsPerPage', $recordsPerPage);
$stmt->bindValue(':recordNumber', $recordNumber);
$stmt->execute();
$stmt->setFetchMode(PDO::FETCH_CLASS, 'Abiturient');
$abiturients = $stmt->fetchAll();
return $abiturients;
>>661100>>661137
#769 #661100
>>661098
Быстрофикс. Это я уже заменил placeholder обычной переменной когда это все работает. Я хочу именно чтобы было
$query = "SELECT * FROM abiturient ORDER BY :sort DESC LIMIT :recordsPerPage OFFSET :recordNumber";
$stmt->bindValue(':sort', $sort);
#770 #661131
>>661090
Теперь понял тебя.
#771 #661137
>>661098

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

Тебе придется вставлять имя переменной, но не забудь в этой же функции сделать проверку значения этой переменной по списку разрешенных знаечний, чтобы не было уязвимости.
>>663503
#772 #661142
Вечер добрый, я только начинаю изучать пхп и запнулся на задачке с айфоном отсюда http://archive-ipq-co.narod.ru/l1/loops.html

Пытаюсь зделоть вот так http://ideone.com/wRdYSo но чёт ничего не выходит. Дайте совет штоле.
>>661151>>661316
#773 #661151
>>661142
Условие свое в начало цикла перенеси.
>>661158
#774 #661158
>>661151
Изменил немного, но ответ всё равно не сходится. Почему - то у меня выходит на 1000 меньше и на 1 месяц меньше.
#775 #661256
>>659837
Сделал, спасибо. Ещё вопрос: какие объекты из контроллера мне доступны в шаблоне? Только тот массив, который передаётся третьим параметром в render()?
>>661375
#776 #661284
Скоро придется работать с Yii, подскажите чего почитать хорошего? Можно и на английском.
>>664773
#777 #661294
>>661032
ууухх что за сложности я думал все проще
>>661322
#778 #661316
>>661142
В тот момент, когда у тебя $creditBalance становится меньше 5000, а именно - становится 4138, он попадает в условие if ($creditBalance < 5000).
В нём $monthlyPayment меняется с 5000 на 5270 где-то (сделай var_dump в этом месте, всё увидишь). А далее именно его ты отнимаешь в $creditBalance = ( $creditBalance * $percent ) + $servicePayment - $monthlyPayment;, обнуляя $creditBalance, он становится равным нулю и идёт в последний вывод echo.
А в $paymentTotal = $paymentTotal + $monthlyPayment; ты просто плюсуешь эту сумму в 5270.
Получается, у тебя теряется комиссия и проценты от 262 рублей, который должны остаться для выплаты в 13-ый месяц. То есть 1000 + 262 + проценты от 262.
Я на этой задаче собаку съел без соли.
Далее задавай вопросы, если не понятно, куда копать для правильного решения.
#779 #661322
>>661294
Там несколько простых условий if и подставленная в функцию mb_substr переменная $i.
#780 #661375
#781 #661516
>>657617
Связь тема-новости не налажена, потому что там две таблицы связанные. Писать на чистом сокле было условием.
>>661557
#782 #661519
>>657617

>isset year


Это переменна может не быть, если сортировка по году не произошла.
18 Кб, 122x136
#783 #661524
Что-то тред у вас уплыл далековато, целых 5 минут искал.

Анон, я к тебе с весьма нубским вопросом.
Есть кое-какие куски кода - ideone.com/TFsq18
Первый код дергает за якоря (id) и подставляет значения из массива (второго кода) в свитч (первого кода). Но почему-то отрабатывается только первая главная страница, где айди нет. В чем может быть проблема?
#784 #661529
>>661524
Ты долбаеб ? В шапке ведь написано MCV, иди и перепиши с помощью этого паттерна. А это говно выброси и больше никому не показывай.
>>661558>>661559
#785 #661533
>>661524
Если все же хочешь писать, то пиши print_r($_SERVER["REQUEST_URI"]);
И смотри что за говно в адресе.
>>661538
#786 #661538
>>661533
Так а почему мой метод не работает? Я просто понять хочу. Я же все сделал как препод говорил.
>>661554
#787 #661554
>>661538
Блять, отбой вопроса, я вместе с наполнением страницы удалил инклюды этих самых внешних страниц, топ кек.
#788 #661557
>>661516

Я имел в виду связь между моделями. В Юи есть отношения между моделями и можно по модели Новости получить связанные с ней Темы.
#789 #661558
>>661529

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

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

>>661524

Проверь как именно выполняется код - натыкай echo и var_dump, чтобы видеть приходит в GET, какие блоки кода выполняются. Наверняка тогда почему он не выполняется станет очевиднее.
>>661568
#790 #661559
>>661529

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

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

>>661524

Проверь как именно выполняется код - натыкай echo и var_dump, чтобы видеть приходит в GET, какие блоки кода выполняются. Наверняка тогда почему он не выполняется станет очевиднее.
>>661568
#791 #661568
>>661559
>>661558
Cпасибо тебе, добрый анон.
W5.2 #792 #661846
На правах бампа.
Задачка W5.2. Про банк и проценты. Правильно?
https://ideone.com/FVJNrf
>>661851
#793 #661851
>>661846
Нет.
Должно быть 49 лет и 65 анону на тот момент.
А сама цифра верная получилась.
>>661869
#794 #661869
>>661851
Боль и унижение. Обосраться на такой простой задаче.
>>661888
#795 #661888
>>661869
Попробуй echo выводить при каждом цикле, там увидишь, что не так.
Там у тебя только в паре моментов не совсем всё верно.
>>661921
W5.1. #796 #661918
Зацените решение задачи про айфон в кред

https://ideone.com/R7Imn2
#797 #661921
>>661888
970172,3378 - еще не миллион
1067189,572 - а это уже больше
Получается если цикл начинать с нуля, то будет правильный ответ.
>>661950>>661951
#798 #661950
>>661921
Покажи-ка.
>>662013
#799 #661951
>>661921
Хорошее решение. Считает всё правильно.
>>661953
#800 #661953
#801 #661957
После перерыва в месяц, опять вкатываюсь с списком студентов, спасибо ОПу за то что проверил.

https://github.com/foobar1643/student-list

>А больше 151 что нельзя набрать?


А зачем больше 151? В моей стране ЕГЭ не сдают, но я слышал что там больше 100 нельзя набрать. Не стал это менять.

>Ошибки надо бы сделать более информативными. Не "неправильно заполнено поле" и не подкрасить красным цветом, а написать например "Имя может содержать не более X символов, вы ввели Y".


Я сделал немного по другому, чтобы не делать для каждого поля отдельную функцию проверки, но теперь там еще и HTML5 валидация, поэтому я думаю что с этим проблем не будет, все получилось достаточно информативно, на мой взгляд.
>>661999>>662012
#802 #661999
>>661957

как я понимаю, там есть "первичные баллы", которые потом нормализуются и переводятся на шкалу от 0 до 100. 3 предмета по 100 баллов дают макс. сумму в 300 баллов.

http://xn--80aff1fya.xn--p1ai/news/shkala_ege16/2015-10-17-228

> Тестовые баллы – это конечные баллы после перевода в 100-балльную шкалу, с которыми абитуриенты поступают в вуз. За один предмет можно получить не более 100 тестовых баллов.



Прошу недавних школоанонов прокомментировать.

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

Также, по коду:

https://github.com/foobar1643/student-list/blob/master/app/Helper/FormHelper.php

Не пиши такую стену кода. Ее тяжело читать. По-первых, строки длиннее 80 символов надо переносить. Во-вторых, if не может занимать меньше 3 строк с учетом скобок и переносов.

Не стоит экономить место на экране - оно бесплатное.

> [:space:]


короче написать \\s

Ну и насчет сообщений об ошибках - все же они не соответствуют регуляркам, например:

> [-А-ЯЁа-яёa-zA-Z0-9]{2,5}


> Имя группы должно быть не короче 2 и не длиннее 5 символов



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

> https://github.com/foobar1643/student-list/blob/master/templates/form.html#L35


> value="<?php if($student->name): print($student->name); endif; ?>"


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

Вместо print лучше использовать <?= и тернарный оператор.

> pattern="^[А-ЯЁA-Z]{1}[-а-яёa-zА-ЯЁA-Z]{1,15}$"


> title="Имя должно быть не длиннее 15 символов."


Здесь тоже сообщение не точно соответствует регулярке.

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

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

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

И мне не нравится реализация конфига:

https://github.com/foobar1643/student-list/blob/master/app/Config.php

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

То есть получается такая схема: класс с настройками + файл с переопределенными знаечниями.

И разумеется имя файла не надо захардкоживать в классе. Пусть это будет универсальный класс, который может загрузить любой файл с настройками.
#802 #661999
>>661957

как я понимаю, там есть "первичные баллы", которые потом нормализуются и переводятся на шкалу от 0 до 100. 3 предмета по 100 баллов дают макс. сумму в 300 баллов.

http://xn--80aff1fya.xn--p1ai/news/shkala_ege16/2015-10-17-228

> Тестовые баллы – это конечные баллы после перевода в 100-балльную шкалу, с которыми абитуриенты поступают в вуз. За один предмет можно получить не более 100 тестовых баллов.



Прошу недавних школоанонов прокомментировать.

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

Также, по коду:

https://github.com/foobar1643/student-list/blob/master/app/Helper/FormHelper.php

Не пиши такую стену кода. Ее тяжело читать. По-первых, строки длиннее 80 символов надо переносить. Во-вторых, if не может занимать меньше 3 строк с учетом скобок и переносов.

Не стоит экономить место на экране - оно бесплатное.

> [:space:]


короче написать \\s

Ну и насчет сообщений об ошибках - все же они не соответствуют регуляркам, например:

> [-А-ЯЁа-яёa-zA-Z0-9]{2,5}


> Имя группы должно быть не короче 2 и не длиннее 5 символов



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

> https://github.com/foobar1643/student-list/blob/master/templates/form.html#L35


> value="<?php if($student->name): print($student->name); endif; ?>"


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

Вместо print лучше использовать <?= и тернарный оператор.

> pattern="^[А-ЯЁA-Z]{1}[-а-яёa-zА-ЯЁA-Z]{1,15}$"


> title="Имя должно быть не длиннее 15 символов."


Здесь тоже сообщение не точно соответствует регулярке.

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

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

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

И мне не нравится реализация конфига:

https://github.com/foobar1643/student-list/blob/master/app/Config.php

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

То есть получается такая схема: класс с настройками + файл с переопределенными знаечниями.

И разумеется имя файла не надо захардкоживать в классе. Пусть это будет универсальный класс, который может загрузить любой файл с настройками.
>>662025
#803 #662012
>>661957

Ой, насчет конфига я немного ошибся. У тебя есть загрузка ini-файл и это хорошо. Но имя этого файла надо убрать из класса - так будет универсальнее.

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

> protected $app_enableFiller;


И прочитай-ка рекомендации PSR-2, PSR-1

http://www.php-fig.org/psr/psr-1/
http://www.php-fig.org/psr/psr-2/

перевод:

http://svyatoslav.biz/misc/psr_translation/#_PSR-1
http://svyatoslav.biz/misc/psr_translation/#_PSR-2

Имена полей пишутся кемел кейсом: enableFiller. Не надо использовать подчеркивания и изобретать свои стили наименования.
#804 #662013
>>662018>>664774
#805 #662018
>>662013
Вот
https://ideone.com/xOxzDm
Я, походу, что-то перепутал сам. И там как раз 50 лет нужно, а анону будет 66, как у тебя было с самого начала.
Ведь сейчас ошибка - за 0 лет накопил он через первый год.
Извини, бро, попутал.
>>664774
#806 #662025
>>661999
Я не знаю как это написать покороче и чтобы понятно было.

Вот так нормально будет?

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


>Имя должно быть не длиннее 15 символов, в имени разрешается использовать символы латиницы, кириллицы, цифры и дефисы.



Думал еще к каждой ошибке добавить примеры правильно введенных данных, но это уже слишком, наверное.
>>662033
#807 #662033
>>662025

Да, так подойдет.
#808 #662065
Нужно написать сайт с админкой, задали нам в шаражке. Сейчас верстаю интерфейс. Саму админку буду на php писать. Подскажите, как в плане алгоритма можно релизовать примерно следующее:
я выбираю вид статьи - большая или маленькая, потом заполняю, отдельно пишу название. Если большая - то еще и спец. картинку загружаю.

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

Ну и думаю как реализовать отображение - чтобы выводило только самые свежие на главной, а все можно было в архиве посмотреть или сделать автоматическое создание новых страниц когда записей очень много. Вот только опять же как. Нужно без использования всяких цмс-ок и готовых решений.
>>662091>>664774
#809 #662091
>>662065

>самые свежие на главной


SELECT * FROM news ORDER BY date DESC LIMIT 10
>>662095
#810 #662095
>>662091
Ок, меня больше инетересует со стороны вёрстки, как мне с php надо обращаться к коду самой страницы, чтоб в именно тот блок, что мне нужно, добавляло новости.
>>662097>>662109
#811 #662097
>>662095
Сделай шаблон, который будет брать данные с php скрипта и выводить их.
>>662103
#812 #662103
>>662097
Можешь немного подробнее написать, не совсем понял.
>>662107
#813 #662107
>>662103

>index.php


$a = 10;
$b = 20;
include("template.html");

>template.html


<h1>$a</h1> <!-- 10 -->
<h2>$b</h2> <!-- 20 -->
>>662127
#814 #662109
>>662095
И еще, сделай что бы все новости были в одной таблице и в таблице было поле с типом новости.
А в скрипте типу новости будет соответсвовать класс articleNews, protoNews, который будет наследоваться от news/ для каждой свой обработчик
#815 #662127
>>662107
Я правильно понял, у насу меня есть страница что по дефолту включает в себя другой файл и когда мы добавляем новую статью то она добавляется в этот файл и таким образом файл включается в код и на сайте уже всё отображается.

Я просто немного нуб в php, погуглил функцию include, кажись это как раз то, что мне нужно, спасибо.
>>662128>>662143
#816 #662128
>>662127
Первый абзац это вопрос.
#817 #662143
>>662127

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


Нет. Включает она в себя другой файл потому что тебе нужно разделить логику и отображение. Новости будешь добавлять в базу данных, оттуда же их получать. Например будет файл record.php, при передаче ему GET параметра id (http://localhost/record.php?id=1) он будет выбирать запись с таким айди из базы данных и заполнять модель новости. После того как модель новости заполнилась, ты подключаешь файл record.html, который отвечает только за вывод информации из переменных которые ему передают. Так же тебе нужно продумать все условности (что будет если параметр id пустой, что будет если новости с таким id не существует и т.д.).
>>662146
#818 #662146
>>662143
Хорошо, тогда буду разбираться.
#819 #662175
Кем я могу устроиться работать, если я сделаю все, что есть в ОП-посте? Или вы все это учите ради своих проектов?
мимо-из-перл-треда
>>662176>>662178
#820 #662176
>>662175
В пятерочку можешь или в ашан. Один успешный Вован из этого треда уже пришел к успеху.
>>662184
#821 #662178
>>662175
Джуном спокойно, но для этого нужно сначала что-то сделать. Тут многие не могут задачку на айфон в кредит сделать.
>>662182>>662184
#822 #662182
>>662178

>Тут многие не могут задачку на айфон в кредит сделать.


А некоторые виртуозно играются с кодом.
#823 #662184
>>662176
Я так понимаю, он устроился админом СУБД в пятерочку? С каталогами товаров работает?
>>662178
Я почитал вакансии намедни и там дохуя фреймворков и еще js нужно знать на уровне бога.
>>662187>>662189
#824 #662187
>>662184
Скорее админом кассового аппарата. С покупателями работает.
>>662196
#825 #662189
>>662184
Чего там может быть дохуя? Главное MVC понимать, дальше какой-нибудь Yii или Symfony будет легче освоить уже в работе. Ты никогда в сфере не работал что ли? Тут главное нужно говорить нормально и не вести себя как забитый хикка-аутист. А вообще в этом треде язык изучают, можешь в соседний перезвоним сходить и спросить про джуниоров там.
>>662219
#826 #662196
>>662187

>Скорее админом кассового аппарата. С покупателями работает.


Какая напрасная трата человеческих сил!
#827 #662209
Ребзя, а есть такая программа, типа ideone или codepad, только офлайн?
>>662214>>662234
#828 #662214
>>662209
JetBrains PHP Storm
#829 #662219
>>662189
Окей, спасибо за информацию. Я в универе перл учил, а на все остальное хуй клал. Потом, после выпуска, с трудоустройством были колоссальные проблемы. Со здоровьем.А сейчас, когда перл уже нигде не нужен, хуй устроишься. Столько времени впустую потрачено. Так что ты мне советуешь выбрать, Юи или Симфони?
>>664774
#830 #662234
>>662209

Установи себе PHP на компьютер - в ОП посте есть ссылка на инструкцию и скачай IDE или редактор кода.
Сумма Прописью #831 #662246
Анончики, проверьте задачу на ошибки, пожалуйста.

http://ideone.com/w9VikV
>>662248>>664775
#832 #662248
>>662246
Исправил немного

http://ideone.com/w9VikV
>>664775
#833 #662408
Господа, а есть ли среди вас гуру php, xml, mysql и wsdl?
Есть работа долларов на 300.
Нужно написать обработчик для availability-запросов и wsdl основываясь на некоторой xml-schema.
Проблема в том, что база там не унифицирована, ее унификация и переезд на новую платформу это отдельная большая работа на будущее. На текущий момент нужно написать правильную выгрузку из базы и перевод обратно в xml (по этой же xml-schema) для отдачи.
Возможно и увеличение платы при разумном объяснении.
#834 #662417
>>662408

>xml mysql wsdl


Как там в 2010?
>>662420
#835 #662419
>>662408
3 глазом читаем?

> и переезд на новую платформу это отдельная большая работа на будущее


Сайт вообще написан на асп.
#836 #662420

>>66241 -> >>662417

>>662472
#837 #662422
>>662408
В этом треде гуру разве что ОП, все остальные только изучают. С такими запросами я думаю тебе лучше будет обратиться на сайты для фрилансеров.
#838 #662424
Тут периодически появляются аноны, которые хотят удаленно зарабатывать хотя бы 15-20 000 р в мес и пишут что они на все согласны. Что, аноны, ваш час пришел.
>>662428>>662435
#839 #662428
>>662424
Делать задания для рандомного хуя в треде? Я смотрю ты лохов авантюристов ищешь.
>>662478
#840 #662432
Аноны, есть такое пример. Я ведь хуйню написал в строчке "(preg_match(strtolower($regexp, $text)))" и буквы в регулярке не станут маленькими?
http://ideone.com/J7dBf3
>>662465>>664775
#841 #662433
Как при помощи notepad++ или другого текстового редактора совершать поиск определённой функции или какой-то текстовой записи в файлах определённой папки?
#842 #662435
>>662424
Что надо делать?
>>662477
#843 #662437
>>662433
Подключи все файлы к одному и сделать $GLOBAL поиск.
>>662438
#844 #662438
>>662437

>$GLOBALS


Фикс.
#845 #662440
>>662433
А, стоп, я хуйню написал, с помощью глобалс ты только переменные найдешь. Но у меня переменные, в которых хранятся значения функций одноименные, так что мне норм.
>>664776
#846 #662465
>>662432
Отбой вопроса, я забыл про флаги.
#847 #662472
>>662420
Может ОП за это и возьмется?
В воркаче искать, как я понимаю, тоже бессмысленно?
>>662475>>662481
#848 #662475
>>662472
ОП сюда обычно вечером-ночью заглядывает, да и не каждый день. Так что жди.
https://github.com/disbeliever/phptraining/tree/master/students #849 #662476
>>655349

А почему ты один репозиторий используешь для 2 проектов?

https://github.com/disbeliever/php_training/blob/master/students/public/index.php
Здесь при исключении надо делать логгирование в первую очередь, а не в последнюю - так как если у тебя где-то дальше произойдет ошибка, то первоначальное исключение не залоггируется.

> require_once('../src/init.php')


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

Используй require вместо include - про разницу между ними почитай в мануале.

> 503 Sorry about the mess


> include('../src/views/404.php');


Ты тут противоречий не видишь? Как минимум файл назван неудачно.

> $app = new ControllerStudentsList($stg);


А почему это не внутри try?

Заметь, что тебе пришлось 2 раза в 2 файлах написать try/catch. Здесь можно оставить это, в более сложных приложениях обычно применяют паттерн Front controller, то есть делают так чтобы все запросы проходили через одну точку, в которой можно как раз ловить ошибки.

https://github.com/disbeliever/php_training/tree/master/students/src
По моему классы тут надо разложить по папкам. Например, контроллеры, сущности, хелперы, классы работы с БД. Заодно изучи неймспейсы и PSR-4, у меня в гитхабе есть урок по ним.

https://github.com/disbeliever/php_training/blob/master/students/src/Autoloader.php
зачем здесь поле $_lastLoadedFilename? Отладка? И не ставь подчеркивание в начале - есть слово private для этого.

> https://github.com/disbeliever/php_training/blob/master/students/src/init.php


> $stg = new StudentTableGateway($PDO, $config['studentsPerPage']);


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

> $config[dbtype]


А так точно можно делать? У тебя можно поменять тип базы данных в конфиге, например на mysql, и все будет работать?

https://github.com/disbeliever/php_training/blob/master/students/src/ControllerStudentsList.php#L5

> public function __construct($stg)


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

> }


> else {


} else { - почитай PSR: http://svyatoslav.biz/misc/psr_translation/#_PSR-1

> https://github.com/disbeliever/php_training/blob/master/students/src/ControllerStudentsList.php#L10


> public function run($studentsPerPage)


Вот это странная конструкция. Давай подумаем, в чем задача функции run() в контроллере? Ее задача - обработать запрос пользователя и вывести ответ. С какой стати studentsPerPage стало аргументом этой функции? Я понимаю, если бы например на вход подавался объект Request - это логично, но подавать на вход параметры конфига наверно не очень логично. Тем более что он всегда имеет одно и то же значение.

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

> $this->stg->getTotalStudentsNum() / $studentsPerPage + 1


По моему неправильная формула. Если у нас 5 студентов на страницу и всего 10 человек, она выдает 3. А если 9 человек - то получается 2.8. И что это значит? Что такое 2.8?

> include('../src/views/ViewStudentsList.php');


Надо абсолютные пути и require. А может вообще сделать функцию render для этого.

https://github.com/disbeliever/php_training/blob/master/students/src/ControllerStudent.php#L16

> if ($registered) {


> $msg = ["class" => "success", "text" => "Регистрация выполнена"];


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

> TokenHelper::getOrGenerateCSRFToken();


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

Это довольно тонкий момент, но главное тут понять что у тебя - метод класса (не привязанный к объектам класса) или метод объекта? В зависимости от этого и решается делать его статическим или нет.

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

Более того, использование статических методов (не в контроллерах) приводит к спутанности классов:

https://habrahabr.ru/post/169301/
http://karmazzin.ru/when-to-use-static-methods
https://gist.github.com/codedokode/e1d31a31b37d5f635057
http://stackoverflow.com/questions/2080150/when-should-i-use-static-methods-in-a-class-and-what-are-the-benefits (англ)
http://stackoverflow.com/questions/2671496/java-when-to-use-static-methods (англ)

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

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

> TokenHelper::setCSRFToken($token);


Почему бы не записывать токен в куки в методе getOrGenetrate?

> if (FormHelper::isEditable()) {


Лучше проверять по наличию id у студента.

> if (FormHelper::isFormSent()) {


> else if ($_SERVER['REQUEST_METHOD'] == "GET") {


А что если ни одно из условий не сработает?

И еще, я вижу что у тебя по многим хелперам раскиданы обращения к POST/COOKIE/GET. Это уже получаются не хелперы, а просто код контроллера размазан по нескольким классам. Надо пройтись и решить, где функции могут работать с переданными им явно данными. Ну например функция FormHelper::isEditable явно может принимать на вход объект студента.

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

> header("HTTP/1.0 403 Access denied");


> $errString = "Нет доступа";


> include('../src/views/404.php');


Для вывода страницы ошибки стоит сделать функцию, а не копипастить эти строчки.

https://github.com/disbeliever/php_training/blob/master/students/src/ControllerStudent.php#L51
Тут у тебя слишком большая функция run. Подумай, как уменьшить ее объем.

https://github.com/disbeliever/php_training/blob/master/students/src/StudentTableGateway.php#L16
Длинные SQL запросы надо писать в несколько строк.

https://github.com/disbeliever/php_training/blob/master/students/src/StudentTableGateway.php#L51

> if (is_string($authToken) && strlen($authToken) == self::AUTH_LENGTH) {


А что если это условие не выполняется? Что будет при попытке сделать $query->execute()?

https://github.com/disbeliever/php_training/blob/master/students/src/Student.php#L24

> public static function fromRow($row)


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

https://github.com/disbeliever/php_training/blob/master/students/src/StudentHelper.php#L4
Тут функцию можно сделать более универсальной и отвязать от формы, вместо POST передавая ей произвольный массив.

Не очень понятно зачем ты записываешь куку auth в студента: ее обновлять не требуется.

> $this->stg->isEmailInDB($student)


Не очень логично выглядит вызов: функция проверяет есть ли в базе емайл, а на вход получает студента. Логичнее получать на вход email и id наверно.

> https://github.com/disbeliever/php_training/blob/master/students/src/TokenHelper.php#L11


> $characters[rand(0, $charactersLength - 1)];


Квадратные скобки не будут работать если мы добавим нелатинские символы, например кириллицу. Аналогчино strlen. Читай https://gist.github.com/codedokode/ff99e357e9860ea169b8
https://github.com/disbeliever/phptraining/tree/master/students #849 #662476
>>655349

А почему ты один репозиторий используешь для 2 проектов?

https://github.com/disbeliever/php_training/blob/master/students/public/index.php
Здесь при исключении надо делать логгирование в первую очередь, а не в последнюю - так как если у тебя где-то дальше произойдет ошибка, то первоначальное исключение не залоггируется.

> require_once('../src/init.php')


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

Используй require вместо include - про разницу между ними почитай в мануале.

> 503 Sorry about the mess


> include('../src/views/404.php');


Ты тут противоречий не видишь? Как минимум файл назван неудачно.

> $app = new ControllerStudentsList($stg);


А почему это не внутри try?

Заметь, что тебе пришлось 2 раза в 2 файлах написать try/catch. Здесь можно оставить это, в более сложных приложениях обычно применяют паттерн Front controller, то есть делают так чтобы все запросы проходили через одну точку, в которой можно как раз ловить ошибки.

https://github.com/disbeliever/php_training/tree/master/students/src
По моему классы тут надо разложить по папкам. Например, контроллеры, сущности, хелперы, классы работы с БД. Заодно изучи неймспейсы и PSR-4, у меня в гитхабе есть урок по ним.

https://github.com/disbeliever/php_training/blob/master/students/src/Autoloader.php
зачем здесь поле $_lastLoadedFilename? Отладка? И не ставь подчеркивание в начале - есть слово private для этого.

> https://github.com/disbeliever/php_training/blob/master/students/src/init.php


> $stg = new StudentTableGateway($PDO, $config['studentsPerPage']);


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

> $config[dbtype]


А так точно можно делать? У тебя можно поменять тип базы данных в конфиге, например на mysql, и все будет работать?

https://github.com/disbeliever/php_training/blob/master/students/src/ControllerStudentsList.php#L5

> public function __construct($stg)


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

> }


> else {


} else { - почитай PSR: http://svyatoslav.biz/misc/psr_translation/#_PSR-1

> https://github.com/disbeliever/php_training/blob/master/students/src/ControllerStudentsList.php#L10


> public function run($studentsPerPage)


Вот это странная конструкция. Давай подумаем, в чем задача функции run() в контроллере? Ее задача - обработать запрос пользователя и вывести ответ. С какой стати studentsPerPage стало аргументом этой функции? Я понимаю, если бы например на вход подавался объект Request - это логично, но подавать на вход параметры конфига наверно не очень логично. Тем более что он всегда имеет одно и то же значение.

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

> $this->stg->getTotalStudentsNum() / $studentsPerPage + 1


По моему неправильная формула. Если у нас 5 студентов на страницу и всего 10 человек, она выдает 3. А если 9 человек - то получается 2.8. И что это значит? Что такое 2.8?

> include('../src/views/ViewStudentsList.php');


Надо абсолютные пути и require. А может вообще сделать функцию render для этого.

https://github.com/disbeliever/php_training/blob/master/students/src/ControllerStudent.php#L16

> if ($registered) {


> $msg = ["class" => "success", "text" => "Регистрация выполнена"];


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

> TokenHelper::getOrGenerateCSRFToken();


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

Это довольно тонкий момент, но главное тут понять что у тебя - метод класса (не привязанный к объектам класса) или метод объекта? В зависимости от этого и решается делать его статическим или нет.

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

Более того, использование статических методов (не в контроллерах) приводит к спутанности классов:

https://habrahabr.ru/post/169301/
http://karmazzin.ru/when-to-use-static-methods
https://gist.github.com/codedokode/e1d31a31b37d5f635057
http://stackoverflow.com/questions/2080150/when-should-i-use-static-methods-in-a-class-and-what-are-the-benefits (англ)
http://stackoverflow.com/questions/2671496/java-when-to-use-static-methods (англ)

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

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

> TokenHelper::setCSRFToken($token);


Почему бы не записывать токен в куки в методе getOrGenetrate?

> if (FormHelper::isEditable()) {


Лучше проверять по наличию id у студента.

> if (FormHelper::isFormSent()) {


> else if ($_SERVER['REQUEST_METHOD'] == "GET") {


А что если ни одно из условий не сработает?

И еще, я вижу что у тебя по многим хелперам раскиданы обращения к POST/COOKIE/GET. Это уже получаются не хелперы, а просто код контроллера размазан по нескольким классам. Надо пройтись и решить, где функции могут работать с переданными им явно данными. Ну например функция FormHelper::isEditable явно может принимать на вход объект студента.

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

> header("HTTP/1.0 403 Access denied");


> $errString = "Нет доступа";


> include('../src/views/404.php');


Для вывода страницы ошибки стоит сделать функцию, а не копипастить эти строчки.

https://github.com/disbeliever/php_training/blob/master/students/src/ControllerStudent.php#L51
Тут у тебя слишком большая функция run. Подумай, как уменьшить ее объем.

https://github.com/disbeliever/php_training/blob/master/students/src/StudentTableGateway.php#L16
Длинные SQL запросы надо писать в несколько строк.

https://github.com/disbeliever/php_training/blob/master/students/src/StudentTableGateway.php#L51

> if (is_string($authToken) && strlen($authToken) == self::AUTH_LENGTH) {


А что если это условие не выполняется? Что будет при попытке сделать $query->execute()?

https://github.com/disbeliever/php_training/blob/master/students/src/Student.php#L24

> public static function fromRow($row)


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

https://github.com/disbeliever/php_training/blob/master/students/src/StudentHelper.php#L4
Тут функцию можно сделать более универсальной и отвязать от формы, вместо POST передавая ей произвольный массив.

Не очень понятно зачем ты записываешь куку auth в студента: ее обновлять не требуется.

> $this->stg->isEmailInDB($student)


Не очень логично выглядит вызов: функция проверяет есть ли в базе емайл, а на вход получает студента. Логичнее получать на вход email и id наверно.

> https://github.com/disbeliever/php_training/blob/master/students/src/TokenHelper.php#L11


> $characters[rand(0, $charactersLength - 1)];


Квадратные скобки не будут работать если мы добавим нелатинские символы, например кириллицу. Аналогчино strlen. Читай https://gist.github.com/codedokode/ff99e357e9860ea169b8
>>663030
#850 #662477
>>662435

Прочитать посты чуть выше где анон предлагает работу.
#851 #662478
>>662428

Работу можно разбить на части, использовать коды протекции или оформить безопасную сделку через сайт фриланса. Изучи советы в сети, прояви инициативу.
#852 #662481
>>662472

У ОПа много работы и он не заинтересован в дополнительных задачах.
Ответы 16 февр #853 #662524
>>655585

> $letter2 = mb_substr($halfText, -$i);


Ты берешь не 1 букву, а все до конца строки

> if ($letter1 = $letter2) {


Используешь присваивание вместо сравнения

>>655615

> $from1 = 0;


> $from2 = -1;


Это избыточные переменные. Их значение можно вычислить через $i. Например $from1 == $i. А отдельно их увеличиать/уменьшать только усложняет код.

Вместо exit можно сделать переменную, в которой хранить результат (палиндром/не палиндром = 1/0 или true/false), и ее выводить в конце.

В общем, можно упростить код.

>>655882

Не знаю

>>656043

Надо разобраться почему стандартная функция не работает.
Ответы 16 февр #854 #662528
>>656234

> и если я правильно понимаю, что по коду нет замечаний


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

> Я недавно видел как писали в одном файле что-то вроде


> Мне это не понравилось, что под классом написано что-то еще.


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

> Мне кажется что вот так писать pdo будет не правильно:


Как раз правильно будет засунуть создание и инициализацию PDO в контейнер. Чтобы пользователь контейнера получил уже готовый и настроенный объект. Для этого контейнер и нужен.

>>656418

Первые 6 задач проверял уже: >>657614

> 7. https://jsfiddle.net/64zzbmtp/


Верно

> 8. https://jsfiddle.net/1w8Ltex7/


> for(var key in objects){


> if(key == fieldName){


Что за наркоманство? для получения значения по ключу есть скобки, для проверки наличия ключа - оператор in

> 9. https://jsfiddle.net/wu98844o/


Правильно

> 10. https://jsfiddle.net/Lz07Locq/


Ок, хорошо.
Ответы 16 февр #854 #662528
>>656234

> и если я правильно понимаю, что по коду нет замечаний


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

> Я недавно видел как писали в одном файле что-то вроде


> Мне это не понравилось, что под классом написано что-то еще.


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

> Мне кажется что вот так писать pdo будет не правильно:


Как раз правильно будет засунуть создание и инициализацию PDO в контейнер. Чтобы пользователь контейнера получил уже готовый и настроенный объект. Для этого контейнер и нужен.

>>656418

Первые 6 задач проверял уже: >>657614

> 7. https://jsfiddle.net/64zzbmtp/


Верно

> 8. https://jsfiddle.net/1w8Ltex7/


> for(var key in objects){


> if(key == fieldName){


Что за наркоманство? для получения значения по ключу есть скобки, для проверки наличия ключа - оператор in

> 9. https://jsfiddle.net/wu98844o/


Правильно

> 10. https://jsfiddle.net/Lz07Locq/


Ок, хорошо.
>>662796>>663742
48 Кб, 532x450
#855 #662529
Аноны, вот поясните кто уже работал.

Вот вижу я вакансию, например, обслуживание/поддержание интернет магаза. Знания, пхп, хтмл, еще что-то там.

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

Потому что мне постоянно кажется, что я не справлюсь и что я нихуя не знаю для работа еще пока действительно мало, но все же интересно
>>662548
#856 #662548
>>662529
Спроси у работодателей. В основном, ты будешь править косяки (в т.ч. и свои) магазина, добавлять новые товары в каталог, повышать цену, устанавливать системы скидок, вот это все.
#857 #662553
Почему, чтобы обозначить необязательность символа нужно ставить "?" перед символом, а необязательность выражения "(huitaregexp)?" после?
>>662556>>662566
#858 #662556
>>662553

>Почему, чтобы обозначить необязательность символа нужно ставить "?" перед символом


Вообще-то после
>>662592
#859 #662566
>>662553

Надо в обоих случаях ставить после.
>>662592
#860 #662577
>>657873

>


оставь фэйко почту. может вместе потупим.
я по чуть-чуть уже разобрался.
тоже сычую 8 лет
>>662676
#861 #662592
>>662566
>>662556
Ой, не так прочитал faq.
#862 #662676
>>662577
Я только 3 года сычую. Можно тебе написать?
>>662692>>662885
#863 #662692
>>657873
>>662676
Пиздовать в офис и обязательно чтобы на маршрутке каждый день гонять туда по 40 минут.
Из-за гиподинамии у всех людей развивается депрессия и прочие ништяки вроде явлений застойной крови.
А программирование можно и после работы час или два учить, как долгосрочный план изучать кодинг вполне норм.
А сегодня вам надо просто растрясти себя и позарабатывать денюжку, сторожем там или ещё кем.
Всё равно не выпилитесь, назад дороги нет.
>>662710
39 Кб, 640x480
#864 #662710
>>662692
Топ кек, никто не собирается выпиливаться но, вообще-то, немного охота. Кем я только не работал - от продавца и курьера до санитара и фитнесс-тренера. Но мне нравится сычевать, сириусли, только изредка накатывает одиночество, которое я стараюсь задавить силой мысли. Впрочем, мне и одному норм учится, но вдвоем-втроем оно как-то сподручнее выходит. У каждого свое мнение, у одного из людей по-любому будет идея, как сделать то или иное, а другие уже смогут дополнить идею.

P.S. Я не совсем понял твою строчку про офис, мне не очень хочется тратить столько денег на дорогу, я лучше себе кучу таблеток куплю, спортивного питания, да даже новый курс анаболиков: вот я тебе даже список напишу, что мне нужно пить ежедневно:

Утро: 8:00
1. компливит (полезно жи)
2. фестал после первого и второго завтрака (холестатический синдром)
3. рыбий жир на первый и второй завтрак (пассивный метод снижения процента жира в организме)
4. тамоксифен (антагонист прогестерона)
5. аспаркам (синусоидная аритмия)
6. стакан ессентуков-17 за 20 минут до еды (холестатический синдром)

День: 13:00
1. фестал после обеда и полдника
2. рыбий жир на обед и полдник
3. тамоксифен
4. аспаркам
5. стакан ессентуков-17 за 20 минут до еды (холестатический синдром)

Вечер: 19:00
1. фестал после ужина и второго ужина
2. рыбий жир на ужин и второй ужин
3. тамоксифен
4. аспаркам
5. стакан ессентуков-17 за 20 минут до еды (холестатический синдром)

Ночь: 23:00
1. компливит
2. мелатонин
3. фестал после ночного приема пищи.
4. рыбий жир на ночной прием пищи.

В таком режиме я уже живу почти год. Пункты с тамиком и мелатонином появились недавно.
39 Кб, 640x480
#864 #662710
>>662692
Топ кек, никто не собирается выпиливаться но, вообще-то, немного охота. Кем я только не работал - от продавца и курьера до санитара и фитнесс-тренера. Но мне нравится сычевать, сириусли, только изредка накатывает одиночество, которое я стараюсь задавить силой мысли. Впрочем, мне и одному норм учится, но вдвоем-втроем оно как-то сподручнее выходит. У каждого свое мнение, у одного из людей по-любому будет идея, как сделать то или иное, а другие уже смогут дополнить идею.

P.S. Я не совсем понял твою строчку про офис, мне не очень хочется тратить столько денег на дорогу, я лучше себе кучу таблеток куплю, спортивного питания, да даже новый курс анаболиков: вот я тебе даже список напишу, что мне нужно пить ежедневно:

Утро: 8:00
1. компливит (полезно жи)
2. фестал после первого и второго завтрака (холестатический синдром)
3. рыбий жир на первый и второй завтрак (пассивный метод снижения процента жира в организме)
4. тамоксифен (антагонист прогестерона)
5. аспаркам (синусоидная аритмия)
6. стакан ессентуков-17 за 20 минут до еды (холестатический синдром)

День: 13:00
1. фестал после обеда и полдника
2. рыбий жир на обед и полдник
3. тамоксифен
4. аспаркам
5. стакан ессентуков-17 за 20 минут до еды (холестатический синдром)

Вечер: 19:00
1. фестал после ужина и второго ужина
2. рыбий жир на ужин и второй ужин
3. тамоксифен
4. аспаркам
5. стакан ессентуков-17 за 20 минут до еды (холестатический синдром)

Ночь: 23:00
1. компливит
2. мелатонин
3. фестал после ночного приема пищи.
4. рыбий жир на ночной прием пищи.

В таком режиме я уже живу почти год. Пункты с тамиком и мелатонином появились недавно.
>>662718>>664776
#865 #662718
>>662710

>никто не собирается выпиливаться


Я так и написал. А про самовыпил впринципе я упомянул из-за депресухи твоей.

>мне нравится сычевать, сириусли


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

>Я не совсем понял твою строчку про офис, мне не очень хочется тратить столько денег на дорогу


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

>я лучше себе кучу таблеток куплю, спортивного питания


>…список таблеток…


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

Тебя никто не заставляет идти искать самку, и свой драгоценный пинус в неё вкладывать, но нельзя жить с постоянным депресняком который возникает именно от сидения дома и гиподинамии.
Я понимаю сычевать у себя на строве или вилле с бассейном и иногда брать ламборгини из гаража и ехать по чистой дороге выстроенной специально для тебя (потому что сыч идейный), но у тебя нет всего этого.
Олсо, от гиподинамии мозг хуже работает, какими ты таблетками его не накачивай — погромист с плохо работающей головой никому не нужен.
>>662721
#866 #662721
>>662718
Ты меня попутал с тем постером, который простыню с котом написал. Я тот, который 3 года сычует. Но у меня уже нет депрессии, я в дурке полежал полгода, мне хватило, спасибо. Я выхожу на улицу, хожу в спортзал, но с людьми редко общаюсь, мне хватает общения на анонимной борде. Хотя я большую часть времени сижу на стуле за пекарней, так что ты прав, да. Я в 14 году за день обходил город вдоль, а на следующий день поперек, ДС-2, а это дохуя километров, более 60 точно. Вот тогда были очень ламповые времена. Сейчас что-то не то все. Но и сейчас мне гулять особо негде, я загородом живу, тут много населения, которое лучше избегать. Кстати, наверное, из-за этого я идейный сыч.
>>662732
#867 #662729
Чем абстрактный класс отличается от интерфейса, зачем нужна инкапсуляция и почему нельзя менять свойства объекта извне?
>>662732>>662749
#868 #662732
>>662721
Извини дарагой, раз попутал.

>из-за этого я идейный сыч


За такое я осуждать не могу, как ты понял я больше о здоровье пекусь, а не об общественных нормах типа «должен», «нимужик».

>хожу в спортзал


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

>я загородом живу, тут много населения, которое лучше избегать


Эх да, хорошая пешая трасса дорогого стоит.

>>662729

>зачем нужна инкапсуляция


>почему нельзя менять свойства объекта извне


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

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

В итоге всё это для облегчения поддержки больших кодовых баз.
>>662954
#869 #662749
>>662729

> зачем нужна инкапсуляция


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

> почему нельзя менять свойства объекта извне?


Можно если они публичные

Чтобы понять ООП надо решать задачи на него, например Вектор и кошки-мышки. Вот теория:

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

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

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

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

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

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

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

Интерфейс это набор требований к классу. «требование» здесь значит требование чтобы в классе был определенный метод.

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

Допустим мы делаем сайт где можно ставить лайки постам и комментам. Допустим у нас есть классы User, Post и Comment.

Вот у нас есть пост и коммент, мы можем увеличить число лайков, допустим методом increaseLikeCount и узнавать сколько у них лайков методом getLikeCount, то есть у них есть что-то общее, но как описать это в коде? Как сказать что эти 2 класса в отличие от других умеют работать с лайками?

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

function addLike(User $user, $object) ...

Мы сказали что $user должен быть объектом класса User, а как сказать что $object должен быть классом, умеющим работать с лайками?

Обе проблемы решают интерфейсы. Объявим интерфейс Likeable, который представляет собой умение получать лайки. Опишем какие методы обязаны реализовать такие классы:

interface Likeable
{
public function increaseLikeCount( );
public function getLikeCount( );
}

Теперь укажем в коде что посты и комменты можно лайкать:

class Post implements Likeable { ... }
class Comment implements Likeable { ... }

на этом этапе php проверит, не забыли ли мы реализовать в классах упомянутые методы. Если забыли — выдаст ошибку. Как удобно!

Ну и теперь мы можем использовать интерфейс чтобы указать какие аргументы принимает функция addLike:

function addLike(User $user, Likeable $object) { ... }

заметь что благодаря интферйесам наш код стал расиряем. Допустим завтра мы добавим класс Photo который тоже можно лайкать. Если он будет реализовывать интерфейс Likeable то функция вроде addLike сможет работать и с ним без переписывания кода.

В общем интерфейс представляет какую-то способность класса и требует от него реализовать определенные методы.
#869 #662749
>>662729

> зачем нужна инкапсуляция


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

> почему нельзя менять свойства объекта извне?


Можно если они публичные

Чтобы понять ООП надо решать задачи на него, например Вектор и кошки-мышки. Вот теория:

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

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

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

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

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

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

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

Интерфейс это набор требований к классу. «требование» здесь значит требование чтобы в классе был определенный метод.

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

Допустим мы делаем сайт где можно ставить лайки постам и комментам. Допустим у нас есть классы User, Post и Comment.

Вот у нас есть пост и коммент, мы можем увеличить число лайков, допустим методом increaseLikeCount и узнавать сколько у них лайков методом getLikeCount, то есть у них есть что-то общее, но как описать это в коде? Как сказать что эти 2 класса в отличие от других умеют работать с лайками?

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

function addLike(User $user, $object) ...

Мы сказали что $user должен быть объектом класса User, а как сказать что $object должен быть классом, умеющим работать с лайками?

Обе проблемы решают интерфейсы. Объявим интерфейс Likeable, который представляет собой умение получать лайки. Опишем какие методы обязаны реализовать такие классы:

interface Likeable
{
public function increaseLikeCount( );
public function getLikeCount( );
}

Теперь укажем в коде что посты и комменты можно лайкать:

class Post implements Likeable { ... }
class Comment implements Likeable { ... }

на этом этапе php проверит, не забыли ли мы реализовать в классах упомянутые методы. Если забыли — выдаст ошибку. Как удобно!

Ну и теперь мы можем использовать интерфейс чтобы указать какие аргументы принимает функция addLike:

function addLike(User $user, Likeable $object) { ... }

заметь что благодаря интферйесам наш код стал расиряем. Допустим завтра мы добавим класс Photo который тоже можно лайкать. Если он будет реализовывать интерфейс Likeable то функция вроде addLike сможет работать и с ним без переписывания кода.

В общем интерфейс представляет какую-то способность класса и требует от него реализовать определенные методы.
>>662954
#870 #662796
>>662528

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


С этим мы уже разобрались. Я сейчас жду пока ты мне ответишь на >>659278 чтобы исправить твое последние замечание и начать отталкиваться от правильного кода чтобы делать дальше.
#871 #662885
>>662676
давай
]h,rraspizdosovANUSgmwm"ailPUNCTUM-V/com
Айпад в кредит #872 #662886
Посмотрите кому уже проверяли.
https://ideone.com/YZMDuu
#873 #662892
>>662886
Всё верно работает.
Как и у того анона, откуда ты взял это решение.
Я слежу за тобой, username.
Помни это.
>>664776
Задачка на проверку телефонов #874 #662916
А за такую регулярку сразу обоссут?

https://ideone.com/8kQPKe

Что-то покороче ума не хватает сделать.
#875 #662925
>>662916
Ты копипастишь одно и то же несколько раз. Можно написать выражение которое ты копипастишь один раз, и рядом с ним в фигурных скобках задать кол-во повторений, например:
^[asd]{1,10}$
В данном случае блок asd может повториться от одного до десяти раз.
>>662939
#876 #662939
>>662925
https://ideone.com/JqsNcG

Да об этом что-то я не подумал. Благодарю за помощь.
>>664777
#877 #662954
>>662749
>>662732
Спасибо за хорошие ответы, все понятно теперь стало.
#878 #662959
Заметил, что некоторые сайты (яндекс, мейлру) ухитряются подсовывать рекламу исходя из поисковых запросов. Например искал одну вещь по интернет-магазинам, смотрю яндекс теперь "ненавязчиво" предлагает ссылку похожей тематики. Причем я же пользовался гуглом для поиска, откуда они берут результаты моих запросов? К истории браузера вроде не может быть доступа?
Про то что яндекс нагло анализирует письма вообще молчу.
#879 #662962
>>662959
Если ты посещал сайт, на котором стоит код Я.Метрики или РСЯ (Рекламной сети Яндекса), то всё.
То же самое, когда посещаешь ВКонтакте - у Яндекса договор с этой соцсетью, также и виджеты от ВК, находящиеся на сторонних сайтах, собирают всю доступную о пользователе информацию.
Вот попробуй поискать что-нибудь специфическое в Гугле, походи по нескольким сайтам - через некоторое время увидишь рекламу в тему и в ВК.
>>662967
#880 #662967
>>662962
Я не использую адблок и у меня нет рекламы в вк, что я делаю не так?
>>662969
#881 #662969
>>662967
Не используешь ВК.
Чтобы рекламодателям ты стал интересен (подпал под разные фильтры в настройке рекламной кампании), твой профиль должен быть более-менее живым.
>>662970
#882 #662970
>>662969
Я в вк открыт круглосуточно, я там слушаю музыку и пишу некоторым ракам. Стена у меня редко обновляется. Аватарки меняю раз в полгода. Это недостаточно живо?
>>662976
#883 #662976
>>662970
Сложно сказать.
Сейчас в настройках много тонкостей. Если у тебя личной информации в профиле нет (ты её просто не заполнял), ты не подписан на паблики определённой тематики, то, вполне возможно, считают тебя недостаточно живым либо просто не проходишь по различным фильтрам.
Рекламодатели же платят либо за показы рекламы, либо за клики на неё, максимально стараются отсеять не целевые группы пользователей. По возрасту, по полу, по интересам (паблики на определённую тематику).
>>662991
132 Кб, 766x766
75 Кб, 659x703
#884 #662978
Как-то так. Только нужно было ставку и выплаты школьника присвоить переменным. Какие еще нарекания есть?
>>662984>>664777
#885 #662984
>>662978
Переменные непонятно называешь. В большом коде будет сложно разобраться. А так всё нормально вроде бы.
#886 #662991
>>662976

>у тебя личной информации в профиле нет


Угу.

>ты не подписан на паблики определённой тематики


Ага.

Понятно все.
#887 #662997
ОП, уроки по Хаскелю больше не будут выходить?
>>663199
40 Кб, 656x279
25 Кб, 273x464
#888 #663020
Почему перемножаются результаты COUNT()?
>>663023>>663204
55 Кб, 807x371
#889 #663023
>>663020
Блять, вот этот ты меня обогнал. Я еще только задачи решаю в "повторим?". Ебать я тупой.
>>663025>>663044
#890 #663025
>>663023
Я другой анон
#891 #663030
>>662476
Ещё одна простыня…
#892 #663039
https://github.com/foobar1643/student-list

Вчерашние исправления по списку студентов.

Максимальное количество баллов поставил 300, но теперь это константа, поэтому в случае чего значение можно будет легко поменять.
#893 #663044
>>663023
cколько ты занимаешься?
другой тупой
>>663050
#894 #663047
Где можно почитать про подключение к БД из php для дебилов? ОП даёт ссылку https://habrahabr.ru/post/137664/, но там сразу сбивают с ног какими-то подключениями, расширениями, драйверами и рассчитано явно на того, кто разбирается.

Есть где-нибудь подробный гайд по ПДО для дураков?
>>663049
#895 #663049
>>663064
#896 #663050
>>663044
Я "занимаюсь" с июня прошлого года. Но я настолько тупой, что это просто клиника. Я три месяца учил html|css заметь, даже не пятый, а просто html, с хуем пополам выучил, даже сейчас помню как что верстать. Js пытался учить август-сентябрь. Учил основы: синтаксис, функции, типы объектов, рекурсию, короче, что у ОПа в самоучителе на юкозе, то я и учил, только по js. Но запомнил крайне мало. Остановился на моделях DOM и BOM. Пыху немного учил тем летом тоже. Задачки решил про айфон и айпад. Но потом забил, решил, что рано мне еще серверный язык учить. Потом был перерыв - октябрь-ноябрь-декабрь - работал. Вот сейчас с января опять заново начал решать ОПовский фак, чтобы не отупеть. От js меня, мягко говоря, тошнит, но выучить его время равно надо будет. Вот так. Расскажи теперь о себе, няша.
>>663052>>663212
#897 #663052
>>663050
Учу с конца того года. Занимаюсь по учебнику ОПа. Очень быстро всё забываю, тот же sql учил-учил две недели назад, сейчас с трудом вспоминаю, что к чему. js даже не начинал, пока думаю без него. Срочно берусь за голову начиная с завтра, т.к. деньги кончаются, кушать хочется и надо искать работу, а я даже студентов ещё не делал
>>663060>>663212
#898 #663054
>>660203
Я уже башку сломал над тем какая регулярка должна нормально проверить запятую перед а или но. Намекните более прозрачно.
http://ideone.com/D7XAra
>>663070>>663220
#899 #663060
>>663052
Если ты такой же тупой как и я, то тебе и двух лет не хватит, чтобы все-все выучить в php, что нужно для работы.
>>663062
#900 #663062
>>663060
А для чего ты учишь?
>>663065
#901 #663064
>>663049
У меня в php.ini отсутствует строчка extension=php_pdo.dll. Но в мануале написано, что её не обязательно расскоментировывать. Окей, делаю дальше, как сказано - раском. остальные pdo.

Пробую вызвать из IDE что-нибудь, пишет
HP Warning: PHP Startup: Unable to load dynamic library 'C:\php\php_pdo_firebird.dll'

что это, почему так?
>>663075>>663236
#902 #663065
>>663062
Хочу веб-приложение написать силами html-css-js-php с перспективой транспортировки его на платформу ведра при помощи js.
#903 #663070
>>663054
Сначала исправь предыдущие замечания.
Не для того всё это так расписывается, чтобы ты пропустил мимо ушей.
Не думай, что вот сейчас ты пишешь говнокод, называешь переменные как попало, а потом такой ррраз - и сразу запишешь солидный код.
>>663079
#904 #663075
>>663064
Это значит что PHP не может найти драйвер для твоей базы данных, в данном случае это firebird. Я с firebird не работал, может кто другой подскажет как правильно скачать драйвер для windows-версии, но в линуксе это обычно делалось через apt-get install php5-mysql и т.д.
#905 #663076
Ребят, теперь не знаю как присвоить одноклассникам с ростом выше 169 переменную $number. подсказачка будет?
codepad.org/1kaQzd8w
Grammar Nazi #906 #663077
Посмотрите так надо было делать?
https://ideone.com/Jb2yyO

И еще такой вопрос. Есть к примеру регулярка
"/\b\s\b(а|но)\b/u"
как заставить preg_match не добавлять повторно в результат то что в скобочках?
>>663399>>664778
#907 #663079
>>663070
Замечания не были пропущены, просто я как начал с а|но, так на этом и застопорился.
>>663135
#908 #663090
>>663076
$number - это сколько человек в классе выше анона. Вот и подумай, что с этой переменной надо делать при выполнении условия
if ($height > 169) и кстати зачем писать 169 если у тебя специально заведена переменная $anonHeight = 169;
>>663097
#909 #663091
>>663076
Снова я. Если только так:
http://codepad.org/92PzEJ6e
#910 #663093
>>663076

>codepad.org/1kaQzd8w


Когда пыха определяет, что одноклассник выше анон, то в конце ветки цикла нужно увеличивать переменную на единицу.
>>663097
#911 #663096
>>663091
Молодец, правильно, но можно написать и покороче.
#912 #663097
>>663090
>>663093
спасибо, вот всегда так - спрошу, а пока мне отвечают, то ответ уже сам нахожу >>663091
>>663098
#913 #663098
>>663097
Ты няша-умняша.
#914 #663135
>>663079
Насчёт "нет запятой перед а или но" - забудь на время, что там ищется отсутствие запятой, попробуй написать вот такую регулярку: "слово, пробел, а или но, пробел, слово". Такая регулярка будет срабатывать и на любом другом знаке препинания и не сработает, если пробелов несколько. Поэтому дальше измени её.
Напиши: "слово, отсутствие запятой, как минимум один пробел или много, а или но, один пробел или много пробелов, слово".
Обрати внимания на то, что твой текст не может существовать в таком виде: после "но" точка - достаточно неординарный момент. Но другие знаки вполне могут быть: запятая, многоточие. Поэтому учитывай и этот момент в окончательном варианте регулярки.
Grammar Nazi исправление ошибок #915 #663166
Нормальное решение?
https://ideone.com/cDhLLr
#916 #663169
>>663166
Не очень.
Тонны копипаста:

>$pattern = "/с(десь)/ui";


>$text = preg_replace($pattern, "з$1", $text);


Надо сделать это всё в массиве - все регулярки и все замены.
#917 #663171
>>663166
То есть массив с регулярками и массив с заменами.
Проходиться по тексту в цикле или просто в функции preg_replace.
>>663265
#918 #663175
>>662959

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

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

Я знаю, что есть всякие расщирения для блокировки рекламы или сторонних скриптов - но хочу предупредить, они зачастую написаны очень неэффективно и создают огромную нагрузку на браузер, потому я не хочу ими пользоваться. Вот пример: https://blog.mozilla.org/nnethercote/2014/05/14/adblock-pluss-effect-on-firefoxs-memory-usage/

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

Потому я не используя адблок.
>>663179
#919 #663179
>>663175

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

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

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

Отдельно скажу про рекламу. рекламыный баннер часто создает на странице один или несколько ифреймов, загружает в него свои скрипты, стили. Каждый ифрейм - это фактически как новая вкладка с загруженной страницей. Если на странице 3-4 рекламных блока, каждый создает 2-3 ифрейма с кодом то вы получаете тот же самый эффект если бы открыли в браузере 10 новых вкладок. А теперь объясните почему я должен пускать в свой браузер криворукие поделки быдлокодеров не умеющих в оптимизацию?
>>663185
#920 #663185
>>663179

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

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

Уверен что такой проект при правильном развитии мог бы потеснить существующие сети.
#921 #663194
>>662959

https://habrahabr.ru/post/254217/
Вот еще статья, там раньше была ссылка на сайт где можно было зайти и увидеть свою историю посещний.

Я кстати на яндекс маркет захожу только в приватном режиме.
#922 #663199
>>662997

Нет, это было в честь 1 апреля.
#923 #663204
>>663020

Попробуй в первом запросе убрать COUNT и группировку, то есть сделать

SELECT p.id, p.name, get_likes.id_from, set.likes.id_to FROM ....

А потом сгруппировать на глаз.

COUNT(get_likes.id_from) не считает число человек. Он считает сколько записей в группе имеют get_likes.id_from не равный NULL.

http://phpclub.ru/mysql/doc/group-by-functions.html
>>663384
#924 #663212
>>663050

Вот ты говоришь что учил HTML или JS, а ведь у нас есть хорошие задачки на них. Пройди их, покажи решения, исправь замечания - и будешь верстать как этот анон: http://integer64.github.io/site-layout/exercise/mainTask/index.html

>>663052

Код надо чаще писать чтобы не забывать. Старайся больше задачки решать, можешь всегда попросить дополнительную по какой-то теме.
#925 #663220
>>663054

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

- буква, за ней пробелы, за ней слово а или но, за ним граница слова

В общем, тебе надо больше внимания уделять задачам на регулярки. Нужно понять какие у них есть возможности и как их использовать для решения.
#926 #663236
>>663064

А ты с базой firebird хочешь работыть или например с mysql? Если первое то ищи драйвер firebird для PDO.

Для линукс - искать надо в пакетном менеджере, например в убунте и дебиане эт apt-cache search firebird | grep pdo

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

http://php.net/manual/ru/ref.pdo-firebird.php

В данном случае информации нет.

Далее, иди на PECL и ищи расширение там:

http://php.net/manual/ru/install.pecl.windows.php
http://windows.php.net/downloads/pecl/releases/
http://pecl.php.net/package-search.php?pkg_name=firebird&bool=AND&submit=Search

Увы и там нет ссылки на скопилированную библиотеку.

Тогда остается гугл: https://www.google.ru/search?q=pdo+firebird+windows&btnG=Поиск&newwindow=1&gbv=1

Вот тут пишут http://stackoverflow.com/questions/15857757/load-pdo-firebird-dll что надо установить dll библиотеку из комплекта firebird.
#927 #663265
>>663171
https://ideone.com/cCD3w0

Да так значительно лучше выглядит
>>663318>>664779
Опечаточники #928 #663276
Как вам такой вариант? Имеет место на жизнь?

https://ideone.com/zcqjYI
#929 #663318
>>663265
Вот так неплохо по структуре.
Но сами регулярки не все хороши.

>з(делал|делаю|делан)


Подумай, как можно сократить повторяющиеся части "дела"? Это просто.
>>663276
Зачем усложнять функцией, когда там такое же решение возможно, как и с Граммар Наци?
Чужие решения могут быть хороши только тогда, когда ты реально долго сидишь над задачей.
Наводящие подсказки в треде и собственное решение лучше, чем вот подобная переделка.
Не злоупотребляй этим.
>>663399>>664779
#930 #663363
В чем разница между SQL, MySQL и noSQL простыми словами? И какие есть еще?
>>663373
#931 #663373
>>663363

SQL - язык написания запросов для доступа к данным в базе
MySQL - сервер базы данных, поддерживающий язык SQL для доступа к ним
NoSQL - технологии хранилищ данных, не поддерживающих язык SQL
>>663383
#932 #663383
>>663373
Cпасибо, понял. А по каким учебникам вы учите SQL?
>>663393>>663394
68 Кб, 512x602
#933 #663384
>>663204
Без COUNT и группировки он показывает, что get_, что set_ одинаковыми. Я, скорее всего, как-то с джойном накосячил.

>COUNT(get_likes.id_from) не считает число человек. Он считает сколько записей в группе имеют get_likes.id_from не равный NULL.


Это я понимаю. Поэтому приравниваю id из таблицы people сначала к id_from, а потом к id_to.
>>663496
#934 #663393
>>663383
В ОП-посте ссылка на гитхаб по MySQL.
#935 #663394
>>663383
5 часов хватит чтобы знать SQL на среднем уровне. При наличии толкового учебника.

На высшем уровне - на это уйдет несколько месяцев, надо сначала смотреть на СУБД в которой этот SQL используется.
#936 #663399
>>663318

>Подумай, как можно сократить повторяющиеся части "дела"


В голову только такое пришло.
/з(дела(л|ю|н))/ui

Посты с заданием в теме
>>661918
>>662886
>>662916
>>663077
>>663166
>>663276

Это всё моё. Решение нигде не подсматривал.
Изврат с preg_replace_callback это единственное до чего додумался. Либо использовать несколько регулярок для варианта когда слово начинается с латинской буквы и что делать если при этом в слове есть еще латинские буквы да еще и идущие друг за другом. И вариант когда слово начинается на букву с кириллицы
>>663452
Клавиша shift. экзамента на получение 2 левела #937 #663444
Опять через preg_replace_callback. Нормально так или нет?

https://ideone.com/YG8V0O
>>663452>>664780
#938 #663452
>>663399
Задача про Айпад в кредит, например, пару недель назад анон делал именно так - вплоть до названия переменных.
Как хочешь, так и поступай.

>/з(дела(л|ю|н))/ui


Так лучше.
>>663444
Ну вот, ты снова?..
>>663486
56 Кб, 547x604
#939 #663458
Наверное, не туда пишу, но все же. Я хочу стать программистом. ололо, кто бы поверил! И я считаю, что домашнего обучения мне мало, мне нужно, чтобы мне втирал информацию человек, как лосьон в кожу. Я бы с радостью пошел на вышку и превозмогал бы, несмотря на свое гуманитариеблядство, но в егэ у меня рус-мат-био-общ, все, кроме такой важной информатики. Но: можно пойти на курсы. И из этого следует самый главный вопрос, суть всего поста: чего стоит человек, получивший лицензию программиста на курсах? А дополнительные вопросы такие:
1. очевидно, что клепание сайтов это не предел мечтаний, вопрос: что можно будет делать при помощи js/php/sql, кроме сайтов?
2. если я буду ходить на курсы программирования, я буду лучше себя самого, чем если бы я просто учил сам, но хуже, чем если бы я учился в универе, да? Краткий алгоритм сравнения: самообразование < курсы < вуз.

Все эти вопросы скорее риторические, чем практические, поэтому я полагаю, что вряд ли получу на них определенный ответ, потому что если бы у меня были задатки хорошего программиста, я бы сразу знал, что мне делать. Но все же я надеюсь на ответы дочитавших мою масту до конца. Спасибо.
>>663500>>663924
#940 #663471
>>662408
Примерно понял что должен делать скрипт, только вот с wsdl и xml-schema не знаком, с xml знаком, про shema слышал но не знаю что это такое. Я так понял надо взять данные из базы данных и придать им xml структуру, а дальше куда-то вывести. Собственно то, что я описал я делал, писал парсеры для определённых сайтов, которые добавляли статьи в базу данных, а потом формировал из них rss в формате xml. С xml-schema думаю смогу быстро познакомиться, если тебя ещё интересует этот скрипт, может не против будешь дать мне попробовать это сделать? Вот моя почта если что vladiPK}mir.pankratov1ANUSg-zDmailPUNCTUM|+Pcom
#941 #663486
>>663452

> Айпад в кредит, например, пару недель назад анон делал именно так


Ну не знаю. Вот про этот мой вариант >>661918 про айфон, ты написал, что нормальное решение. Айпад это же по сути то-же самое, только расчет обернул в функцию, для вызова под каждый банк. Переменные я обзываю через гугл транслит поскольку с английским у меня все сложно.
#942 #663496
>>663384

Нет, ты пока не понимаешь.

Джойн дает все возможные комбинации записей из таблиц (с учетом условий в ON).

WHERE (тут его нет) отсеивает записи не соответствующие условию.

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

COUNT считает число значений в группе, не равных NULL. Очевидно что в твоей таблице оба каунта дадут одно и то же число, и не то что тебе надо.

Перечитай внимательно ссылку выше http://phpclub.ru/mysql/doc/group-by-functions.html

> Поэтому приравниваю id из таблицы people сначала к id_from, а потом к id_to.


ON просто задает условие объединения таблиц (без него приджойнятся все записи во всех возможных осчетаниях).

Почитай где-нибудь еще про джойны тогда.
>>663816
#943 #663500
>>663458
1. PHP — можно писать serverside-api, т.е. штуку которая будет предоставлять данные по сети клиентам без браузера, но игру или видеоплеер на нём не написать. JS — кое-где используется для написания плагинов. SQL — опять же отдельная песня, можно стать DBA и настраивать базы данных.
2. Универ даст тебе хорошую матешу, если не будешь лениться и учить её, матеша не сделает тебя супер мега кодером, но в то же время сделает, потому что мозги упорядочит. А уровень собственно программирования в универах не совсем коммерческий. Поэтому, курсы хороши тем, что покажут тебе коммерческую разработку.

И да, таки, тебе нужно превозмогать себя и налегать на самообразование, потому что в программировании только так — нельзя что-то выучить и до гроба это использовать, периодически нужно будет что-то учить.
>>663939
#944 #663503
>>661137
$orders = array("name", "surname", "qroupNumber", "points");
$key = array_search($sort, $orders);
$sort = $orders[$key];
$query = "SELECT * FROM abiturient ORDER BY $sort DESC LIMIT :recordsPerPage OFFSET :recordNumber";
$stmt->bindValue(':recordsPerPage', $recordsPerPage);
$stmt->bindValue(':recordNumber', $recordNumber);
$stmt->execute();
$stmt->setFetchMode(PDO::FETCH_CLASS, 'Abiturient');
$abiturients = $stmt->fetchAll();
return $abiturients;

Ну вот, я это как бы делаю. И все плейсхолдеры после переменной ломаются. Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens' in
>>663515>>663594
#945 #663515
>>663503
SELECT FROM files WHERE name = :name_bind - Будет работать
SELECT FROM files WHERE name = Name LIMIT :limit - не будет работать

В твоем случае подставляй значение из переменной, только не забудь сделать защиту от SQL-инъекций, как написали выше.
>>663594
#946 #663563
А как сделать так, чтобы человек мог пользоваться определённой функцией на сайте только один раз в сутки? Я понимаю что можно повесить куки, но он же может зайти с другого браузера, то же самое и с ip, как сделать так, чтобы один компьютер, мог только раз воспользоваться этой функцией, и даже, чтобы Тор не помог это обойти?
>>663927
http://integer64.github.io/site-layout/exercise/mainTask/index.html #947 #663571
>>656503

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

Если не знаешь, чем дальше заняться, смотри в сторону JS и DOM.
>>663573
#948 #663573
>>663571

Вот кстати ты у нас хорошо справляешься, сделал бы сапера (задание на JS) с разделением на MVC.
>>663669
Ответы 16-17 февр #949 #663576
>>656608

> $textarray= preg_split("//u",$text);


Там надо писать preg_split("//u", $text, null, PREG_SPLIT_NO_EMPTY); чтобы не было пустых строк с краев массива.

Переменные названы неудачно. Что за textarray? Это буквы, то есть letters.

> $text1


Плохое название, наверно надо было написать reversedText

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

Чтобы перевернуть массив, есть функция array_reverse, цикл не требуется.

> PHP Notice: Undefined variable: text1 in /home/T3bwmT/prog.php on line 14


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

В общем, код требует улучшений.

>>656745
>>656789

Определение результата можно сделать так: сделать переменную, положить в нее 1, если буквы не совпали то положить 0, а в конце проверить ее значение.

Это получается проще чем городить сложные конструкции и сравнивать чему там равно $i.
Ответы 16-17 февр #949 #663576
>>656608

> $textarray= preg_split("//u",$text);


Там надо писать preg_split("//u", $text, null, PREG_SPLIT_NO_EMPTY); чтобы не было пустых строк с краев массива.

Переменные названы неудачно. Что за textarray? Это буквы, то есть letters.

> $text1


Плохое название, наверно надо было написать reversedText

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

Чтобы перевернуть массив, есть функция array_reverse, цикл не требуется.

> PHP Notice: Undefined variable: text1 in /home/T3bwmT/prog.php on line 14


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

В общем, код требует улучшений.

>>656745
>>656789

Определение результата можно сделать так: сделать переменную, положить в нее 1, если буквы не совпали то положить 0, а в конце проверить ее значение.

Это получается проще чем городить сложные конструкции и сравнивать чему там равно $i.
Ответы 16-17 февр #950 #663577
>>657286

> http://ideone.com/cB8GtS


Ок, все верно

> http://ideone.com/DUWAUE


Правильно

> http://ideone.com/qVRE0L


Все верно

> http://ideone.com/kk7HZW


Тут тоже все правильно

>>657353

В public только те файлы, к которым можно обращаться напрямую. Шаблон вызывается из контроллера и в public ему делать нечего.
https://github.com/someApprentice/Students/ #951 #663578
>>657591

О, ты стал писать нормальные описания к коммитам? Хорошо. Теперь если ты захочешь вспомнить "а что я делал в январе" или "зачем я дописал эту строчку", git log тебе напомнит. Когда пишешь один, это может не так актуально, а вот в больших проектах помогает разбираться в чужих правках.

Можешь тогда еще README.md добавить, написав что это за проект и как его установить. Пример: https://github.com/V3N0m21/Uppu4/blob/master/readme.md

> Essence


Это обычно называют Entity или Model. Я обычно не придираюсь к переводу, но это просто важное слово.

Далее, контроллер у тебя называется class RegisterAction. Action значит "действие", то есть например логин или регистрация это одно действие, а у тебя в классе их почему-то два. Надо либо 2 класса либо переименовать класс в "контроллер", а в нем сделать signupAction, registerAction

Я вообще не очень понимаю, как использовать твой контроллер. Вот есть допустим публичный метод SignUp c кучей параметров - а почему он публичный? Кто его вызывает?

Далее, контроллеры должны быть тонкими так как код в них нельзя исплоьзовать повторно.

Вот эту вот стену текста

https://github.com/someApprentice/Students/blob/6471191b2bd63bb5aa3205369cfb26adb5a0067d/app/Controller/RegisterAction.php#L27

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

> public function SignUp($name, $surname, $gender, $grupnumber, $email, $satscores, $yearofbirth, $location, $password) {


Не надо делать так много аргументов, это же нечитаемо. Передавай модель студента.

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

> protected $studentgtw;


Разделяй слова кемелкейсом

Что такое MVC? Модель хранит и изменяет данные, контроллер обрабатывает запрос от пользователя. Контроллер должен быть тонким и все, что можно обобщить и абстрагировать, надо из него выносить.

Вот например это:

> $salt = $this->reghelper->generateSalt(); //getRegHelper() будет лучше?


> $hash = $this->reghelper->hashPassword($password, $salt);


> $token = $this->reghelper->generateToken();



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

Представь такую ситуацию: нам по каким-то причинам нужна вторая страница регистрации, со своим контроллером и формой (другого вида). Или страница смены имени и фамилии. Или смены email. А еще нам нужен скрипт который берет массив имен и заполняет базу студентами на их основе. Много ли кода придется копипастить? В твоем случае - много, смотри:

- нужно скопипастить стену из 10 методов валидации полей
- нужно скопипастить код который генерирует токены и пароли
- может еще что-то

Или например у нас есть объект студента, мы хотим узнать, правильно ли он заполнен (например мы меняем правила валидации и хотим проверить, соответствуют ли старые записи в базе им). Много ли кода придется написать? Да, придется скопипастить стену текста из контроллера.

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

Чтобы лучше это усвоить, напиши скрипт для командной строки, который генерирует студента, сохраняет в базу и выводит его данные. Имена и другие данные можно сгенерировать с помощью https://github.com/fzaninotto/Faker

Далее напиши скрипт, проверяющий студентов в базе на текущие правила валидации и выводящего для ошибочных записей id и ошибки.

Для таких скриптов сделай отдельную папку.

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

> $name = isset($_POST['name']) && is_scalar($_POST['name']) ? $_POST['name'] : '';


> $surname = isset($_POST['surname']) && is_scalar($_POST['surname']) ? $_POST['surname'] : '';


Эту унылую копипасту надо заменить циклом.

> https://github.com/someApprentice/Students/blob/6471191b2bd63bb5aa3205369cfb26adb5a0067d/app/Model/Essence/Student.php#L17


> public function __construct($name, $surname, $gender, $grupnumber, $email, $satscores, $yearofbirth, $location, $hash, $salt, $token) {


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

У моделей обычно делают пустой конструктор.

> protected $yearofbirth;


Надо разделять слова camelcase

> public function setName($student) {


Посмотри рекомендации PSR-1 и 2, и проверь, как ставится скобка после имени функции

> https://github.com/someApprentice/Students/blob/6471191b2bd63bb5aa3205369cfb26adb5a0067d/app/Model/Gateway/StudentGateway.php#L10


> $connect = $this->getPdo();


Одинаковые вещи лучше называть одинаково

> $user->bindValue(':id', $id, \PDO::PARAM_STR);


Почему id это строка?

> public function getStudentById($id) {


Почему метод возвращает массив, а не модель студента? Чем массив удобнее?

> $user->execute();


Странное название переменной user.

> public function getStudentByName($name) {


> public function getStudentBySurname($surname) {


> public function getStudentByEmail($email) {


Эти функции скопированы. Избавься от копипасты, например сделав универсальную функцию поиска.

https://github.com/someApprentice/Students/blob/6471191b2bd63bb5aa3205369cfb26adb5a0067d/app/Model/Gateway/StudentGateway.php#L103

> return $insert;


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

https://github.com/someApprentice/Students/blob/6471191b2bd63bb5aa3205369cfb26adb5a0067d/app/Model/Validators/Validations.php#L24

> if ($gender != "Man" and $gender = "Woman") {


Нужны константы

> if (mb_strlen($grupnumber) < 2) {


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

https://github.com/someApprentice/Students/blob/6471191b2bd63bb5aa3205369cfb26adb5a0067d/app/Model/Validators/Validations.php#L51

> if (!preg_match('/^([.\\w-]{2,127})@


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

> if (!preg_match('/^\\d{2}$|^\\d{4}$/', $yearofbirth, $matches)) {


Почему позволяешь год хранить в базе в разных форматах? Как потом искать например по году?

> public function isNameInvalid($login) {


> "Incorrect login type


Не соответствие названия поля

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

https://github.com/someApprentice/Students/blob/6471191b2bd63bb5aa3205369cfb26adb5a0067d/app/config.ini
Что-то как-то сложно. Почему настройки БД разнесены по 2 группам?

> label {


> display: block;


Очень странный стиль. почему ты хочешь сделать все label на всех страницах блоками?

> span {


> color: red;


И почему все спаны на всех страницах должны быть красными?

> name` varchar(20) COLLATE utf8_bin NOT NULL,


Почему сравнение с учетом регистра?

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

В форме нет HTML5 валидации.
https://github.com/someApprentice/Students/ #951 #663578
>>657591

О, ты стал писать нормальные описания к коммитам? Хорошо. Теперь если ты захочешь вспомнить "а что я делал в январе" или "зачем я дописал эту строчку", git log тебе напомнит. Когда пишешь один, это может не так актуально, а вот в больших проектах помогает разбираться в чужих правках.

Можешь тогда еще README.md добавить, написав что это за проект и как его установить. Пример: https://github.com/V3N0m21/Uppu4/blob/master/readme.md

> Essence


Это обычно называют Entity или Model. Я обычно не придираюсь к переводу, но это просто важное слово.

Далее, контроллер у тебя называется class RegisterAction. Action значит "действие", то есть например логин или регистрация это одно действие, а у тебя в классе их почему-то два. Надо либо 2 класса либо переименовать класс в "контроллер", а в нем сделать signupAction, registerAction

Я вообще не очень понимаю, как использовать твой контроллер. Вот есть допустим публичный метод SignUp c кучей параметров - а почему он публичный? Кто его вызывает?

Далее, контроллеры должны быть тонкими так как код в них нельзя исплоьзовать повторно.

Вот эту вот стену текста

https://github.com/someApprentice/Students/blob/6471191b2bd63bb5aa3205369cfb26adb5a0067d/app/Controller/RegisterAction.php#L27

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

> public function SignUp($name, $surname, $gender, $grupnumber, $email, $satscores, $yearofbirth, $location, $password) {


Не надо делать так много аргументов, это же нечитаемо. Передавай модель студента.

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

> protected $studentgtw;


Разделяй слова кемелкейсом

Что такое MVC? Модель хранит и изменяет данные, контроллер обрабатывает запрос от пользователя. Контроллер должен быть тонким и все, что можно обобщить и абстрагировать, надо из него выносить.

Вот например это:

> $salt = $this->reghelper->generateSalt(); //getRegHelper() будет лучше?


> $hash = $this->reghelper->hashPassword($password, $salt);


> $token = $this->reghelper->generateToken();



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

Представь такую ситуацию: нам по каким-то причинам нужна вторая страница регистрации, со своим контроллером и формой (другого вида). Или страница смены имени и фамилии. Или смены email. А еще нам нужен скрипт который берет массив имен и заполняет базу студентами на их основе. Много ли кода придется копипастить? В твоем случае - много, смотри:

- нужно скопипастить стену из 10 методов валидации полей
- нужно скопипастить код который генерирует токены и пароли
- может еще что-то

Или например у нас есть объект студента, мы хотим узнать, правильно ли он заполнен (например мы меняем правила валидации и хотим проверить, соответствуют ли старые записи в базе им). Много ли кода придется написать? Да, придется скопипастить стену текста из контроллера.

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

Чтобы лучше это усвоить, напиши скрипт для командной строки, который генерирует студента, сохраняет в базу и выводит его данные. Имена и другие данные можно сгенерировать с помощью https://github.com/fzaninotto/Faker

Далее напиши скрипт, проверяющий студентов в базе на текущие правила валидации и выводящего для ошибочных записей id и ошибки.

Для таких скриптов сделай отдельную папку.

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

> $name = isset($_POST['name']) && is_scalar($_POST['name']) ? $_POST['name'] : '';


> $surname = isset($_POST['surname']) && is_scalar($_POST['surname']) ? $_POST['surname'] : '';


Эту унылую копипасту надо заменить циклом.

> https://github.com/someApprentice/Students/blob/6471191b2bd63bb5aa3205369cfb26adb5a0067d/app/Model/Essence/Student.php#L17


> public function __construct($name, $surname, $gender, $grupnumber, $email, $satscores, $yearofbirth, $location, $hash, $salt, $token) {


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

У моделей обычно делают пустой конструктор.

> protected $yearofbirth;


Надо разделять слова camelcase

> public function setName($student) {


Посмотри рекомендации PSR-1 и 2, и проверь, как ставится скобка после имени функции

> https://github.com/someApprentice/Students/blob/6471191b2bd63bb5aa3205369cfb26adb5a0067d/app/Model/Gateway/StudentGateway.php#L10


> $connect = $this->getPdo();


Одинаковые вещи лучше называть одинаково

> $user->bindValue(':id', $id, \PDO::PARAM_STR);


Почему id это строка?

> public function getStudentById($id) {


Почему метод возвращает массив, а не модель студента? Чем массив удобнее?

> $user->execute();


Странное название переменной user.

> public function getStudentByName($name) {


> public function getStudentBySurname($surname) {


> public function getStudentByEmail($email) {


Эти функции скопированы. Избавься от копипасты, например сделав универсальную функцию поиска.

https://github.com/someApprentice/Students/blob/6471191b2bd63bb5aa3205369cfb26adb5a0067d/app/Model/Gateway/StudentGateway.php#L103

> return $insert;


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

https://github.com/someApprentice/Students/blob/6471191b2bd63bb5aa3205369cfb26adb5a0067d/app/Model/Validators/Validations.php#L24

> if ($gender != "Man" and $gender = "Woman") {


Нужны константы

> if (mb_strlen($grupnumber) < 2) {


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

https://github.com/someApprentice/Students/blob/6471191b2bd63bb5aa3205369cfb26adb5a0067d/app/Model/Validators/Validations.php#L51

> if (!preg_match('/^([.\\w-]{2,127})@


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

> if (!preg_match('/^\\d{2}$|^\\d{4}$/', $yearofbirth, $matches)) {


Почему позволяешь год хранить в базе в разных форматах? Как потом искать например по году?

> public function isNameInvalid($login) {


> "Incorrect login type


Не соответствие названия поля

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

https://github.com/someApprentice/Students/blob/6471191b2bd63bb5aa3205369cfb26adb5a0067d/app/config.ini
Что-то как-то сложно. Почему настройки БД разнесены по 2 группам?

> label {


> display: block;


Очень странный стиль. почему ты хочешь сделать все label на всех страницах блоками?

> span {


> color: red;


И почему все спаны на всех страницах должны быть красными?

> name` varchar(20) COLLATE utf8_bin NOT NULL,


Почему сравнение с учетом регистра?

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

В форме нет HTML5 валидации.
>>663737
Ответы 17 февр, сапер #952 #663580
>>657761

Просто флудить стали много

>>657766

> this._table.oncontextmenu = function(){


Если ты отменяешь действие mousedown то это не должно требоваться.

Я кстати тут подумал: вот ты сделал все одним классом - а разбить на контроллер/модель/представление или на представление и модель не хочешь? Чтобы оторвать логику и внутреннюю модель игры от DOM?

Если тебе это интересно, вот ссылки

http://design-pattern.ru/patterns/mvc.html
https://ru.wikipedia.org/wiki/Model-View-Controller
http://rsdn.ru/article/patterns/generic-mvc.xml (сложно!)

К примеру в методе open у тебя перемешаны обращения к DOM и работа со внутренними структурами данных. Нет разделения. Хотя оно в этой задаче и не требуется, но может ты хочешь лучше разобраться в MVC и как это делется в более сложных приложениях. Для тебя, я вижу, эта задача очень простая оказалась - почему бы не поломать голову.

> MineField.prototype.generate


Правильнее generateIfNeeded или generateIfFirstTime, чтобы была понятна логика работы функции

> while(this.checkForBomb(x,y) || (x == firstClicked[0] && y == firstClicked[1])){


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

> var x = Math.floor(Math.random()9);


> while


> x = Math.floor(Math.random()9);


Копипаста же - поменяй тип цикла на do/while.

> x == firstClicked[0]


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

> MineField.prototype.checkForBomb = function(x,y)


Просто для развития кругозора. Сейчас у тебя проверка имеет сложность O(N) и скорость зависит от числа бомб. Хотя в игре вряд ли будут сотни тысяч бомб, но не мог бы ты сделать проверку со сложностью O(1)?

> if(row){


> for(var n = -1; n<=1; n++){


> var cell = row.cells[x+n];


> if(cell){


Слишком большая вложенность. Переверни if чтобы было if (!row) ...

Для table надо добавить правило table-layout: fixed чтобы отключить алгоритмы автоматического растягивания таблицы в зависимости от содержимого. Помни что в таблицах height/width обозначают min-heigth/min-width.

> MineField.prototype.popup


Названия функций начинаются с глагола.

> pop.firstChild.data=pop.firstChild.data.replace('{{text}}', text);


Это как-то сложно и неправильно. Зачему надо делать пока HTMl у нас в виде строки. А в твоем варианте нельзя перенести {{text}} в любое место шаблона.

> var button = pop.querySelector('.new-game');


Лучше искать от корня попапа, а то привязываешься к структуре HTML в нем.

А еще, а функцию popup() можно вызвать несколько раз подряд?

> this.removeOpenedCells();


> this.removeBombCells();


> this.removeFlaggedCells();


Стоит объединить эти функции в одну общую, там все равно копипаста.

Вообще, неплохо решено, но я вижу для тебя это простая задачка, может попробуешь отделить модель от DOM?
Ответы 17 февр, сапер #952 #663580
>>657761

Просто флудить стали много

>>657766

> this._table.oncontextmenu = function(){


Если ты отменяешь действие mousedown то это не должно требоваться.

Я кстати тут подумал: вот ты сделал все одним классом - а разбить на контроллер/модель/представление или на представление и модель не хочешь? Чтобы оторвать логику и внутреннюю модель игры от DOM?

Если тебе это интересно, вот ссылки

http://design-pattern.ru/patterns/mvc.html
https://ru.wikipedia.org/wiki/Model-View-Controller
http://rsdn.ru/article/patterns/generic-mvc.xml (сложно!)

К примеру в методе open у тебя перемешаны обращения к DOM и работа со внутренними структурами данных. Нет разделения. Хотя оно в этой задаче и не требуется, но может ты хочешь лучше разобраться в MVC и как это делется в более сложных приложениях. Для тебя, я вижу, эта задача очень простая оказалась - почему бы не поломать голову.

> MineField.prototype.generate


Правильнее generateIfNeeded или generateIfFirstTime, чтобы была понятна логика работы функции

> while(this.checkForBomb(x,y) || (x == firstClicked[0] && y == firstClicked[1])){


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

> var x = Math.floor(Math.random()9);


> while


> x = Math.floor(Math.random()9);


Копипаста же - поменяй тип цикла на do/while.

> x == firstClicked[0]


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

> MineField.prototype.checkForBomb = function(x,y)


Просто для развития кругозора. Сейчас у тебя проверка имеет сложность O(N) и скорость зависит от числа бомб. Хотя в игре вряд ли будут сотни тысяч бомб, но не мог бы ты сделать проверку со сложностью O(1)?

> if(row){


> for(var n = -1; n<=1; n++){


> var cell = row.cells[x+n];


> if(cell){


Слишком большая вложенность. Переверни if чтобы было if (!row) ...

Для table надо добавить правило table-layout: fixed чтобы отключить алгоритмы автоматического растягивания таблицы в зависимости от содержимого. Помни что в таблицах height/width обозначают min-heigth/min-width.

> MineField.prototype.popup


Названия функций начинаются с глагола.

> pop.firstChild.data=pop.firstChild.data.replace('{{text}}', text);


Это как-то сложно и неправильно. Зачему надо делать пока HTMl у нас в виде строки. А в твоем варианте нельзя перенести {{text}} в любое место шаблона.

> var button = pop.querySelector('.new-game');


Лучше искать от корня попапа, а то привязываешься к структуре HTML в нем.

А еще, а функцию popup() можно вызвать несколько раз подряд?

> this.removeOpenedCells();


> this.removeBombCells();


> this.removeFlaggedCells();


Стоит объединить эти функции в одну общую, там все равно копипаста.

Вообще, неплохо решено, но я вижу для тебя это простая задачка, может попробуешь отделить модель от DOM?
Ответы 17-18 февр #953 #663581
>>657810

Перенес в последний урок просто, так как ее рановато решать сразу после ООП. Лучше со студентов начать наверно.

>>657868

Неправильно. Во втором банке ответ должен быть около 61270 выплачено всего. Также, ты скопипастил функцию расчета 2 раза - надо объединить эти 2 функции в одну.

>>658296

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

>>658501

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

> if ($creditBalance > 5000) {


> } elseif ($creditBalance < 5000) {


А если ровно 5000?
#954 #663587
>>658572

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



$oldArray['key'] = $newArray;
$oldArray[] = $newArray;

> unset($paths[$start][$points]);


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

> Просто так массив набиваю, а при следующем вызове функции он уничтожается, наполняется заново.


У тебя же в начале функции стоит очистка переменной:

$allTraversedPaths = array();

> $traversedPath[$i] = $start;


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

> foreach($paths[$start] as $points => $value)


Надо переменные называть правильно, а то код тяжело читать. ЧТо за value? Почему points во множественном числе?

> $start = $points;


Вот смотри, ты в цикле меняешь start и из-за этого на втором шаге вот эти строчки

> $period = $paths[$start][$points]['time'];


Дают совсем не то что надо. Поставь внутри цикла echo и выводи значения переменных, смотри и проверяй какие там значения.
#954 #663587
>>658572

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



$oldArray['key'] = $newArray;
$oldArray[] = $newArray;

> unset($paths[$start][$points]);


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

> Просто так массив набиваю, а при следующем вызове функции он уничтожается, наполняется заново.


У тебя же в начале функции стоит очистка переменной:

$allTraversedPaths = array();

> $traversedPath[$i] = $start;


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

> foreach($paths[$start] as $points => $value)


Надо переменные называть правильно, а то код тяжело читать. ЧТо за value? Почему points во множественном числе?

> $start = $points;


Вот смотри, ты в цикле меняешь start и из-за этого на втором шаге вот эти строчки

> $period = $paths[$start][$points]['time'];


Дают совсем не то что надо. Поставь внутри цикла echo и выводи значения переменных, смотри и проверяй какие там значения.
#955 #663594
>>663515

> SELECT FROM files WHERE name = Name LIMIT :limit - не будет работать



Будет работать если в bindValue() явно указать тип INT и передать не строку, а int.

>>663503

> $stmt->bindValue(':recordsPerPage', $recordsPerPage);


Где ты берешь stmt? Из кода не видно.
#956 #663604
Интересно, нашел в одном из исходников Хромиума такую штуку: https://chromium.googlesource.com/arc/arc/+/master/src/build/whitespace_file.txt

файл, в который дописывают всякую ерунду чтобы перезапустить сборку.
#957 #663669
>>663573
Как только learn.javascript.ru добью, попробую
Yoda Speak #958 #663720
>>664780
#959 #663737
>>663578

>Я вообще не очень понимаю, как использовать твой контроллер. Вот есть допустим публичный метод SignUp c кучей параметров - а почему он публичный? Кто его вызывает?


А если метод будет закрытый будет понятней что он вызывается после метода register()?

>>663578

>Вот эту вот стену текста


>


>https://github.com/someApprentice/Students/blob/6471191b2bd63bb5aa3205369cfb26adb5a0067d/app/Controller/RegisterAction.php#L27


>


>надо унести в валидатор - чтобы ты мог дать например модель студента на вход, а он вернул все найденные ошибки. Да и стоит подумать, не сделать ли это циклом.


Я хотел вызывать эти методы в методе изменения свойств Студента

function setName($name) {
$error = $validations->isNameInvalid($name);

...
}

>>663578

>> public function setName($student) {


>Посмотри рекомендации PSR-1 и 2, и проверь, как ставится скобка после имени функции


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

>>663578

>> https://github.com/someApprentice/Students/blob/6471191b2bd63bb5aa3205369cfb26adb5a0067d/app/Model/Gateway/StudentGateway.php#L10


>> $connect = $this->getPdo();


>Одинаковые вещи лучше называть одинаково


Не понял, какие одинаковые вещи? $connect нужно переименовать в $pdo?

>>663578

>> public function getStudentByName($name) {


>> public function getStudentBySurname($surname) {


>> public function getStudentByEmail($email) {


>Эти функции скопированы. Избавься от копипасты, например сделав универсальную функцию поиска.


Не понимаю как она должна работать. Допустим кто-то хочет зарегистрироваться под именем Ivan, и в базе уже есть пользователь с таким именем, универсальная функция всегда будет выдавать ошибку... Хотя, я могу написать функцию которая будет принимать в аргумент название столбца, но не будет ли это лишним усложнением? Придется писать вот так в запросе "SELECT * FROM students WHERE {$columnName}=:{$columnName}". С этим все хорошо? Мне почему-то не нравится это.

>>663578

>https://github.com/someApprentice/Students/blob/6471191b2bd63bb5aa3205369cfb26adb5a0067d/app/Model/Validators/Validations.php#L51


>> if (!preg_match('/^([.\\w-]{2,127})@


>А ты читал статьи про валидацию email, ссылки на которые есть в комментариях к задаче?


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

>>663578

>> if (!preg_match('/^\\d{2}$|^\\d{4}$/', $yearofbirth, $matches)) {


>Почему позволяешь год хранить в базе в разных форматах? Как потом искать например по году?


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

>>663578

>https://github.com/someApprentice/Students/blob/6471191b2bd63bb5aa3205369cfb26adb5a0067d/app/config.ini


>Что-то как-то сложно. Почему настройки БД разнесены по 2 группам?


Потому что удобнее чтобы был массив db_dsn и отдельно от него значения пользователя и пароля.

Я видел как ты предлагал писать всё в одной группе >>657355 , но мне мне при создании PDO пришлось бы писать

$pdo = new PDO(arary('mysql:host' . $config['host'], $config['user']), ...);

>'mysql:host' . $config['host']


Я не хочу писать так. Мне не нравится этот метод записи.

>>663578

>> label {


>> display: block;


>Очень странный стиль. почему ты хочешь сделать все label на всех страницах блоками?


>


>> span {


>> color: red;


>И почему все спаны на всех страницах должны быть красными?


Это было только для наглядности сделано. Все равно страница пока что одна, и все равно я не очень разбираюсь в css чтобы заморачиваться.
#959 #663737
>>663578

>Я вообще не очень понимаю, как использовать твой контроллер. Вот есть допустим публичный метод SignUp c кучей параметров - а почему он публичный? Кто его вызывает?


А если метод будет закрытый будет понятней что он вызывается после метода register()?

>>663578

>Вот эту вот стену текста


>


>https://github.com/someApprentice/Students/blob/6471191b2bd63bb5aa3205369cfb26adb5a0067d/app/Controller/RegisterAction.php#L27


>


>надо унести в валидатор - чтобы ты мог дать например модель студента на вход, а он вернул все найденные ошибки. Да и стоит подумать, не сделать ли это циклом.


Я хотел вызывать эти методы в методе изменения свойств Студента

function setName($name) {
$error = $validations->isNameInvalid($name);

...
}

>>663578

>> public function setName($student) {


>Посмотри рекомендации PSR-1 и 2, и проверь, как ставится скобка после имени функции


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

>>663578

>> https://github.com/someApprentice/Students/blob/6471191b2bd63bb5aa3205369cfb26adb5a0067d/app/Model/Gateway/StudentGateway.php#L10


>> $connect = $this->getPdo();


>Одинаковые вещи лучше называть одинаково


Не понял, какие одинаковые вещи? $connect нужно переименовать в $pdo?

>>663578

>> public function getStudentByName($name) {


>> public function getStudentBySurname($surname) {


>> public function getStudentByEmail($email) {


>Эти функции скопированы. Избавься от копипасты, например сделав универсальную функцию поиска.


Не понимаю как она должна работать. Допустим кто-то хочет зарегистрироваться под именем Ivan, и в базе уже есть пользователь с таким именем, универсальная функция всегда будет выдавать ошибку... Хотя, я могу написать функцию которая будет принимать в аргумент название столбца, но не будет ли это лишним усложнением? Придется писать вот так в запросе "SELECT * FROM students WHERE {$columnName}=:{$columnName}". С этим все хорошо? Мне почему-то не нравится это.

>>663578

>https://github.com/someApprentice/Students/blob/6471191b2bd63bb5aa3205369cfb26adb5a0067d/app/Model/Validators/Validations.php#L51


>> if (!preg_match('/^([.\\w-]{2,127})@


>А ты читал статьи про валидацию email, ссылки на которые есть в комментариях к задаче?


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

>>663578

>> if (!preg_match('/^\\d{2}$|^\\d{4}$/', $yearofbirth, $matches)) {


>Почему позволяешь год хранить в базе в разных форматах? Как потом искать например по году?


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

>>663578

>https://github.com/someApprentice/Students/blob/6471191b2bd63bb5aa3205369cfb26adb5a0067d/app/config.ini


>Что-то как-то сложно. Почему настройки БД разнесены по 2 группам?


Потому что удобнее чтобы был массив db_dsn и отдельно от него значения пользователя и пароля.

Я видел как ты предлагал писать всё в одной группе >>657355 , но мне мне при создании PDO пришлось бы писать

$pdo = new PDO(arary('mysql:host' . $config['host'], $config['user']), ...);

>'mysql:host' . $config['host']


Я не хочу писать так. Мне не нравится этот метод записи.

>>663578

>> label {


>> display: block;


>Очень странный стиль. почему ты хочешь сделать все label на всех страницах блоками?


>


>> span {


>> color: red;


>И почему все спаны на всех страницах должны быть красными?


Это было только для наглядности сделано. Все равно страница пока что одна, и все равно я не очень разбираюсь в css чтобы заморачиваться.
>>663746
#961 #663746
>>663737

> А если метод будет закрытый будет понятней что он вызывается после метода register()?



Будет понятно что снаружи его не вызвать.

> Я хотел вызывать эти методы в методе изменения свойств Студента


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

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

> $connect нужно переименовать в $pdo?


да

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


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

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


Лишнее усложнение это когда код раздут в 4 раза копированием.

> =:{$columnName}


Тут не нужна переменная

> Мне почему-то не нравится это.


По идее можно бы использовать query builder для такого случая но это реально будет усложнением

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


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


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

> но мне мне при создании PDO пришлось бы писать


> Я не хочу писать так. Мне не нравится этот метод записи.


Чем он тебе не нравится? Я вот например не вижу логики, почему настройки базы данных разнесены на 2 группы и еще и записаны в каком-то странном виде. Какой еще dsn? Обычно например на хостинге тебе просто дают хост, название бд, пользователя и пароль, а никаких dsn не дают.

> и все равно я не очень разбираюсь в css чтобы заморачиваться


Мог бы параллельно решать наши задачки на CSS из ОП поста - начнешь разбираться.
#961 #663746
>>663737

> А если метод будет закрытый будет понятней что он вызывается после метода register()?



Будет понятно что снаружи его не вызвать.

> Я хотел вызывать эти методы в методе изменения свойств Студента


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

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

> $connect нужно переименовать в $pdo?


да

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


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

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


Лишнее усложнение это когда код раздут в 4 раза копированием.

> =:{$columnName}


Тут не нужна переменная

> Мне почему-то не нравится это.


По идее можно бы использовать query builder для такого случая но это реально будет усложнением

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


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


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

> но мне мне при создании PDO пришлось бы писать


> Я не хочу писать так. Мне не нравится этот метод записи.


Чем он тебе не нравится? Я вот например не вижу логики, почему настройки базы данных разнесены на 2 группы и еще и записаны в каком-то странном виде. Какой еще dsn? Обычно например на хостинге тебе просто дают хост, название бд, пользователя и пароль, а никаких dsn не дают.

> и все равно я не очень разбираюсь в css чтобы заморачиваться


Мог бы параллельно решать наши задачки на CSS из ОП поста - начнешь разбираться.
>>663763
#962 #663752
Я создал папку в которой создавал разные репозитории, ветки, короче игрался с гитом и гитхабом. Для того чтобы все корректно удалить и не знаю там, не оставить каких-то хвостов, достаточно просто удалить папку на локальной машине и репозитории из аккаунта на гитхабе?
>>663772
#963 #663763
>>663746

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


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

https://github.com/codedokode/pasta/blob/master/student-list.md

>Контроллер отвечает за взаимодействие с внешним миром (пользователем) и управление всем процессом. Обычно контроллер разбирает параметры запроса из $_POST/$_GET, обращается к модели, чтобы получить какие-то данные или сделать какое-то действие

>>663770
#964 #663770
>>663763

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


Можно. Просто лучше вызывать функцию 1 раз, а ты там вызываешь 10 разных функций.
Ответы 18 февр #965 #663771
>>658732

Ошибки PHP Notice: надо исправить - ты обращаешься к несуществующей переменной.

> if($lastDigits%10 == 1) return $word1;


Не экономь место, пиши в 3 строчки

> ($lastDigits - $lastDigits%10)/10 == 1


Тут наверно проще было записать через >= 11 && <= 19

> if($number-($number%100) != 0) $text .= $spelling[$number-($number%100)] . " ";


> if(($number%100 <=20 && $number%100 >=3) || ($isFemale == 0 && $number%100 <= 20 && $number%100 != 0)) $text .= $spelling[$number%100] . " ";


> else if($number%100 <= 20 && $number%100 != 0) $text .= $femaleSpelling[$number%100] . " ";


Ну вот эту стену же невозможно читать, все в глазах путается. Тело ифа надо писать на отдельной строке, длинные условия надо разбивать на части и выносить в переенные. Вот например выражние $number%100 скопипащено огромное число раз - надо его вынести в переменную.

Переформатируй эту стену текста, пока в ней разбираться тяжело.

> if($number >= 1000000 && ($number - $number%1000000)/1000000 != 0) $text .= smallNumberToText(($number - $number%1000000)/1000000, 0) . inclineWord(($number - $number%1000000)/1000000, "миллион", "миллиона", "миллионов") . " ";


Здесь тоже надо отформатировать код, добавить фигурные скобки, убрать копипасту.

В общем, код надо переделать.

>>658769

Да не с чего там пример брать, стена нечитаемого текста.

>>658793

Хорошо, считает правильно.

По поводу скобок - объяснение в мануале http://php.net/manual/ru/language.types.string.php#language.types.string.parsing
Ответы 18 февр #965 #663771
>>658732

Ошибки PHP Notice: надо исправить - ты обращаешься к несуществующей переменной.

> if($lastDigits%10 == 1) return $word1;


Не экономь место, пиши в 3 строчки

> ($lastDigits - $lastDigits%10)/10 == 1


Тут наверно проще было записать через >= 11 && <= 19

> if($number-($number%100) != 0) $text .= $spelling[$number-($number%100)] . " ";


> if(($number%100 <=20 && $number%100 >=3) || ($isFemale == 0 && $number%100 <= 20 && $number%100 != 0)) $text .= $spelling[$number%100] . " ";


> else if($number%100 <= 20 && $number%100 != 0) $text .= $femaleSpelling[$number%100] . " ";


Ну вот эту стену же невозможно читать, все в глазах путается. Тело ифа надо писать на отдельной строке, длинные условия надо разбивать на части и выносить в переенные. Вот например выражние $number%100 скопипащено огромное число раз - надо его вынести в переменную.

Переформатируй эту стену текста, пока в ней разбираться тяжело.

> if($number >= 1000000 && ($number - $number%1000000)/1000000 != 0) $text .= smallNumberToText(($number - $number%1000000)/1000000, 0) . inclineWord(($number - $number%1000000)/1000000, "миллион", "миллиона", "миллионов") . " ";


Здесь тоже надо отформатировать код, добавить фигурные скобки, убрать копипасту.

В общем, код надо переделать.

>>658769

Да не с чего там пример брать, стена нечитаемого текста.

>>658793

Хорошо, считает правильно.

По поводу скобок - объяснение в мануале http://php.net/manual/ru/language.types.string.php#language.types.string.parsing
#966 #663772
Ответы 18 февр #967 #663774
>>659089

Погугли сайты-рейтинги cms

>>659278

> Тогда я не могу понять что я не вынес отдельно. Или все дело в том что в контроллере не должно делаться это? Все должно сразу передаваться в класс Студента и проверяться уже там?


Валидацию удобно поместить в класс-валидатор. В нем сделать метод в который мы даем модель студента и получаем список ошибок.

>>659306

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

>>659307

Проверил >>659478

> Еще вопрос, что ты думаешь по поводу Magento 2


Известная CMS, особенно на западе, довольно сложная, много ООП и паттернов, сам с ней не работал.

> или она реально сложная такая?


Она сложная, но если взяться и начать разбираться, думаю, со временем станет проще. Если бы у тебя был опыт с фреймворком вроде Симфони наверно было бы полегче.
Ответы 18 февр #968 #663775
>>659322

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

> Но ведь всё равно надо будет набивать массив $allTraversedPaths всеми пройденными путями, получается, чтобы потом сделать min($allTraversedPaths)?


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

> А вот как остановить это всё


Выйти из функции можно с помощью return, из цикла с помощью break

> Вообще не понимаю, почему в итоге у меня обрывается скрипт, там же не все возможные пути проходит?


Ошибки скорее всего

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


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

А хочешь пока задачку на рекурсию, но попроще? Дано имя файла, например 'file.txt' и маска, например 'file.*'. Надо определить соответствует ли маска имени. В маске знак вопроса обозначает любой символ, звездочка - любое число любых символов. Пустая маска соответствует только пустому имени файла.

Рекурсия тут понадобится так как мы не знаем скольки символам соответствует звездочка и должны проверять все варианты: что, если она соовтетствует 0 символов? 1 символу? 2 символам?

> Но я боюсь влезать в такие математические дебри,


А ты осторожно влезай, не спеша, заменяя числа по одному за раз.

>>Кстати цикл можно заменить второй функцией array_fill


> Хм, не соображу сейчас сходу, как.


Сделать массив соответствующий одной строке, а потом сделать массив таких массивов с помощью array_fill.

>>По моему ты перепутал x и y


> Почему? У меня x - это косинус, а y - это синус.


Нет, я другом смысле. Ты пишешь $screen[$x][$y] - но ведь первый индекс - номер строки - отвечает за позицию по вертикали, то есть должно быть [$y][$x]

> Вот никак не соображу, что там с половиной ширины/высоты, ну что ты будешь делать.


Ну половина высоты - это середина нашего экрана. Мы прибавляем ее к sin x R чтобы центр круга был посередине экрана. Ведь по умолчанию sin x R принимает значения от -R до R (то есть центр круга будет в точке с координатами (0, 0)), а у нашего "экрана" и x и y должны быть больше нуля.

>>659494

Да. Округление нужно так как нечетное число при делении на 2 даст дробный результат.
Ответы 18 февр #968 #663775
>>659322

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

> Но ведь всё равно надо будет набивать массив $allTraversedPaths всеми пройденными путями, получается, чтобы потом сделать min($allTraversedPaths)?


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

> А вот как остановить это всё


Выйти из функции можно с помощью return, из цикла с помощью break

> Вообще не понимаю, почему в итоге у меня обрывается скрипт, там же не все возможные пути проходит?


Ошибки скорее всего

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


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

А хочешь пока задачку на рекурсию, но попроще? Дано имя файла, например 'file.txt' и маска, например 'file.*'. Надо определить соответствует ли маска имени. В маске знак вопроса обозначает любой символ, звездочка - любое число любых символов. Пустая маска соответствует только пустому имени файла.

Рекурсия тут понадобится так как мы не знаем скольки символам соответствует звездочка и должны проверять все варианты: что, если она соовтетствует 0 символов? 1 символу? 2 символам?

> Но я боюсь влезать в такие математические дебри,


А ты осторожно влезай, не спеша, заменяя числа по одному за раз.

>>Кстати цикл можно заменить второй функцией array_fill


> Хм, не соображу сейчас сходу, как.


Сделать массив соответствующий одной строке, а потом сделать массив таких массивов с помощью array_fill.

>>По моему ты перепутал x и y


> Почему? У меня x - это косинус, а y - это синус.


Нет, я другом смысле. Ты пишешь $screen[$x][$y] - но ведь первый индекс - номер строки - отвечает за позицию по вертикали, то есть должно быть [$y][$x]

> Вот никак не соображу, что там с половиной ширины/высоты, ну что ты будешь делать.


Ну половина высоты - это середина нашего экрана. Мы прибавляем ее к sin x R чтобы центр круга был посередине экрана. Ведь по умолчанию sin x R принимает значения от -R до R (то есть центр круга будет в точке с координатами (0, 0)), а у нашего "экрана" и x и y должны быть больше нуля.

>>659494

Да. Округление нужно так как нечетное число при делении на 2 даст дробный результат.
#969 #663790
Аноны, спасайте.
Как импортировать большую ( > 3гб) БД в Openserver?

Пробовал sypex dumper, но доходит до 2гб и начинает импортировать заново.

Прошу прощение если не совсем в тему.
>>664781
57 Кб, 621x368
#970 #663816
>>663496
Я сделал так. Но у ОПа написано, что задача делается без подзапросов. Я не понимаю, как в одном запросе получить два разных значения от каунта
>>664704
Сумма Прописью #971 #663855
>>660197

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



Не понял этот момент. То есть вместо функции inclineWord сделать тоже самое в функции smallNumberToText?

ОП, проверь, пожалуйста. Может на 3й раз получится.

http://ideone.com/f2IIDk
>>664707
48 Кб, 260x221
#972 #663917
>>649329 (OP)

>2016


>использовать POST/GET запросы


>не использовать JSON

>>663918>>664714
#973 #663918
>>663917
Как JSON заменяет POST запросы?
#974 #663924
>>663458
Курсы это лохотрон. Хотя для людей, которые вообще не знакомы с программированием, могут дать общее представление, так что пожалуй можно и сходить, если есть лишние деньги.

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

>чего стоит человек, получивший лицензию программиста на курсах?


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

>мне нужно, чтобы мне втирал информацию человек, как лосьон в кожу


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

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

tldr:
Короче, выполни (качественно) все задания из оп-поста и устраивайся на работу в контору, где поставлена командная работа.
#974 #663924
>>663458
Курсы это лохотрон. Хотя для людей, которые вообще не знакомы с программированием, могут дать общее представление, так что пожалуй можно и сходить, если есть лишние деньги.

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

>чего стоит человек, получивший лицензию программиста на курсах?


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

>мне нужно, чтобы мне втирал информацию человек, как лосьон в кожу


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

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

tldr:
Короче, выполни (качественно) все задания из оп-поста и устраивайся на работу в контору, где поставлена командная работа.
>>663939>>664714
#975 #663927
>>663563
Запилить регистрацию, иначе никак.
76 Кб, 500x676
#976 #663939
>>663924
>>663500
>Если тебе около 18
21 уже.

>Видеозаписи курсов кстати можно бесплатно качнуть на торрентах ("Специалист", "Школа программирования"), хотя они не стоят даже места на диске.



А можешь объяснить, почему? Я html/css успешно выучил у специалиста. Борисов очень хорошо объяснять. Не спорю, что он 60% рассказывает всякие охуительные истории и только 40% говорит по делу, но это бывает весело. Он очень быстро пробегает по темам и из его вебинаров хрен что понятно. Вот взять к примеру курс пыхапэ. Разделен на 3 части. Я первую кое-как осилил, я бы не сказал, что было сложно, но когда я делал его лабы, у меня было НЕДОПОНИМАНИЕ, потому что он объясняет очень поверхностно, я слушаю его как лекционный материал. Мне кажется, курсы специалиста направлены на людей, которые уже знают как минимум один язык (тогда спрашивается, какого черта им нужен php?), потому что люди, которые сидят в аудитории все прекрасно понимают (или говорят, что понимают). Но если они не понимают, то почему не задают вопросы? Даже я, отбитый хиккан задавал бы вопросы без конца, потому что я, твою мать, деньги за обучение заплатил. Нипанятна.

Ладно, что ж, спасибо огромное за ответы, буду продолжать решать задачки.
>>663941>>664714
#977 #663941
>>663939

>Но Борисов не очень хорошо объясняет.


reversedFix
127 Кб, 1600x900
#978 #664015
кто хочет поработать в команде?

нужно средне php и желательно мочь в multi-curl

пишите телеграмки или жабы ikuyolleh собака gmail.com
>>664023
#979 #664023
>>664015
А что значит multi curl? С обычным curl знаком, писал некоторые парсеры, если multi curl это вот это http://job-interview.ru/articles/post/67 то думаю с его освоением не должно возникнуть много проблем.
>>664040
#980 #664032
Какой написать плагин для вордпресс?
>>664038>>664048
#981 #664038
>>664032
А зачем ты задаешь этот вопрос в пхп-треде?
#982 #664040
>>664023

ага, оно
ваши контакты мистер?
>>664065
#983 #664048
>>664032
Плагин вебконференции с возможностью показывать презентации и захватывать рабочий стол. Существующие не поддерживаются давно.
#984 #664065
>>664040
Написал на почту
#985 #664255
В регулярке нужно экранировать пробел?
>>664386
#986 #664386
>>664255
Отбой вопроса.
Поясните, пожалуйста, почему у меня не работает данная регулярка?
https://ideone.com/AJaH1S
>>664781
#987 #664398
гайз , как решить проблемку?

-
Если что-то не получается , горю , пытаюсь еще раз сделать , еще раз не получается , сгораю нахуй , забиваю , через денек опять дикое желание , и по новой , и так двигаюсь ОЧЕНЬ маленькими шагами..
>>664401>>664407
#988 #664401
>>664398
Ты это я. Никак не решить. Просто не бросать проггерство, и все.
>>664409
#989 #664407
>>664398

подобная фигня
заказываю антидепресанты
>>664411
#990 #664409
>>664401

бля..
у меня еще такая тема , что , начинаю учить , и за 10 минут прям хочу создать что-то охуенное , второй ВК , дело не доходит даже до 0.01% и я опять сгораю нахуй. бесит пиздец.
#991 #664411
>>664407

у меня нету денег на антидепресанты..
>>664425
#992 #664425
>>664411

даблотрип зато у тебя
и социофобия еще наверн? вообще тоже денежек небыло, в офе работал немного
>>664430
#993 #664430
>>664425
Даблотрип , что это?

ну , у меня хорошо складывается общение с людьми , но , находится в крупных компаниях , или в метро например , просто не могу
#994 #664493
Пиздец, конечно, у ОПа задачи в повторении. Без гугла хуй решишь. Да и в реальном программировании не пригодится.
>>664613>>664781
#995 #664498
Почему эхо ничего не выводит?
>>664499>>664781
#996 #664499
>>664498
Ссылку проебал.
https://ideone.com/s9kcFO
#997 #664613
>>664493

>Да и в реальном программировании не пригодится.


Зато на собеседовании в любую компанию тебе дадут похожую задачу. Плюс обязательно спросят про сложности алгоритмов, числовые ряды и графы. Любой программист должен знать математику.
#998 #664704
>>663816

Перечитай мануал по ссылке http://phpclub.ru/mysql/doc/group-by-functions.html

Чтобы найти число лайкнувших, можно посчитать число уникальных, не повторяющихся id в группе.
#999 #664707
>>663855

$cats = 4;
echo numeric($cats, '%d кот', '%d кота', 'аж %d котов', 'ни одного кота'); // 4 кота
#1000 #664714
>>663917

Спасибо, мы вам перезвоним.

>>663924
>>663939

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

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

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


Это очень правильная позиция.
#1001 #664756
Задача на миллион. Кто сталкивался с fpdf? при генерации pdf дока из php слетает кодировка языка. Пробовал ВСЕ, от подключенных шрифтов, до прописывания изменений в командной строке и тд. (да, да и uft, и cp1251 и проч. заюзаны) Как в создаваемом доке сделать так, чтобы нормально выводился русский ? Хоть кто-нибудь ответит, надеюсь, а то прям беда
>>664758
#1002 #664758
>>664756

какие шрифты ты используешь? дело может быть в том что они в неправильной кодировке или не содержат кириллицы. Также, изучил ли ты документацию на используемые библиотеку? Что там написано про кодировки?
Ответы - кошки-мышки #1003 #664772
>>659518

Кошки-мышки

> a) не расставлял закрытость переменных(все public)


Надо пройти и расставить. Ведь с помощью public/private ты фактически документируешь код, поясняя предназначение поля или метода. И видно по публичным методам, для чего предназначен объект, какой у него интерфейс.

паста:

---

Также, ты должен для всех полей и методов расставить модификаторы доступа (pubic, private, protected - они определяют, откуда можно обращаться к полю или методу). Ты должен подумать логически и для каждого поля/метода определить: это часть кода, которая относится к внутренней логике класса и не должна быть доступна снаружи, или же это часть кода, которая должна быть доступна. Ну к примеру, в Департаменте метод посчитатьОбщиеЗатратыНаЗарплату() должен быть публичным - для этого мы и пишем класс, чтобы считать затраты.

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

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

---

> b) не заканчивал игру на смерти мышей


Хорошо.

> можно в своё будущее резюме


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

> готов ли я после всего этого к Студентам


Да

> foreach($this->animalList as $key => $animal){


> if($animal === $deadAnimal) {


Можно использовать array_Search только изучи мануал очень внимательно

> public function addAnimal(Animal $animal)


> for ($i = 0; $i <= 100; $i++) {


> $y = rand(0, $this->height);


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

Порядок объявлений в объекте должен быть такой:

- константы
- публичные поля
- непубличные
- конструкторы
- публичные методы
- непубличные

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

> public $arrayField = [];


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

> for ($j = 0; $j <= $this->width; $j++) {


> $this->arrayField[$i][] = Battlefield::EMPTYCELL;


Для таких случаев есть array_fill

> foreach ($this->arrayField[$i] as $place) {


> print $place;


Есть implode

> public function getPossibilityOfMovement(array $arrayMove)


Очень странно. У тебя есть функция, просеивающая массив ходов, а функции, делающей проверку для одной клеточки нет - почему?

> if ($this->arrayField[$move->y][$move->x] != Battlefield::EMPTYCELL AND $i != 0) {


Зачем проверка что $i не равно 0?

> if($distanceY>=$distanceX){


> return $distanceY;


min/max

> public function eating(Cat $cat, Mouse $mouse)


Почему эту функцию нельзя заменить на удаление мыши + перемещение кошки?

> public function findNearestAnimal(Animal $centreAnimal, $id)


> $nearestCat = NULL;


> $nearestMouse = NULL;


> $nearestDog = NULL;


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

> $minDistance1 = INF;


> $minDistance2 = INF;


Это массив

> if ($animal instanceof Cat AND $animal != $centreAnimal) {


> if($animal instanceof Mouse AND $animal != $centreAnimal) {


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

> switch($id):


> case 1:


> case 2:


Это антипаттерн "магические числа". Код нечитаем и запутан с твоими цифрами. В таких случаях надо исплоьзовать константы, либо имена классов (в новом PHP можно писать так: SomeClass::class - имя класса само по себе константа).

> public function measureDistanceToEdges($y, $x)


Тут вместо возвращения массива наверно проще сделать 2 функции.

> public function pickTheBestChoice(Mouse $mouse, Cat $cat, Movement $move)


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

Также, почему поведение мыши определяется единственным котом, а не всеми?

> //смотрю, чтоб новая позиция увеличила расстояние меж мышью и котофеем


> //т.к. это оче важно даю 30 поинтов


Тут можно обойтись без сравнения со старым расстоянием. Можно просто брать новое расстояние и умножать на 30 например. Там где расстояние больше будет больше баллов.

Но в общем сам выбор факторов меня утсраивает, хорошо.

> даю оче много поинтов за то, чтоб прижаться к псу, ЕСЛИ он рядом.


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

> также боимся собаки, не встаём на ближайшую клетку с ней


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

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

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

> public function letTheGameBegin()


startGame

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

> abstract public function moves();


Должно начинаться с глагола

> //совершить ход. Тут идёт работа с визуальным массивом игрового поля + обновляем свои координаты


> public function makeMove(Movement $move)


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

> public $sign = " m ";


Зачем пробелы? Мне кажется значок тут только буква.

> return $arrayMove; //на выходе массив с возможными ходами, не выходящими за рамки игрового поля


Точно не выходящими? И такие длинные комментарии лучше писать надо строкой

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

> case !NULL:


Что за ерунда? !NULL это true, а не сокращение для != NULL.

> endswitch;


Это для шаблонов, тут используй фигурные скобки

> $move1 = new Movement($this->y, $this->x);


> $move2 = new Movement($this->y + 1, $this->x);


...

> $move6 = new Movement($this->y + 1, $this->


Копипаста, убирай

> abstract public function makeBestMove(array $arrayMove);


> abstract public function go();


> abstract public function moves();


А обязательны ли все эти методы ?

В общем, для начала неплохо но над кодом еще надо серьезно поработать. Вывод текста - хорошо получилось.
Ответы - кошки-мышки #1003 #664772
>>659518

Кошки-мышки

> a) не расставлял закрытость переменных(все public)


Надо пройти и расставить. Ведь с помощью public/private ты фактически документируешь код, поясняя предназначение поля или метода. И видно по публичным методам, для чего предназначен объект, какой у него интерфейс.

паста:

---

Также, ты должен для всех полей и методов расставить модификаторы доступа (pubic, private, protected - они определяют, откуда можно обращаться к полю или методу). Ты должен подумать логически и для каждого поля/метода определить: это часть кода, которая относится к внутренней логике класса и не должна быть доступна снаружи, или же это часть кода, которая должна быть доступна. Ну к примеру, в Департаменте метод посчитатьОбщиеЗатратыНаЗарплату() должен быть публичным - для этого мы и пишем класс, чтобы считать затраты.

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

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

---

> b) не заканчивал игру на смерти мышей


Хорошо.

> можно в своё будущее резюме


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

> готов ли я после всего этого к Студентам


Да

> foreach($this->animalList as $key => $animal){


> if($animal === $deadAnimal) {


Можно использовать array_Search только изучи мануал очень внимательно

> public function addAnimal(Animal $animal)


> for ($i = 0; $i <= 100; $i++) {


> $y = rand(0, $this->height);


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

Порядок объявлений в объекте должен быть такой:

- константы
- публичные поля
- непубличные
- конструкторы
- публичные методы
- непубличные

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

> public $arrayField = [];


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

> for ($j = 0; $j <= $this->width; $j++) {


> $this->arrayField[$i][] = Battlefield::EMPTYCELL;


Для таких случаев есть array_fill

> foreach ($this->arrayField[$i] as $place) {


> print $place;


Есть implode

> public function getPossibilityOfMovement(array $arrayMove)


Очень странно. У тебя есть функция, просеивающая массив ходов, а функции, делающей проверку для одной клеточки нет - почему?

> if ($this->arrayField[$move->y][$move->x] != Battlefield::EMPTYCELL AND $i != 0) {


Зачем проверка что $i не равно 0?

> if($distanceY>=$distanceX){


> return $distanceY;


min/max

> public function eating(Cat $cat, Mouse $mouse)


Почему эту функцию нельзя заменить на удаление мыши + перемещение кошки?

> public function findNearestAnimal(Animal $centreAnimal, $id)


> $nearestCat = NULL;


> $nearestMouse = NULL;


> $nearestDog = NULL;


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

> $minDistance1 = INF;


> $minDistance2 = INF;


Это массив

> if ($animal instanceof Cat AND $animal != $centreAnimal) {


> if($animal instanceof Mouse AND $animal != $centreAnimal) {


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

> switch($id):


> case 1:


> case 2:


Это антипаттерн "магические числа". Код нечитаем и запутан с твоими цифрами. В таких случаях надо исплоьзовать константы, либо имена классов (в новом PHP можно писать так: SomeClass::class - имя класса само по себе константа).

> public function measureDistanceToEdges($y, $x)


Тут вместо возвращения массива наверно проще сделать 2 функции.

> public function pickTheBestChoice(Mouse $mouse, Cat $cat, Movement $move)


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

Также, почему поведение мыши определяется единственным котом, а не всеми?

> //смотрю, чтоб новая позиция увеличила расстояние меж мышью и котофеем


> //т.к. это оче важно даю 30 поинтов


Тут можно обойтись без сравнения со старым расстоянием. Можно просто брать новое расстояние и умножать на 30 например. Там где расстояние больше будет больше баллов.

Но в общем сам выбор факторов меня утсраивает, хорошо.

> даю оче много поинтов за то, чтоб прижаться к псу, ЕСЛИ он рядом.


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

> также боимся собаки, не встаём на ближайшую клетку с ней


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

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

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

> public function letTheGameBegin()


startGame

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

> abstract public function moves();


Должно начинаться с глагола

> //совершить ход. Тут идёт работа с визуальным массивом игрового поля + обновляем свои координаты


> public function makeMove(Movement $move)


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

> public $sign = " m ";


Зачем пробелы? Мне кажется значок тут только буква.

> return $arrayMove; //на выходе массив с возможными ходами, не выходящими за рамки игрового поля


Точно не выходящими? И такие длинные комментарии лучше писать надо строкой

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

> case !NULL:


Что за ерунда? !NULL это true, а не сокращение для != NULL.

> endswitch;


Это для шаблонов, тут используй фигурные скобки

> $move1 = new Movement($this->y, $this->x);


> $move2 = new Movement($this->y + 1, $this->x);


...

> $move6 = new Movement($this->y + 1, $this->


Копипаста, убирай

> abstract public function makeBestMove(array $arrayMove);


> abstract public function go();


> abstract public function moves();


А обязательны ли все эти методы ?

В общем, для начала неплохо но над кодом еще надо серьезно поработать. Вывод текста - хорошо получилось.
Ответы 19 февр #1004 #664773
>>659597

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

>>659966

> echo "{$month} месяц спустя: долг = {$creditBalance} руб,


Это повторяется там раза 3, хорошо бы убрать повторы.

> $creditBalance > 5000


5000 у тебя в коде повторяется 2 раза - неудобно менять будет.

http://ideone.com/zq3x86 - ответ должен быть 61270.

> 10 месяц спустя: долг = 4138.1720657184 руб, выплачено всего 55000 руб.


> 11 месяц спустя: долг = 4138.1720657184 руб, выплачено всего 55000 руб.


Это явно баг, числа одинаковые

>>660801

Почитай примечания к задаче про студентов из ОП поста

>>660767

https://git-scm.com/docs/gitignore

> A gitignore file specifies intentionally untracked files that Git should ignore. Files already tracked by Git are not affected; see the NOTES below for details.


> To stop tracking a file that is currently tracked, use git rm --cached.



Может в этом дело?

Также, можно убрать файл из changed c помощью git reset по моему

>>661284

Официальную документацию
Ответы 19 февр #1004 #664773
>>659597

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

>>659966

> echo "{$month} месяц спустя: долг = {$creditBalance} руб,


Это повторяется там раза 3, хорошо бы убрать повторы.

> $creditBalance > 5000


5000 у тебя в коде повторяется 2 раза - неудобно менять будет.

http://ideone.com/zq3x86 - ответ должен быть 61270.

> 10 месяц спустя: долг = 4138.1720657184 руб, выплачено всего 55000 руб.


> 11 месяц спустя: долг = 4138.1720657184 руб, выплачено всего 55000 руб.


Это явно баг, числа одинаковые

>>660801

Почитай примечания к задаче про студентов из ОП поста

>>660767

https://git-scm.com/docs/gitignore

> A gitignore file specifies intentionally untracked files that Git should ignore. Files already tracked by Git are not affected; see the NOTES below for details.


> To stop tracking a file that is currently tracked, use git rm --cached.



Может в этом дело?

Также, можно убрать файл из changed c помощью git reset по моему

>>661284

Официальную документацию
Ответы 20 февр #1005 #664774
>>661918

> $amountCredit != 0;


Надежнее писать $amountCredit > 0 чтобы при уходе в минус не было вечного цикла.

> if ($amountCredit < $payment){


> $amountPayment += $amountCredit;


Этот if можно заменить на min или max

Ответ верный.

>>662013

Верно

>>662018

У тебя ошибка в выводе:

> Сумма 11000 накоплена за 0


Не за 0, а за 1 год.

> Сумма 1067189.5716336 накоплена за 48


> Сумма 1067189.5716336 накоплена за 49


2 раза одно и то же

>>662065

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

>>662219

С Юи начать изучать проще, а Симфони более мощный фреймворк, его во вторую очередь изучать надо.
Ответы 20 февр #1005 #664774
>>661918

> $amountCredit != 0;


Надежнее писать $amountCredit > 0 чтобы при уходе в минус не было вечного цикла.

> if ($amountCredit < $payment){


> $amountPayment += $amountCredit;


Этот if можно заменить на min или max

Ответ верный.

>>662013

Верно

>>662018

У тебя ошибка в выводе:

> Сумма 11000 накоплена за 0


Не за 0, а за 1 год.

> Сумма 1067189.5716336 накоплена за 48


> Сумма 1067189.5716336 накоплена за 49


2 раза одно и то же

>>662065

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

>>662219

С Юи начать изучать проще, а Симфони более мощный фреймворк, его во вторую очередь изучать надо.
Ответы 20 февр #1006 #664775
>>662246
>>662248

> function inclineWord($key, $word) {


Лучше сделать функцию выбирабщее форму слова из переданных, а не работаюшую только с 3 заложенными словами

Более того, эта функция принимает на вход какие-то непонятные переменные. Чему равен key? Чему равен word? Куда передавать число? Как ей вообще пользоваться? По моему должно быть так: передаешь число и 3 формы слова, получаешь нужную.

> $hundred = mb_substr($number, -3);


> if (mb_strlen($discharge) == 3) {


Для работы с числами надо использовать математические методы, а не функции работы со строками

> $regexp = array('/один тысяча/', '/два тысячи/', '/ ноль/', '/^[ ]/');


Это костыли, надо изначально вставлять правильное слово. Такой код тяжело читать и поддерживать.

> if (mb_substr($number, -3) == 000) {


000 без кавычек то же самое что 0. Попробуй сделать echo 00000;

Код требует доработки.

>>662432

Strtolower вообще не работает с кириллицей, надо mb_strtolower

>>662433

Там есть поиск по файлам
Ответы 20 февр #1006 #664775
>>662246
>>662248

> function inclineWord($key, $word) {


Лучше сделать функцию выбирабщее форму слова из переданных, а не работаюшую только с 3 заложенными словами

Более того, эта функция принимает на вход какие-то непонятные переменные. Чему равен key? Чему равен word? Куда передавать число? Как ей вообще пользоваться? По моему должно быть так: передаешь число и 3 формы слова, получаешь нужную.

> $hundred = mb_substr($number, -3);


> if (mb_strlen($discharge) == 3) {


Для работы с числами надо использовать математические методы, а не функции работы со строками

> $regexp = array('/один тысяча/', '/два тысячи/', '/ ноль/', '/^[ ]/');


Это костыли, надо изначально вставлять правильное слово. Такой код тяжело читать и поддерживать.

> if (mb_substr($number, -3) == 000) {


000 без кавычек то же самое что 0. Попробуй сделать echo 00000;

Код требует доработки.

>>662432

Strtolower вообще не работает с кириллицей, надо mb_strtolower

>>662433

Там есть поиск по файлам
Ответы 21 февр #1007 #664776
>>662440

Он в текстовом редакторе ищет

>>662710

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

>>662886

> $amountCredit != 0;


Надежнее писать $amountCredit > 0 чтобы при уходе в минус не было вечного цикла.

> if ($amountCredit < $payment){


> $amountPayment += $amountCredit;


Этот if можно заменить на min или max

>>662892

Может он у себя взял

>>662916

> if(preg_match($pattern, $value) === 1) {



Можно просто if (preg_match(...)) так как if (1) срабатывает, а if (0) нет

В регулярке копипаста, исплоьзуй квантификатор {N}
Ответы 21 февр #1007 #664776
>>662440

Он в текстовом редакторе ищет

>>662710

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

>>662886

> $amountCredit != 0;


Надежнее писать $amountCredit > 0 чтобы при уходе в минус не было вечного цикла.

> if ($amountCredit < $payment){


> $amountPayment += $amountCredit;


Этот if можно заменить на min или max

>>662892

Может он у себя взял

>>662916

> if(preg_match($pattern, $value) === 1) {



Можно просто if (preg_match(...)) так как if (1) срабатывает, а if (0) нет

В регулярке копипаста, исплоьзуй квантификатор {N}
Ответы 21 февр #1008 #664777
>>662939

> \s8\s


> \s\+\s7\s*


Пробелы с краев можно вынести за скобки чтобы не повторять

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

>>662978

Функции и переменные надо называть правильно, код надо форматировать, второй пост треда. В остальном - нормально.
Ответы 22 февр #1009 #664778
https://github.com/foobar1643/student-list - ты пока переделываешь замечания ведь?

>>663077

> как заставить preg_match не добавлять повторно в результат то что в скобочках?


Нужно брать только элемент массива с индексом 0, а то что под индексом 1, 2, 3 ... - это подстроки, попавшие в скобки. Потому у тебя цикл вывода сделан непрваильно - там должен быть один цикл по найденным фрагментам, а второй - по подстрокам - не нужен. Разберись с форматом массива.

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

регулярка => текст,
регулярка => текст,
...

и обходить его в цикле.

Где слово "координально"?

> /\b\s\bа\b


Объедини регулярку с регуляркой для "но". Также, одна из \b тут не нужна, подумай какая.
Ответы 22 февр #1010 #664779
>>663091

> echo "Имя: {$name}, рост:


Сделай чтобы было одно echo, а не два одинаковых

> if ($height > 169) {


> } elseif ($height < 169) {


А если равно?

>>663166

> \s{1,


Это то же что и плюс

> \b(а|но)


\b лишняя - тут всегда будет граница слова

>>663265

{1,} это плюс

А так, хорошо сделано

>>663276

> {1,}


Это знак плюс

Также, ты видишь опечатки в русских словах, а опечатки в английских?

>>663318

В функции-то что плохого? думаю, функции использовать можно.
Ответы 22 февр #1010 #664779
>>663091

> echo "Имя: {$name}, рост:


Сделай чтобы было одно echo, а не два одинаковых

> if ($height > 169) {


> } elseif ($height < 169) {


А если равно?

>>663166

> \s{1,


Это то же что и плюс

> \b(а|но)


\b лишняя - тут всегда будет граница слова

>>663265

{1,} это плюс

А так, хорошо сделано

>>663276

> {1,}


Это знак плюс

Также, ты видишь опечатки в русских словах, а опечатки в английских?

>>663318

В функции-то что плохого? думаю, функции использовать можно.
Ответы 22 февр #1011 #664780
>>663444

> $returnText = "";


лишняя строчка

> $pattern = array(


> "/^\w/u",


> "/\.\s*\w/u"


Можно объединить в одну регулярку

>>663720

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

> $splitSentence


$sentences

> $wordsSentence


$words

> $result = $result.


.=

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

>>663742

> https://jsfiddle.net/kxh8b4pm/


Верно

> 5. https://jsfiddle.net/qpcrgpyk/



> var innerArguments = [].concat(outerArguments);


Можно просто outerArguemtns.slice().

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

> 6. https://jsfiddle.net/92kh90af/


> var fn = arguments[0];


Лучше прописать fn в заголовке функции в скобках

> } else {


> innerArguments.push(outerArguments);


> } else {


> innerArguments.push(outerArguments);


Попробуй убрать повтор кода.

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

> 8. https://jsfiddle.net/p0bsypcw/


Верно
Ответы 22 февр #1011 #664780
>>663444

> $returnText = "";


лишняя строчка

> $pattern = array(


> "/^\w/u",


> "/\.\s*\w/u"


Можно объединить в одну регулярку

>>663720

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

> $splitSentence


$sentences

> $wordsSentence


$words

> $result = $result.


.=

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

>>663742

> https://jsfiddle.net/kxh8b4pm/


Верно

> 5. https://jsfiddle.net/qpcrgpyk/



> var innerArguments = [].concat(outerArguments);


Можно просто outerArguemtns.slice().

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

> 6. https://jsfiddle.net/92kh90af/


> var fn = arguments[0];


Лучше прописать fn в заголовке функции в скобках

> } else {


> innerArguments.push(outerArguments);


> } else {


> innerArguments.push(outerArguments);


Попробуй убрать повтор кода.

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

> 8. https://jsfiddle.net/p0bsypcw/


Верно
Ответы 23 февр #1012 #664781
>>663790

Через командную строку

>>664386

> ^([а-яё]|[a-z]|\\s){1,}.$


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

>>664493

Откуда ты знаешь что не пригодится?

>>664498

Ты на ideone в stdin что-нибудь написал?
Миграция - тред закрыт #1013 #664786
Аноны, переходите в новый тред >>664784 (OP)

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

Не пишите здесь больше.
Тред утонул или удален.
Это копия, сохраненная 9 марта 2016 года.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски