Этого треда уже нет.
Это копия, сохраненная 2 февраля 2016 года.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
88 Кб, 500x500
157 Кб, 1024x683
364 Кб, 1920x1080
792 Кб, 843x1200
Клуб изучающих PHP 67 #619873 В конец треда | Веб
Добро пожаловать в наш уютный тредик. Тут мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет научиться программировать, кто-то - делать сайты, кто-то - просто размять мозги и заняться чем-то полезным.

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

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

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

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

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

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

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

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

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

- Простая, но полезная задача сделать список студентов: 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
193 Кб, 1024x768
190 Кб, 682x1024
Прочти #2 #619875
Прочти: Код нужно писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.

Если тебе лень выравнивать код руками, закачай его на 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
193 Кб, 1024x768
190 Кб, 682x1024
Прочти #2 #619875
Прочти: Код нужно писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.

Если тебе лень выравнивать код руками, закачай его на 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 #619876
Аноны, перекатывайтесь сюда. Тем, кому я не ответил в предыдущем треде >>612122 (OP), я отвечу сегодня-завтра.
#4 #619882
>>613285
Оп исправил почти все твои замечания
http://integer64.github.io/site-layout/
Задача 10:

>>Почему width 100%?


Гугль дал такое решение для адаптивности картинок
Задача 11:

>>перемещаться с клавиатуры, клавишами Tab, Shift + Tab, стрелками, пробелом.


Реализовал, добавил для checkbox на :focus бордер тень,что бы было видно.
Задача 12:
Переделал, совсем без id у меня не получилось, надо было как то input с label связать. Может быть есть другое решение.
Связал вкладки и контент вкладок через data-атрибуты. Хотелось бы в CSS полноценные регулярные выражения, тогда решение было бы более эстетичное.
Возник вопрос по поводу длинны названия вкладки: три раза прочитал, так и не понял что требуется, разжуй пожалуйста, для самых глупеньких вроде меня.
#5 #619888
Как посчитать хеш файла (ну, чтобы установить подлинность или сравнить два файла)? Тупо md5(file_get_contents(файл))?
Будет ли такая проверка однозначно устанавливать идентичность файлов при совпадении их хэшей? Алсо, если файлов много - случаются пиздец тормоза, а скрипт все-таки не бесконечно работать может.
996 Кб, 500x281
#6 #619889
>>619873 (OP)
Юкинон!
#7 #619902
Кто-нибудь обьяснит мне без троллинга, щюточек и петросянства, круг применения регулярок? Я понимаю мэйл проверить или грамматику, но ведь это по большому счёту очень узкий круг. Ну тоесть я например написал проверку форм для регистрации. А потом пишу ещё 99.9% кода для всего остального. Стоит ли заморачиваться с этим так, как вы в 2 прошлых тредах заморачивались?
#8 #619907
Чето подозрительно. ОП не перекатывает сам пока всё не проверит, неужто наш скорострел умело маскиурется под него?
467 Кб, 680x460
#9 #619929
Однако скрипт проверки на ошибки (пока совсем топорный вариант, но хоть на что-то похоже): https://ideone.com/vSnFKo
Далее попробую с помощью функций вывести кусок текста с ошибкой, а не с помощью регулярок.

>>619815
Сюка, аж в голос!... Действительно же, блиять...
Но, кстати, нет: там нам надо будет искать именно отсутствие пробела и отсутствие букв перед "а" или "но". Иначе придётся делать регулярки с другими символами (конца предложения, например) или полагаться на ту регулярку, которая просто ищет отсутствие пробела после знака препинания.
Это не по заветам ОПа.

>>619902

> без троллинга, щюточек и петросянства


Извини, но нет.
Например, стоп-слова для чата, форума или просто блога (матюки убирать либо заменять их словами "розочка" и т.п., ну ты понял). Унификация данных для платёжных систем (когда номер карты вводят с дефисами или без, а биллинг требует какого-то стандарта в передаче данных) или чтобы просто удобнее хранить его в БД. Проверка на вредоносные скрипты или спам, возможно, - регулярка не позволяет ввести <script> или http (я пока не знаю, именно ли регулярки надо использовать в этом случае).
Короче, применений много может быть.
И не такие они и сложные, кстати, проблемы у того же меня больше с массивами и циклами.

>>619907
В прошлый раз сначала перекатились, а потом ОП там отвечал.
#10 #619930
>>619929

>...маете?А в это... - Пропущен пробел перед союзом "а".


>...учает,а также... - Пропущен пробел перед союзом "а".


И в то же время:

>...маете?А в эт... - Пропущен пробел после знака препинания.


>...учает,а такж... - Пропущен пробел после знака препинания.


Короче, что-то не то у меня в регулярке опять.
А ведь только что сказал, что не так и сложно...
#11 #619931
>>619930
Аа, я торможу, это вторая регулярка с поиском отсутствия пробелов после знаков препинания находит то же самое, что нашла первая.
Надо просто исключение добавить в регулярку с поиском пробелов.
#12 #619932
http://ideone.com/bcKcYa
задача "на словах ты лев толстой". Вроде, всё работает, но не уверен, что такое решение просили. Посмотрите, кто-нибудь?
#13 #619935
>>619907
Перекатываал последние 8 тредов - я. ОП по традиции слоупочит. А раньше, так тред раза 3 за 900 постов уходил.
#14 #619937
>>619932
Херась, отличное решение с разными хорошими добавлениями!

>$word3 = $list3[mt_rand(0,4)];


Небольшая опечатка, там тоже 5 ведь элементов.
#15 #619938
>>619937
и правда, не заметил. Спасибо!
#16 #619939
>>619937
нет, кстати, всё же у меня было правильно: там 5 элементов - 0,1,2,3,4. В других по шесть
#17 #619942
>>619939
Аа, бро, извини, постоянно забываю об этом - что с "0" надо начинать отсчёт...
#18 #619967
ОП, вот я в прошлом тред кидал свой недошоп на обозрение - https://github.com/lexdss/shop
#19 #619971
48 Кб, 464x464
#20 #619974
>>619967
Оо, а как это всё установить на Денвер с Дримвивером??7
#21 #619976
>>619974
Проиграл. Я в этот раз даже бамп с бд кинул для таких случаев.
#22 #619977
>>619976

>дамп


совсем обдвачевался
#23 #620005
Решил перекатиться на вашу парашу. Что спрашивают на собеседованиях?
Хочу за мидла сразу сойти. Хотя знаний толком нет, но действие происходит в мухосрани, там небось все такие.
#24 #620011
>>620005
О, опять этот толстяк вылез. Это ты в прошлом треде был тянкой-мидлом, которая не могла найти работу?
#25 #620014
>>620011
Нет. Что такого толстого в вопросе о типичном собеседовании на мидла?
#26 #620025
>>620005
А зарплату тебе будут платить за то что ты собеседование прошел? Ты же понимаешь, что тебе нужно будет выполнять какие-то задачи, а если не сможешь, то пойдешь нахуй. Как ты без знаний будешь работать?
#27 #620035
>>620005
"Чем отличается абстрактный класс от интерфейса?"
"Витую пару обжимать умеешь?"
#28 #620039
Задача про компанию «Вектор» http://ideone.com/YWXBjq
Не бейте лучше обоссыте.
#29 #620040
>>620025
Да в процессе разберусь. Я же умный программист, но с опытом в других(байтоебских) областях.
#30 #620078
Здравствуйте. Суть такова:
Есть куча текстовых файлов, в каждом из них на каждой новой строке есть запись вида "имя:значение".
Вопрос:
Как сделать так, чтобы открыть каждый файл, найти значение по имени, а затем по всем составить таблицу?
#31 #620104
>>619742
Бамп вопросу. 502 ошибка*
#32 #620107
>>620104
Потому-что нет такого индекса в GET. Продампай $_GET и посмотри что там тебе приходит в запросе.
#33 #620118
Почему ОП в своих заданиях по html/css говорит, что нельзя использовать селектор ? В итоге постоянно нужно убирать эти ебучие отступы чуть ли ни в каждом элементе. С чего вдруг плохо написать в начале файла:
{
margin: 0;
padding:0;
}
И самому спокойно выставлять нужныее отступы где они нужны.
#34 #620121
>>620118
А зачем тебе обнулять все отступы?
#35 #620124
>>619875
На картинке с котиком: в чём отличие var_dump(); от $VAR_DUMP? о_0
Это же не константа, раз у неё знак доллара в начале?
#36 #620125
>>620121
Ну вот я например делал его 6 задание. И мне пришлось обнулять внутрнний отступ у <ul>, внешние отступы у <p> и внешние отступы у <h1>. Не легче было просто прописать вначале файла чтобы у всех элементов был нулевой отступ и самому делать их такими как мне надо, а не такими как задумано браузером?
#37 #620127
>>620125
а если у тебя не 3 тега, а 10 или 20, а может их сотня и у всех маргин 0 и паддинг 0?
#38 #620132
>>620127
Если я буду верстать страницу с четко нарисованного psd макета с конкретными размерами, то очевидно все отступы я буду брать оттуда, а не пользоваться предустановленными
#39 #620135
>>620124
Нет ни константы, ни переменной VAR_DUMP, это типа показано как не надо писать.
#40 #620151
быстро и резко поясните за индексацию в майсокле.
#41 #620167
>>620078
Вроде, сделал, что мне надо.
Только теперь надо в цикл пустить (имена файлов от 1 до 50) создание ячеек таблицы. А выходит только первый файл. ЧЯДНТ?
[CODE]<?php
for ($i = 1; $i <= 50; $i++) {

$file = $i . ".txt";
$ar = file($file);
$a = substr($ar[0], 9);
$b = substr($ar[4], 21);
$c = substr($ar[5], 6);
$d = substr($ar[3], 9);
$e = substr($ar[6], 14);
$f = substr($ar[1], 5);

echo "<table><tr><td>$a</td><td>$b</td><td>$c</td><td>$d</td><td>$e</td><td>$f</td>";

for ($i = 9; $i <= 68; $i=$i+3) {
$str = substr($ar[$i-1], 3);
$strWithoutChars = preg_replace('/[^0-9]/', '', $str);
echo "<td>" . $strWithoutChars . "</td>";
echo "<td>" . substr($ar[$i], 11) . "</td>";
echo "<td>" . substr($ar[$i+1], 14) . "</td>";
}

echo "</tr></table>";
}
?>[/CODE]
#41 #620167
>>620078
Вроде, сделал, что мне надо.
Только теперь надо в цикл пустить (имена файлов от 1 до 50) создание ячеек таблицы. А выходит только первый файл. ЧЯДНТ?
[CODE]<?php
for ($i = 1; $i <= 50; $i++) {

$file = $i . ".txt";
$ar = file($file);
$a = substr($ar[0], 9);
$b = substr($ar[4], 21);
$c = substr($ar[5], 6);
$d = substr($ar[3], 9);
$e = substr($ar[6], 14);
$f = substr($ar[1], 5);

echo "<table><tr><td>$a</td><td>$b</td><td>$c</td><td>$d</td><td>$e</td><td>$f</td>";

for ($i = 9; $i <= 68; $i=$i+3) {
$str = substr($ar[$i-1], 3);
$strWithoutChars = preg_replace('/[^0-9]/', '', $str);
echo "<td>" . $strWithoutChars . "</td>";
echo "<td>" . substr($ar[$i], 11) . "</td>";
echo "<td>" . substr($ar[$i+1], 14) . "</td>";
}

echo "</tr></table>";
}
?>[/CODE]
#42 #620171
>>620167
А что у тебя там за магические числа?
#43 #620176
>>620167
Ну пиздец ты намудрил, можно же и попроще все было сделать.
#44 #620178
>>620171
Строки выбираю, если ты об этом.
Просто, надо как-то сделать цикл, а он не идет.

Или, проще, как в excel'e выровнять данные, которые в столбик, в строчку? Я помню, что так можно, но забыл, как. Гугл не помог.
#45 #620183
>>620176
Ручки кривые, да и надо же на раз, чтобы вручную данные не вытаскивать.
#46 #620196
В чём суть механизма работы с различными API соцсетей или платёжных систем?
POST-запросом через cURL отправить данные на какой-то урл с идентификационным токеном, а далее обрабоать полученный ответ-правильно я себе всё представляю?
#47 #620211
Посоветуйте нормальных сообщест для помощи нубам в изучении Пи-Ейч-Пи.
Вкудахте вообще тухло, стаковерфло? где ещё
Петушиную свою конфу в телеграмме не предлагать, там филиал би, причем самой мерзкой его стороны.
#48 #620214
>>620211
тут сиди, чем тебе не сообщество?
#49 #620216
>>620211

>стаковерфло


Да, единственно адекватное и где могут реально помочь. Русскую версию не читал, но осуждаю.

Можешь ещё toster.ru попробовать, но там большая часть вопросов уровня "как вкатиться в 30 лет" и "по какой книжке учить джаву, чтобы заработать мильён", почти как pr в общем лол.
#50 #620224
>>620214
Ну помимо тут.
>>620216
Я че то смотрел там, на разных форумах - как же бесит, когда задает нуб вопрос, а ему тупо ссылки на мануал. Ну прямо багет на таких.
Ну попробую на стак, с инргишем только не важно.
6 Кб, 317x249
#51 #620231
>>620216

>Русскую версию не читал, но осуждаю.


Походу есть за что.
#52 #620236
чо про индексы в майсокле нихуя у опа нет, оказывется это часть оптимизации и писать select * уже не модно.
#53 #620253
>>620224
Если ответом является первая строчка в гугле-поделом.
И прочитай хотя бы одну книгу про PHP на англ.-потом сразу легче станет.
#54 #620257
>>620236
Я не ОП, но могу попробовать ответить. Что именно в индексах тебе не понятно?
#55 #620270
Сделал 8-е задачу ОПа по html/css - https://jsfiddle.net/7u2q9Lme/
Но получилось только с использованием margin у <p> по-другому вообще никак. Почему ОП написал, что нужно ее делать без margin для абзацев? Какое тогда еще может быть решение?
#56 #620274
>>620270
http://integer64.github.io/site-layout/exercise/exercise8/index.html
можешь мое решение поковырять, Оп вроде одобрил
#57 #620281
Спрошу заново в новом треде:

Как правильно делать на CSS на коммерческих сайтах, картиночки справой стороны или снизу у которых текст, типа 15 лет на рынке, самая лучшая методика, профессиональные кадры и т.д., такое кажется тизерами называется, такие есть и в шаблоне ОПа, там где андроид нарисован и другие картиночки. Так вот, как их правильно делать, просто как отдельными картинками и рядом текст? Или как фоновое изображение в дивах? Стоит ли делать из них специальный текст, текст из иконок?
12 задача #58 #620285
#59 #620295
Для чего (и как) применять создание функции в задаче "айпад в кредит"? Какую функцию делать?
Решать задачу просто три раза посчитав, сказано, нельзя.
#60 #620309
>>620295
Задачу про Айфон в кредит уже сделал?
Вот вводишь решение в функцию, как у ОПа в учебнике, а потом просто для каждого банка подставляешь их переменные в вывод функции (разные проценты в месяц, разные цифры для обслуживания кредита и т.п.).
Но сначала надо дождаться ответа ОПа насчёт задачи про калькулятор кредита на Айфон.
Я что-то не помню, чтобы кто-то показывал его недавно, я бы не пропустил, потому что выМучил этот калькулятор наизусть пару недель назад.
#61 #620311
>>620309
Айфон вчера делал, только не сохранил решение и теперь надо заново делать. Логично ты расписал, сейчас вкину своё решение на айпад
#62 #620312
>>620118

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

Да и быдлокодисто как-то получается. Там, где тебе надо, там и убирай.

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



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

Потому логика тут такая: большинство сайтов динамические, тексты на них правятся редактором, значит все теги которые могут быть в них использованы должны нормально отображаться. Значит не надо отключать отступы, делать везде одинаковый размер шрифта и тд.
#63 #620316
Спрошу не про PHP, хотя его тоже учу. htmlacademy и webref.ru пойдет для изучения основ HTML/CSS?
585 Кб, 821x490
#64 #620320
>>620316
А-а-а-а-а, какой же я мудак слепой. Все, вопрос нет.
#65 #620323
>>620320
так подойдут или нет?
#66 #620326
>>620125

> И мне пришлось обнулять внутрнний отступ у <ul>, внешние отступы у <p> и внешние отступы у <h1>.



Надо обнулять не у всех тегов ul, а только у тех которые нужны. Так как иначе твой стиль будет влиять на ul в тексте который добавит администратор и на ul которые в будущем добавит твой коллега-верстальщик.

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

Один из способов добвиться этого - использовать БЭМ нотацию:

<ul class="menu__list">
<li>Пункт</li>

.menu__list {
padding: 0;
}

.menu__list > li {
...
}

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

В общем, старайся делать все независимыми блоками, особенно когда дойдешь до большого макета.
#67 #620330
>>620270

Если добавить в текст другие стандартные теги, то текст разваливается, нет полей слева. Исправь это: https://jsfiddle.net/rLstv59m/1/
#68 #620336
>>620281

Давай конкретные примеры. По макету из задач на CSS, делается так:

div.features
(4 раза) div.features__item
------h3 Заголовок фичи
------p Текст фичи
------p Текст фичи

Если картинка это часть дизайна сайта то делаешь фоновой картинкой. Если часть контента то img.

Например картинка новости это img. А какое-нибудь украшение которое есть на всех страниых это фон.
#69 #620339
>>620309
>>620311

Доделал задачу про айпад. Уфф, сколько пота сошло. Проверьте, кто-нибудь?
http://ideone.com/gYxgd7
#70 #620340
>>619907

Ссылка на предыдущий тред, номер треда и картинки правильные - значит ОП.
#71 #620343
>>620339

>В гомо банке будем платить 12 месяцев


>В мягком банке платим 12 месяцев


>В клубничном банке платим 11 месяцев


Хм, ты совсем не понял условия!
Там надо посчитать, сколько именно денег выплатит анон во всех трёх банках, а у тебя там месяцы.
Там надо получать общую выплату - попробуй её получить для всех трёх банков.
#72 #620347
>>620339
Если поставить 1000 вместо 39999, то выдаёт, что выплачивать надо 2 месяца - значит, абсолютно неверно считает, там выплата всего 2030 рублей должна быть в один месяц.
#73 #620349
>>620347
Это у того банка, у которого 3% и 1000 обслуживания, а также у первого банка.
#74 #620351
>>620339
Также лучше переводить названия переменных, не писать транслитом.
Так, мелкое замечание.
#75 #620366
>>620343
>>620349
>>620347
>>620351
http://ideone.com/bs0K2U
теперь, вроде, всё правильно? спасибо за замечания.
#76 #620380
А я как то решал задачу про банкомат. ОП меня надоумил решать её в двух вариациях, с рекурсией и без. Сколько я тогда ночей провёл, сколько, как вспомню пиздец. Всегда нервный ходил. С тех пор на эту задачу даже смотреть не могу лол
#77 #620381
>>620380
У меня те же чувства вызывает задача на поиск путей. До сих пор с ужасом вспоминаю и по ночам просыпаюсь в холодном поту. Уже наверное больше года прошло.
#78 #620391
>>620381
После банкомата я задачи на раз два щелкал. С путями быстро разобрался.
#79 #620420
>>620366

>В мягком банке платим 60260.891466803 рублей


Нет, бро, считает неверно. Там должно получиться 61270 с копейками.
У тебя отсутствует, получается, прибавка к оставшейся небольшой не выплаченной сумме 3% от остатка (там вроде 264 рубля должно быть) и 1000 за обслуживание кредита.
Также у тебя там точка с запятой стоят за фигурными скобками. Также отсутствует часть в условии - else, там надо её поместить, иначе не по правилам.
Хм, вроде бы алгоритм там у тебя выстроен верно, всё проходит правильно, но вот считает в итоге неверно, как я пояснил.
Сам чё-то туплю, куда девается 1000р и 3% от остатка, всё же должно быть в итоге.
#80 #620424
>>620380
>>620381
То сладостное чувство, когда уже на калькуляторе Айфона ходил нервный и ворочался во сне, а сейчас по-прежнему не доволен решённой задачей на поиск ошибок в тексте
#81 #620431
>>620366
При этом если подставить 1000 вместо 40000 в сумму кредита - считает верно, выдаёт 2030.
#82 #620440
>>620420
>>620431
Перепроверил всё, не могу понять, почему считает неверно. Можешь скинуть правильное решение какое-нибудь? Оче сложно найти ошибку в том, что так долго выстраивал
#83 #620445
>>620440
ОП бы не одобрил готовое решение. Так не научишься сам думать.
#84 #620449
а почему тут codeacademy не предлагают в целях изучения? прохожу их курс сейчас по php, закончил на 50 процентов, вроде годнота.
#85 #620451
>>620440
Бро, сам сейчас сижу и разбираюсь, куда у тебя девается 1000р и 3% от остатка. Тем более, что считает верно на небольшой сумме.
Всё-таки скину свой вариант, потому что ты же всё там выстраиваешь верно, прошел несколько раз по твоему коду. Вместе сейчас попробуем найти, где там ошибка.
Вот мой вариант: http://ideone.com/7FJfGm

>>620445
Тот случай, когда совсем уж непонятно, чому неправильно. Думаю, и анончику это на пользу пойдёт.
#86 #620457
>>620440
Это я скинул скрипт для Айфона только, но в Айпаде как раз у тебя Мягкий банк должен эти же цифры выдать.
#87 #620460
>>620451
Нужно каждый шаг дампить, тогда ответ будет виден сразу. Всегда это помогает.
#88 #620463
>>620451
>>620457
Благодарю, анон, нашёл ошибку, расписав свою программу по месяцам по мягкому банку и сравнив с твоим.

11 месяц спустя: долг = 4138.1720657184 руб, выплачено всего 55000 руб.
12 месяц спустя: долг = 262.31722768997 руб, выплачено всего 60000 руб.
13 месяц спустя: долг = 0 руб, выплачено всего 61270.186744521 руб.

у меня же 12 месяц пропускался засчёт того, что я уводил при сумме меньшей, чем 5000 в if {} и там добивал всю сумму. Сейчас буду думать, как исправить
#89 #620468
>>620463
>>620457
Исправил в if ($summa * $percent + $comission < $payback). Теперь работает как надо! Аноны, спасибо большое, всё теперь понятно

http://ideone.com/bs0K2U
#90 #620470
>>620463

>у меня же 12 месяц пропускался засчёт того, что я уводил при сумме меньшей, чем 5000 в if {} и там добивал всю сумму.


Вот в том-то и дело, что это правильный алгоритм: при сумме меньшей или равной 5000 нужно просто выплачивать общий долг и вот эту сумму. Но эта "меньшая сумма" должна перед этим пройти прибавление 3% и 1000 за сервис.
Вроде у тебя так и было.
Где ошибка - не пойму, хоть ты тресни.
#91 #620473
>>620470
Нет, у меня было раньше
if ($summa < $payback), т.е. я уводил в сторону сразу при сумме 5000, без добавления 3% и 1000 за сервис. Я исправил на ($summa * $percent + $comission < $payback) и заработало.
#92 #620475
>>620468
Хм, я закрыл вкладку с форком твоего кода, но пытался подставить перед этим в скрипт это, почему-то не получилось.
Ну вот, отлично, значит.
#93 #620478
>>620449
в пизде у твоей мамки годнота, шкальник.
#94 #620479
>>620257
Ну попробуй ответить, шкальничек, что такое индексы и как их используют.
#95 #620481
>>620473
Вот сейчас форкнул так, как я делал, алгоритм же один, - всё заработало.
http://ideone.com/o4iw1M
Чёрт знает, почему прежде не получалось.
ОП не одобрит оформление кода, там не по правилам же }; и отсутствие else {}.
#96 #620482
>>620478
>>620479
О, вернулся со смены в пятерочке? Я уже соскучился по твоим постам.
#97 #620483
>>620481
Ну если в ифе происходит выход из цикла или return, то else писать необязательно, без него даже лучше т.к меньше кода.
#98 #620485
>>620481
Да я уже понял, что проебался с };, у себя в phpstorm убрал всё и получше оформил.

А по поводу else, для чего он в моём случае? В задании не было сказано, что его обязательно использовать.
#99 #620486
>>620460
Золотые слова, кстати.
#100 #620487
>>620483
Вообще да, действительно.

>>620485

> по поводу else, для чего он в моём случае? В задании не было сказано, что его обязательно использовать.


Это у меня ОПобоязнь, стремление сделать всё максимально по-ОПовски грамотно.
Иногда вот так может заносить.
#101 #620488
>>620486
Поддвачну. Это надо в шапку добавить. Намного меньше тупых вопросов будет, если люди внемлют этому совету. Половина вопросов в этом треде решается простым дампом. Надо бы использовать это как универсальный ответ на любой вопрос вида "анончики чому у меня не работает код?", как в видеорелейтед https://www.youtube.com/watch?v=t2F1rFmyQmY
#102 #620491
А какие сейчас самые популярные фриланс-биржи на русском языке? Где больше всего заказов?
#103 #620494
>>620488
Зачем. Зачем придумали рекомендованные видео.
#104 #620496
>>620494
залип?
#105 #620507
>>620496
Теперь не до РНР.
#106 #620509
>>620507
Иногда надо давать себе перерыв
#107 #620536
>>620449

Можешь почитать, если хочешь, но он у них очень базовый и скорее годится для ознакомления. Ну если ты считаешь что этого курса достаточно, ты ведь без проблем решишь наши задачи, правда?
#108 #620608
Ничего не могу понять в оптимизации сокла запроса посредство индексов. Какие-то они ключи комбинируют при создании таблицы, а потом делают запрос посредством AND и измеряют миллисекунды запроса, наркоманство какое-то.
#109 #620624
Надоели тупые вопросы шкальников, давайте создадим какой-нибудь тред для продвинутого уровня, а этот оставим под маркером "тред для beginners, задачки и тупые вопросы приветствуются". Надоело разгребать тонны вопросов про регулярки, чтобы почитать про серьезные проекты.
#110 #620626
>>620624
нахуй пошел, пидор, создавай свой тред и катись отсюда, мудила.
#111 #620628
>>620626
двачую
#112 #620636
>>620608

Начни с этой статьи http://ruhighload.com/post/%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%B0%D0%BC%D0%B8+%D0%B2+MySQL

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

Почитай также про бинарный поиск и двоичные деревья - это связанные темы.
#113 #620649
>>619971
Чем это лучше моего варианта?

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

#114 #620678
>>620626
>>620628
cам себя не поддвачуешь, да школьник тупой?
#115 #620688
>>620678
двачую
#116 #620751
>>620626
Двачую!
32 Кб, 533x426
#117 #620754
Смотрите, что пришло в голову с задачей на проверку ошибок да-да, я снова выхожу на связь снова
Берём функцию preg_split, подставляем в неё регулярки для разбивания текста на куски до ошибки и после ошибки.
Далее с помощью функции mb_substr от конца первого куска отсчитываем десять символов назад и десять символов вперёд, также отсчитываем десять символов от начала второго куска.
Соединяем куски просто при выводе в echo и внутрь вставляем ту ошибку из массива ошибок, которая всему этому соответствует.
Звучит вроде вполне правдоподобно и вполне реализуемо.
Как там на деле будет - посмотрим.
#118 #620756
https://ideone.com/tWeZNj
Задачка на проверку ошибок в тексте. Подскажите, пожалуйста, какие косяки?
ideone, почему-то упорно отказывается подавать что-либо на stdout, поэтому вот тот же скрипт на tutorialspoint: http://goo.gl/v2sfaa
#119 #620757
>>620754
Почему именно по 10 символов? Сделал по слову слева и справа >>620756
#120 #620761
>>620756
Как я понял, Ideone не позволяет массивы вставлять более современным способом, как array[], только как array().
Пока не удалось запустить твоё решение, пробую поменять.
>>620757
В принципе, да, можно и так, действительно.
Я сделал до этого вот так: https://ideone.com/vSnFKo
Но это неправильно, надо функциями это всё собирать, а не регулярками. Или я уже поехал, возможно.
#121 #620764
>>620756
Косяк сразу - нет ui в конце регулярок, чтобы они работали с русским текстом и вне зависимости от регистра.
#122 #620765
Вот, попробовал поменять: https://ideone.com/sF0l6w
Работает неправильно, какой-то сумбур на выходе.
Но это, возможно, из-за того, что я там всё не соединил должным образом.
#123 #620768
>>620756
Ещё и в самих регулярках у тебя там сумбур, бро.
Букву "Ё" надо дополнительно указывать, потому что utf её не воспринимает при перечислении "а-я".
Перед союзами "а" и "но" надо искать отсутствие пробела. Там может быть текст типа "...пришёл домой.А жена-то и говорит..."
И регулярка должна находить эту ошибку не как отсутствие пробела после точки, а отсутствие пробела перед союзом.
Это всё ОП говорил.
#124 #620777
>>620764

>нет ui в конце регулярок


Да, забыл. Cкрипт почему-то без u них работает.

>Букву "Ё" надо дополнительно указывать, потому что utf её не воспринимает при перечислении "а-я".


Да, об этом ОП писал, я забыл.

>Перед союзами "а" и "но" надо искать отсутствие пробела.


Так ищет же их скрипт, в массиве третья регулярка с конца: после не запятой идёт пробел \s. Можешь проверить: http://goo.gl/4HcE0W

>пришёл домой.А жена-то и


За это первая регулярка в массиве отвечает: "После точки, запятой, двоеточия, точки с запятой, восклицательного и вопросительного знаков нужно ставить пробел."
#125 #620778
>>620777

>без u них работает.


просто без u.
#126 #620787
http://goo.gl/OWTWZI
Самое интересное, что без ui нет никаких warnings и вроде как всё работает.
https://stackoverflow.com/questions/3455985/range-out-of-order-in-character-class
Говорят, что нужно дефис экранировать, но мне не помогло.
#127 #620823
>>619873 (OP)
причем здесь Гахара и Пых? Что их роднит кроме охуенности?
#128 #620847
>>620777
Я там не понимаю, как запустить.
Тогда жди ОПа.
Вроде показывает ошибки в большом тексте и прежний вариант, вот тут я проверял же: >>620765
Но работает правильно только с большим текстом, вот посмотри сейчас на текст с одной ошибкой и парой слов. ОП обычно так и проверяет, так что инфа соточка, что он бы не одобрил.

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


Я так сделал с самого начала, а ОП не одобрил. Вообще так и говорилось в условии, как ты сделал. Это я могу уже ехать и путать. Я всё это двадцать раз переписывал, потому что с нуля изучаю, могу уже всё путать.
А у тебя, кстати, какая-то база есть - это чувствуется. Что-то уже изучал?
#129 #620850
>>620787
Зависит от кодировки и всяких расширений.
ОП советовал делать так, как везде работает.
#130 #620872
>>620847

>Я там не понимаю, как запустить.


Просто выбирай Execute. http://goo.gl/QiuyPF
Вроде причесал ещё немного регулярки, жду ОПа. Спасибо за внимание, анон!

>Что-то уже изучал?


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

>ОП советовал делать так, как везде работает.


Я просто не подумал, что где-то может быть по-другому (в регулярках, различные реализации которых бесчисленны!). Думал, что вот у меня в линуксе проблем с кодировкой нет, значит у всех нет.
#131 #620878
>>620872
Хм, а вот там всё работает и с небольшим текстом, действительно...
#132 #620899
Добрался до регулярок. Задача на проверку номера телефона (который может быть задан многими вариантами).

Додумался только до такого, всё работает, но не уверен, что это самый изящный вариант:

<?php
$a = 89115668756;
$b = '/^8-?\\s?\\(?\\d{3}\\)?-?\\s?\\d{3}-?\\s?\\d{2}-?\\s?\\d{2}$/';
if (preg_match($b, $a)) {
echo "ok";
} else {
echo "not ok";
}
#133 #620903
>>620899
Во-первых, залей свой код на ideone. Во-вторых, попробуй сделать массив вариантов номера. Например вот так:
$arrayOfPossibleVariants = [
'8 213 23434 34 позвать Любу',
'8 213 2343 434',
'8 213 23434p34',
'8 213 23434 34',
'8(213234-34-34',
'02',
'8(911)-506 56 56'
];

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

foreach ($arrayOfPossibleVariants as $value) {
if(preg_match($regExp, $value)){
echo "{$value} соответствует.\n";
} else {
echo "{$value} не соответствует.\n";
}
}

По регуляркам пусть кто-то другой подскажет, сам жду когда мне подскажут.
#134 #620912
>>620903
А для чего ты указываешь в массиве неправильные варианты? Это я про "позвать Люду". Насколько я понимаю, мой вариант компактнее и правильнее(зачем это делать через массив, если можно в одну строчку уместить? Мой вариант полностью рабочий, просто громоздкий. Но это согласен, пусть тот, кто разбирается выскажется.

залил на ideone
http://ideone.com/538Hqy
#135 #620917
>>620912

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


Для проверки правильности работы регулярок. Взглянул на регулярку, появились сомнения - добавил парочку элементов массив, проверил сразу несколько вариантов. Вместо того, чтобы строку каждый раз менять для отдельного варианта. Ну а вообще удобнее для таких целей использовать сервисы вроде https://regex101.com/
#136 #620920
>>620917
Интересный сайт, но он ругается на мою формулировку \\( и \\), хотя они указаны у ОПа в уроке и работают хорошо в phpstorm.
#137 #620925
>>620920
Пиши так \( и \). Нет разницы.
#138 #621054
ОП, когда начнешь проверять?
#139 #621056
Пиздец, как не зайдешь на какую-нибудь биржу фриланса везде нужно знать кучу движков чтобы хоть что-то выполнять. Мне кажется даже одну cms надо задрачивать кучу времени чтобы чувствовать себя в ней уверено, а надо знать хотя бы 3-4 штуки. Охуеть вообще.
#140 #621099
>>621056
На самом деле нет.
#141 #621125
Если я не делаю imageDestroy, а вместо него делаю unset() - что случается? Когда будет очищена память и как чистить, если точно не уверен, является ли переменная ресурсом изображения или нет, а ее надо обнулить? Через @ как-то не хочется.
#142 #621130
Алсо, можно ли как-то отловить эту ошибку, подавленную собачкой, и вывести ее в некоторый лог-файл, к примеру? Или послать по почте...
#143 #621137
блядь, ёбаный в рот, как делать задачу на проверку ошибок? Тем более она даётся раньше, чем preg_match_all, то есть получается делать надо без него? Как, сука, как?!
#144 #621152
>>621137
посмотрел по треду, кто как решает, кто через двойные массивы(массивы в массиве), кто через foreach, но этого не было в уроках ОПа! Точнее, было только упоминание
#145 #621166
>>621152
>>621137
бля, помогите, как это делать?
#146 #621167
>>621137
>>621152
Да, ОП и сам говорил, что урок по регуляркам нуждается в переработке.
Пости сюда свой вариант, будем тебе помогать, хотя я не уверен, что ОП и мой вариант одобрит.
#147 #621170
>>621167
Я даже не знаю, как взяться за него. Пооткрывал все решения из треда, сейчас сижу и разбираю ваш код, пытаясь понять, как это работает. Но сам бы не дошёл до всех этих двойных массивов, т.к. учил только по ОПу и такого пока не встречал. Думаю пропущу после разбора этой задачи регулярки, т.к. чувствую пробелы в знаниях
#148 #621172
>>620899
ОП где-то выкладывал кучу номеров,которые должны правильно проверяться, найду потом не с телефона.
Там сразу вижу, что нет учёта +7 в начале.
>>620903
Да, но нужно больше номеров с пробелами и даже вот такого типа: +7 - ( 910 ) - 56 - 56 - 56 -1.
#149 #621175
>>621170
Не-не - даже не думай!
Задача больше на массивы и цыклы, я гарантирую, сношался с ней с 31 декабря до вчерашнего дня, всех затралил в треде.
Зато поймёшь принципы и многое уяснишь.
#150 #621176
https://jsfiddle.net/g91an8Lr/6/

решаю упражнения отсюда
http://dkab.github.io/jasmine-tests/?spec=6

скажите мне, я уебан кривой или решение и должно таким быть?
#151 #621177
>>621175
*циклы, совсем запрограммировался...
#152 #621179
>>621170
У ОПа это всё есть, надо просто ВСЕ его примеры переводить в Идеоне и там смотреть, когда только изучаешь.
Не надо галопом по Европам, я базарю.
#153 #621200
В итоге очень понравилось решение анона сверху, но сам бы до него никогда не додумался. Разобрал его и понял (вроде бы), как что работает, в целом стырил у него только идею, но, как уже говорил, сам бы не дошёл, тк больно мудрёно.

https://ideone.com/3biSgl
#154 #621211
>>621200
Нужно больше текста перед ошибкой и после неё, а то ведь непонятно ничего.
Мне его решение тоже понравилось, моё сложнее и наивнее.
#155 #621220
>>621211
Да, согласен, что больше контекста нужно, заново заливать не буду, всё равно решение не моё.

Твоё через массив в массиве? Ты молодец, раз сам дошёл, но у того очень уж изящно вышло. Тешу себя мыслью, что я пока только первую неделю занимаюсь (до этого программирование в глаза не видел) и всё ещё впереди.
#156 #621350
>>621200

В этом решении куча ошибок. Программа находит ошибки где их нету и не находит где они есть: https://ideone.com/4ytqUN

[a|b] - это неправльно. Это значит не «a или b », а «один из символов a, | или b».

Ну и ошибки что он ожидает всегда ровно 1 пробел после «но».
#157 #621353
>>621176

Вместо alert используй console.log или document.write, а то у людей руки отвалятся эти окна закрывать.

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

arrArg -> externalArgs
arr -> internalArgs

Сравни сам, насколько понятнее становится.

Вместо reverse + pop ты можешь использовать shift - он снимает элемент из начала массива.

После if всегда стоит писать {} - иначе можно допустить ошибку при правке кода.

Длинные комментарии лучше писать над строчкой, а не справа.

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

>>621172

Куча номеров:

----------

Задачу про номера телефонов надо проверить на большом числе телефонов, чтобы убедиться что твой код правильный. Но руками подставлять номера — долго и скучно. Пусть работает робот, а не человек!

Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 2 списка номеров (правильные и нет), добавь их в программу и напиши цикл, который их по очереди прогоняет через регулярку и проверяет что они определяются как надо (если нет — надо вывести какой именно номер не распознается правильно).

Вот список номеров:

Правильные: array('84951234567', '+74951234567', '8-495-1-234-567', ' 8 (8122) 56-56-56', '8-911-1234567', '8 (911) 12 345 67', '8-911 12 345 67', '8 (911) - 123 - 45 - 67', '+ 7 999 123 4567', '8 ( 999 ) 1234567', '8 999 123 4567');

Неправильные: array('02', '84951234567 позвать люсю', '849512345', '849512345678',
'8 (409) 123-123-123', '7900123467', '5005005001', '8888-8888-88',
'84951a234567', '8495123456a',
'+1 234 5678901', // неверный код страны
'+8 234 5678901', // либо 8 либо +7
'7 234 5678901' // нет +
);
#157 #621353
>>621176

Вместо alert используй console.log или document.write, а то у людей руки отвалятся эти окна закрывать.

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

arrArg -> externalArgs
arr -> internalArgs

Сравни сам, насколько понятнее становится.

Вместо reverse + pop ты можешь использовать shift - он снимает элемент из начала массива.

После if всегда стоит писать {} - иначе можно допустить ошибку при правке кода.

Длинные комментарии лучше писать над строчкой, а не справа.

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

>>621172

Куча номеров:

----------

Задачу про номера телефонов надо проверить на большом числе телефонов, чтобы убедиться что твой код правильный. Но руками подставлять номера — долго и скучно. Пусть работает робот, а не человек!

Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 2 списка номеров (правильные и нет), добавь их в программу и напиши цикл, который их по очереди прогоняет через регулярку и проверяет что они определяются как надо (если нет — надо вывести какой именно номер не распознается правильно).

Вот список номеров:

Правильные: array('84951234567', '+74951234567', '8-495-1-234-567', ' 8 (8122) 56-56-56', '8-911-1234567', '8 (911) 12 345 67', '8-911 12 345 67', '8 (911) - 123 - 45 - 67', '+ 7 999 123 4567', '8 ( 999 ) 1234567', '8 999 123 4567');

Неправильные: array('02', '84951234567 позвать люсю', '849512345', '849512345678',
'8 (409) 123-123-123', '7900123467', '5005005001', '8888-8888-88',
'84951a234567', '8495123456a',
'+1 234 5678901', // неверный код страны
'+8 234 5678901', // либо 8 либо +7
'7 234 5678901' // нет +
);
#158 #621357
>>621170

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

>>621152

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

>>621137

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

>>621130

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

>>621125

> Когда будет очищена память и как чистить, если точно не уверен, является ли переменная ресурсом изображения или нет


Если у тебя всего 2 варианта: либо в переменной картинка либо null то проверить можно так:

if ($image) {
... удаляем картинку
$image = null; // обнуляем переменную чтобы второй раз не удалить
}

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

>>621056

Можно искать только по своей CMS задачи. Но задачи на CMS обычно низкоквалифицированные и плохо оплачиваемые.

>>621054

Сегодня попробую пройтись по старому треду, а потом в этом.

>>620920

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

echo "\\"; -> \
echo "\"; -> ошибка

То есть ты пишешь \\( а движок регулярки получает просто \(

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

мануал http://php.net/manual/ru/language.types.string.php#language.types.string.syntax.double

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

\\

Но если так написать в строке в PHP то он поймет это как 1 бекслеш потому в PHP мы удваиваем каждй бекслеш:

\\\\

Тогда движок регулярок получит \\ на вход.
#158 #621357
>>621170

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

>>621152

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

>>621137

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

>>621130

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

>>621125

> Когда будет очищена память и как чистить, если точно не уверен, является ли переменная ресурсом изображения или нет


Если у тебя всего 2 варианта: либо в переменной картинка либо null то проверить можно так:

if ($image) {
... удаляем картинку
$image = null; // обнуляем переменную чтобы второй раз не удалить
}

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

>>621056

Можно искать только по своей CMS задачи. Но задачи на CMS обычно низкоквалифицированные и плохо оплачиваемые.

>>621054

Сегодня попробую пройтись по старому треду, а потом в этом.

>>620920

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

echo "\\"; -> \
echo "\"; -> ошибка

То есть ты пишешь \\( а движок регулярки получает просто \(

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

мануал http://php.net/manual/ru/language.types.string.php#language.types.string.syntax.double

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

\\

Но если так написать в строке в PHP то он поймет это как 1 бекслеш потому в PHP мы удваиваем каждй бекслеш:

\\\\

Тогда движок регулярок получит \\ на вход.
#159 #621361
Кто делает задачу на регулярки - держите ссылку где уже вбиты примеры телефонов: https://regex101.com/r/qF7vT8/2

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

Флаг m в конце для того чтобы ^ и $ обозначали не начало/конец текста, а начало/конец любой строки.
Проверка номеров телефонов #160 #621365
Ой, правильная ссылка здесь: https://regex101.com/r/qF7vT8/3 (я забыл флаг g добавить). Я протестировал - если ввести правильную регулярку, то все правильные номера выделяются цветом.

Очень удобно на этом сайте тестировать - там все само обновляется по мере набора текста.
#161 #621369
>>620912

Проверь свою регулярку сначала сам на списке номеров тут >>621353\t или на regex101 по ссылке >>621365

Не забудь что на regex101 бекслеш пишется 1 раз а не два.

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

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

А не закладывать вариант что всегда идет ровно 3 цифры, за ними ровно 2 и тд.

>>620903

Совет по именованию:

arrayOfPossibleVariants -> possibleVariants
value -> variant

>>620899

Протестируй свой вариант на примерах номеров.
Также, попробуй переписать проще, например:

+7 или 8, за ними ровно 10 цифр между которыми любое число пробелов, минусов, скобок.
#161 #621369
>>620912

Проверь свою регулярку сначала сам на списке номеров тут >>621353\t или на regex101 по ссылке >>621365

Не забудь что на regex101 бекслеш пишется 1 раз а не два.

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

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

А не закладывать вариант что всегда идет ровно 3 цифры, за ними ровно 2 и тд.

>>620903

Совет по именованию:

arrayOfPossibleVariants -> possibleVariants
value -> variant

>>620899

Протестируй свой вариант на примерах номеров.
Также, попробуй переписать проще, например:

+7 или 8, за ними ровно 10 цифр между которыми любое число пробелов, минусов, скобок.
#162 #621371
>>620823

Для заманивания новых анонов и мотивирования старых. А вообще, ОП просто ставит в шапку картинки которые ему нравятся.

>>620787

Твои ссылки на tutorialspoint к сожалению сейчас не открываются, ошибка 504

>>620787
>>620777

Без флага u русские буквы будут работать некорректно, причем там все так хитро что ты можешь даже не сразу это заметить и замучаешься искать в чем причина. Всегда ставь этот флаг если ты используешь utf-8.

Если нужны подробности, то суть в том что в utf-8 русские буквы состоят из 2 идущих подряд байт, а движок регулярок по умолчанию думает что 1 байт = 1 символ и он воспринимает русскую букву как 2 независимых символа.

То есть ты пишешь аб (это кодируется байтами D0 B0 D0 B1), а движок регулярок видит 4 отдельных символа c кодами D0, B0, D0, B1. Так как в тексте «аб» кодируется так же, то это сработает. Но не сработает например если в тексте идет АБ так как оно кодируется как D0 90 D0 91.

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

D0 B0 ?

То есть он видит «идет символ с кодом D0, за ним может быть или не может быть символ B0». В utf-8 не бывает просто байта с кодом D0, за ним всегда что-то идет, и это выражение сработает только если в тексте есть буква a с кодом D0 B0. Очевидно что тут будет ошибка и выражение «a?» будет интерпретироваться как «a», то есть знак вопроса не сработает.

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

Коды я взял тут: http://i.voenmeh.ru/kafi5/Kam.loc/inform/UTF-8.htm

Потому всегда ставь флаг u.
#162 #621371
>>620823

Для заманивания новых анонов и мотивирования старых. А вообще, ОП просто ставит в шапку картинки которые ему нравятся.

>>620787

Твои ссылки на tutorialspoint к сожалению сейчас не открываются, ошибка 504

>>620787
>>620777

Без флага u русские буквы будут работать некорректно, причем там все так хитро что ты можешь даже не сразу это заметить и замучаешься искать в чем причина. Всегда ставь этот флаг если ты используешь utf-8.

Если нужны подробности, то суть в том что в utf-8 русские буквы состоят из 2 идущих подряд байт, а движок регулярок по умолчанию думает что 1 байт = 1 символ и он воспринимает русскую букву как 2 независимых символа.

То есть ты пишешь аб (это кодируется байтами D0 B0 D0 B1), а движок регулярок видит 4 отдельных символа c кодами D0, B0, D0, B1. Так как в тексте «аб» кодируется так же, то это сработает. Но не сработает например если в тексте идет АБ так как оно кодируется как D0 90 D0 91.

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

D0 B0 ?

То есть он видит «идет символ с кодом D0, за ним может быть или не может быть символ B0». В utf-8 не бывает просто байта с кодом D0, за ним всегда что-то идет, и это выражение сработает только если в тексте есть буква a с кодом D0 B0. Очевидно что тут будет ошибка и выражение «a?» будет интерпретироваться как «a», то есть знак вопроса не сработает.

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

Коды я взял тут: http://i.voenmeh.ru/kafi5/Kam.loc/inform/UTF-8.htm

Потому всегда ставь флаг u.
#163 #621380
>>620765

> [а-Я]


Так не надо писать. В юникоде (посмотри сам: http://unicode-table.com/ru/blocks/cyrillic/) большие буквы идут раньше маленьких, отсюда ошибка: ты указал невозможный диапазон символов. Также, буква ё находится там не после е, а вообще отдельно от алфавита.

Надо писать

[а-яА-ЯёЁ]

> "Предложение должно начинаться с большой буквы.",


У тебя там в регулярке флаг i - игнорировать регистр.

> Перед союзами «а» и «но» нужно ставить запятую


там ошибка что после но должен идти пробел. А может идти например какой-то знак.

> \sздел\S


А что если «Зделал» идет в самом начале текста?

>>620761

> Ideone не позволяет массивы вставлять более современным способом, как array[], только как array().



Позволяет: $a = [1, 2,3 ];

> 0 => array


> 1 => array


Можно не писать тут индексы, PHP сам их поставит.

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

> здела


сработает на правильное слово «разделать медведя»

> Пропущен пробел перед союзом \"а\"."


Надо проверять пропущенную запятую а не пробел

> [^\\s(а|но)]


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

> for ($i=0; $i < $possibleErrorsCount; $i++) {


Лучше foreach
#163 #621380
>>620765

> [а-Я]


Так не надо писать. В юникоде (посмотри сам: http://unicode-table.com/ru/blocks/cyrillic/) большие буквы идут раньше маленьких, отсюда ошибка: ты указал невозможный диапазон символов. Также, буква ё находится там не после е, а вообще отдельно от алфавита.

Надо писать

[а-яА-ЯёЁ]

> "Предложение должно начинаться с большой буквы.",


У тебя там в регулярке флаг i - игнорировать регистр.

> Перед союзами «а» и «но» нужно ставить запятую


там ошибка что после но должен идти пробел. А может идти например какой-то знак.

> \sздел\S


А что если «Зделал» идет в самом начале текста?

>>620761

> Ideone не позволяет массивы вставлять более современным способом, как array[], только как array().



Позволяет: $a = [1, 2,3 ];

> 0 => array


> 1 => array


Можно не писать тут индексы, PHP сам их поставит.

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

> здела


сработает на правильное слово «разделать медведя»

> Пропущен пробел перед союзом \"а\"."


Надо проверять пропущенную запятую а не пробел

> [^\\s(а|но)]


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

> for ($i=0; $i < $possibleErrorsCount; $i++) {


Лучше foreach
#164 #621381
>>620756

Нет флага u, из-за этого скорее всего регулярка выдает битые utf-8 последовательности и ideone отказывается их отображать.

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

https://ideone.com/z4idwF

В utf-8 русская буква кодируется 2 байтами, первый это D0 или D1, второй - от 80 до FF.

В строке

> Здесь ошибка: d1 80 d0 b0 d1 81 d1 81 d1 83 d0 b4 d0 be d0 ba 21 d0 b7 d0 b0 d0 b0 d1


> Описание: Предложение должно начинаться с большой буквы.



В конце идет D1 и за ней нет ничего, отсюда и проблемы.
#165 #621383
>>620754

Сложновато. Можно лучше сделать так:

- preg_match_all находим все места с ошибками
- функцией типа mb_strpos http://php.net/manual/ru/function.mb-strpos.php по найденной фразе находим ее позицию в тексте (подвох: фраза может встретиться несколько раз)
- имея позицию, можем взять кусок текста например на 10-15 символов раньше

Также, preg_match_all умеет сообщать позицию найденного текста в байтах с помощью флага PREG_DELIM_CAPTURE, но там получится сложный 3-мерный массив.
#166 #621385
>>620491

fl.ru

>>620481

выражение

> $summa x $percent + $comission;


Повторяется 3 раза, убери повторы.

>>620468

Надо еще убрать повторы выражения

> $summa x $percent + $comission



>>620440

Готовые решения не даем.

>>620391

У нас еще есть студенты, файлообменник, и более сложные задачи.

>>620366

Сейчас выглядит верно но надо убрать повторы выражения для расчета процентов.

>>620316

Да.

>>620285

> for(var key in this.getSizes()){


> if(size == key){


Используй оператор in

Лучше переименовать
calculationResult -> result

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

>>620295

Функцию расчета кредита в одном банке.
#166 #621385
>>620491

fl.ru

>>620481

выражение

> $summa x $percent + $comission;


Повторяется 3 раза, убери повторы.

>>620468

Надо еще убрать повторы выражения

> $summa x $percent + $comission



>>620440

Готовые решения не даем.

>>620391

У нас еще есть студенты, файлообменник, и более сложные задачи.

>>620366

Сейчас выглядит верно но надо убрать повторы выражения для расчета процентов.

>>620316

Да.

>>620285

> for(var key in this.getSizes()){


> if(size == key){


Используй оператор in

Лучше переименовать
calculationResult -> result

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

>>620295

Функцию расчета кредита в одном банке.
ООО Вектор #167 #621393
>>620196

Примерно да. Но почему через curl? Он же неудобный, лучше использовать guzzle например.

>>620151

Гуглил?

>>620132

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

>>620039

У тебя очень странная модель. Почему-то объект Employee представляет не одного работника, как можно подумать из названия, а любое их число. Это усложняет программу: представь например что нам надо взять и повысить ранг одному работнику из группы. Логичнее было бы сделать 1 объект = 1 работник. А если хочется их группировать, сделать объект ГруппаРаботников.

Причем что интересно, зарплату он считает с учетом числа людей, а потребление кофе - без.

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

$ivan = new Manager(1, 1, false);
echo "Зарплата Ивана: {$ivan->getSalary()}\n";
$ivan->leader = true;
echo "Зарплата Ивана после повышения: {$ivan->getSalary()}\n";

http://ideone.com/wLCThI

Если все верно то зарплата Ивана должна повыситься. А что? Поле leader публичное, значит автор кода разрешил менять его снаружи, если бы он был против, он бы сделал его private или protected.

У тебя она почему-то не повышается.

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

> class EmployeeList {


Логичнее было сделать объект Департамент.

Также, держи дополнительное задание:

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

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

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

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

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

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

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

Примерно да. Но почему через curl? Он же неудобный, лучше использовать guzzle например.

>>620151

Гуглил?

>>620132

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

>>620039

У тебя очень странная модель. Почему-то объект Employee представляет не одного работника, как можно подумать из названия, а любое их число. Это усложняет программу: представь например что нам надо взять и повысить ранг одному работнику из группы. Логичнее было бы сделать 1 объект = 1 работник. А если хочется их группировать, сделать объект ГруппаРаботников.

Причем что интересно, зарплату он считает с учетом числа людей, а потребление кофе - без.

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

$ivan = new Manager(1, 1, false);
echo "Зарплата Ивана: {$ivan->getSalary()}\n";
$ivan->leader = true;
echo "Зарплата Ивана после повышения: {$ivan->getSalary()}\n";

http://ideone.com/wLCThI

Если все верно то зарплата Ивана должна повыситься. А что? Поле leader публичное, значит автор кода разрешил менять его снаружи, если бы он был против, он бы сделал его private или protected.

У тебя она почему-то не повышается.

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

> class EmployeeList {


Логичнее было сделать объект Департамент.

Также, держи дополнительное задание:

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

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

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

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

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

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

Совет директоров в затруднении: какой путь выбрать? Помоги им с этим, распечатав прогноз по потреблению и расходам (аналогичный тому что требуется в задаче) после принятия каждой из мер.
#168 #621413
Как посчитать хеш файла (ну, чтобы установить подлинность или сравнить два файла)? Тупо md5(file_get_contents(файл))?
Будет ли такая проверка однозначно устанавливать идентичность файлов при совпадении их хэшей? Алсо, если файлов много - случаются пиздец тормоза, а скрипт все-таки не бесконечно работать может. Выше писали про специальные функции для хеша именно файла. Чем это отличается от моего варианта?
>>621357

>Не используй собачку. Отловить вроде можно через свой обработчик ошибок.


Как без нее-то? Если варнинги и нотисы выводятся. Например if ($test = @imagecreatefromjpeg...) else ...
всё равно выплюнет варнинг без собачки, если условие не выполняется. Поэтому я ее давлю, но хочу где-то запомнить.

>свой обработчик ошибок


Эм, чо?
#169 #621433
test
CREATE TABLE
INSERT INTO
UPDATE
SELECT
#170 #621436
>>619932

Решение хорошее, но есть недостаток: у тебя вручную посчитаны индексы массивов:

> mt_rand(0,5)


Надо либо чтобы они считались сами через count либо использовать функцию array_rand.

>>621413

> Тупо md5(file_get_contents(файл))?


md5_file наверно лучше

> Будет ли такая проверка однозначно устанавливать идентичность файлов при совпадении их хэшей?


да

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


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

> Как без нее-то? Если варнинги и нотисы выводятся.


Проверять что перед тобой JPEG файл прежде чем вызывать imagecreatefromjpeg

Например функцией getimagesize.
https://github.com/lexdss/shop/ #171 #621438
Советы и замечания. Пока все плохо, но если ты прочтешь все уроки и все исправишь, я думаю, результат будет лучше.

А ты читал про нормализацию в SQL? Если нет то прочти, есть статьи где это простыми словами объясняется.

https://github.com/lexdss/shop/blob/master/shop.sql
У таблицы category (и всех остальных) надо указать уникальные индексы для колонок где не может быть повторяющихся значений.

path лучше писать в виде «cort» если там везде в начале стоит /cat. Более того, по моему колонка path просто дублирует значения из code.

Не очень понятно чем поле name отличается от title - надо бы добавить комментарий к полям через конструкицию COMMENT '....'

....

Полностью ответ тут http://pastebin.ru/mzp3Ex5d
#172 #621439
>>619967 - тебе ответил выше >>621438\t
#173 #621442
>>621436
Я имею ввиду, сама проверка через хеши - она однозначна и для любых сравнений подходит? Нет там коллизий каких-нибудь хитрых или еще чего?

>Например функцией getimagesize.


Ну это я итак делаю.

>Впрочем тут есть способы ускорить проверку - например если длина файла не совпадает


А если файлов десятки тысяч? По идее, сначала посчитать хэши (зато один раз) будет быстрее, нет?
#174 #621444
Не знал, куда податься - по этому решил сюда. Поставил апач на свой линуксокомп и вроде всё работает. На локалхосте показывается страница. Но php файл в папке var/www не видится. Апач перезапускал.
#175 #621447
>>621444
Отбой тревоги, f5 всё решил.
#176 #621448
Ців
#177 #621449
>>613285
Оп исправил почти все твои замечания
http://integer64.github.io/site-layout/
Задача 10:

>>Почему width 100%?


Гугль дал такое решение для адаптивности картинок
Задача 11:

>>перемещаться с клавиатуры, клавишами Tab, Shift + Tab, стрелками, пробелом.


Реализовал, добавил для checkbox на :focus бордер тень,что бы было видно.
Задача 12:
Переделал, совсем без id у меня не получилось, надо было как то input с label связать. Может быть есть другое решение.
Связал вкладки и контент вкладок через data-атрибуты. Хотелось бы в CSS полноценные регулярные выражения, тогда решение было бы более эстетичное.
Возник вопрос по поводу длинны названия вкладки: три раза прочитал, так и не понял что требуется, разжуй пожалуйста, для самых глупеньких вроде меня.

И как выкладывать решение задач по MySQL? В каком виде?
#178 #621461
Анончики, вот пост нашел в предыдущем треде, который меня радует: >>616970

Анон учился-учился в нашем треде и нашел работу в итоге. Молодец, что. Заметьте, что анон выбрал сложный путь изучения: не примитивные пиратские видеокурсы по написанию процедурной лапши с устаревшими функциями, а наш тред, ООП, композер, вот все это. Соответсвенно и на работе Symfony и Doctrine, не ерунда какая-то.

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

>>621442

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

> А если файлов десятки тысяч? По идее, сначала посчитать хэши (зато один раз) будет быстрее, нет?



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

>>621449

> как выкладывать решение задач по MySQL?


Если SQLfiddle работает то лучше всего на него. Если нет - делай SQL дамп (CREATE TABLE + INSERT + SELECT) и загружай на любой pastebin или ideone.

То есть нужен код на языке SQL, создающий таблицы, вставляющий в них что-нибудь и делающий нужный запрос.
#179 #621462
>>621380
Спасибо за подробные и полезные ответы!
Немножко доработал регулярки:

> Перед союзами «а» и «но» нужно ставить запятую


>там ошибка что после но должен идти пробел. А может идти например какой-то знак.



Написал такую регулярку: /\w\s(а|но)[^w]/gu
Тесты с различными вариантами здесь: https://regex101.com/r/jT4fT6/2

> \sздел\S


>А что если «Зделал» идет в самом начале текста?



Написал такую: /(\s|^)здел\S*/gui
Тесты: https://regex101.com/r/jI7vG3/1
#180 #621464
>>621449

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


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

> Хотелось бы в CSS полноценные регулярные выражения, тогда решение было бы более эстетичное.


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

~=
*=
^=
|=
$=

Почитай если не слышал https://learn.javascript.ru/css-selectors
#181 #621465
>>621462

(\s|^) -нельзя ли заменить на \b? \b значит граница слова, то есть место где с одной стороны стоит \w а с другой \W (не-\w).

[^w] - где бекслеш? Это не то же самое что \W?

Лучше не полагаться что между словами ровно один пробел.
#182 #621473
Ответы в старом треде

>>621467 - вопрос про аякс
>>621468 - про поиск грамматических ошибок, композер, поиск пути
>>621469 - поиск пути, константа EMPTY, структура папок в задаче студентов, про неймспейсы
>>621470 - getId3, калькулятор
>>621471 - Кошки-мышки, в общем хорошо решено
>>621472 - https://github.com/fxsloker/Student

Если вы постили в прошлом 2015 году и вас пропустили - напомните о себе в этом треде. Если уже в 2016 то погодите еще пару часиков.

Если старый тред исчез и вы не можете прочесть ответ - попросите ОПа поискать в архиве, напомните о чем шла речь.
#183 #621503
>>621473

>Я бы убрал core, и вместо одной папки models сделал разные папки для разных классов: для валидатров, сущностей, хелперов, классов работы с БД.



Где тут MVC тогда, не понимаю.
#184 #621505
>>621503

MVC не в том что ты создаешь ровно 3 папки, а в том что приложение можно логически разбить на M, V и C.
#185 #621511
Чому шин2 не выводит?
http://ideone.com/xEl2f5
Ответы в старом треде #186 #621521
Ответил на все вопросы и проверил все что было в старом треде.

>>621512 - про ключи в массиве
>>621513 - https://github.com/MindiMakridi/filehosting
>>621514 - что сделать на симфони, исправление опечаток, проверка телефона, кредит
>>621515\t- JS про электросеть, поиск ошибок, Апач на маке
>>621516 - игра в кубики, стихи, кредит
>>621517 - ...
>>621519\t- http://integer64.github.io/ (хорошо сделал)
>>621520\t- первые 3 задачи, поиск ошибок, проблема в phpstorm

Если я не ответил вам или не проверил что-то, пишите в этом треде. Если старый тред утонул и вы не увидели решение, попросите ОПа достать из архива, напомните что за задача была.
#187 #621523
>>621513

>Нельзя в заголовках исплоьзовать что-то кроме ASCII (то есть латинницы). Убери это поле.


Без этого поля файл сохраняется с айди.

>Интересные у тебя геттеры. Зачем это ты исключение выбрасываешь? Я не против, просто хочу понять заечм.


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

>Это должно быть в другом классе.


Ну токен это же свойство файла. Алсо, куда тогда девать все эти методы? Создать хелпер и туда отправлять все не нашедшие себе места методы?
#188 #621525
>>621523

> Без этого поля файл сохраняется с айди.


В ссылке на скачивание должно быть имя файла в конце. Покажи какая у тебя ссылка.

> Ну токен это же свойство файла.


Это да, но он не обязан их генерировать, он их только хранит.

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


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

>>621511

Флаг u почему пропустил?

также,

> switch($test) {


> case preg_match("/[0-9]х?ме[0-1]/", $test)


как это по твоему должно работать? Это ведь примерно равно

if ($test == preg_match("/[0-9]х?ме[0-1]/", $test))
#189 #621526
>>621525

>В ссылке на скачивание должно быть имя файла в конце. Покажи какая у тебя ссылка.


Хм, в самом деле скачивает по имени файла в конце. Хотя может дело было в том, что браузер как-то запоминал прежнее имя, под которым я скачивал файл, потому-что я тестировал разные имена файлов, и для уже скачанных файлов изменения кода не оказывали никакого влияния, они продолжали скачиваться с тем именем, которое было при первой загрузке.
#190 #621527
>>619882

в старом треде где-то в конце ответил.
#191 #621528
1
#192 #621532
Помогите, пожалуйста, с регуляркой на номера телефонов
>>621369

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



Я вот написал такой вариант, но понимаю, что он неправильный.

$reg = '/(+7|8)[0-9\\(?\\)?-? ?]{10}'; Как воплотить это

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

Integer64 #193 #621533
>>621521
Спасибо Оп.
Теперь по поводу главного задания по верстке макета, верстать надо на голом CSS или можно bootstrap использовать?
#194 #621534
>>621533
Какой смысл использовать бутстрап при обучении верстке?
#195 #621540
>>621534
А почему бы и нет?
Мне просто нужен ответ:
Да, можно или нет, нельзя.
sage #196 #621541
>>621540
Можно.
#197 #621543
>>621532
помохите
#198 #621547
Я хотел заметить, что у ОПа в задачках вообще не рассказывается ни про апач ни про то, как запускать программы через винду (не идеон). Очень напрягает то, что позанимавшись по его мануалам около двух недель понимаешь, что на самом деле не знаешь даже элементарных основ
#199 #621551
>>621547

>Чтобы делать эти задания, тебе надо установить Апач + 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

#200 #621552
>>621551
Да, я даунт-аутист, признаю, сижу в учебнике и даже не смотел на сам ОП-пост
#201 #621561
Привет, нужен совет:
есть массив $_GET, где может быть как 2 так и 50 элементов, нужно сделать определения всех элементов в переменные. Пример:
test.ru/putin?hui=1&president=da&coolman=super
нужно, чтобы было что-то isset($_GET['hui']) $hui = $_GET['hui'] else $hui = ''; И так все остальные, проблема как раз таки, что количество может быть разное и в дальнейшем расширяться
#202 #621563
>>621561
Попробуй
foreach($_GET as $key => $value) {
echo "GET parameter '$key' has '$value'";
}
#203 #621568
>>621563
думал об этом, спасибо гляну
55 Кб, 560x750
#204 #621569
В задании о циклах с локал сайтика не могу понять куда писать о том, что если баланс кредите меньше 5000 выплата равна балансу.
#205 #621571
Стоит ли покупать какую-нибудь книгу по ПХП в бумажном варианте?
#206 #621573
>>621571
Лучше по жаваскрипту купи.
#207 #621575
>>621568

>isset($_GET['hui']) $hui = $_GET['hui'] else $hui = '';


Если нужно именно сохранять в переменные, то можешь использовать extract() или переменные переменных: https://secure.php.net/manual/ru/language.variables.variable.php

Вот пример второго:

Запрос: index.php?id=1&name=vasyan

Код:
<?php

foreach ($_GET as $key => $value) {
\t$$key = $value;
}

echo $id, $name;

>>621571
Купить можно, чтобы поддержать автора. Но мне лично удобнее читать с планшета в транспорте.
#208 #621576
>>621573
зачем мне жаваскрипт?
#209 #621577
>>621576
Ты думаешь обойдешься одним пхп?
#210 #621578
11 Кб, 480x360
#211 #621583
Анон, подскажи будь добр.

Почему когда я делаю так я получаю хуй.

function __construct() {
`return new SomeClass();`
}

А когда так, то все ок

private $obj;

function __construct() {
`$this->obj = new SomeClass();`
`return $this->obj;`
}
#212 #621584
>>621473

>Также, если твой роутер будет создавать и вызывать контроллер, а не просто анализировать URL то фактически это паттерн FrontController.



А какие еще есть паттерны проектирования? Где можно почитать, потрогать?
#213 #621585
А решая задачи ОПа считается ли честным решение, если гуглить подсказки на форумах и строить на них своё решение? Или надо доходить самому до всего?
#214 #621586
>>621583
Пожалел глаза анона и создал на pastbin
http://pastebin.com/GHG6AaEn
#215 #621587
>>621533

Не рекомендую так как там от него ничего не использовать и ты только усложнишь себе жизнь, а мне - проверку.
#216 #621590
>>621569

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

>>621575

Это плохая идея, так можно переопределить какой-нибудь $_SERVER и получить уязвимость.
#217 #621591
>>621590
http://codepad.org/nm9jPcpd
Как написать проверку мне понятно, а куда и под каким оператором засунуть - нет. Пробовал с if не получилось, хотя проверка ошибок не выдала, просто все наебнулось в конце.
#218 #621598
>>621583

Зачем ты в конструкторе пишешь return? Конструктор не может ничего вернуть, на то он и конструктор.Его задача - заполнить поля в объекте начальными значениями.

Оба примера кода неправильные.

>>621584

Есть паттерны работы с базой данных: https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md

Почитать в книге Фаулера «patterns of enterprise application architecture» ( http://www.ozon.ru/context/detail/id/4884925/ ), она есть и на русском.

Вот тут краткий список паттернов http://design-pattern.ru/

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

>>621585

Можно гуглить, можно даже тут просить подсказки и обсуждать. Цель чтобы ты получил нужные знания тем или иным путем и писал код. Вот только код надо писать все равно самому - не копипасть готовые куски, иначе не научишься.
#219 #621599
>>621591

В этом коде есть ошибки, тут действительно проверку так просто не вставить. Лучше всего его переписать заново с нуля.
#220 #621602
>>621598
Уже настековерфловил что протупил. Тогда можно сделать так?
http://pastebin.com/qFYtMFyf
#221 #621607
>>621598
ОП, ответь ради Христа>>621532
#222 #621608
>>621532

> [0-9\\(?\\)?-? ?]


Это значит: «любой из символов: цифра, скобка, минус, знак вопроса, пробел». Ну и повторяется 10 раз. Ну то есть например это может быть 6 цифр и 4 знака, или 7 цифр и 3 знака и тд.

В квадратных скобках вопрос просто обозначает знак вопроса. Квадратные скобки значат «один из указанных тут символов».

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

Если что, проси еще подсказки.
#223 #621651
>>621473
https://github.com/fxsloker/Student

При запуске http://student/front/index падает с ошибкой:
Fatal error: Class 'FrontController.php' not found in /home/sloker/public_html/student/app/Router.php on line 28
Но я же подключил файл и вызвал существующий класс. Не могу понять откуда ошибка.

В правильном направлении я делаю роутер и паттерн FrontController?
#224 #621656
>>621380

>Позволяет: $a = [1, 2,3 ];


> 0 => array


> 1 => array


>Можно не писать тут индексы, PHP сам их поставит.


Да, действительно, Идеоне позволяет - я после этого проверил.

>Твои регулярки не сработают если например слово «сдесь» стоит в самом начале текста.


>> здела


>сработает на правильное слово «разделать медведя»


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

>> Пропущен пробел перед союзом \"а\"."


>Надо проверять пропущенную запятую а не пробел


Чёрт, я попутал, что именно нужно, это да.

>> [^\\s(а|но)]


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


Спасибо, поправлю и запомню, это не проблема.

>> for ($i=0; $i < $possibleErrorsCount; $i++) {


>Лучше foreach


Да, сейчас заглянул впервые на страницу "Повторим?", там как раз говорится, что в массивах элементы неправильно перебирать с помощью for, лучше foreach.
>>621383
Спасибо, сохраню такой алгоритм, попробую применить, когда снова всё буду прорешивать.
Спасибо за ответы и помощь!
#225 #621660
>>621220
Да, то решение со вложенными массивами моё.
Я занимаюсь месяц где-то, конечно же, всё впереди. Сейчас как-то сразу начинаю представлять, как будет многое работать и что будет получаться на выходе, но ошибок и непонятного для меня всё равно ещё очень много даже в пройденных уроках.

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


Просто надо каждый код ОПа вставлять в IDE, манипулировать и изменять его, а не просто пробегать глазами и думать, что уяснил его работу.
Да и о многом речь начинает идти уже в самом конце, до этого ещё дойти надо.
#226 #621663
>>621547

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


Просто надо каждый код ОПа вставлять в IDE, манипулировать и изменять его, а не просто пробегать глазами и думать, что уяснил его работу.
Да и о многом речь начинает идти уже в самом конце, до этого ещё дойти надо.
1297 Кб, 1798x1199
#227 #621665
ОП!!! ОП!! Я решил задачу Клавиша shift! Как же долго я бился над нею! Прошу оценить проделанную работу:

http://ideone.com/fpRAtk

как будто подрочил, чесслово
#228 #621670
>>621665
ну и в чём смысл этой хуеты, сложнаа сложнаа сложна блять нихуя не понятно сложна блять
#229 #621681
>>621599
http://ideone.com/AVF2Sh
Как то слишком жестко для 3 урока если учишь с нуля
#230 #621684
>>621683
Наверно потому что про while еще ничего не рассказали, а без него ничего бы не вышло.
#231 #621687
>>621684
Блять вайл для пидарасов, это все знают, хотя я смею предположить что ты полный отбитый наглухо далбаёб, поэтому прошу тебя проследовать нахуй.
#232 #621689
>>621674
Пшёл вон холоп.

>>621681
У опа там нет while, ясно же, что анон не с нуля идёт. Был тут уже такой шутник, калькулятор-кун, мы знаем.
#233 #621694
блять с чего начать заебали, тоже хочу быть погромистом фрифлюсером 200к в час, чё делоть то, с вами сраться даж не интересно
#234 #621697
Ну алёёё вы куда разбежались то, хочу с пэхопе начать, за плечами есть опыт паскаля, какие подводные камни?
138 Кб, 540x555
#235 #621703
#236 #621726
>>621665
Сколько же ты её решал?
Каковы познания языка в целом?
#237 #621728
>>621726
Часа три сидел не отываясь. Познания языка - неделя с ОПовским сайтом
#238 #621733
>>621728
До этого что-то изучал, что ли? Или это ты шёл по решениям анонов?
Это не ТруЪ - использовать чужие решения, выдавая или принимая их за свои. Надо пердолиться сутками самостоятельно. Так приходит понимание.
#239 #621736
>>621733
Да нет, решил всё сам, я бы не был так рад, если бы копипастил чужие решения.
#240 #621737
>>621733
До этого ничего не изучал, одно время с питоном интересовался только, но вообще гуманитарий по профе. Вот перекатываюсь потихоньку
sage ## Mod ## #241 #621744
Скатывание треда в чятик для перекидывания говном без дополнительного содержания - это для /б.
#242 #621748
>>621744
Ну так потри. Полезные посты отвечающих на вопросы перемежаются с вербальным поносом обделённого вниманием ополоумевшего школьника.
#243 #621775
>>621651
https://github.com/fxsloker/Student
Все, переделал роутер. Верно ли я сделал?
1126 Кб, 1798x1199
#244 #621781
ОП! Прошу проверить также задачу Yoda speak. После первой уже полегче пошла.

http://ideone.com/jY00kx
#245 #621786
Переписал файлообменник почти с нуля. Заменил смарти на твиг, подключил jquery, сверстал на бутстрапе. Отрефакторил как мог, но чувствую что все равно код можно улучшить. Например с подключением аякса появилась куча веток типа if (isAjax) {...}. Некрасиво, но не знаю что с этим делать.
https://github.com/nsdvw/file-sharing

Вопросы.
1. Можно ли как-то использовать подготовленные выражения с sql оператором IN (...)? Мне нужно найти пользователей с id перечисленными в массиве.
Нашел несколько советов из гугла (либо лепить запрос руками и байндить поштучно, либо использовать трюк с mysql функциями типа find_in_set)
http://stackoverflow.com/questions/1586587/pdo-binding-values-for-mysql-in-statement/1586650#1586650
Использую второй вариант с функцией, но мало ли, вдруг у этого подхода есть недостатки (например при смене субд придется ходить и переписывать все запросы).

2. Что делать с импортированием классов? Если писать use для каждого, то это займет половину строк скрипта. Если не импортировать, а писать полный неймспейс, получаются длинные строки. Пока делаю так: импортирую только те классы, упоминание которых встречается более 1 раза. Но это же не по программерски, делать через раз без четкой системы. Может есть какой-нибудь стандарт? В php7 вроде пытались что-то с этим сделать, но вышло не очень, там всего лишь группировка по корневому неймспейсу.

3. Хотел пожаловаться на бутстрап. Оп тут проповедует семантичненькую верстку с минимумом тегов и четким разделением ответственности между css и html, а они там намешали вложенных дивов с десятками классов, пустые теги для создания иконок например, ссылки которые на самом деле кнопки и кнопки которые ссылки, ну и вообще черт знает что.
Но выглядит шикарно, ничего не скажешь.
А, в пагинаторе еще почему-то переход по заблокированной ссылке "Next" все равно происходит. То есть они конечно сделали ее серенькой, и даже ховер с зачеркнутой ручкой, только вот при клике переход происходит (на эту же страницу, тупо перезагрузка). Это так и задумано по каким-то левым соображениям (типа юзер может обидеться, почему в свободной стране ему запрещают перейти по ссылке и подать в суд?), или это не додумано, и я должен сам повесить на нее preventDefault?
Еще какая-то фигня с модальными окнами: если повесить триггер не на кнопку, как показано в доках, а на ссылке, то модальное окошко будет грузить именно то, что расположено по этой ссылке.
Мне вообще-то нужно было, чтобы при отключенном js пользователь мог спокойно перейти по ссылке на форму редактирования, расположенную на другой странице.
Наверное придется изобретать трюк: сделать и ссылку, и кнопку, кнопка скрыта по умолчанию, а js меняет их местами, то есть делает ссылку скрытой, а кнопку отображает.

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

5. У слима вроде есть свои методы для работы с сессией и куками, но у меня они используются в своих классах, это что, передавать весь объект приложения чтобы сделать $app->setCookie? Почему нельзя сделать родное setcookie?

6. Статические методы в твиге как использовать? Я насоздавал себе статических хелперов, которые отдают пути к файлам например, а в твиге оказывается их теперь не так просто использовать.
Подключил функцию вида return call_user_func_array("{$class}::{$method}", $args), но вызов в представлении получается громоздкий, тем более приходится писать полное пространство имен в имени класса.

7. Урок по исключениям читал. Но не понял, как практически использовать. Да-да, в тех местах, где "что-то может случиться", ставим try{}catch(){} и в кетче а) пишем в лог (писать свой логгер? не хотет, возьму готовый), б) выводим заглушку для пользователя, форбидден для робота.
Я не понимаю, в каких местах "может что-то случиться"? Подключение к базе, ага. Это при создании объекта pdo, или он ленивый и поключится только в момент execute?
Все exec/execute завернуть в try/catch?
Дальше, там у меня работа с файлами (создание превью например, может еще что, не помню). Господи, это мне весь код придется перечитывать и думать, где там может произойти ошибка.

8. Еще там у меня пара косяков в jquery, но скорее всего мне нужно просто отдохнуть.
Например, передо мной встала задача создать дерево элементов на лету, типа $("<div><p>test</p></div>"), а затем к вложенному p применить addClass("test").
Если создавать эти элементы из строки, то все работает. Но я беру контент из шаблона <s cript type="text/template" id="template">разметка</s cript>, $($("#template").html()) вот это не работает. Впрочем в этом не уверен, нужно перепроверить. В прошлый раз я полчаса мучился с addClass(".test"), точку по привычке поставил. Так что может и зедсь моя ошибка.

Еще мне нужно в списке комментариев поставить обработчик на каждый из комментариев (на ссылку #reply). Естественно, это нужно делать на родителе. Прикол в том, что внутри этого родительского элемента лежит еще и форма отправки комментария. Так что мой preventDefault, рассчитанный на то чтобы грохнуть ссылку, убьет и сабмит формы. Форму не охота вытаскивать из дерева комментариев, она должна открываться под тем комментарием, на который юзер отвечает.
А, блин, наверное придется делать через абсолютное позиционирование.
#245 #621786
Переписал файлообменник почти с нуля. Заменил смарти на твиг, подключил jquery, сверстал на бутстрапе. Отрефакторил как мог, но чувствую что все равно код можно улучшить. Например с подключением аякса появилась куча веток типа if (isAjax) {...}. Некрасиво, но не знаю что с этим делать.
https://github.com/nsdvw/file-sharing

Вопросы.
1. Можно ли как-то использовать подготовленные выражения с sql оператором IN (...)? Мне нужно найти пользователей с id перечисленными в массиве.
Нашел несколько советов из гугла (либо лепить запрос руками и байндить поштучно, либо использовать трюк с mysql функциями типа find_in_set)
http://stackoverflow.com/questions/1586587/pdo-binding-values-for-mysql-in-statement/1586650#1586650
Использую второй вариант с функцией, но мало ли, вдруг у этого подхода есть недостатки (например при смене субд придется ходить и переписывать все запросы).

2. Что делать с импортированием классов? Если писать use для каждого, то это займет половину строк скрипта. Если не импортировать, а писать полный неймспейс, получаются длинные строки. Пока делаю так: импортирую только те классы, упоминание которых встречается более 1 раза. Но это же не по программерски, делать через раз без четкой системы. Может есть какой-нибудь стандарт? В php7 вроде пытались что-то с этим сделать, но вышло не очень, там всего лишь группировка по корневому неймспейсу.

3. Хотел пожаловаться на бутстрап. Оп тут проповедует семантичненькую верстку с минимумом тегов и четким разделением ответственности между css и html, а они там намешали вложенных дивов с десятками классов, пустые теги для создания иконок например, ссылки которые на самом деле кнопки и кнопки которые ссылки, ну и вообще черт знает что.
Но выглядит шикарно, ничего не скажешь.
А, в пагинаторе еще почему-то переход по заблокированной ссылке "Next" все равно происходит. То есть они конечно сделали ее серенькой, и даже ховер с зачеркнутой ручкой, только вот при клике переход происходит (на эту же страницу, тупо перезагрузка). Это так и задумано по каким-то левым соображениям (типа юзер может обидеться, почему в свободной стране ему запрещают перейти по ссылке и подать в суд?), или это не додумано, и я должен сам повесить на нее preventDefault?
Еще какая-то фигня с модальными окнами: если повесить триггер не на кнопку, как показано в доках, а на ссылке, то модальное окошко будет грузить именно то, что расположено по этой ссылке.
Мне вообще-то нужно было, чтобы при отключенном js пользователь мог спокойно перейти по ссылке на форму редактирования, расположенную на другой странице.
Наверное придется изобретать трюк: сделать и ссылку, и кнопку, кнопка скрыта по умолчанию, а js меняет их местами, то есть делает ссылку скрытой, а кнопку отображает.

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

5. У слима вроде есть свои методы для работы с сессией и куками, но у меня они используются в своих классах, это что, передавать весь объект приложения чтобы сделать $app->setCookie? Почему нельзя сделать родное setcookie?

6. Статические методы в твиге как использовать? Я насоздавал себе статических хелперов, которые отдают пути к файлам например, а в твиге оказывается их теперь не так просто использовать.
Подключил функцию вида return call_user_func_array("{$class}::{$method}", $args), но вызов в представлении получается громоздкий, тем более приходится писать полное пространство имен в имени класса.

7. Урок по исключениям читал. Но не понял, как практически использовать. Да-да, в тех местах, где "что-то может случиться", ставим try{}catch(){} и в кетче а) пишем в лог (писать свой логгер? не хотет, возьму готовый), б) выводим заглушку для пользователя, форбидден для робота.
Я не понимаю, в каких местах "может что-то случиться"? Подключение к базе, ага. Это при создании объекта pdo, или он ленивый и поключится только в момент execute?
Все exec/execute завернуть в try/catch?
Дальше, там у меня работа с файлами (создание превью например, может еще что, не помню). Господи, это мне весь код придется перечитывать и думать, где там может произойти ошибка.

8. Еще там у меня пара косяков в jquery, но скорее всего мне нужно просто отдохнуть.
Например, передо мной встала задача создать дерево элементов на лету, типа $("<div><p>test</p></div>"), а затем к вложенному p применить addClass("test").
Если создавать эти элементы из строки, то все работает. Но я беру контент из шаблона <s cript type="text/template" id="template">разметка</s cript>, $($("#template").html()) вот это не работает. Впрочем в этом не уверен, нужно перепроверить. В прошлый раз я полчаса мучился с addClass(".test"), точку по привычке поставил. Так что может и зедсь моя ошибка.

Еще мне нужно в списке комментариев поставить обработчик на каждый из комментариев (на ссылку #reply). Естественно, это нужно делать на родителе. Прикол в том, что внутри этого родительского элемента лежит еще и форма отправки комментария. Так что мой preventDefault, рассчитанный на то чтобы грохнуть ссылку, убьет и сабмит формы. Форму не охота вытаскивать из дерева комментариев, она должна открываться под тем комментарием, на который юзер отвечает.
А, блин, наверное придется делать через абсолютное позиционирование.
#246 #621820
У слима есть встроенный логгер.

>The Slim application’s log object will write log messages to slim.errors whenever an Exception is caught or the log object is manually invoked.



$app = new \Slim\Slim([
'slim.errors' => fopen('../error.log', 'a')
]);
Продолжает писать в stderr, то есть в системный лог и в браузер, а я хочу перенаправить в error.log
#247 #621853
http://ideone.com/3muueO
Прошу проверить задачу, указать на недостатки кода.
#248 #621854
Посмотрите на облочка на этих двух сайтах:
http://aqua.dreamtown.ua
http://dreamtown.ua
Они как бы по определённому закону реагируют на действия мышки вблизи, как называет такой эффект?
#249 #621860
>>621854

>Посмотрите на облочка, как называет такой эффект


jquery parallax
#250 #621861
>>621854
Это параллакс эффект от движения мыши.
http://verstaemvse.ru/demo/jparallax/
#251 #621878
>>621860
>>621861
Спасибо
#252 #621883
>>621514

>Задача на тесты: https://gist.github.com/codedokode/8733007 - как тебе?


Отлично. За неё, думаю, и возьмусь в скором времени. Спасибо.
Раньше там Symfony не было в предлагаемых технологиях.

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


Тоже может быть.
#253 #621945
>>621781
А где твоя задача на поиск и исправление ошибок в тексте?
#254 #621966
>>621786
503 а не 403, ну оговорился.

По поводу исключений, пробежался по коду, я так понимаю нужно обработать места где работа с базой или файлами.
Для начала ловить PDOException в месте инициализации соединения.
На php.net написано что-то странное
http://php.net/manual/ru/pdo.error-handling.php

>Метод PDO::__construct() будет всегда бросать исключение PDOException, если соединение оборвалось


Как понимать "оборвалось"? Исключение будет брошено не только в момент создания соединения, но и в любой другой момент, если произошел разрыв? При чем тут тогда конструктор? Это наверное срабатывает деструктор, если соединение теряется, а не конструктор. Но кажется суть в том, что исключение будет брошено не только при отсутствии соединения в момент инициализации, но и в любой другой момент. То есть мне не нужно его ловить на селектах например? Достаточно только new PDO обернуть в try/catch?

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

Функция move_uploaded_file вроде ничего сама не бросает. Но выдает какое-то предупреждение

> ...если файл не может быть перемещён по каким-либо причинам, никаких действий не предпринимается и move_uploaded_file() возвращает FALSE. Кроме того, отображается предупреждение.


Notice я так понял? А ошибки подавляются, если я оборачиваю в try/catch, или они живут своей жизнью, и пишутся как обычно в стандартный лог?
Ну короче тут надо бросить исключение. Непонятно правда что писать в message. Couldn't upload file :( Как-то вообще можно узнать причину, по которой не сработал move_uploaded_file? Скорее всего просто нет прав на запись, но все же.

Еще там есть генерация превью. В случае, если превью не существует, будет попытка его сгенерировать. Если и оригинального файла нет в папке upload, тогда нужно бросить исключение. Можно конечно просто поставить еще одну ветку в условии, типа если и оригинального файла нет, ну и ладно, будет пустое место с альт-текстом вместо картинки.
Но наверное это нехорошо, и лучше отслеживать такое, чтобы прочитал админ и настучал разработчикам.
У меня как раз только что произошла эта ошибка, когда клонировал свой репозиторий в другую папку ради теста установки. Все работает, а страница просмотра файла падает
c exception 'ErrorException' with message 'imagecreatefromjpeg(upload/4_374491.jpg.txt): failed to open stream: No such file or directory'
Запись в старой базе есть (мне лень было заливать новую), а файла ей соответствующего нет.
Только мне кажется тут в отличие от других случаев не нужно отдавать 503 и грустную страницу unavailable, не хватает всего лишь картинки. Так что в catch только записать в лог в этом случае.

По поводу логов я так и не понял, как писать в свой лог при помощи стандартного слимовского логгера. Вроде никак. Зато есть другой логгер от разработчиков https://github.com/codeguy/Slim-Logger
Вот тут у меня получилось записать свое сообщение, это мне нравится.
#254 #621966
>>621786
503 а не 403, ну оговорился.

По поводу исключений, пробежался по коду, я так понимаю нужно обработать места где работа с базой или файлами.
Для начала ловить PDOException в месте инициализации соединения.
На php.net написано что-то странное
http://php.net/manual/ru/pdo.error-handling.php

>Метод PDO::__construct() будет всегда бросать исключение PDOException, если соединение оборвалось


Как понимать "оборвалось"? Исключение будет брошено не только в момент создания соединения, но и в любой другой момент, если произошел разрыв? При чем тут тогда конструктор? Это наверное срабатывает деструктор, если соединение теряется, а не конструктор. Но кажется суть в том, что исключение будет брошено не только при отсутствии соединения в момент инициализации, но и в любой другой момент. То есть мне не нужно его ловить на селектах например? Достаточно только new PDO обернуть в try/catch?

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

Функция move_uploaded_file вроде ничего сама не бросает. Но выдает какое-то предупреждение

> ...если файл не может быть перемещён по каким-либо причинам, никаких действий не предпринимается и move_uploaded_file() возвращает FALSE. Кроме того, отображается предупреждение.


Notice я так понял? А ошибки подавляются, если я оборачиваю в try/catch, или они живут своей жизнью, и пишутся как обычно в стандартный лог?
Ну короче тут надо бросить исключение. Непонятно правда что писать в message. Couldn't upload file :( Как-то вообще можно узнать причину, по которой не сработал move_uploaded_file? Скорее всего просто нет прав на запись, но все же.

Еще там есть генерация превью. В случае, если превью не существует, будет попытка его сгенерировать. Если и оригинального файла нет в папке upload, тогда нужно бросить исключение. Можно конечно просто поставить еще одну ветку в условии, типа если и оригинального файла нет, ну и ладно, будет пустое место с альт-текстом вместо картинки.
Но наверное это нехорошо, и лучше отслеживать такое, чтобы прочитал админ и настучал разработчикам.
У меня как раз только что произошла эта ошибка, когда клонировал свой репозиторий в другую папку ради теста установки. Все работает, а страница просмотра файла падает
c exception 'ErrorException' with message 'imagecreatefromjpeg(upload/4_374491.jpg.txt): failed to open stream: No such file or directory'
Запись в старой базе есть (мне лень было заливать новую), а файла ей соответствующего нет.
Только мне кажется тут в отличие от других случаев не нужно отдавать 503 и грустную страницу unavailable, не хватает всего лишь картинки. Так что в catch только записать в лог в этом случае.

По поводу логов я так и не понял, как писать в свой лог при помощи стандартного слимовского логгера. Вроде никак. Зато есть другой логгер от разработчиков https://github.com/codeguy/Slim-Logger
Вот тут у меня получилось записать свое сообщение, это мне нравится.
66 Кб, 1032x783
#255 #621997
Тэкс-тэкс, что тут у нас? Ещё одно топорное и неказистое решение от гуманитария? Ну наконец-то!
https://ideone.com/XYyTBQ - даже Идеоне говорит, как XYyёво быть TоBQй.
Задача на проверку и исправление ошибок.
Все замечания ОПа вроде бы учёл.
#256 #622055
>>621997
For не переделал в foreach.
#257 #622088
Какие книги по пхп полезно было бы себе купить почитать? В ОП-посте даны две: одна 2006, другая 2009 года. Староваты ведь, не?
#258 #622089
>>622088
Никакие.
400 Кб, 1918x782
#259 #622092
>>622055
Вот переделал, спасибо за напоминание: https://ideone.com/hZQ6Gk
Также добавил условие для текста, в котором нет ошибок.
Вопрос: как прерывать выполнение всего скрипта, когда переменная соответствует определённому условию?
У меня исправление ошибок идёт отдельным циклом с foreach, он запускается и тогда, когда в предыдущем срабатывает
else {
echo "Ошибок не найдено.";
break;}
И получается, что ошибок не найдено, а текст исправляется.
Как скрипт остановить в этом случае?
#260 #622093
>>622092
Сразу в голову гуманитарию приходит муть с ещё одной проверкой текста в этом последнем цикле всеми регулярками сразу, в соответствии с которой текст либо меняется, либо не меняется.
Но пока гоню от себя первую пришедшую мысль, подожду советов.
713 Кб, 1366x768
#261 #622094
OP, ты же вроде знаешь японский? Почему в ниппонию не перекатишься, лучше же чем в рашке?
63 Кб, 400x637
#262 #622095
>>621997
Развивай привычку мыслить логически, вот годный учебник по логике.
#263 #622113
>>622094

>в рашке


ОП вряд ли мыслит подобными петушиными категориями.
Это видно и по его сайту, и по его ответам.
#264 #622117
Добрый день, после полугода работы в местной конторе у меня развилась стойкая неприязнь к верстке особенно на сайтах где по тз есть адаптивность. Как не скатиться в быдловерстальщики, а продолжить путь бэкенд программиста? На данный момент знаком с несколькими CMS, sql слабоват, но для уровня работы с cms пока-что хватало, js на таком уровне чтобы пользовать jquery/ajax. Так вот, в какую сторону дальше смотреть?
#265 #622122
>>622117
Ты это я, бро. Я тоже спустя полгода продолжил выполнять задачи ОПа. И тоже работаю в быдлоконторе.
#266 #622126
>>622122
Наверное как и мне ещё и зп маленькую платят, при том что приходится тянуть по несколько проектов самому?
#267 #622132
>>622126
Я как на конвеере. Мне дают заказ, я и дизайн спизжу и верстку сделаю, и заполню. И получаю за это 30к. И все это быстро сделать.
#268 #622135
>>622132
Тоже такое ощущение, если по началу я делал по проекту в месяц, и сильно нервничал по поводу того, что я не успеваю что-то, на выходных иногда работал и допоздна засиживался. Сейчас же уже какой-то похуизм выработался когда висит по 3-4 сайта на мне и дедлайн близко - всё равно стараюсь не сидеть дольше положенного, и голову не забиваю этим. Хотя иногда бывают интересные задачи, но в основном чувствую что скатывается в рутину, и всё больше дают сайтов под верстку+настройку функционала по мелочи. Грусть.
#269 #622146
>>622113
Ну ок, в россии. Климат и уровень сервиса лучше, еда лучше, ЗП тоже выше..
#270 #622151
>>622146
Поддвачну. Залипаю на ролики этого анона https://www.youtube.com/channel/UCTfdoffYyeLL2_8wtMbkLDA
(он, кстати, переодически постит в автаче), но боюсь пхп-макаке о таком и мечтать нельзя.
#271 #622153
>>622151
Кстати, тоже анимешник, как и ОП.
#272 #622205
>>622151
сша - говно, у вована(vovanjapan - видеоблогер рассказывающий о японии) есть запись с русским ученым который жил в японии а потом переехал в сша, тот говорит что в сша в общем примерно как в россии, но не такая разруха.

>боюсь пхп-макаке о таком и мечтать нельзя


PHP-developer'у можно как раз таки, вон Шамов(тоже блог о японии) вообще сисадмином работает, а это имхо уровень ниже, если сравнивать с грамотным разработчиком.
#273 #622257
>>622088
бамп вопросу. И кстати, где ОП?
98 Кб, 445x600
#274 #622273
>>622093
Ну вот то, что и пришло тогда в голову: https://ideone.com/b7y9Pf
К ОПобоязни добавилась ещё и говнокодобоязнь, хотя тут всё изначально связано.

Как такого избежать, чтобы не лепить дополнительную проверку регуляркой для прерывания скрипта в середине?
#275 #622277
>>622257
Мануал на php.net - по-любому.
А так читать просто для выяснения основных принципов, синтаксиса и т.п.
#276 #622288
>>619873 (OP)
ОП, проверь еще одну, а я пока задачку про кратчайший путь исправлю.
http://ideone.com/vJPg7z
Надеюсь ты закроешь глаза на то, что я не сделал оформление таблицей, уж очень лень
#277 #622296
Ечть ли где почитать коммерческое применение паттернов? Теория и сферические примеры это все заебись, но данный момент у меня нет задач, где я осознанно мог применить что-то сложнее Синглтона. А в сети вместо реальных кейсов использования паттернов в работе нет. Уже возникло ощущение, что это идея фикс, о которой говорят только на хабре и спрашиввют на собеседованиях, чтобы потешить чсв, а по факту все говнодят. Ни разу не встретил и не читал такого: "На работе у нас возникла такая то задача, мы применили такие то паттерны, и это принесло профиты."
#278 #622297
Какие перспективы пхп-программиста? Можно ли выбиться в люди, переехать заграницу (в будущем?) или это чистый макакинг за 40 к в месяц без будущего и надежд?
#279 #622298
>>621786

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

> Можно ли как-то использовать подготовленные выражения с sql оператором IN (...)?


Плейсхолдеров для массивов в PDO нет. Бери библиотеку где они есть (может doctrine dbal? не уверен) или пиши свою функцию для этого. Можешь поискать библиотеки-обертки для PDO, сравнить, написать тут про то какая удобнее.

> 2. Что делать с импортированием классов?


Я думаю проще всего писать use. У меня в sublime плагин какой-то есть, PHP helper или PHP companion, он сам вставляет use при нажатии F5 на имени класса.

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

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


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

> почему-то переход по заблокированной ссылке "Next" все равно происходит


Потому что в HTML нельзя запретить ссылку (инпуты - пожалуйста, а ссылку нет). Надо просто не выводить там тег a или выводить span.
Яваскрипт тут не требуется.

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


Почитай документацию или исходный код плагина. Может есть опция или можно что-то дописать.

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


Правильная мысль. И я надеюсь что и обычная и аяксовая форма у тебя обрабатывается одним кодом. И ты также сделал HTML5 валидацию.

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


Для начала изучи код плагина.

> 4. Нужна ли пагинация на аяксе?


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

> Если надо сделаю (хотя задолбался и неохота)


Это можно как-то автоматизировать, типа ты указываешь на ссылке свойство data-update="some-id" и он обновляет этот id на странице (а при открытии в новой вкладке или отсутсвии JS открывается обычная страница). И так можно «аяксизировать» любу. ссылку. Гитхаб по моему так делает, и есть готовые плагины, но в них надо разбираться а не вешать бездумно.

Если делаешь аякс-ссылки - проверяй что меню правой кнопки на ссылке полноценно работает.

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


Там есть 2 объекта для чтения и записи кук, по моему $app->request->cookies, $app->response->cookies - можно передавать только нужный.

> Почему нельзя сделать родное setcookie?


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

> 6. Статические методы в твиге как использовать?


Можно создать функцию в твиге:

http://twig.sensiolabs.org/doc/advanced.html#functions
http://twig.sensiolabs.org/doc/advanced.html#filters

(почитай вообще всю эту страницу)

или можно переделать на нестатический.
#279 #622298
>>621786

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

> Можно ли как-то использовать подготовленные выражения с sql оператором IN (...)?


Плейсхолдеров для массивов в PDO нет. Бери библиотеку где они есть (может doctrine dbal? не уверен) или пиши свою функцию для этого. Можешь поискать библиотеки-обертки для PDO, сравнить, написать тут про то какая удобнее.

> 2. Что делать с импортированием классов?


Я думаю проще всего писать use. У меня в sublime плагин какой-то есть, PHP helper или PHP companion, он сам вставляет use при нажатии F5 на имени класса.

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

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


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

> почему-то переход по заблокированной ссылке "Next" все равно происходит


Потому что в HTML нельзя запретить ссылку (инпуты - пожалуйста, а ссылку нет). Надо просто не выводить там тег a или выводить span.
Яваскрипт тут не требуется.

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


Почитай документацию или исходный код плагина. Может есть опция или можно что-то дописать.

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


Правильная мысль. И я надеюсь что и обычная и аяксовая форма у тебя обрабатывается одним кодом. И ты также сделал HTML5 валидацию.

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


Для начала изучи код плагина.

> 4. Нужна ли пагинация на аяксе?


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

> Если надо сделаю (хотя задолбался и неохота)


Это можно как-то автоматизировать, типа ты указываешь на ссылке свойство data-update="some-id" и он обновляет этот id на странице (а при открытии в новой вкладке или отсутсвии JS открывается обычная страница). И так можно «аяксизировать» любу. ссылку. Гитхаб по моему так делает, и есть готовые плагины, но в них надо разбираться а не вешать бездумно.

Если делаешь аякс-ссылки - проверяй что меню правой кнопки на ссылке полноценно работает.

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


Там есть 2 объекта для чтения и записи кук, по моему $app->request->cookies, $app->response->cookies - можно передавать только нужный.

> Почему нельзя сделать родное setcookie?


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

> 6. Статические методы в твиге как использовать?


Можно создать функцию в твиге:

http://twig.sensiolabs.org/doc/advanced.html#functions
http://twig.sensiolabs.org/doc/advanced.html#filters

(почитай вообще всю эту страницу)

или можно переделать на нестатический.
#280 #622300
>>622297
Удваиваю. Знающие, подскажите. Неохота осваивать PHP, чтобы пилить вордпрессы до конца жизни.
#281 #622304
Кстати, ОП, пока ты здесь, хотелось бы спросить насчет:
>>621513

>Загрузку файла наверно надо вынести в отдельные методы



Я ведь уже делал загрузку файла в методе класса файла, ты сказал, что этот код должен быть в контроллере, а не в модели. Так в какие методы её выносить? Хелпер это ведь тоже модель.
#283 #622314
Какова длинна поля txt в mySQL. Могу я туда 3 томник войны и мира засунуть?
#284 #622318
>>621786

> 7. Урок по исключениям читал. Но не понял, как практически использовать.


При исключении выбрасываешь throw. Если тебе надо ловить это исключение - делаешь свой класс и ловишь его, но в 99% случаев это не требуется. В 99% случаев catch у тебя один на всю программу. Вот еще паста:

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

Как надо обрабатывать исключения (и как делает Слим по умолчанию):

- записать информацию в лог
- показать пользователю заглушку
- на заглушке выставить HTTP 503 код ответа для роботов
- на компьютере разработчика (при display_errors = 1 или debug=true) показать подробности и стектрейс

Если как в плохих учебниках сделать catch + echo то:

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

Как будет если просто не ловить исключение:

- информация пишется в лог (ок)
- на компьютере разработчика выводятся подробности (ок)
- пользователь видит белую страницу (не ок)
- отдается код 200 (не ок)

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

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

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

Задавай вопросы еще если что.

> Это при создании объекта pdo, или он ленивый и поключится только в момент execute?


Не знаю, проверь создав объект, сделав sleep, посмотри в базе процессы через SHOW fuLL PROCESSLIST, есть соединение или нет. Или программой WireShark если ты под виндой.

> Я не понимаю, в каких местах "может что-то случиться"?


Хочешь прочитать конфиг, а его нет. Или ждешь что на вход функции придет число больше нуля, а пришло меньше нуля. Или отпарвляешь запрос к АПИ, а приходит в ответ код HTTP 500.

> Все exec/execute завернуть в try/catch


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

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


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

> $($("#template").html()) вот это не работает. В


Посмотри что выведет $('#tpl').html(). Возможно, надо взять html(), преобразовать как тебе надо и вставить на страницу через $('.div').html(html);

jQuery по моему воспринимает строку как hTML только если она начинается с < (иначе он считает ее селектором).

Я тебе не советую полагаться вообще на это автоопределение типа, это не надежно. Там есть готовая функция именно для HTML, http://api.jquery.com/jquery.parsehtml/

> Еще мне нужно в списке комментариев поставить обработчик на каждый из комментариев (на ссылку #reply). Естественно, это нужно делать на родителе.


$.on по моему

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


Надо указать правильный селектор в $.on

> А, блин, наверное придется делать через абсолютное позиционирование.


не стоит. Стоит внимательно изучить возможности jquery по установке обработчиков. Также, если есть время и желание, можешь взять наши задачи на DOM и решить их с использованием jQuery.

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


Это костыль какой-то, лучше бы через IN.

Код особо не смотрел пока, вот что бросается:

https://github.com/nsdvw/file-sharing/blob/master/web/js/comment-ajax.js#L4

> var errorBox = $("#commentForm .text-danger");


Мне не очень нравится селетктор. Там написано: «блоки с ошибкой в форме комментариев». Но что если верстальщик поменяет стиль например с text-danger на text-info? ЧТо если он добавит позже еще такой блок в форму? Это явно хрупкий код, меняя верстку ты ломаешь работу JS скрипта.

Я могу придумать такие способы решения:

- использование префикса js- для классов/id которые нужны не в верстке, а в скрипте. Вроде так делают на гитхабе- глянь-ка код страницы.
- использование data атрибутов
- использование более явного названия класса: #commentForm form-error-message

В общем подумай над поддерживаемостью твоего кода.

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

> https://github.com/nsdvw/file-sharing/blob/master/web/js/comment-ajax.js#L8


> var form = document.forms.comment_form;


Не стоит это использовать, это древний способ, лучше использовать jQuery тут.

> var formData = new FormData(form);


В HTML4-браузерах нет FormData, а preventDefault ты уже вызвал. В них форма не будет работать даже в обычном режиме.

> var replyID = form.querySelector(".replyID").value;


Не стоит смешивать поиск через jQuery и DOM. Также, элементы формы удобнее всего искать по имени, name, а не по классу.

> window.location.pathname.split("/").pop()


Это надо сделать функцией, и я кстати не понимаю, зачем это. Если это id файла то его надо передавать в яваскрипт явно, а не вытаскивать такими вот хаками. Что если мы разместим форму на странице с другим URL? Все сломается.

Все входные переменные надо передавать явно из PHP через тег скрипт на странице и json_encode:

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

Предлагаю тебе самому подумать почему и зачем тут json_encode и raw.

> $(function () {


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

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

Также, тут явно некоторые вещи можно вынести в функции, а не писать весь JS сплошной стеной.

также, у тебя в JS коде нет приема ошибок от сервера. как серверу сообщить об ошибке?

Также, мне не нравится что по коду много раз разбросан селектор "#commentForm. Лучше наверно получить этот объект один раз в начале кода.

Не уверен, нужен ли шаблон комментария в JS коде. Тут нет дублирования серверного шаблона? И если уж делать шаблон, то делать его как шаблон, а не вот так:

$(".media-heading", template).text(login);
$(".comment-text", template).text(comment.contents);

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

> errorBox.text("Message is empty!");


Это лучше вынести в функцию вроде showError()
#284 #622318
>>621786

> 7. Урок по исключениям читал. Но не понял, как практически использовать.


При исключении выбрасываешь throw. Если тебе надо ловить это исключение - делаешь свой класс и ловишь его, но в 99% случаев это не требуется. В 99% случаев catch у тебя один на всю программу. Вот еще паста:

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

Как надо обрабатывать исключения (и как делает Слим по умолчанию):

- записать информацию в лог
- показать пользователю заглушку
- на заглушке выставить HTTP 503 код ответа для роботов
- на компьютере разработчика (при display_errors = 1 или debug=true) показать подробности и стектрейс

Если как в плохих учебниках сделать catch + echo то:

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

Как будет если просто не ловить исключение:

- информация пишется в лог (ок)
- на компьютере разработчика выводятся подробности (ок)
- пользователь видит белую страницу (не ок)
- отдается код 200 (не ок)

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

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

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

Задавай вопросы еще если что.

> Это при создании объекта pdo, или он ленивый и поключится только в момент execute?


Не знаю, проверь создав объект, сделав sleep, посмотри в базе процессы через SHOW fuLL PROCESSLIST, есть соединение или нет. Или программой WireShark если ты под виндой.

> Я не понимаю, в каких местах "может что-то случиться"?


Хочешь прочитать конфиг, а его нет. Или ждешь что на вход функции придет число больше нуля, а пришло меньше нуля. Или отпарвляешь запрос к АПИ, а приходит в ответ код HTTP 500.

> Все exec/execute завернуть в try/catch


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

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


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

> $($("#template").html()) вот это не работает. В


Посмотри что выведет $('#tpl').html(). Возможно, надо взять html(), преобразовать как тебе надо и вставить на страницу через $('.div').html(html);

jQuery по моему воспринимает строку как hTML только если она начинается с < (иначе он считает ее селектором).

Я тебе не советую полагаться вообще на это автоопределение типа, это не надежно. Там есть готовая функция именно для HTML, http://api.jquery.com/jquery.parsehtml/

> Еще мне нужно в списке комментариев поставить обработчик на каждый из комментариев (на ссылку #reply). Естественно, это нужно делать на родителе.


$.on по моему

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


Надо указать правильный селектор в $.on

> А, блин, наверное придется делать через абсолютное позиционирование.


не стоит. Стоит внимательно изучить возможности jquery по установке обработчиков. Также, если есть время и желание, можешь взять наши задачи на DOM и решить их с использованием jQuery.

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


Это костыль какой-то, лучше бы через IN.

Код особо не смотрел пока, вот что бросается:

https://github.com/nsdvw/file-sharing/blob/master/web/js/comment-ajax.js#L4

> var errorBox = $("#commentForm .text-danger");


Мне не очень нравится селетктор. Там написано: «блоки с ошибкой в форме комментариев». Но что если верстальщик поменяет стиль например с text-danger на text-info? ЧТо если он добавит позже еще такой блок в форму? Это явно хрупкий код, меняя верстку ты ломаешь работу JS скрипта.

Я могу придумать такие способы решения:

- использование префикса js- для классов/id которые нужны не в верстке, а в скрипте. Вроде так делают на гитхабе- глянь-ка код страницы.
- использование data атрибутов
- использование более явного названия класса: #commentForm form-error-message

В общем подумай над поддерживаемостью твоего кода.

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

> https://github.com/nsdvw/file-sharing/blob/master/web/js/comment-ajax.js#L8


> var form = document.forms.comment_form;


Не стоит это использовать, это древний способ, лучше использовать jQuery тут.

> var formData = new FormData(form);


В HTML4-браузерах нет FormData, а preventDefault ты уже вызвал. В них форма не будет работать даже в обычном режиме.

> var replyID = form.querySelector(".replyID").value;


Не стоит смешивать поиск через jQuery и DOM. Также, элементы формы удобнее всего искать по имени, name, а не по классу.

> window.location.pathname.split("/").pop()


Это надо сделать функцией, и я кстати не понимаю, зачем это. Если это id файла то его надо передавать в яваскрипт явно, а не вытаскивать такими вот хаками. Что если мы разместим форму на странице с другим URL? Все сломается.

Все входные переменные надо передавать явно из PHP через тег скрипт на странице и json_encode:

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

Предлагаю тебе самому подумать почему и зачем тут json_encode и raw.

> $(function () {


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

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

Также, тут явно некоторые вещи можно вынести в функции, а не писать весь JS сплошной стеной.

также, у тебя в JS коде нет приема ошибок от сервера. как серверу сообщить об ошибке?

Также, мне не нравится что по коду много раз разбросан селектор "#commentForm. Лучше наверно получить этот объект один раз в начале кода.

Не уверен, нужен ли шаблон комментария в JS коде. Тут нет дублирования серверного шаблона? И если уж делать шаблон, то делать его как шаблон, а не вот так:

$(".media-heading", template).text(login);
$(".comment-text", template).text(comment.contents);

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

> errorBox.text("Message is empty!");


Это лучше вынести в функцию вроде showError()
#285 #622319
>>621786

> function refreshCaptcha() {


> $("#captcha-img").attr("src", "/image/captcha_generator.php");


> }


Обновление картинки может занять много времени. При этом пользователь будет видеть старую картинку и может попытаться ее разгадать. подумай как этого избежать. Также, надо очищать поле с кодом. также, нужна кнопка явного обновления капчи.
#286 #622324
>>622314
http://www.php.su/mysql/?fields
TINYTEXT - Максимальная длина 255 символов
TEXT - Максимальная длина 65535 символов (64 Кб)
MEDIUMTEXT - Максимальная длина 16 777 215 символов
LONGTEXT - Максимальная длина 4 294 967 295 символов
#287 #622327
>>621775
https://github.com/fxsloker/Student

ОП, я обновил код немного. Посмотри на роутер. И я создал сущность. А еще я подумал, если у меня нужно работать с одной моделью почему бы и не использовать только один контроллер? Можно так и правильно ли так?
#288 #622332
>>621781
>>621665
ОП, ты тут? Посмотри мои решения, пожалуйста, очень жду комментариев
#289 #622345
>>621966

Надо смотреть английскую версию.

> Note:


> PDO::__construct() will always throw a PDOException if the connection fails regardless of which PDO::ATTR_ERRMODE is currently set. Uncaught Exceptions are fatal.



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

> Это наверное срабатывает деструктор, если соединение теряется, а не конструктор.


Нет, деструктор это при удалении объекта сборщиком мусора или счетчиком ссылок.

> То есть мне не нужно его ловить на селектах например?


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

> Достаточно только new PDO обернуть в try/catch?


Такой try/catch поймает только ошибки при создании объекта. Но тебе это не надо.

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


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

> Функция move_uploaded_file вроде ничего сама не бросает. Но выдает какое-то предупреждение


Слим преобразует PHP предупреждения в исключения, по моему вот в такие: http://php.net/manual/ru/class.errorexception.php

И правильно делает. Это принцип fail fast: http://habrahabr.ru/post/218325/ - он экономит твое время.

> А ошибки подавляются, если я оборачиваю в try/catch, или они живут своей жизнью, и пишутся как обычно в стандартный лог?


По умолчанию ошибки и try/catch вобще никак не связаны. Но Слим преобразует ошибки в исключения. Но ты не должен пытаться их ловить, так как они говорят об ошибке в коде программы и что надо ее исправить.

Вообще ловить исключения надо очень редко. И обычно их ловят только для того, чтобы что-то отменить или освододить и выкинуть исключение дальше. ну например, откатить выполнявшуюся транзацию. Вот пример кода, функция. которая выполняет переданный код внутри транзакции: https://github.com/doctrine/dbal/blob/master/lib/Doctrine/DBAL/Connection.php#L1086

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

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

> Непонятно правда что писать в message. Couldn't upload file :( Как-то вообще можно узнать причину, по которой не сработал move_uploaded_file? Скорее всего просто нет прав на запись, но все же.


Вообще через http://php.net/manual/ru/function.error-get-last.php но в данном случае Слим сам создаст ислючение из варнинга и запишет в него причину.

Вот это место в Слиме:

https://github.com/slimphp/Slim/blob/2.x/Slim/Slim.php#L1293
https://github.com/slimphp/Slim/blob/2.x/Slim/Slim.php#L1406

Изучи этот код и мануал по set_error_handler.

> Можно конечно просто поставить еще одну ветку в условии, типа если и оригинального файла нет, ну и ладно, будет пустое место с альт-текстом вместо картинки.


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

> По поводу логов я так и не понял, как писать в свой лог при помощи стандартного слимовского логгера.


Код/документацию смотрел?
#289 #622345
>>621966

Надо смотреть английскую версию.

> Note:


> PDO::__construct() will always throw a PDOException if the connection fails regardless of which PDO::ATTR_ERRMODE is currently set. Uncaught Exceptions are fatal.



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

> Это наверное срабатывает деструктор, если соединение теряется, а не конструктор.


Нет, деструктор это при удалении объекта сборщиком мусора или счетчиком ссылок.

> То есть мне не нужно его ловить на селектах например?


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

> Достаточно только new PDO обернуть в try/catch?


Такой try/catch поймает только ошибки при создании объекта. Но тебе это не надо.

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


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

> Функция move_uploaded_file вроде ничего сама не бросает. Но выдает какое-то предупреждение


Слим преобразует PHP предупреждения в исключения, по моему вот в такие: http://php.net/manual/ru/class.errorexception.php

И правильно делает. Это принцип fail fast: http://habrahabr.ru/post/218325/ - он экономит твое время.

> А ошибки подавляются, если я оборачиваю в try/catch, или они живут своей жизнью, и пишутся как обычно в стандартный лог?


По умолчанию ошибки и try/catch вобще никак не связаны. Но Слим преобразует ошибки в исключения. Но ты не должен пытаться их ловить, так как они говорят об ошибке в коде программы и что надо ее исправить.

Вообще ловить исключения надо очень редко. И обычно их ловят только для того, чтобы что-то отменить или освододить и выкинуть исключение дальше. ну например, откатить выполнявшуюся транзацию. Вот пример кода, функция. которая выполняет переданный код внутри транзакции: https://github.com/doctrine/dbal/blob/master/lib/Doctrine/DBAL/Connection.php#L1086

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

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

> Непонятно правда что писать в message. Couldn't upload file :( Как-то вообще можно узнать причину, по которой не сработал move_uploaded_file? Скорее всего просто нет прав на запись, но все же.


Вообще через http://php.net/manual/ru/function.error-get-last.php но в данном случае Слим сам создаст ислючение из варнинга и запишет в него причину.

Вот это место в Слиме:

https://github.com/slimphp/Slim/blob/2.x/Slim/Slim.php#L1293
https://github.com/slimphp/Slim/blob/2.x/Slim/Slim.php#L1406

Изучи этот код и мануал по set_error_handler.

> Можно конечно просто поставить еще одну ветку в условии, типа если и оригинального файла нет, ну и ладно, будет пустое место с альт-текстом вместо картинки.


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

> По поводу логов я так и не понял, как писать в свой лог при помощи стандартного слимовского логгера.


Код/документацию смотрел?
#290 #622346
>>622094

Для начала неплохо бы попасть туда в качестве туриста.
#291 #622347
>>622296

Возьми фреймворк типа Симфони или Юи 2 и ищи их в его коде.
#292 #622349
>>622304

Я наверно сказал из-за того что ты работу с FILES или POST в класс засунул. Это должно быть в index.php наверно. Ну идея примерно такая:

if (форма запощена) {
$file = $helper->validateFile(.....);

if (ошибок ент) {
$helper->saveFile($file);
redirect...;
}
}

вот как-то так должно быть в контроллере, мне кажется. Стандартный алгоритм работы с формой.
#293 #622351
>>622349
А метод валидации для чего? У _FILES ведь встроенный массив ошибок.
#294 #622366
>>622351

как раз проверить что там нет ошибки, что размер разрешенный, может потом еще что-то добавится.
#295 #622370
>>622366
Сейчас тоже проверяется, обчным ифом, а если ошибка есть - выбрасывается исключение с кодом ошибки и текстом.
#296 #622374
>>622095
Шта?
С логикой проблем у меня нет. Мои проблемы в том, что на информатике у нас не преподавали языки, у меня абсолютно нет опыта в таком.
Когда ты знаешь, что нужно сделать, но не вполне понимаешь, как это нужно сделать, - это не с логикой проблемы.
#297 #622382
>>622374
Какой у тебя бэкграунд вообщелвл, образование? Часто вижу тебя в треде
#298 #622383
Допустим есть класс для работы с imap (класс 1).
Заросы выполнять буду через класс для работы с сокетами (класс 2).
Чтобы не прописывать в классе 1 методы класса 2 я решил что можно передать эти методы как параметры в конструкторе а дальше дергать их когда нужно. Как это реализовать?
#299 #622397
>>622382
31 год, филологическое образование, работаю редактором в издательстве.
HTML, CSS Wordpress, SEO.
#300 #622398
#301 #622400
>>622397
Интересно. Зачем пыху учишь?
#302 #622403
Ну вот я немного научился верстать из ПСД и натягивать потом всё это на вордпресс, что теперь делать?
#303 #622404
>>622403
работу ищи
#304 #622407
>>622346
В /ja описано как, если коротко то надо 300к рублей
#305 #622411
>>622407
без образования и только с английским - реально? есть 300к и даже больше
770 Кб, 1798x1199
#306 #622428
ОП! Сделал задачку Я у мамы калькулятор. Буду ждать комментариев по решению а также по двум предыдущим

http://ideone.com/PlYb5t
31 Кб, 433x619
#307 #622437
Дали дамп базы, а там encoding ебанутый. Что делать? Вся кириллица в иероглифах.
Эта база использовалась с какой-то самопальной CMS, которая таки отоброжала русский текст нормально. Я в php профан, но вангую что есть какая то функция init_i18_new_kirilica_mb_init(true) которую нужно вызывать в начале скрипта, и все будет ок.
#308 #622445
Хз, но set_charset("utf8") после коннекта с бд, iconv("что-то", "UTF-8", $str), mb_convert_encoding($str, "UTF-8", "что-то"). Дамп развернуть и в phpMyAdmin сменить кодировку.
#309 #622447
Загуглишь как и что юзается вообщем
#310 #622450
ну и у файла тоже можно, есть онлайн конветоры итп.
#311 #622461
>>622445
>>622447
>>622450
Спасибо, но почему ты не используешь ссылки?
#312 #622467
>>622461

Я тут в первый раз. Не сориентировался куда тыкать.
Помогло? Или спасибо за варианты?
#313 #622498
>>622400
Для собственного проекта.
Ровно год назад появлялся в этом треде, спрашивал у ОПа советов мудрых, как быть.
ОП посоветовал изучать РНР, нанимать на фрилансе людей для сложных моментов.
Я внял только частично: решил полностью заказать на фрилансе весь проект, а вместо изучения просто расписывал ТЗ для создания проекта.
В итоге фрилансеры не справились с задачами (либо затягивали, либо откровенно обманывали), надоело это терпеть, решил всё изучить самостоятельно.
Теперь думаю изучить учебник ОПа, всё далее из ОП-поста, затем фреймворк Yii2, а потом заказывать отдельные элементы и системы для проекта, самостоятельно их интегрировать в него.
Такие вот дела.
Это уже сталь принципиальным, потому что потрачено много времени, какие-то деньги, многие оказались втянуты в него, имеются большие перспективы.
#314 #622501
>>622498
на работу возьмёшь?
#315 #622518
>>622498
А меня возьмёшь на работу?
#316 #622519
>>622501
Я когда подтяну знания, то многих знакомых анончиков приглашу, там работы много будет разнообразной.
И тут тоже буду искать людей, это точно.
#317 #622520
>>622518
Один фрилансер мне месяц канифолил мозги с модулем для регистрации - туда надо было интегрировать пять самых популярных социальных сетей, а также выбор группы пользователей при регистрации, к которой регистрирующийся себя относит, по желанию ввод личных данных сразу (номера телефона, имя-фамилии).
В итоге сделал простую интеграцию модуля от uLogin, попытался сдать в таком виде...
А ты ответственен ли, анончик?
#318 #622527
>>622519

>Нанял толпу быдлокодеров за гроши


>Внезапно кинули/не справились


> тут тоже буду искать людей, это точно


Необучаемый.
#319 #622530
>>622520
Зря выбрал PHP туда ли ты зашел, питушок, поведают мне, но ничего личного, пацаны. Бери питон, там средний исполнитель в разы адекватнее. Плати по часам и с трекером. Очень часто бывает, что исполнитель лажает с определением сроков и ему становится понятно, что проще кинуть тебя, чем доделывать; плюс при фикседе есть мотивация сделать тяп-ляп и сдать говно. Будь готов, что названный срок будет проебан в 3 раза при оценке твоего бюджета и рейта, фактическую оплату делай раз в две недели-месяц, работа должна вестись в виде ежедневных коммитов в репозиторий, который ты можешь чекать - чтобы не слушать "бля, я все сделал, но в провайдера попала молния и я не могу выложить" с последующим сливом через неделю.
И все, неадекватов ты быстро отсеешь. Но и самому придется попотеть, контролируя процесс.
#320 #622532
>>622527
На техподдержку многие сойдут.
На реализацию задумок - будет видно.
#321 #622533
Сап друзья, помоги совладать с вашей этой PHP и её средой интерпретации. Собсна суть такова, есть одна кодировка и она не даёт мне спать уже сотни часов, а именно КАЗАХСКАЯ. Я не могу использовать более менее вменяемую кодировку для правильного отображения работая с файловой системой, сами попробуйте.
Допустим есть файл ғғғғғғғғғғғғ.hui мне нужно его записать в директорию или, например, что в принципе не важно считать имя этого файла, я получаю полную лабуду вида Т“Т“Т“Т“Т“Т“Т“Т“Т“Т“Т“Т“.hui

использовал при этом такие функции как scandir и iconv
#322 #622534
>>622530
Спасибо, братишка, толковые советы.
Питон советовали многие, да, но я как-то два года назад уже пробовал читать книгу по РНР, поэтому решил и продолжить. К тому же, часть уже реализована, в которой надо разбираться и которую надо улучшать, а там всё на РНР+JS.

>Но и самому придется попотеть, контролируя процесс.


Я уже втянулся, мне это нравится.
#323 #622563
>>622411
я имел ввиду туристом, эта сумма на 2-3 недели, с английским там все хуево.
#324 #622572
>>622404
Хотел бы попробовать как-то зарабатывать на фрилансе вначале, но никак не могу решиться попробовать. Кстати, тут говорят о какой-то работе, нужно что то кому то? Может дадите мне попробовать?
#325 #622575
>>622572
Сделай мне сайт по инфе из вебархива. Только вордпресс не нужен, статики и бутстрэпа достаточно.
#326 #622576
>>622146
Само собой уровень России и Японии даже сравнивать нельзя, как и России и США и других подобных стран. Однако, айтишники сейчас практически по всему миру на одинаковом уровне, заработки если смотреть по ППС сравнимы. Ну что касательно других специальностей, то конечно всё совсем иначе.
Мимокрокодил
#327 #622577
>>622575
Что должен делать такой сайт?
#328 #622579
>>622577
Ничего, у меня когда-то спиздили домен, нужно сайт восстановить и сделать стильно-модно-молодежно, а не как делал я на таблицах в 2007.
#329 #622580
>>622576
В Японии для тебя карьерный рост заказан.
#330 #622582
>>622579
А, понял, я думал нужен какой-то сайт, который будет делать что то с информацией полученной из сайта вебархива. Я не умею в дизайн, могу только немного в вёрстку и само собой ПХП. Где можно посмотреть информацию о твоём сайте?
#331 #622584
>>622520
Да, тут все аноны ответственные. Я в том числе.
#332 #622585
>>622582
Мне переверстать нужно как раз, с таблиц на бутстрэп. Мыльцо дай, какой смысл этот тут обсуждать.
#333 #622588
>>622585
Пиши сюда vladimir.B3_pankratov1ANUSgmaznuilPUNCTUMc3,=om
#334 #622592
>>622519

>знакомых анончиков


как вы это делаете? тут же анонимно всё, я один тут годами сижу и никого не знаю лично?
#335 #622596
>>622592

> я один тут годами сижу и никого не знаю лично?



Да.
#336 #622600
>>622596

>как вы это делаете?

#337 #622601
>>622600
Анкетки в соц постят, а потом по контактам или скайпикам всем табуном шароебятся по интересам. Очевидно же.
#338 #622638
>>622498

Ты правильно решил. Если ты сам не разбираешься в каких-то технических вещах то не можешь эффективно управлять фрилансерами. Чтобы работать с фрилансерами надо либо самому быть специалистом, либо иметь лояльного специалиста который будет ими управлять. Иначе тебе навешают лапши на уши. Потому да, тебе стоит наверно научиться самому делать приложения. Проходи быстрее учебник и берись за студентов и файлообменник. Можешь его попробовать сразу на Юи делать, хотя конечно для маленького проекта Слим лучше бы подошел.
#339 #622640
>>622527

Его проблема в том что он не может правильно оценить квалификацию фрилансера и предлагаемые решения. Например он может не знать что задача решается готовым модулем и согласится на написание велосипеда.
#340 #622641
>>622533

Какая ОС? Если винда то с каким языком? Если казахский то какие у вас кодировки используются? 1251 (кириллица) как у нас или что-то свое?

Под виндой в функции работы с файлами в PHP надо передавать данные в виндовой кодировке. Если ты используешь utf-8 то имена файлов для функций PHP надо перекодировать в виндокодировку. И соответственно если ты читаешь список файлов с диска то надо перекодировать обратно.

Под линуксом и маком файловые функции работают обычно в utf-8, ничего делать не требуется.
#341 #622643
>>622411

Что-то дороговато, мне кажется можно экономней найти варианты.
#342 #622646
Решал тут задачу и для меня всё выглядит нормально, но $newAmount не высчитывается больше одного раза, поэтому прошу помочь.
Айдион http://ideone.com/h1bjyG
#343 #622647
>>622646
Почему не высчитывается? Высчитывается. Только ее составные части - $amountM * $percent не меняются в цикле.
мимо не пишу на пхп
#344 #622670
>>622298

>поискать библиотеки-обертки для PDO, сравнить


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

Да, у доктрины, вернее ее компонента (?) dbal (abstract level) имеются такие средства.
http://doctrine-orm.readthedocs.org/projects/doctrine-dbal/en/latest/reference/data-retrieval-and-manipulation.html#list-of-parameters-conversion
Но я не могу прикинуть, насколько большая эта библиотека и целесообразно ли ее подключать ради одного проблемного запроса. Лучше напишу свою функцию/метод, где запрос будет слепливаться в цикле и там же привязать параметры.

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

FluentPDO приглянулась. Простая, быстрая (хотя так все говорят), и с широкими возможностями. Нашу проблему array binding решает:
https://github.com/lichtner/fluentpdo/blob/0092fc16dbef345a61ce2c448f98f75c99886b30/tests/07-where-column-array.phpt#L8
И автор оперативно реагирует: в issues клянчили 'not in' условие, запушил спустя неделю https://github.com/lichtner/fluentpdo/issues/81
Добавил в закладки, но сейчас она мне особо ни к чему.

Совсем низкоуровневая библиотека:
https://github.com/auraphp/Aura.Sql#array-quoting
Просто квотят каждый элемент массива, потом склеивают:
https://github.com/auraphp/Aura.Sql/blob/2.x/src/ExtendedPdo.php#L840
Наверное, перепишу себе этот кусочек.

>Потому что в HTML нельзя запретить ссылку (инпуты - пожалуйста, а ссылку нет). Надо просто не выводить там тег a или выводить span.


Вложенный спан помог. Вообще выбросить ненужный вложенный тег нельзя, ломается селектор
https://github.com/twbs/bootstrap/blob/master/dist/css/bootstrap.css#L4724
Можно конечно сверху прописать свое правило, чтобы избавиться от вложенного тега, но смысл захламлять css ради чистки html. Ну и вообще раз используем фреймворк, то придется мириться с его недостатками.

Может есть более кошерный фреймворк, кроме бутстрапа? Чтобы была нормальная структура html и не было этой мешанины типа class class-another class-abc class-class-class
И еще чтобы была встроенная валидация форм и можно было грабить корованы.
#344 #622670
>>622298

>поискать библиотеки-обертки для PDO, сравнить


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

Да, у доктрины, вернее ее компонента (?) dbal (abstract level) имеются такие средства.
http://doctrine-orm.readthedocs.org/projects/doctrine-dbal/en/latest/reference/data-retrieval-and-manipulation.html#list-of-parameters-conversion
Но я не могу прикинуть, насколько большая эта библиотека и целесообразно ли ее подключать ради одного проблемного запроса. Лучше напишу свою функцию/метод, где запрос будет слепливаться в цикле и там же привязать параметры.

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

FluentPDO приглянулась. Простая, быстрая (хотя так все говорят), и с широкими возможностями. Нашу проблему array binding решает:
https://github.com/lichtner/fluentpdo/blob/0092fc16dbef345a61ce2c448f98f75c99886b30/tests/07-where-column-array.phpt#L8
И автор оперативно реагирует: в issues клянчили 'not in' условие, запушил спустя неделю https://github.com/lichtner/fluentpdo/issues/81
Добавил в закладки, но сейчас она мне особо ни к чему.

Совсем низкоуровневая библиотека:
https://github.com/auraphp/Aura.Sql#array-quoting
Просто квотят каждый элемент массива, потом склеивают:
https://github.com/auraphp/Aura.Sql/blob/2.x/src/ExtendedPdo.php#L840
Наверное, перепишу себе этот кусочек.

>Потому что в HTML нельзя запретить ссылку (инпуты - пожалуйста, а ссылку нет). Надо просто не выводить там тег a или выводить span.


Вложенный спан помог. Вообще выбросить ненужный вложенный тег нельзя, ломается селектор
https://github.com/twbs/bootstrap/blob/master/dist/css/bootstrap.css#L4724
Можно конечно сверху прописать свое правило, чтобы избавиться от вложенного тега, но смысл захламлять css ради чистки html. Ну и вообще раз используем фреймворк, то придется мириться с его недостатками.

Может есть более кошерный фреймворк, кроме бутстрапа? Чтобы была нормальная структура html и не было этой мешанины типа class class-another class-abc class-class-class
И еще чтобы была встроенная валидация форм и можно было грабить корованы.
#345 #622676
>>622298

>Можно создать функцию в твиге для вызова статических методов


Я так и сделал
function ($class, $method, array $args) {
return call_user_func_array("{$class}::{$method}", $args);
}

Но получается каша в представлении
<a class="btn btn-success"
href="{{callStaticMethod(
'\\FileSharing\\Helper\\ViewHelper',
'getDownLoadUrl',
[file.id, file.name])}}"
id="downloadLink">download
</a>
#346 #622691
Есть еще библиотека чисто под слим
https://github.com/FaaPz/Slim-PDO/blob/master/docs/Clause/WHERE.md
Хотя если честно не понял, чем она к слиму привязана, кроме неймспейса? Обычный квери билдер.

Тоже поддерживает множество условий типа whereIn('id', [1,2,3]);
Более сложный код (сложный в плане кол-ва классов и методов), чем у индусов из aura, которые просто квотят элементы массива, но реально используют плейсхолдеры.

Итого:
1. Заквотить в цикле элементы массива, как у aura
или
2. Юзать Slim-PDO с плейсхолдерами-вопросиками?
#347 #622739
>>622298

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


> Почитай документацию или исходный код плагина. Может есть опция или можно что-то дописать.


Ну да, он вроде воспринимает наличие атрибута href как включение опции remote, то есть будет игнорироваться data-target и контент браться по ссылке.
http://getbootstrap.com/javascript/#modals-options
Как отключить эту парашу не написано.

В исходном коде не понимаю, вроде оно должно быть отключено по умолчанию?
https://github.com/twbs/bootstrap/blob/master/dist/js/bootstrap.js#L1236
Кажется вот эта фигня включает:

> remote: !/#/.test(href) && href


Ну и как от этого избавиться?

Короче я тогда уберу все эти дата-атрибуты с ссылки и вызову modal('trigger') при попытке перехода
$("#modal-trigger").on("click", function (event) {
event.preventDefault();
$("#modalForms").modal('toggle');
});

Только наверное не onclick, а что-то другое. Что из этого списка сработает, если ссылка получит фокус табом и затем нажать enter? http://www.w3schools.com/jsref/dom_obj_event.asp
70 Кб, 600x449
#348 #622820
Окей, вкатываюсь в PHP.

Выполнил кубики http://ideone.com/61yg3b
И циклы http://ideone.com/1pXwxA

Примеры не смотрел, читал теорию и задание.
Сейчас буду массивы изучать.
#349 #622824
>>622592
Есть же конфа в Телеграме, бывали конфы в Скайпе, в ВК. Вот анончик оставил e-mail выше - вот так и знакомимся.

>>622638
Да, всё верно, братишка, столкнулся с подобным как раз.
Мне ещё, наоборот, пытаются подсунуть готовые решения по цене написанных с нуля. Вот как с тем модулем регистрации. А то, что там нет ничего из ТЗ, кроме собственно связи профиля в соцсети с личным кабинетом, - не беспокоит.
Натолкнулся на многое за этот год на фрилансах.
>>622640
Связывался с фрилансерами, которые имели кучу положительных отзывов и рейты около 1к рублей за час, были зарегистрированы и по 10 лет, - всё равно. Поэтому иногда так и хочется сказать сомневающимся анончикам, что фриланс - это совсем не так страшно, когда ты исполнитель, но не хочется плодить безответственных фрилансеров.
#350 #622827
>>622646
Неверно то, что у тебя переменная с общей суммой не меняется.
Думаю, одно это должно помочь.
>>622647
Сначала написал ответ, а потом прочитал твое сообщение...
#351 #622828
>>622646
Также сразу дам ориентир - 49 лет.
#352 #622830
>>622828
На получение суммы, большей 1 млн.
Также у тебя через год после вклада анончику 16 лет по-прежнему.
#353 #622857
Господа, когда будет ОП?
#354 #622862
>>622332
>>622857
Ну перестань ты уже тред засирать, ОП не вернётся быстрее от этого. Это вообще редкость, что кто-то готов тратить своё время на то, чтобы так часто проверять чьи-то левые хеловорды.
#355 #622868
>>622862
Я понимаю, но у меня больше вообще не к кому обратиться. Ладно, буду смиренно ждать опа молча.
#356 #622869
>>622868
Делай дальше, у тебя же всё работает в задачах.
ОП потом проверит, ты потом поправишь.
#357 #622879
На локальном сервере всё работает
Заливаю на хостинг и...
Fatal error: Call to a member function real_query() on a non-object in
Ну что за фигня такая то?
#358 #622883
>>622879
Значит ты в эту функцию пытаешься передать не объект, а она ждет объект. Перед функцией сдампь переменную которая в неё идет. Посмотришь, видимо у тебя ошибка раньше. Ну и если все работает на локалхосте, то мб проблема в настройке mysql на серве.
#359 #622890
>>622883
Выдало таки
Ошибка при загрузке набора символов utf8:
Конект такой.
<?php
$link = mysqli_connect('localhost','anon','123','anon');
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}
if ($link->set_charset("utf8")) {
printf("Ошибка при загрузке набора символов utf8: %s\n", $link->error);
} else {
printf("Текущий набор символов: %s\n", $link->character_set_name());
}
?>

Да чтож такое то?
#360 #622893
>>622890

>Заливаю на хостинг


> mysqli_connect('localhost'


>пачиму ни работаэ???

#361 #622895
>>622893
Лол!
#362 #622897
>>622893

>Считает что кто-то будет на двачи продакшн конект кидать


Ну ты вообще наивный!
#363 #622902
Аноны, какие перспективы у изучающего пхп? Есть хоть призрачные шансы в будущем свалить из великой? Я взялся за программинг помимо прочего по этой причине, и по причине того, что я гуманитарий взялся за более простой для вхождения пхп. Какие перспективы? Только честно
#364 #622903
>>622902
Фундаментальные знания дрочи, а не конкретный язык.
#365 #622905
>>622890
Попытался удалить проверку на utf8, всё в кракозябрах. Ну ёмоё (
#366 #622920
>>622670

> FluentPDO приглянулась.


Хочу сразу предупредить. Вот такая штука

$fpdo->from('user')->where('id', array(1,2,3));

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

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

Если хочешь, можешь использовать, дело твое. Но если он не позволяет обычные запросы писать то по моему это не удобно.
#367 #622921
>>622676

Нет, я имел в виду создать функцию

{{ getDownloadUrl() }}

или так:

{{ viewHelper().getDownloadUrl() }}

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

Ну и что касается генерации URL, считаю удобнее сделать UrlHelper без статических методов и передавать его как объект во все шаблоны.
#368 #622922
>>622691

Для массива наверно нет смысла генерировать 100500 плейсхолдеров и передавать 100500 значений - проще на стороне PHP заквотить все и вставить в запрос. Я конечно не знаю точно, но подозреваю что иначе можно упереться в какой-нибудь лимит на число плейсхолдеров если элементов в массиве много.
#369 #622923
>>622691

Тут например http://stackoverflow.com/questions/4922345/how-many-bind-variables-can-i-use-in-a-sql-query-in-mysql-5/11131824#11131824 пишут что максимум 65536 плейсхолдеров. Очевидно эта система не рассчитана на подстановку огромного числа плейсхолдеров.
#370 #622925
>>622739

> Что из этого списка сработает, если ссылка получит фокус табом и затем нажать enter?


Click, но стоит проверить

По поводу выбора href. Там есть 2 кода:

- класс Modal, который никакие атрибуты сам не читает: https://github.com/twbs/bootstrap/blob/master/dist/js/bootstrap.js#L920

- связующий маленький код который ищет элементы с атрибутом modal и вешает на них обработчик: https://github.com/twbs/bootstrap/blob/master/dist/js/bootstrap.js#L1229

Этот связующий код можно переписать на свой, работающий с другим атрибутом и по другим принципам и использовать его. Вроде ты так и хотел?
#371 #622965
>>622327
https://github.com/fxsloker/Student

Итак, ОП. Посмотри мой роутер. Я создал новую сущность. А еще я подумал, если у меня нужно работать с одной моделью почему бы и не использовать только один контроллер? Можно так и правильно ли так?

И я создал базу: https://github.com/fxsloker/Student/blob/master/app/students.sql
#372 #623029
Бывает ли вакансия погромиста Пхп не- верстальщика? как ни ищу на HH, всё сводится на совокупность ПХП+ДЖС+КСС = вёрстка сайтов. Не дно ли это?
#373 #623154
>>623029
Одногруппник рассказывает, что в конторе, в которой он работает, есть версталы и дизайнеры. Но PHP-программисту нужно уметь натягивать ГОТОВУЮ вёрстку.
#374 #623227
>>623029
Если ты из Мухосрани, то ты обречен. Работодатель захочет одну мартышку, которая будет делать все. Возможно будешь переставлять винду в том числе.
#375 #623239
ОП, дело вот какое. Я начал гуглить про TableDataGateway и, как ты сам понимаешь, я попал в документацию Zend. Начал читать изучать и увидел много непонятных классов. Хоть там и расписано их предназначение, но я ничего не понял.

Смотри вот есть класс TableDataGateway, в нем есть метод initialize. Я правильно понимаю, что прямо в этом классе происходит подключение к бд? А я думал, что нужно его в автолоадер засунуть. А где он тогда вызывается? Почему не подключаться к бд сразу в конструкторе? В конструкторе я вижу только, что передается имя таблицы, адаптер (кстати опять непонятно, что за адаптер) и еще что-то.

Итак, я так понимаю, что в TableDataGateway я должен реализовать примитивные методы update, insert, where, select, которые будут применимы для всех моделей, а уже работая с каждой моделью, она должна будет наследовать этот класс и использовать эти методы?

Далее я повстречал классы ServiceManager, ServiceLocator, они как-то все вместе взаимодействуют. Только я понять не могу как. Еще адаптер.

Вообщем объясни мне, ОП, как это все работает? Я хочу применить это в студентах и понять как оно устроено.

Также прочти мою логику, как я пока думаю, как правильно сделать. Создаю класс TableDataGateway, там создаю все эти "примитивные методы". Рядом с ним создаю класс UserDataGateway, который наследует TableDataGateway и там уже пишу методы вроде add, delete, edit и т.д. В самой модели Student в конструкторе будет создаваться объект класса UserDataGateway с аргументом "students" (имя таблицы). Там будут использоваться такие же методы add, update, edit и т.д., которые будут вызывать аналогичные методы класса UserDataGateway. Контроллер опять же будет иметь методы action_add, action_edit, в каждом из которых будет создавать экземпляр класса Student и вызывать аналогичный метод модели. Но пугает меня то, что во всех трех классах будут одинаковые методы, которые по цепочке будут вызывать другу друга до обращения в базу. Правильно ли это?
71 Кб, 865x496
#376 #623260
ОП, я по поводу своего шопа по которому ты мне много чего написал здесь - http://pastebin.ru/mzp3Ex5d
Начал с разработки нормальной БД, почитал про нормализацию, связи. Пришел к такому варианту как на пикче, вот еще в текстовом варианте - http://ideone.com/JmbBSV
#377 #623278
>>623260
Переименуй первичные ключи в просто "id", не надо везде ставить "category_id", так называются внешние ключи (т.е. когда данные лежат в другой таблице).
#378 #623281
>>623278
И таблицы называются обычно в единственном числе, тогда в запросах м/будет написать:
"product.category_id = category.id"
29 Кб, 841x377
#379 #623318
Ппц, за 10 часов работы получилось сделать 1 BTC = 32к рублей, хотя я даже не джун.
Челу нужно было написать алгоритм для новой версии одного биткоин-клиента. Я ради интереса нашел этот клиент на гитхабе, оказалось, что он написан на питоне. Ну и я тупо переписал все на пхп. Конечно, без пердолинга не обошлось, но все равно збс. А вы говорите про 15к в месяц.
#380 #623319
>>623239

Нет, TDG это просто класс где собраны функции работы с таблицей. В ZF просто по совему это сделано. Никаких where или update делать не требуется.
#381 #623321
>>623260

ENUM стоит сделать латинницей и без пробелов.

>>623278

Да, можно так сделать.
#382 #623323
>>623321

>ENUM стоит сделать латинницей и без пробелов.


В кириллицу переводить в самом коде? Не будет ли это лишним захламленим кода? Это же надо будет через какой-нибудь switch перегонять или ifelse
#383 #623334
>>623319

>Нет, TDG это просто класс где собраны функции работы с таблицей. В ZF просто по совему это сделано. Никаких where или update делать не требуется.



Это ОП написал? А то больно скудно, ничего не понятно.
#384 #623338
>>623318
Где нашёл заказ? Как свои Скиллы оцениваешь? Расскажи
#385 #623350
>>623318
Раз на раз не приходится же.
Везение играет роль, постоянный мониторинг заказов, адекватные цены. Наверняка там куча петушков нарисовалась с ценниками от 100к рублей или около того.
С почином, бро, это мотивация для многих в этом треде.
#386 #623358
Не совсем понятно про Data Mapper. Допустим у меня есть 2 сущности в БД. Для каждой из них я должен создать класс-модель этой сущности, свойства которой будут полями, которые есть в БД для этой таблицы, верно? И еще должны быть классы, которые уже непосредственно работают с БД, типа select, update и т.д. причем опять же для каждого объекта/сущности свой такой класс в котором должны быть описаны все возможны методы для взаимодействия с БД?
#387 #623401
>>623358
Не еби себе мозг. Есть такие ORM, как doctrine и propel. Или есть такие фреймворки как Yii, со встроенной орм. У них есть документация и туториалы. Берешь и решаешь свои задачи за их счет, стараясь не раздувать классы моделей кучей похожих методов. Но лучше конечно перед этим выкинуть сраное похапэ
#388 #623442
>>622318

>соединение создается при создании pdo объекта или при выполнении первого запроса?


>Не знаю, проверь


Проверил, подключается при создании pdo.

>либо не делай catch либо сделай один-единственный catch в охватывающий все приложение и выводящий заглушку


Теперь понял. Обернуть в try/catch только $app->run, если нужно (обычно не нужно).
Слим сам преобразует ошибки в исключения (через set_error_handler), сам выдает заглушку (некрасивую), сам пишет в лог (стандартный).
Можно переопределить страницу ошибки, чтобы показать страницу с обезьянкой-ремонтником, но тогда придется переписывать сообщение в лог.
У меня получилось так
https://github.com/nsdvw/file-sharing/blob/master/web/index.php#L55

>>622298

> надеюсь что и обычная и аяксовая форма у тебя обрабатывается одним кодом. И ты также сделал HTML5 валидацию.


Одним и тем же кодом, но получилась лапша из ифов и скобок, жду советов по рефакторингу.
Про html5 валидацию слышу второй раз в жизни. Ты имеешь ввиду эти атрибуты типа required и pattern?
Во-первых, это поддерживается не во всех браузерах,
http://caniuse.com/#feat=form-validation
во-вторых мне просто не нравится внешний вид этих попапов. Их можно как-то переопределить, или изменить текст сообщения?
#389 #623458
>>623401
Позвольте заметить, что в Yii ActiveRecord, а не ORM. И то и то - частный случай DBAL. Или меня щас нахуй пошлют?
#390 #623462
>>623458
Кстати, на вопрос разрабам Yii, будет ли стоковая интеграция Doctrine и Yii - они ответили - "НЭТ НЭ БУДЕТ". Свою ORM они писать не хотят, видимо сложна. Поэтому Yii так и останется на уровне "стильно, модно, молодежно".
#391 #623492
https://github.com/MindiMakridi/filehosting ох чую не понравится тебе, ОП, то, что я сотворил с превьюшками. Вообще чем больше исправлений я делаю, тем более уродливый становится код.
#392 #623518
Оп проверь, сделал главное задание на верстку, буду допиливать под Ослика. Кстати какая минимальная версия, шестая или седьмая?
http://integer64.github.io/site-layout/exercise/mainTask/index.html
#393 #623520
>>623458
Пардон, обосрался. Да, там Active Record.
979 Кб, 2560x1912
#394 #623534
/Pr/ограммач, помоги
Извиняюсь за столь сраный скрин, на машине не было ината. Как реализовывать пикрелейтед? Через SELECT? Если да, то как? Было бы круто, если бы анон написал код и пояснил что и почему
Хотя, что и почему я наверное сам пойму, но пока что я не знаю за что схватиться
#395 #623537
>>623534
Гугли group by и count.

>Было бы круто, если бы анон решил за меня лабу


Было бы круто, если бы ты обсосал мое очко.
#396 #623538
>>623537
оно у тебя немытое)0)0
спасибо за наводку, анон
#397 #623549
>>623338
На bitcointalk.org. Читал сначала про биток в целом, потом пошел на этот форум, случайно увидел заказ. Оказалось, что за 8 месяцев никто так и не смог ему сделать, аж 8500$ запросили (он пендос). О реверс-инджиниринге алгоритма из оригинального клиента никто походу не додумался, пхп-шники же. Ну я и рискнул. Причем изначально стояла награда 0.5 BTC, а я блефанул и повысил до 1-го.
Скиллы средние. В данном случае понадобились только синтаксис питона, пхп и phpstorm с pycharm'ом, благо до этого на питоне кодил.
Алсо, говнокод там был просто ппц. По сравнению с ним, народ из этого треда - сеньоры.
#398 #623552
>>623537
Че, рили такое в вузиках дают? Так эта что, я, получается, типа ОБРАЗОВАННЫЙ?
#399 #623553
>>623552
Да нет, просто вузики отстой
231 Кб, 1799x1199
#400 #623576
ОП! Решил кое-как задачу про банкомат. Оцени, плиз знаю, что не очень, но работает ладно

http://ideone.com/HGT26l
#401 #623601
Кто разбирается, посмотрите мое тестовое на ошибки плз.
Алсо, нужно ли его было покрывать юнит тестами и правильно ли проставлены индексы в бд?
https://github.com/toppestkek/Test
765 Кб, 740x490
#402 #623605
И тут такой я с опечаточником: http://ideone.com/phKzaH
Немного ВЗБОДРИЛО, когда стал проверять всякие разные госзаказы на официальном сайте зосзакупок.

Ещё читаю книгу Савельевой о РНР - как же тёте далеко до нашего ОПа. Там курс лекций, вроде более-менее доступно излагается, дочитаю.
#403 #623606
>>623350
ага, мотивация, пока я безуспешно делаю тестовые задания на днище вакансии по 20 т.рублей в месяц, читать такие вот истории в ваших говноконфах про шлюх, работающих тимлидами за 90к, которые "ну я толком ни жиес ни пхп ни знаю)) ну на рабипитоне и шотот там накалякать магу))" - пригорает пиздец.
#404 #623611
>>623606
А откуда ты? Как вообще себя опишешь, свои скиллы?
#405 #623617
>>621473
>>621471

Новый код с небольшими исправлениями: http://ideone.com/Loymjd
Старый код:
http://ideone.com/sepIh4

Сделал сам: строка if($foundAnimals["Dog"]) { превратилась в if (isset($foundAnimals["Dog"]) && $foundAnimals["Dog"]) { потому что при создании игры мы можем отказаться от собак в отличии от кошек и мышей

> Не стоило canIMove переделывать ради array_filter. Аргументы функции выбираются из логики, тут логично чтобы аргументами были (x, y), то есть даем координаты и получаем ответ. Для совместимости с array_filter можно либо сделать метод в Animal, либо использовать анонимную функцию (так даже наверно лучше):


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

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


Как я должен описать там анонимную функцию?Если я по твоему раннему совету передаю два разных метода countPoints, т.к. алгоритм подсчета очков различается.

> if (!count($foundAnimals["Cat"])) {


> throw new Exception("Ошибка. Должна быть как минимум одна кошка.");


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


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

Алсо насчет правил.

> Также, для мышки надо рассматривать вариант «стоять на месте». Иногда стоять на месте может быть выгоднее чем сделать шаг навстречу кошке. Например когда мышка в углу и к ней с 2 сторон приближаются кошки.


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

> //Если обнаружили новый тип животных - добавляем его как ключ


> if (!array_key_exists($animalType = get_class($animal), $foundAnimals)) {


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


А array_key_exists разве не это выполняет?

В общем я слоупочу с советами по анонимным функциям. Я скопипастил их с метода canIMoveTo (все еще с одним параметров вместо двух x,y), они копия друг друга. Правильно ли делать такой копипаст, когда раньше мы просто передавали ссылку на метод в array_filter?
#405 #623617
>>621473
>>621471

Новый код с небольшими исправлениями: http://ideone.com/Loymjd
Старый код:
http://ideone.com/sepIh4

Сделал сам: строка if($foundAnimals["Dog"]) { превратилась в if (isset($foundAnimals["Dog"]) && $foundAnimals["Dog"]) { потому что при создании игры мы можем отказаться от собак в отличии от кошек и мышей

> Не стоило canIMove переделывать ради array_filter. Аргументы функции выбираются из логики, тут логично чтобы аргументами были (x, y), то есть даем координаты и получаем ответ. Для совместимости с array_filter можно либо сделать метод в Animal, либо использовать анонимную функцию (так даже наверно лучше):


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

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


Как я должен описать там анонимную функцию?Если я по твоему раннему совету передаю два разных метода countPoints, т.к. алгоритм подсчета очков различается.

> if (!count($foundAnimals["Cat"])) {


> throw new Exception("Ошибка. Должна быть как минимум одна кошка.");


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


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

Алсо насчет правил.

> Также, для мышки надо рассматривать вариант «стоять на месте». Иногда стоять на месте может быть выгоднее чем сделать шаг навстречу кошке. Например когда мышка в углу и к ней с 2 сторон приближаются кошки.


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

> //Если обнаружили новый тип животных - добавляем его как ключ


> if (!array_key_exists($animalType = get_class($animal), $foundAnimals)) {


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


А array_key_exists разве не это выполняет?

В общем я слоупочу с советами по анонимным функциям. Я скопипастил их с метода canIMoveTo (все еще с одним параметров вместо двух x,y), они копия друг друга. Правильно ли делать такой копипаст, когда раньше мы просто передавали ссылку на метод в array_filter?
#406 #623619
Помните, как-то говорили о сайтах для портфолио на фрилансе? Помимо каких-нибудь магазинов и блогов вот такая чушь вызывает интерес, если хорошо оформлена: http://howmuchdoyoucost.xyz/
Я базарю.
#407 #623621
>>623619
у успешных менеджеров? мб
#408 #623622
Пиздос, написал в старом треде, и удивляюсь, почему никто не пишет.

Охуенная шапка, чаю авторам.
Привет, анонимус, будет многобукв, очень надеюсь на помощь, потому что не знаю куда мне еще обратиться!

Я буду прям и краток, не вдаваясь в детали: уже несколько лет имеется магазин розничной торговли.
ВНЕЗАПНО захотелось автоматизировать некоторые процессы, потому что заебало писать всё на листках, и вообще работать вручную, а именно:
- вести учет товара на складе (поступления, продажи)
- автоматизировать выдачу договоров купли и пары других отчетов.

Я очень долго хотел (да и щас подумываю) реализовывать это в MS Access, однако внезапно вспомнил, что у меня есть говносайтик на ололо-CMS с бесплатным шаблоном (но который очень даже неплох - делал его давно, без знаний каких то ЯП, хотя и наебался со всякими css-ами, ну не суть).

И я подумал, что было бы неплохо сделать ИНТЕРНЕТ-МАГАЗИН вместо нынешнего "сайта-визитки-каталога".

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

В общем, анонимус, я тут подумал, и в своих фантазиях набросал такую схему:
Ставлю CMS для интернет-магазина, пополняю его, тем самым у меня решается проблема складского учета товара в наличии.
А затем, при помощи PHP (который я так яро настроен изучить) - взять и к той же CMS прикрутить функционал выдачи договоров и прочих отчетов для курьера/грузчика и тд. Насколько моя идея охуительна и реально ли такое реализовать одному?

И вообще, анонимус, что ты думаешь по поводу моей уёбищной ситуации?

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

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

Пиздец, анон, сам не понимаю, чего хочу, прошу помочь с принятием решения.
Алсо - как долго нужно учить PHP?
#408 #623622
Пиздос, написал в старом треде, и удивляюсь, почему никто не пишет.

Охуенная шапка, чаю авторам.
Привет, анонимус, будет многобукв, очень надеюсь на помощь, потому что не знаю куда мне еще обратиться!

Я буду прям и краток, не вдаваясь в детали: уже несколько лет имеется магазин розничной торговли.
ВНЕЗАПНО захотелось автоматизировать некоторые процессы, потому что заебало писать всё на листках, и вообще работать вручную, а именно:
- вести учет товара на складе (поступления, продажи)
- автоматизировать выдачу договоров купли и пары других отчетов.

Я очень долго хотел (да и щас подумываю) реализовывать это в MS Access, однако внезапно вспомнил, что у меня есть говносайтик на ололо-CMS с бесплатным шаблоном (но который очень даже неплох - делал его давно, без знаний каких то ЯП, хотя и наебался со всякими css-ами, ну не суть).

И я подумал, что было бы неплохо сделать ИНТЕРНЕТ-МАГАЗИН вместо нынешнего "сайта-визитки-каталога".

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

В общем, анонимус, я тут подумал, и в своих фантазиях набросал такую схему:
Ставлю CMS для интернет-магазина, пополняю его, тем самым у меня решается проблема складского учета товара в наличии.
А затем, при помощи PHP (который я так яро настроен изучить) - взять и к той же CMS прикрутить функционал выдачи договоров и прочих отчетов для курьера/грузчика и тд. Насколько моя идея охуительна и реально ли такое реализовать одному?

И вообще, анонимус, что ты думаешь по поводу моей уёбищной ситуации?

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

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

Пиздец, анон, сам не понимаю, чего хочу, прошу помочь с принятием решения.
Алсо - как долго нужно учить PHP?
#409 #623623
>>623622
Wordpress + WooCommerce, как вариант, из самого простого.
Там очень многое возможно.
#410 #623628
>>623623
То есть мне лучше разделить свои личные запросы? Вести учет товаров в вордпрессе а договоры и все остально пос таринке - вручную?
#411 #623629
>>623628
Оставь это, путник. Про товары можешь еще подумать, но в вордпрессе свои процессы делать не стоит.
#412 #623632
>>623629
Пиздос. Ладно, буду ебаться с Акцесом!

Вордпресс+вукомерс - самое менее ресурсоёмкое, среди других CMS?
#413 #623635
Поясните, что такое вордпресс?
#415 #623639
>>623442

Попробуй получать информацию об исключении через $e->__toString()

Вместо app->log может быть лучше использовать error_log, чтобы ошибка шла в лог PHP.

> во-вторых мне просто не нравится внешний вид этих попапов.


вроде нет

> Их можно как-то переопределить, или изменить текст сообщения?


Частично, через title
#416 #623640
>>623518

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

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

Урок https://gist.github.com/codedokode/855e3970124687b26a1c
#417 #623641
>>623617

> if (isset($foundAnimals["Dog"]) && $foundAnimals["Dog"]) {


if (!empty(...))
#418 #623643
>>623617

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



$x = array_filter($x, function ($y) {
// вызываем любую функцию с любым числом параметров
});

> Имеет ли она право в остальных случаях стоять на месте, если это выгодный ход?


Имеет. Все животные имеют право стоять на месте. Разве что кроме собаки.
#419 #623645
>>623622

Почему не 1С + готовая CMS для магазина, которых сотни?
#420 #623646
>>623334
TDG - класс, с функциями, которые оборачивают твой говнокод для работы с базой. По сути самая простая абстракция и инкапсулирование построенных запросов. По сути тот же говнокод, только рассованый по коробкам.
#421 #623649
>>623645
Смотря что нужно ему. Если он хочет нечто хорошее и качественное, то CMS его не устроит. Я бы всем таким людям советовал для начала найти прошаренного человека, который может консультировать по таким вопросам, честно и без купюр, а уже потом окунаться в омут веб-разработки.
#422 #623651
>>623649
А если он хочет быстро, и без особых претензий, то CMS - самое то.
96 Кб, 1259x914
#423 #623778
Как настроить базу данных во всплывающих окошках phtstorm? Я пытался наобум настроить и после run получал что-то в духе java.sql.SQLException: Unknown database 'Test'.
Мимо смотритель курсов специалиста.
#424 #623782
>>623778
И вообще в шапке написано, что нужно отдельно скачивать mySql. Если у меня phpstorm можно не устанавливать ее? Все уже есть в программе?
#425 #623784
Раньше писал всё на чистом ПХП, для учёбы и для себя конечно писал, отлично помнил все эти классы и подключения к базе данных. Последние месяца 3-4 больше занимаюсь вёрсткой, Вордпрессом, яваскриптом и другими подобными вещами. Сейчас возникла надобность написать небольшое приложение на чистом ПХП, с базами данных. Начал это делать и осознал, что я почти всё забыл и даже сходу не могу написать функции которые работают с базой данных и выполнить все необходимые операции. Конечно, завтра я уже всё сделаю, потрачу несколько часов, посмотрю в свой старый код и норм. Но у меня возник вопрос, когда работаешь веб-программистом, насколько часто используешь например функции ПДО? Всё же делается на КМСах или Фреймворках, где это всё уже автоматически сделано, выходит всё это знать необходимо, потому что это базовые знания, но они очень и очень редко нужны?
#426 #623785
>>623029
Недавно тоже думал над этим вопросом, но потом взял и выучил вёрстку, до уровня верстания с ПСД макетов, таких как в задании ОПа и немного посложнее. Потрать пару недель, получили этот скил и тебя это уже не будет волновать.
#427 #623804
>>623778
рекомендую не заебывается. Все что в Pstorm связано с интеграцией к твоим софтинам обернется тебе дикими лагами. Конечно если у тебя топовая машинка для разработки тыщ за 60, то можешь попробовать. Да и интерфейс с шторме и так перегружен и напичкано туда всего чего можно. Пробовал интегрировать xdebug в Шторм - оказалось для него нужен запущенный xdebug, которые следить за выполнением ВСЕХ скриптов от начала до конца. Можно конечно, ставить трейсы самому, но тогда весь смысл интеграци и - ставить точки остановы и чекать переменные - отпадает. А при полном трейсе производительность дико низкая.

Вообщем суть в том, что при использовании Phpstorm для разработки больших проектов в которых >10.000 файлов все фишки интеграции и дебага дико нагружают локальный сервер.
#428 #623808
>>623778
И да, mysql ставится отдельно, так как это отдельная программа. И вообще привыкай к тому, что разработка на PHP это разработка с помощью опенсорс платформы - то есть тут нихуя нет юзерфрендли, когда все за тебя поставили. Софт стафишь отдельно и отдельно его интегрируешь. Но если ты линуксобог - тут чуть чуть полегче. Загуглил команду - скопировал в консоль - поставился LAMP, например. Загуглил команду - установил Webmin, итд...
#429 #623811
>>623784
На самом деле в программировании нужно тоже найти свою нишу.

Человек, который, например работает в SensioLabs и занимается разработкой фреймворка и человек, который собирает сайты на Symfony - это 2 совершенно разных специалиста. Потратив нек. количество времени на пердолинг можно перетечь из одной в другую. Понятное дело, что функции PDO первый специалист должно знать намного лучше, чем второй, потому что второму они просто не понадобятся для повседневной работы. А все что не повседневно - то гуглится.
36 Кб, 1440x900
#430 #623826
>>619873 (OP)
Спрошу в родном, любимом РНР-тредике.

Как мне хорошо понять, что такое ООП, парадигмы и т.д.? И где я могу на доступном уровне получить не языковые, а обще-программисткие знания? Как я понимаю, нужно читать что-то из книг в первых трех колонках гайда ОП-пика закрепленного треда /pr/?
sage #431 #623828
>>623826
Мэтт Вайсфельд "Объектно-ориентированное мышление"
#432 #623845
бля, господа, посмотрите на этот раздел, на эту зловонную клоаку, состоящую из спермотоксиозных школьников, жалких детей с явно не сформировавшейся личностью, откровенных жирных уродов, анимедаунов, гомосеков и прочих имбецилов. Как же мне стало противно программирование, после пары лет, проведенных здесь. Эти грязные животные, эти оборованные чавкающие плебеи, которым впору жрать из одного корыта со свиньями, эти животные, не могущие связать и двух слов, что-то нечленораздельно мекающие, не могущие ни в литературный русский, ни в английский, ни вообще в какой-либо язык, и вот с их богомерзкого изобильного стола мне приходится подбирать какие-то крохи? Эти тупые безмозглые животные, заучившие пару циклов со скобочками, научившиеся складывать циферки и по слогам, с переводчиком, водить пальцем по документации, вот эти вот животные не просто смеют мнить себя какими-то творцами, нееет, они натурально зарабатывают дохрена и даже кичатся каким-то там "техническим складом ума", техническим образованием. И вот с этими животными мне приходится конкурировать, и эти вот мекающие бессвязные звуки овцы уезжают заграницу и рубят бабло на своих "технических" знаниях, вся суть которых сводится к зубрежке формул и складыванию циферок с калькулятором. Пелена спала с моих глаз. Кодинг - это мерзко, это грязно, это тупо, это ремесленно, это просто обслуживающие чернорабочие, смазывающие шестеренки Интернета, чья задача разносить мысль, реальную человеческую Мысль, которая никогда не зародится в ограниченных черепушках кодеросантехников. Единственное, что меня возмущают, что эти бекающие животные реально получают бабло за свое ковыряние отверткой в иде. Это просто несправедливо, этот тупой скот должен знать свое место, единственная причина, по которой он так заносится - так это бедственное положение рашкинской экономики, где у всех, особенно у литераторов и мыслителей, нет применения, поэтому байтосантекхники прикармливаются у индусов и мнят о себе не весть что. Вот вам мой смачный "гуманитарный" харчок в немытую харю, мерзкие грязные животные, чье место по их свинской природе - в хлеву.
#432 #623845
бля, господа, посмотрите на этот раздел, на эту зловонную клоаку, состоящую из спермотоксиозных школьников, жалких детей с явно не сформировавшейся личностью, откровенных жирных уродов, анимедаунов, гомосеков и прочих имбецилов. Как же мне стало противно программирование, после пары лет, проведенных здесь. Эти грязные животные, эти оборованные чавкающие плебеи, которым впору жрать из одного корыта со свиньями, эти животные, не могущие связать и двух слов, что-то нечленораздельно мекающие, не могущие ни в литературный русский, ни в английский, ни вообще в какой-либо язык, и вот с их богомерзкого изобильного стола мне приходится подбирать какие-то крохи? Эти тупые безмозглые животные, заучившие пару циклов со скобочками, научившиеся складывать циферки и по слогам, с переводчиком, водить пальцем по документации, вот эти вот животные не просто смеют мнить себя какими-то творцами, нееет, они натурально зарабатывают дохрена и даже кичатся каким-то там "техническим складом ума", техническим образованием. И вот с этими животными мне приходится конкурировать, и эти вот мекающие бессвязные звуки овцы уезжают заграницу и рубят бабло на своих "технических" знаниях, вся суть которых сводится к зубрежке формул и складыванию циферок с калькулятором. Пелена спала с моих глаз. Кодинг - это мерзко, это грязно, это тупо, это ремесленно, это просто обслуживающие чернорабочие, смазывающие шестеренки Интернета, чья задача разносить мысль, реальную человеческую Мысль, которая никогда не зародится в ограниченных черепушках кодеросантехников. Единственное, что меня возмущают, что эти бекающие животные реально получают бабло за свое ковыряние отверткой в иде. Это просто несправедливо, этот тупой скот должен знать свое место, единственная причина, по которой он так заносится - так это бедственное положение рашкинской экономики, где у всех, особенно у литераторов и мыслителей, нет применения, поэтому байтосантекхники прикармливаются у индусов и мнят о себе не весть что. Вот вам мой смачный "гуманитарный" харчок в немытую харю, мерзкие грязные животные, чье место по их свинской природе - в хлеву.
#433 #623850
>>622641
>>622641
Шиндовс, пробовал что на 7, что на 10, одно и тоже дерьмо. Кодировка 1251 для казахского текста.

>надо передавать данные в виндовой кодировке.


Как их туда передать в виндовой кодировке? iconv? Если да, то это не вариант, так как iconv не может сконвертировать правильно.

У меня к сожалению жесткие рамки, нужно работать под Win.
#434 #623853
Оп проверь пожалуйста:
http://integer64.github.io/site-layout/exercise/mainTask/index.html
Сделал под ослика.
Можете начать тыкать в мои косяки
#435 #623854
>>623853
А что ты в итоге сделал то? Развернул html страничку на сервере? Молодец.
#436 #623862
>>623854
Эм, это задание по верстке макета. Так что, да сверстал, разместил на гитхабе.
#437 #623870
Такой вопрос.
Из бд извлекается массив.
Допустим.
$arr
{
[a] = 1,
= 2,
[c] = 3,
}
Проблема в том, что например ключа [d] в массиве может и не быть, но при дальнейшей работе скрипта возможно потребуется обращение по этому ключу.

Например:

$a = $arr['a'];
$b = $arr['b'];
$c = $arr['c'];
$d = $arr['d'];\\ ключа d как бы и нет, но как бы и похуй, если $d при этом станет равным = "" То есть все работает как нужно.

Интересует, правильно ли так делать?
Или нужно обязательно проверять наличие ключа в массиве , вроде isset( $arr[ 'd' ] ) перед тем как обратиться по этому ключу?
#438 #623876
>>623870
$d = $arr['d'];
$d = isset($arr['d']) ? $arr['d'] : '';

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

Обычно встречаю вариант, но зачем?
#439 #623898
RIP OP
#440 #623912
>>623854

Прочти сначала шапку треда, дурачок.
#441 #623913
>>623870

Как такое возможно? «Из БД извлекается массив ... ключ может и не быть». Не может такого быть. Все колонки что ты запрашиваешь из БД, возвращаются. Ты что-то делаешь неправильно.
#442 #623930
Всем, сап. js-у и php я пока только учусь, но на работе поставили задачу, и времени на пошаговое изучение пока нет. Поэтому хочу обратиться к вам, авось поможете. Есть функция на js, которая передает параметры, по средствам - XmlHttpRequest, из сформированной ранее на php таблицы, для sql запроса на сервер. Далее на сервере формируется xls - документ(с помощью PHPExcel). Дак вот, если просто сохранить этот документ, на сервере, то проблем нет, но мне нужно его вывести в новом окне брузера или хотя бы предложить пользователю его сохранить. Сейчас у меня предаются параметры, формируется документ, и присылается ответ с сервера (responseText), но как мне этот ответ обработать, чтобы получить ссылку на скачивание документа, я хз.
#443 #623933
>>623913
Что не так-то?
Есть страница настроек с полями ввода. Каждое поле значение поля -> элемент в массиве который сохраняется в БД. Если пользователь не ввел значение в какое-то поле, то в массиве элемент будет отсутствовать. Но потом, по этому элементу возможно будет обращение. И речь вообще, как ты понимаешь не об этом. Тут про то нужно ли городить такие выражения $d = isset($arr['d']) ? $arr['d'] : '' если можно обойтись $d = $arr['d']. Ведь результат будет тот же? При условии что $arr['d'] вообще не существует. То есть ключа d со значение в массиве нет!
#444 #623960
Не пойму в чем смысл внедрения зависимостей? Вот например внедряю я в конструктор объект PDO

public function __construct(PDO $pdo){
\t\t$this->db = $pdo;
\t}

Но в чем сакральный смысл? Я так понимаю это должно помочь в будущем легко менять PDO на какой-то другой сервис, но мне ведь все-равно нужно будет лезть и менять передаваемое в конструктор значение.
#445 #623980
>>623960

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

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

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

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

Немного можешь почитать в этом уроке: https://gist.github.com/codedokode/e1d31a31b37d5f635057

А без DI получается лапша из намертво связанных друг с другом классов.
#446 #623981
>>623960

Ну и еще передать 1 настроенный объект проще чем кучу настроек соединения с БД.
#447 #623982
>>623960

Одинаковые вещи надо называть одинаково:

construct(PDO $db)
{
$this->db = $db;
}
#448 #623987
>>622965
ОП, ты не пропустил? А то вроде как ты там дальше отвечаешь, и где есть ОП вообще?
#449 #623996
Стоит ли бороться с Нотайсами? Например у меня функция возвращает массив каких-то данных, но этих данных может и не быть, тогда возвращается неопределенная переменная и появляется Notice. Не обращать на это внимание или всегда определять переменную, типа типа такого $result = array(); а уже дальше даже если данных не будет, то просто вернется этот пустой массив.
#450 #624023
>>623996
В битриксе, например, портянка нотайсов такая, что их можно только минут за 5 все прочесть, снизу вверх. Однако же деньги делают. Но если хочешь считаться "элитой" программирования и собираешься писать какой-то топчик, то нотайсов быть не должно. Не знаю, например, щас в Друпале есть нотайсы или нет.
#451 #624024
>>623980

>codedokode


О спасибо.
Это креатив ОПа ?
#452 #624029
>>623987

Я пока пробежался и ответил на вопросы, из-за которых аноны не могут что-то решать дальше, задачки я чуть позже гляну, начну с самых старых. Вроде до 8-го января все проверено, так что терпимо.
#453 #624032
>>623996

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

> всегда определять переменную, типа типа такого $result = array(); а уже дальше даже если данных не будет, то просто вернется этот пустой массив.


Неверно. Функция всегда должна возвращать данные в одном и том же виде. Единственное исключение - можно еще возвращать null если например не удалось найти запись в БД. То есть либо массив строго определенного формата + null, либо объект (что лучше) + null, либо строка + null. Как-то так.

>>624024

Да.

>>624023

Да. с битрикса не берите пример. Помните что они программистам 20 000 р в месяц платят, будете писать с нотисами и на массивах, будете получать столько же.
#454 #624051
>>623850
ОП, помоги хоть ты, работа стоит, все интернеты облазил, это абсолютно не типовая задача. >>622533
Если очень коротко и не хочешь перечитывать то смотри:

Стоит задача сканировать директории на наличие файлов и создавать новые файлы (ғғғғғғғғғғғғ.hui) с казахскими буквами. Но у меня это не выходит, я уже всё прошерстил в интернете, но ничего валидного не нашел. Как справиться? В какую сторону копать? ОС Win 7/10 жестко предопределена.
Также для наводки:
использовал функции для работы с файловой системой и собственно iconv. Но он не справляется с кодировкой файловой системы.
#455 #624066
>>624055

Зачем глупости пишешь? Все проверим.

>>624051

Почему iconv не работает? что пишет? Ты все верно делаешь? покажи код.

Должно быть так: твой скрипт в utf-8, все в utf-8, только при создании файла делаешь новую переменную и кладешь в нее имя в cp-1251.
55 Кб, 941x781
#456 #624077
>>624066
Да тут кода и не надо в принципе то, мне нужно добиться работоспособности от функций scandir или, блин, хотя бы fopen.
Вот так делаю:
var_dump(scandir("C:\\ASED\\"));
fopen(iconv("UTF-8","WINDOWS-1251","C:\\ASED\\ғғғғғғғғғғғғ"),"w");
fopen(iconv("UTF-8","cp1251","C:\\ASED\\ғғғғғғғғғғғғ"),"w");
fopen(iconv("WINDOWS-1251","UTF-8","C:\\ASED\\ғғғғғғғғғғғғ"),"w");
fopen("C:\\ASED\\ғғғғғғғғғғғғ","w");

- во всех случаях получается гiвно какое-то.
#457 #624083
>>623804
Какую альтернативную ide посоветуешь? Пека и правда у меня слабая.
#458 #624084
ОП, сколько можно зарабатывать с помощью пыхи, если я допустим, не гений-математик, а обычныйкун? Как ты думаешь, насколько переспективный данный язык, сильно ли соснёт начинающий через 5-6 лет или всётаки сможет прокормить кота и себя?
#459 #624092
>>624077
Ну и всё пиздец? Не робити больше? Скажи оп ты тоже запердолился?
#460 #624106
>>624083
Для PHP лучше шторма еще ничего не придумали. Может у кого-то другой опыт, но я пробовал такие альтернативы:

Sublime
Atom
Eclipse

Для меня главная задача IDE

1) Автокомплит функций, классов, методов, переменных.
2) Удобное управление вкладками.
3) Максимальная поддержка синтаксисов из коробки (кроме основных нужны XML, JSON, YML, Twig)
4) Функционал сниппетов
5) С недавнего времени еще использую встроеный bash-терминал.

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

В Eclipse автокомплит есть, но тормозит точно так же как и в Шторме при наличии в проекте Хуилиона файлов, потому решил что менять IDE нет смысла.

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

NetBeans не ставил, так как смысла нет, такая же тормозная Java поделка, как и Storm.

Сейчас я работают так: проект от корневой доменной папки веду в Phpstorm, если нужно открыть какие-то конфиги, за пределами проекта - открываю в Sublime. Алсо в шторме есть проблема с тем, что он не может открывать большие текстовые файлы. Их я тоже открываю в Sublime.
#460 #624106
>>624083
Для PHP лучше шторма еще ничего не придумали. Может у кого-то другой опыт, но я пробовал такие альтернативы:

Sublime
Atom
Eclipse

Для меня главная задача IDE

1) Автокомплит функций, классов, методов, переменных.
2) Удобное управление вкладками.
3) Максимальная поддержка синтаксисов из коробки (кроме основных нужны XML, JSON, YML, Twig)
4) Функционал сниппетов
5) С недавнего времени еще использую встроеный bash-терминал.

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

В Eclipse автокомплит есть, но тормозит точно так же как и в Шторме при наличии в проекте Хуилиона файлов, потому решил что менять IDE нет смысла.

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

NetBeans не ставил, так как смысла нет, такая же тормозная Java поделка, как и Storm.

Сейчас я работают так: проект от корневой доменной папки веду в Phpstorm, если нужно открыть какие-то конфиги, за пределами проекта - открываю в Sublime. Алсо в шторме есть проблема с тем, что он не может открывать большие текстовые файлы. Их я тоже открываю в Sublime.
#461 #624110
>>624084
PHP соснет очень не скоро. Это как спрашивать: когда соснет Facebook или Двач.

Комьюнити у него очень огромное, а сейчас для продвижения это самое главное.
#462 #624115
>>624110

>\t


Ну хуй знает, что по твоим словам не очень скоро, для некоторых 3 года это не очень скоро, а для некоторых 2 десятка. Ну и сравнения тоже какие то мутные, социальную сеть сравнивать со скриптовым языком.
#463 #624119
>>624115

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


Без разницы. Потому что задачи в итоге у всех сводятся к одному - зарабатывание денег и ЧСВ.
Я говорю о том, что если у чего-то или у кого-то есть большая "аудитория", то бишь комьюнити, то при сегодняшних тенденциях это что-то будет актуально еще очень долго.
#464 #624121
>>624119
Очень долго в тоём понимании это сколько? 10 лет?
#465 #624126
>>624077

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

Судя по википедии, в казахском исплоьзуется модифицированная кодировка, не та же 1251 что у нас в России.

Вот википедия: https://ru.wikipedia.org/wiki/Windows-1251#.D0.9A.D0.BE.D0.B4.D0.B8.D1.80.D0.BE.D0.B2.D0.BA.D0.B0_CP1251-k_.28KazWin.2C_.D0.BA.D0.B0.D0.B7.D0.B0.D1.85.D1.81.D0.BA.D0.B0.D1.8F_.D0.BA.D0.BE.D0.B4.D0.B8.D1.80.D0.BE.D0.B2.D0.BA.D0.B0.29

(маразм конечно - давно пора переходить на юникод и забыть про 256-символьные кодировки).

Видно что символ ғ есть только в модифицированной версии. Значит, надо найти как эта кодировка назвается в iconv.

Гугление дает подобные списки: https://gist.github.com/hakre/4188459 в которых только обычная 1251. Казахской нет.

Значит придется перекодировать ручками - писать свои функции для перекодирования туда и обратно.

Перекодировать из 1251k в utf-8 просто: разбиваешь строку на символы по 1 байту, проходишься и перекодируешь. Коды 0-127 идут без изменений, а для 128-255 надо сделать массив где слева стоит код, справа коды или символ в utf-8. Символы можно скопировать из статьи про cp1251. советую показать код для проверки ну и самому потестировать на всех возможных символах.

Этот же массив с помощью array_flip переворачивается и используется для обратного раскодирования.

Обратное перекодирование делается так: разбиваем utf-8 строку на символы с помощью preg_split. В цикле обходим каждый символ:

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

Помни такие особенности:

- в cp1251k всего 256 символов, в юникоде десятки тысяч. Значит надо решить что делать когда встречается тсутсвующий в 1251k символ
- в cp1251k 1 символ это 1 байт. В utf-8 символ может кодироваться либо 1 байтом от 0 до 127 либо несколькими из диапазона 128-255

Статья про utf-8 в помощь: https://ru.wikipedia.org/wiki/UTF-8

Есть вопросы - задавай.

Было бы хорошо написанные функции снабдить заголовком с нужными ключевыми словами и выложить куда-нибудь на гитхаб чтобы другие могли их нагуглить.
#465 #624126
>>624077

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

Судя по википедии, в казахском исплоьзуется модифицированная кодировка, не та же 1251 что у нас в России.

Вот википедия: https://ru.wikipedia.org/wiki/Windows-1251#.D0.9A.D0.BE.D0.B4.D0.B8.D1.80.D0.BE.D0.B2.D0.BA.D0.B0_CP1251-k_.28KazWin.2C_.D0.BA.D0.B0.D0.B7.D0.B0.D1.85.D1.81.D0.BA.D0.B0.D1.8F_.D0.BA.D0.BE.D0.B4.D0.B8.D1.80.D0.BE.D0.B2.D0.BA.D0.B0.29

(маразм конечно - давно пора переходить на юникод и забыть про 256-символьные кодировки).

Видно что символ ғ есть только в модифицированной версии. Значит, надо найти как эта кодировка назвается в iconv.

Гугление дает подобные списки: https://gist.github.com/hakre/4188459 в которых только обычная 1251. Казахской нет.

Значит придется перекодировать ручками - писать свои функции для перекодирования туда и обратно.

Перекодировать из 1251k в utf-8 просто: разбиваешь строку на символы по 1 байту, проходишься и перекодируешь. Коды 0-127 идут без изменений, а для 128-255 надо сделать массив где слева стоит код, справа коды или символ в utf-8. Символы можно скопировать из статьи про cp1251. советую показать код для проверки ну и самому потестировать на всех возможных символах.

Этот же массив с помощью array_flip переворачивается и используется для обратного раскодирования.

Обратное перекодирование делается так: разбиваем utf-8 строку на символы с помощью preg_split. В цикле обходим каждый символ:

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

Помни такие особенности:

- в cp1251k всего 256 символов, в юникоде десятки тысяч. Значит надо решить что делать когда встречается тсутсвующий в 1251k символ
- в cp1251k 1 символ это 1 байт. В utf-8 символ может кодироваться либо 1 байтом от 0 до 127 либо несколькими из диапазона 128-255

Статья про utf-8 в помощь: https://ru.wikipedia.org/wiki/UTF-8

Есть вопросы - задавай.

Было бы хорошо написанные функции снабдить заголовком с нужными ключевыми словами и выложить куда-нибудь на гитхаб чтобы другие могли их нагуглить.
#466 #624128
>>624077

Еще в помощь тебе 2 функции:

ord - определяет числовой код первого байта (не символа!) в строке
chr - создает строку из 1 байта с указанным кодом.
#467 #624131
>>624083

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

Из плагинов: emmet для верстки, php companion для работы с неймспейсами, docblockr для комментариев.
#468 #624135
>>624084

За 5 лет при желании можно выучить еще несколько языков. Я бы не боялся того что с PHP что-то случится, веб вряд ли вымрет в среднесрочной перспективе, а поменять язык нетрудно.
#469 #624192
Вопрос нуба: нужно ли переломится с апачем, если скачал себе шторм? Или для базовых пониманий всё же установить себе апач?
#470 #624194
>>624192

>пердолиться

#471 #624199
http://www.gm.com/ забавная у них защита от xss, просто 403 кидает.
139 Кб, 1366x737
#472 #624248
Наподключал всякого говна типа bootstrap, jquery, jplayer и handlebars, страница теперь грузится 7 секунд.
Процессор правда слабый (AMD E1-6010), но все же.
Я вижу дырку в 2.5 секунды, с чего бы это?
#473 #624280
>>624192
Если тебе интересно развертывание апача как таковое, то можно и попердолиться, еще можно посмотреть в сторону nginx. В php так или иначе есть веб сервер встроенный и вроде как сторонние ИДЕхи поддерживают его.
#474 #624281
>>622318

По js все поправил, непонятно только это:

>var fileId = {{ fileId | json_encode | raw }};


>Предлагаю тебе самому подумать почему и зачем тут json_encode и raw.


Зачем тут json_encode и raw? Сам думать пробовал, не помогло.
Ну в кавычки обернет строку json_encode, а raw предотвратит экранирование этих кавычек. Зачем мне там кавычки?

Я бы еще понял, если бы передавались какие-то сомнительные данные из базы, полученные от пользователя, например логин или текст сообщения, где может содержаться csrf код.
Но я передаю суррогатный id. Ну ладно, видимо это чисто ради систематичности: мы же экранируем в твиге все что нужно и не нужно, значит и здесь так же.
#475 #624325
>>623876
Здесь кто-нибудь вообще может по делу ответить. Понимаю, вопрос нубский, но весь тред и состоит из таких вопросов, причем намного глупее. Вы че, совсем охуели?

>>624032

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


Поехавший, ты с реальными приложениями вообще работал. Или только кукарекать можешь?
Допустим есть страница пользователя настроек с 1000 текстовыми инпутами. Пользователь допустим заполняет 2 из 1000 инпутов и нажимает сохранить. Формируется массив соответственно из всего из двух элементов, по принципу: ключ - id ипута, значение - value инпута. Этот массив сохраняется в БД. Но потом при извлечении данных из БД возможно придется пройтись по всем элементам, ведь неизвестно сколько инпутов заполнил пользователь.

Если пользователь заполнил всего 2 инпута, то, по твоему, в БД я буду заполнять эти два элемента, и еще 998 элементов ключей с пустыми значениями? А таких пользователей тоже несколько тысяч, со своей страницей настроек? И все это хранить в БД?
#476 #624330
>>623876
Я конечно сам нуб,но попробую помочь. Будем рассуждать логически. Если ты попытаешься обратиться по ключу которого нету в массиве ,то приложение вылетит. Значит надо либо через исключение обрабатывать вызов, либо назначать дефолтное значение.
13я задача #477 #624331
#478 #624334
>>624325
Какой же ты долбоеб.
#479 #624342
>>624325
>>624330
ни в коем случае нотисов не должно быть, если вы уважаете себя и код.

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

насчет массивов вы ошиблись, как раз если в массиве елемента не будет это не критично, хотя не хорошо, но если в обьекте это уже может быть критично.
как вы собираетесь проверять существование переменной в обьекте - очень неудобно, и обьекты больше жрут памяти и медленней обрабатываются.
Имхо я за массивы - минимум расходов максимум полезности, все легко проверить isset(ar[d]) и т.д.
#480 #624350
>>624342
Что-то вообще тебя не понял. Про какие объекты ты говоришь?
#481 #624365
Человек, с которым мы договорились о переделке сайта дня 3 назад в этом треде, только что отписался на почту тебе, по поводу этого задания. Скинул ссылку на сайт, который выложил на бесплатный хостинг.
#482 #624558
А что автолоадер в Silex опять не работает? Снова классы вручную что ли подключать?
#483 #624624
>>624199
Суть в том, что отплавливает хсс, а что еще еадо для счастья?
#484 #624632
Посоны, поясните за тупой вопрос.
Я например, в функции создаю объект
$order = new Class_Order($order_id);

Работаю с этим объектом, например получая его свойства

Затем вызываю др. функцию calc_sum_func($order_id), в которой также создаю новый объект с теми же именами так же с ним работаю

$order = new Class_Order($order_id);

и снова работа со свойствами этого объекта

И когда функция calc_sum_func() возвратит значение в основную функцию

снова происходит работа с первым объектом $order

То есть получается создается два объекта. Два разных объекта? Так можно делать? Конфликтов не возникает? Это норма?

Если соединить все вместе, то выглядит примерно так:

function some_func($order_id){

$order = new Class_Order($order_id);
$total = $order->total;
................................................

$sum = calc_sum_func($order_id);

................................................
$order->upadte_sum($sum);

}

function calc_sum_func($order_id){
$order = new Class_Order($order_id);
..................................................
return $order->yoba_eto_ti($ya);
}
#484 #624632
Посоны, поясните за тупой вопрос.
Я например, в функции создаю объект
$order = new Class_Order($order_id);

Работаю с этим объектом, например получая его свойства

Затем вызываю др. функцию calc_sum_func($order_id), в которой также создаю новый объект с теми же именами так же с ним работаю

$order = new Class_Order($order_id);

и снова работа со свойствами этого объекта

И когда функция calc_sum_func() возвратит значение в основную функцию

снова происходит работа с первым объектом $order

То есть получается создается два объекта. Два разных объекта? Так можно делать? Конфликтов не возникает? Это норма?

Если соединить все вместе, то выглядит примерно так:

function some_func($order_id){

$order = new Class_Order($order_id);
$total = $order->total;
................................................

$sum = calc_sum_func($order_id);

................................................
$order->upadte_sum($sum);

}

function calc_sum_func($order_id){
$order = new Class_Order($order_id);
..................................................
return $order->yoba_eto_ti($ya);
}
#485 #624639
>>624632
Смысл в том, все вычисления по пересчете суммы заказа я хочу вынести в отдельную функцию calc_sum_func(), чтобы можно было вызывать ее из других частей программы, просто передавая Id заказа. Но опять же получается, что в основной функции some_func() я создаю экземпляр , и создаю еще один в calc_sum_func() ?

Конечно, все расчеты можно сделать в some_func() и обойтись одним экземпляром заказа, но теряется гибкость.
#486 #624650
>>624126
>>624128
Привет ОП, вчера попробовал твой метод, но суть в том, что функции ord и chr работают исключительно в рамках таблицы ASCII соответственно их невозможно применить для воспроизведения символов казахской кодировки.

ord - Returns the ASCII value of the first character of string.
chr - Returns a one-character string containing the character specified by ascii.

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



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

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

CP154
CYRILLIC-ASIAN
PT154
PTCP154
CSPTCP154
KZ-1048
RK1048
STRK1048-2002
CSKZ1048

Для представления: iconv("UTF-8", "{Кодировка из списка например CP154}", "Ғ");

Всегда получалась лабуда вроде Ѓ или Є, но не как не Ғ.

Я так понимаю совместимости в данном случае ожидать невозможно, ибо CP1251-k отстутвует в PHP.

Может быть есть способ определения "сырого потока" данных для дальнейшего воспроизведения?
Ну чтобы передать винде списки кодов символов, а она их уже отобразила как надо?
#486 #624650
>>624126
>>624128
Привет ОП, вчера попробовал твой метод, но суть в том, что функции ord и chr работают исключительно в рамках таблицы ASCII соответственно их невозможно применить для воспроизведения символов казахской кодировки.

ord - Returns the ASCII value of the first character of string.
chr - Returns a one-character string containing the character specified by ascii.

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



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

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

CP154
CYRILLIC-ASIAN
PT154
PTCP154
CSPTCP154
KZ-1048
RK1048
STRK1048-2002
CSKZ1048

Для представления: iconv("UTF-8", "{Кодировка из списка например CP154}", "Ғ");

Всегда получалась лабуда вроде Ѓ или Є, но не как не Ғ.

Я так понимаю совместимости в данном случае ожидать невозможно, ибо CP1251-k отстутвует в PHP.

Может быть есть способ определения "сырого потока" данных для дальнейшего воспроизведения?
Ну чтобы передать винде списки кодов символов, а она их уже отобразила как надо?
#487 #624656
>>624635

>Два разных объекта?


Да.

>Это норма?


Нет. Память/время х 2

Передавай уже готовый обьект заказа.
calc_sum_func($SomeOrder)

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

Короче завязывай со своими глобальными функциями.
#488 #624658
#489 #624670
>>624656
Спасибо. И еще вопрос, я правильно понимаю, что $order в функции calc_sum_func() виден только внутри этой функции? Как собственно и любая другая переменная?

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



Все верно, но задача стоит в написании что-то в виде плагина, который сможет сделать кастомный расчет, без изменения уже имеющегося класса.
#490 #624720
>>624325

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

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

> ты с реальными приложениями вообще работал


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

>>624342

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


пруфы, цифры?

> но если в обьекте это уже может быть критично.


как в объекте может «не быть» элемента? Ты ничего не путаешь? У объектов есть только поля и методы.

>>624558

Нужны подробности.

>>624632

Нехорошо конечно. Надо посмотреть, может можно сразу объект в функцию и передавать.

Алсо названия функций у тебя кошмарные, зачем сокращать и зачем писать func?

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


Можно сделать функцию, работающую только с объектом. Если где-то есть i то можно по нему получить объект и передать в функцию. хотя я вообще не понимаю, зачем тебе глобальные функции в ООП коде, лучше бы сделать Сервис Работы с Заказами и в нем нужные методы.

>>624650

Неправда. Они работают с байтами, и возвращают код первого байта строки либо создают строку из 1 байта. Работают с любыми значениями байт от 0 до 255.

> не совсем понял, каким методом можно так разбить её?


str_split например. Или цикл от 0 до strlen - 1, на каждом шаге берешь i-й байт строки через $string{$i}

В PHP строка это просто массив байт. Каждый байт имеет значение от 0 до 255. В 8-битных кодировках 1 символ кодируется ровно 1 байтом (и возможно до 256 разных символов), в utf-8 - 1 символ = от 1 до 6 байтов.

Чтобы получить i-й байт строки числом, пишешь ord($str{$i}). Чтобы создать строку из нескольких байт, пишешь либо chr(123) . chr(234) либо "\xa0\xc0".

Чтобы разбить utf-8 строку на массив символов (а там символы могут состоять из нескольких байт) нужен хак с preg_split.

> Может быть есть способ определения "сырого потока" данных для дальнейшего воспроизведения?


Нет, надо написать 2 функции перекодирования из cp1251k в utf-8 и обратно. Начинай писать, я могу проверить. Если что-то еще непонятно - уточняй.
#490 #624720
>>624325

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

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

> ты с реальными приложениями вообще работал


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

>>624342

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


пруфы, цифры?

> но если в обьекте это уже может быть критично.


как в объекте может «не быть» элемента? Ты ничего не путаешь? У объектов есть только поля и методы.

>>624558

Нужны подробности.

>>624632

Нехорошо конечно. Надо посмотреть, может можно сразу объект в функцию и передавать.

Алсо названия функций у тебя кошмарные, зачем сокращать и зачем писать func?

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


Можно сделать функцию, работающую только с объектом. Если где-то есть i то можно по нему получить объект и передать в функцию. хотя я вообще не понимаю, зачем тебе глобальные функции в ООП коде, лучше бы сделать Сервис Работы с Заказами и в нем нужные методы.

>>624650

Неправда. Они работают с байтами, и возвращают код первого байта строки либо создают строку из 1 байта. Работают с любыми значениями байт от 0 до 255.

> не совсем понял, каким методом можно так разбить её?


str_split например. Или цикл от 0 до strlen - 1, на каждом шаге берешь i-й байт строки через $string{$i}

В PHP строка это просто массив байт. Каждый байт имеет значение от 0 до 255. В 8-битных кодировках 1 символ кодируется ровно 1 байтом (и возможно до 256 разных символов), в utf-8 - 1 символ = от 1 до 6 байтов.

Чтобы получить i-й байт строки числом, пишешь ord($str{$i}). Чтобы создать строку из нескольких байт, пишешь либо chr(123) . chr(234) либо "\xa0\xc0".

Чтобы разбить utf-8 строку на массив символов (а там символы могут состоять из нескольких байт) нужен хак с preg_split.

> Может быть есть способ определения "сырого потока" данных для дальнейшего воспроизведения?


Нет, надо написать 2 функции перекодирования из cp1251k в utf-8 и обратно. Начинай писать, я могу проверить. Если что-то еще непонятно - уточняй.
#491 #624726
>>624720
Хех, я понял что мне можно по коду из ord вычислить символ и перекодировать его отобразив непосредственно на HTML странице или внутри файла текстом, это да, без проблем. Но мне нужно записать этот файл обратно же с именем из этих символов.
#492 #624733
>>624726

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

Ты разбиваешь входную строку на символы (в зависимости от кодировки) и перекодируешь их посимвольно. И результат сохраняешь в другую строку.
#493 #624735
>>624733
Сводя всё конкретнее, мне нужно чтобы была возможность НЕ считывать из файла, а записывать файлы с именем ҒҒҒҒҒҒҒҒ. Именно меня интересует возможность присвоения имени ҒҒҒҒҒ к файлу в винде.
#494 #624739
>>624733
ОП, если это ты, скажи, у тебя получилось под виндой создать файл с именем ҒҒҒҒҒ? Если да, то я не буду спорить с тобой, а постараюсь вникнуть в твой текст.
#495 #624742
>>624739

>получилось под виндой создать файл с именем ҒҒҒҒҒ


Конечно же с помощью ПХП
#496 #624759
>>624735

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

>>624739

У меня нет такой версии Windows чтобы проверить. Я знаю что в обычной российской версии винды перекодирование в 1251 работает.
#497 #624763
>>624739

Проверить можно так: посмотри 16-чный код этой буквы Ғ в cp1251k. Допустим это XX.

затем напиши имя файла так:

$name1251k = "\xXX\xXX\xXX.txt";
file_put_contents($name1251k, "test");

Вместо XX должен быть 16-чный код этого символа из страницы на википедии.
#498 #624778
>>624759
Они не помогут, поверь мне, я пропердолился с этим уже больше двух дней. Поставь виртуалочку на досуге, и затесть работу этого говна.
По идее же, должен работать такой код:
$file = chr(210);
fopen("C:\\ASED\\$file","w");
Так как судя по функции ord("Ғ"); - это 210. Но нет, нихера.

>>624763
Это вообще не работает. Тем более что 16-чной адресации не существует в cp1251k если я не ошибась конечно.

Есть мнение что файловая система NTFS использует кодировку символов UTF-16, но я пробовал опять таки делать конвертацию из UTF-8 в UTF-16 и тоже крякозябры.
#499 #624785
>>624778

> как судя по функции ord("Ғ"); - это 210.


Неверно. 210 это первый из 2 байт которыми эта буква кодируется в utf-8. А тебе надо передать в chr код этой буквы в cp1251-k. Судя по википедии, это 0x81 в 16-чной или 129 в десятичной.

> Поставь виртуалочку


Нет.

> Тем более что 16-чной адресации не существует в cp1251k если я не ошибась конечно.


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

> Есть мнение что файловая система NTFS использует


А я смотрел исходники PHP. В Windows есть 2 набора функций6 одни принимают данные в utf-16, другие в 8-битной кодировке (которая заивсит от языка винды и называется у майкрософт ANSI кодировка). PHP использует 8-битные функции.
#500 #624786
>>624778

Вот кстати таблица где записаны 16-чные коды символов в utf-8 и cp1251k: http://wiki.soiro.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Utf-8_cp1251-k.gif
#501 #624795
>>624785
>>624786

>Нет.


Разговора тогда нет, спасибо что попытался помочь.
#502 #624896
ОП, проверь задачу Клавиша Shift.

http://ideone.com/4a790y
#503 #624901
Пальцаны, делаю тестовое задание на php, до этого не учил его.
В общем нужно сделать срипт, который принимает данные через get запрос, решает задачку и выводит ответ на страницу.

Срипт нужно расположить на сервере, чтобы к нему можно было обратиться по url.

Я справился со всем, кроме последнего. Где мне сервер найти? Можно как-то со своего компуктера запустить этот мини сайт?
#504 #624935
ОП, живой хоть? Или до сих пор от праздников отходит?
27 Кб, 172x126
#505 #624950
Оп - няша, если я благодаря тебе устроюсь на работу - я тебе переведу денег с первой зп.
#506 #624951
Написал недавно один человек, с которым я работал по фрилансу, но не по веб-программированию, спрашивает смогу ли я написать скрипт который будет делать из ссылок РСС в стиле XML 2.0, то есть граббит определённые сайты тайтлы и дескрипшены и формирует из них РСС ленту я так понял. Я что то подобное делал, парсить у меня вроде бы получается, вот только немного не помню, что значит сформировать РСС? То есть задача спарсить определённые данные с разных сайтов в определённый формат и подключить это к какому-то рсс-каналу, где оно будет всё автоматически гонять? То есть мая задача только спарсить в правильном формате и закинуть на определённый сервис или дать в плагин, а саму рассылку он уже сделает сам?
#507 #625054
Допустим у меня есть класс родитель от которого наследуется много контроллеров. Стоит ли в этом классе сразу создать в конструкторе экземпляры объектов, которые потом будут использоваться в дочерних классах? Или в каждом классе отдельно создавать экземпляры конкретно тех объектов, которые в нем будут использоваться?
#508 #625092
>>624951
дак и спроси у него, что ты от нас хочешь?
someApprentice #509 #625108
>>610656
>>612606

>https://github.com/someApprentice - у тебя какие-нибудь вопросы к ОПу или анонам есть? Или мы все разобрали?


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

Спасибо.
#510 #625122
>>625108
Спасибо анончик, я почитал пасты ОПа по твоим вопросам и понял как дальше делать студентов. Я тоже пилю с TableDataGateway.
#511 #625126
Пацаны, вот у меня есть кнопка сенд, она собирает данные с текстбоксов потом что-то там делается и выводятся новые данные на той же странице.
При этом после нажатия на кнопку сенд данные в текстбоксах пропадают, как сделать, чтобы они оставались?
#512 #625128
>>625122
Можно подсмотреть у тебя?
Ответы за 8-9 января #513 #625131
http://integer64.github.io/site-layout/

>>621449

По 10-й задаче: надпись [2, 3, 4] слева надо сделать серой. Насчет картинки - меня беспокоит что из-за width 100% картинка может в каких-то условиях увеличиться. Нельзя ли сделать через max-width: 100%? В остальном, все ок.

По 11-й задаче: нет рамки при фокусировании верхнего переключателя с клавиатуры (тот что на радиокнопках) - почему?

Вместо label.button лучше писать просто .button в CSS коде, так как имени класса достаточно чтобы идентифицировать элемент.

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

Ну и вроде я еще тут что-то отвечал: >>621519

>>621602

Можно но непонятно зачем. Что тебе мешает сразу написать $x = new SomeClass ?

>>621665

> cavinSpacey


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

> $dots = "/( ?)+([,.?!])( ?)+/";


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

> ( ?)+


В чем смысл писать вопрос и плюс? Это по моему можно заменить на звездочку.

Названия переменных тоже выбраны не очень удачно:

> $reg = preg_split('/(?<=[.?!])\s+/', $a);



Лучше заменить:
$reg -> $sentences
$a -> $text
$jobsAlmostDone -> $sentences

> for ($i = 0; $i < count($reg); $i++) {


Лучше foreach использовать для перебора массива

> mb_strtoupper(mb_substr($reg[$i],0,1)).mb_substr($reg[$i],1);


Это лучше вынести в отдельную функцию

Сам принцип работы программы правильный, молодец, но вот код можно еще улучшить.
Ответы за 8-9 января #513 #625131
http://integer64.github.io/site-layout/

>>621449

По 10-й задаче: надпись [2, 3, 4] слева надо сделать серой. Насчет картинки - меня беспокоит что из-за width 100% картинка может в каких-то условиях увеличиться. Нельзя ли сделать через max-width: 100%? В остальном, все ок.

По 11-й задаче: нет рамки при фокусировании верхнего переключателя с клавиатуры (тот что на радиокнопках) - почему?

Вместо label.button лучше писать просто .button в CSS коде, так как имени класса достаточно чтобы идентифицировать элемент.

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

Ну и вроде я еще тут что-то отвечал: >>621519

>>621602

Можно но непонятно зачем. Что тебе мешает сразу написать $x = new SomeClass ?

>>621665

> cavinSpacey


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

> $dots = "/( ?)+([,.?!])( ?)+/";


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

> ( ?)+


В чем смысл писать вопрос и плюс? Это по моему можно заменить на звездочку.

Названия переменных тоже выбраны не очень удачно:

> $reg = preg_split('/(?<=[.?!])\s+/', $a);



Лучше заменить:
$reg -> $sentences
$a -> $text
$jobsAlmostDone -> $sentences

> for ($i = 0; $i < count($reg); $i++) {


Лучше foreach использовать для перебора массива

> mb_strtoupper(mb_substr($reg[$i],0,1)).mb_substr($reg[$i],1);


Это лучше вынести в отдельную функцию

Сам принцип работы программы правильный, молодец, но вот код можно еще улучшить.
Слим, задача про Йоду (и нет, это не реклама) #514 #625132
>>621681

> $creditBalance x $percent) + $servicePayment


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

>>621694

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

>>621697

Никаких

>>621781

Ой-ой, как код плохо оформлен. Ну что это за переменные, что значат их названия?

> $a


> $array1


> $array2


> $value


Надо их переименовать, а то читать тяжело.

> preg_replace('/[,;]/', "", $a);


Лучше заменять на пробел, а то слова могут склеиться

> for ($i = 0; $i < count($array2); $i++) {


Тут лучше foreach

> $array2[$i] = array_reverse($array2[$i]);


> $array2[$i] = implode(" ", $array2[$i]);


Лучше использовать временную переменную вместо элемента массива (меньше скобок будет)

> mb_strtoupper(mb_substr($array2[$i],0,1)).mb_substr($array2[$i],1);


Это надо вынести в отдельную функцию с понятным названием

Сам алгоритм решения верный, но вот код очень неаккуратно выглядит.

>>621820

Вот тут http://docs.slimframework.com/configuration/settings/ нет настройки slim.errors
Вот тут http://docs.slimframework.com/errors/output/ эта настройка меняется через environment

Я бы проверил исходники, поискал эту настройку там и проверил, можно ее передавать как конфиг или нет.
Слим, задача про Йоду (и нет, это не реклама) #514 #625132
>>621681

> $creditBalance x $percent) + $servicePayment


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

>>621694

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

>>621697

Никаких

>>621781

Ой-ой, как код плохо оформлен. Ну что это за переменные, что значат их названия?

> $a


> $array1


> $array2


> $value


Надо их переименовать, а то читать тяжело.

> preg_replace('/[,;]/', "", $a);


Лучше заменять на пробел, а то слова могут склеиться

> for ($i = 0; $i < count($array2); $i++) {


Тут лучше foreach

> $array2[$i] = array_reverse($array2[$i]);


> $array2[$i] = implode(" ", $array2[$i]);


Лучше использовать временную переменную вместо элемента массива (меньше скобок будет)

> mb_strtoupper(mb_substr($array2[$i],0,1)).mb_substr($array2[$i],1);


Это надо вынести в отдельную функцию с понятным названием

Сам алгоритм решения верный, но вот код очень неаккуратно выглядит.

>>621820

Вот тут http://docs.slimframework.com/configuration/settings/ нет настройки slim.errors
Вот тут http://docs.slimframework.com/errors/output/ эта настройка меняется через environment

Я бы проверил исходники, поискал эту настройку там и проверил, можно ее передавать как конфиг или нет.
Задачи про ошибки #515 #625133
>>621853

> $test_preg_split = array();


Эту строчку можно не писать, она ничего не делает полезного. Саму переменную надо назвать осмысленнее, например $sentences

> for ($i = 0; $i < $index-1; $i++) {


Тут лучше использовать foreach. Также, по моему из-за $i < $index-1; ты пропускаешь последнее предложение.

> ( ?)+


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

> [,]


Квадратные скобки не требуются

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

>>621997

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

Советы:

> '/\\,/' => ', ',


> '/\\;/' => '; ',


> '/\\!/' => '! ',


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

> '/жы/ui' => 'жи',


> '/шы/ui' => 'ши',


Тоже можно объединить.

> '/ а /u' => ', а ',


> '/ а, /u' => ', а, ',


> '/ а \\-/u' => ', а \\-',


> '/ но /u' => ', но ',


> '/ но, /u' => ', но, ',


Тоже можно объединить

> "/.{3,5}координально.{3,5}/ui",


Не выводит сообщение об ошибке если слово стоит в самом начале текста: https://ideone.com/jdUhTn

> [^а-яё]здела


Здесь наверно лучше использовать \\b которое значит «граница слова» и ищет место, где с одной строны строит \\w (буква, цифра, подчеркивание), а с другой - не \\w.

> [а-яёa-z]\\sа


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

> ...


ТОчка значит «любой символ». Чтобы искать многтточие, надо писать \\.\\.\\. Имей в виду, что в юникоде есть многоточие одним символом: …

Я думаю, там лучше использовать \\b чтобы сказать что справа от слова «но» не должно быть букв или цифр.

> "/.{3,5}[а-яёa-z]\\sа(\\s?|,|...| \\-).{3,5}/u",


> "/.{3,5}[а-яёa-z]\\sно(\\s?|,|...| \\-).{3,5}/u",


Можно объединить вместе

> [^\\s]


То же самое что \\S

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


Это может сработать на многоточие .. или 2 воскл знака: !!. Надо вместо ^\\s написать «любая буква»

> for ($i=0; $i < $possibleErrorsCount; $i++)


Тут удобнее исплоьзовать foreach

> if (preg_match_all($possibleErrors[$i]['pattern'], $text, $matches)) {


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

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


$value надо переименовать. $key не надо писать если ты его не используешь.

Длинные комментарии надо писать над строчкой, а не справа.

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

>>622088

Да, старые, так что в дополнение к ним почитай php the right way и узнай что поменялось в PHP. Насчет книг - не знаю хороших и современных.

>>622092

> 0 => array (


> 1 => array


Не надо писать тут 0, 1, PHP сам их пронумерует.

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

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


> Как скрипт остановить в этом случае?


Можно проверять количество найденных ошибок через if и не исправлять если их ноль.
Задачи про ошибки #515 #625133
>>621853

> $test_preg_split = array();


Эту строчку можно не писать, она ничего не делает полезного. Саму переменную надо назвать осмысленнее, например $sentences

> for ($i = 0; $i < $index-1; $i++) {


Тут лучше использовать foreach. Также, по моему из-за $i < $index-1; ты пропускаешь последнее предложение.

> ( ?)+


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

> [,]


Квадратные скобки не требуются

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

>>621997

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

Советы:

> '/\\,/' => ', ',


> '/\\;/' => '; ',


> '/\\!/' => '! ',


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

> '/жы/ui' => 'жи',


> '/шы/ui' => 'ши',


Тоже можно объединить.

> '/ а /u' => ', а ',


> '/ а, /u' => ', а, ',


> '/ а \\-/u' => ', а \\-',


> '/ но /u' => ', но ',


> '/ но, /u' => ', но, ',


Тоже можно объединить

> "/.{3,5}координально.{3,5}/ui",


Не выводит сообщение об ошибке если слово стоит в самом начале текста: https://ideone.com/jdUhTn

> [^а-яё]здела


Здесь наверно лучше использовать \\b которое значит «граница слова» и ищет место, где с одной строны строит \\w (буква, цифра, подчеркивание), а с другой - не \\w.

> [а-яёa-z]\\sа


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

> ...


ТОчка значит «любой символ». Чтобы искать многтточие, надо писать \\.\\.\\. Имей в виду, что в юникоде есть многоточие одним символом: …

Я думаю, там лучше использовать \\b чтобы сказать что справа от слова «но» не должно быть букв или цифр.

> "/.{3,5}[а-яёa-z]\\sа(\\s?|,|...| \\-).{3,5}/u",


> "/.{3,5}[а-яёa-z]\\sно(\\s?|,|...| \\-).{3,5}/u",


Можно объединить вместе

> [^\\s]


То же самое что \\S

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


Это может сработать на многоточие .. или 2 воскл знака: !!. Надо вместо ^\\s написать «любая буква»

> for ($i=0; $i < $possibleErrorsCount; $i++)


Тут удобнее исплоьзовать foreach

> if (preg_match_all($possibleErrors[$i]['pattern'], $text, $matches)) {


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

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


$value надо переименовать. $key не надо писать если ты его не используешь.

Длинные комментарии надо писать над строчкой, а не справа.

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

>>622088

Да, старые, так что в дополнение к ним почитай php the right way и узнай что поменялось в PHP. Насчет книг - не знаю хороших и современных.

>>622092

> 0 => array (


> 1 => array


Не надо писать тут 0, 1, PHP сам их пронумерует.

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

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


> Как скрипт остановить в этом случае?


Можно проверять количество найденных ошибок через if и не исправлять если их ноль.
Вектор, паттерны, задача про ошибки #516 #625135
>>622117

sql, серверный язык вроде PHP, ООП, MVC, фреймворки

>>622273

> $bigRegexp = "/координально|сдесь|


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

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

Все замечания выше надо исправить.

>>622288

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

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

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

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

Пока ты решал задачу по выводу отчета о сотрудниках и департаментах, разразился мировой экономический кризис. Доходы компании начали снижаться, и совет директоров поставил перед руководством задачу принять меры. Менеджеры 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 - они определяют, откуда можно обращаться к полю или методу). Ты должен подумать логически и для каждого поля/метода определить: это часть кода, которая относится к внутренней логике класса и не должна быть доступна снаружи, или же это часть кода, которая должна быть доступна. Ну к примеру, в Департаменте метод посчитатьОбщиеЗатратыНаЗарплату() должен быть публичным - для этого мы и пишем класс, чтобы считать затраты.

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

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

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

Вот что надо сделать:

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

Советую показывать промежуточные варианты.

>>622296

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


А ты слышал такое?

- мы применили if и это принесло профиты
- мы применили цикл и массив и это принесло профиты

Вряд ли кто-то будет хвастаться что он знает основы языка? Паттерны это те же основы только в плане архитектуры. Они используются например в общении между программистами: «там в проекте есть FrontController, мы можем наш код в него дописать» или «давайте тут не будем заморачиваться, а используем Single table Inheritance».
Вектор, паттерны, задача про ошибки #516 #625135
>>622117

sql, серверный язык вроде PHP, ООП, MVC, фреймворки

>>622273

> $bigRegexp = "/координально|сдесь|


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

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

Все замечания выше надо исправить.

>>622288

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

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

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

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

Пока ты решал задачу по выводу отчета о сотрудниках и департаментах, разразился мировой экономический кризис. Доходы компании начали снижаться, и совет директоров поставил перед руководством задачу принять меры. Менеджеры 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 - они определяют, откуда можно обращаться к полю или методу). Ты должен подумать логически и для каждого поля/метода определить: это часть кода, которая относится к внутренней логике класса и не должна быть доступна снаружи, или же это часть кода, которая должна быть доступна. Ну к примеру, в Департаменте метод посчитатьОбщиеЗатратыНаЗарплату() должен быть публичным - для этого мы и пишем класс, чтобы считать затраты.

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

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

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

Вот что надо сделать:

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

Советую показывать промежуточные варианты.

>>622296

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


А ты слышал такое?

- мы применили if и это принесло профиты
- мы применили цикл и массив и это принесло профиты

Вряд ли кто-то будет хвастаться что он знает основы языка? Паттерны это те же основы только в плане архитектуры. Они используются например в общении между программистами: «там в проекте есть FrontController, мы можем наш код в него дописать» или «давайте тут не будем заморачиваться, а используем Single table Inheritance».
#517 #625136
>>622297
>>622300

Все зависит от тебя

>>622862

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

>>622383

Используй dependency injection, то есть создай сначала калсс с сокетом и передай его в класс Imap через конструктор или аргумент метода.

Урок https://gist.github.com/codedokode/e1d31a31b37d5f635057

>>622403

А наши задачки на HTML прошел? Может стоит глянуть? А так, я бы советовал учить JS/DOm/jQuery, верстальщик без яваскрипта маловостребован, тем более в кризис. В Оп посте есть задачки и ссылки на учебник learn.javascript.ru .

>>622428

> $number = 0;


> $op = $char;


Это там раз 5 повторено, надо бы вынести из свитча.

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

> case ("+"):


Скобки не требуются

Еще там 2 раза скопирован свитч с операциями - убери копипасту.

>>622437

Поищи команду SET NAMES в дампе, если ее нет, то надо определить кодировку дампа и поставить эту команду. Также, посмотри какая кодировка стоит, если есть, в CREATE TABLE. Лучше всего использовать utf8 (в mysql она пишется без дефиса). Если кодировка не указана в CREATE TABEL то она берется из кодировки базы или настроек mysql в конфиге.

>>622445

Неправильно советуешь. iconv не нужен если все правильно настроено. В коде надо использовать utf-8, при соединении с БД делать set_charset или SET NAMES utf8

>>622520

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

ulogin по моему имеет какие-то недостатки, то ли он данные какие-то собирает то ли что-то на страницу ставит, не помню уже.

>>622670

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


Можно но удобнее конечно когда это библиотека делает

> доктрина это королева orm,


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

> Может есть более кошерный фреймворк, кроме бутстрапа?


Я не знаю. Бутстрап вроде самый известный.

> Чтобы была нормальная структура html и не было этой мешанины типа class class-another class-abc class-class-class


Это нормально.

>>622691

Можешь сделать и так, и так, можешь сделать функцию для заквочивания массивов, можешь подключить квери билдер. Но не стоит генерировать тысячи плейсхолдеров для каждого элемента массива.
#517 #625136
>>622297
>>622300

Все зависит от тебя

>>622862

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

>>622383

Используй dependency injection, то есть создай сначала калсс с сокетом и передай его в класс Imap через конструктор или аргумент метода.

Урок https://gist.github.com/codedokode/e1d31a31b37d5f635057

>>622403

А наши задачки на HTML прошел? Может стоит глянуть? А так, я бы советовал учить JS/DOm/jQuery, верстальщик без яваскрипта маловостребован, тем более в кризис. В Оп посте есть задачки и ссылки на учебник learn.javascript.ru .

>>622428

> $number = 0;


> $op = $char;


Это там раз 5 повторено, надо бы вынести из свитча.

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

> case ("+"):


Скобки не требуются

Еще там 2 раза скопирован свитч с операциями - убери копипасту.

>>622437

Поищи команду SET NAMES в дампе, если ее нет, то надо определить кодировку дампа и поставить эту команду. Также, посмотри какая кодировка стоит, если есть, в CREATE TABLE. Лучше всего использовать utf8 (в mysql она пишется без дефиса). Если кодировка не указана в CREATE TABEL то она берется из кодировки базы или настроек mysql в конфиге.

>>622445

Неправильно советуешь. iconv не нужен если все правильно настроено. В коде надо использовать utf-8, при соединении с БД делать set_charset или SET NAMES utf8

>>622520

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

ulogin по моему имеет какие-то недостатки, то ли он данные какие-то собирает то ли что-то на страницу ставит, не помню уже.

>>622670

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


Можно но удобнее конечно когда это библиотека делает

> доктрина это королева orm,


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

> Может есть более кошерный фреймворк, кроме бутстрапа?


Я не знаю. Бутстрап вроде самый известный.

> Чтобы была нормальная структура html и не было этой мешанины типа class class-another class-abc class-class-class


Это нормально.

>>622691

Можешь сделать и так, и так, можешь сделать функцию для заквочивания массивов, можешь подключить квери билдер. Но не стоит генерировать тысячи плейсхолдеров для каждого элемента массива.
#518 #625137
Если вы что-то написали до 10 января и я вас пропустил, то напомните о себе. Если после - подождите еще, решайте пока задачки, читайте учебники, не тратьте зря время.

>>622820

> Выполнил кубики


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

> циклы


Там ошибки, смотри внизу на ideone:

> PHP Notice: Undefined variable: paymentAfterAll in /home/si1YgK/prog.php on line 12


> PHP Notice: Undefined variable: month in /home/si1YgK/prog.php on line 20


Обращаешься к несуществующей на тот момент переменной.

> if ($totalCredit <= $paymentAfterAll


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

>>622890

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

>>622902

Все зависит от тебя, как ты воспользуешься своими знаниями. Цифры смотри на сайте вакансий и фрилансе.
#519 #625143
>>625137
Посмотри потом файлообменник. Я им доволен, но ты 100% найдешь что еще можно улучшить.
>>621786
#520 #625148
Спасибо, ОП, ты лучший. Буду перерабатывать коды на все задачи, что ты мне поправил, но заново грузить не буду, чтобы не нагружать тебя. Учту все замечания в следующих задачах.
#521 #625149
>>625148
Молодец.
#522 #625152
И ещё такой вопрос: как много времени уделить изучению js+html+css? Насколько они необходимы пхп-программисту?
#523 #625158
>>625152

А ты пройди наши задачки из Оп поста по этим темам - этого будет достаточно. Конечно нужны, ведь тебе надо будет работать с чужой версткой и важно не разломать ее и не писать код которй потом будет тяжело поддерживать.
#524 #625160
>>625158
Да, спасибо, я пока финальные задачи по пхп доделываю. Хтлм там следующим идёт. Эх, жалко второго уровня нет
#525 #625170
>>625160

Вместо второго уровня по PHP идут задачи про студентов и файлообменник в ОП посте.
#526 #625185
>>621775
>>622327
>>622965
ОП, первые два до 10го и последнее 10го января. Проверь.
#527 #625288
>>620231
Проиграл на весь офис.
#528 #625339
>>610656
>>612606
>>625108
https://github.com/someApprentice/Students

Вроде бы разобрался. Один вопрос, у меня init написан процедурно, не возникнет ли у меня проблем, если, например, в этом же коде, я захочу написать его как класс? Я помню что так можно делать, просто не понимаю почему сейчас лучше процедурно. Это потому что так удобней делать внедрение зависимостей? Я бы классом сделал и внедрял её статически __construct(PDO Init::$pdo).
69 Кб, 600x406
Приуныл чёт(( #529 #625340
Оп, поясни пару вещей: нахуй все это надо и хули за все это будет?
1) Все эти мвц, паттерны, алгоритмы - зачем это все? Попытался написать код в стиле дезигн паттернс, он разросся и расплодил сущностей, а реальное изменение его все равно потребует перепила половины файла. Да и вообще, ооп в пхп - к чему это? К чему все эти симфони и прочие фреймворки, если все равно пишутся бесконечные админки, круды и проверка форм? Куда расти и зачем? Чтоб смотрите как могу? Ведь все равно, я так понимаю, хайлоад на пхп не пишут, каких-то хардкорных вычислений не делают и уж тем более не рисуют красивой картинки или каких-то распределенных систем, например. Так зачем все это?
2) А что в итоге? Вот подучился я. Приехал в ДС. На какую зарплату рассчитывать стажеру? А после пары лет? А к тридцатнику? А дальше куда деваться? Хэдхантерам и прочим фрилансим.ру не доверяю, хочу твоего мнения.

И вопрос не по теме: где искать таких няш, как ты, по другим языкам - с++, шарп, питон, етц. Ну, наставничество и вот это все. Не в рашке, надо понимать, лол?
#530 #625344
>>625340

> Все эти мвц, паттерны, алгоритмы - зачем это все?


Циклы, переменные, функции - зачем это все? Это основы без которых ничего не сделать.

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


Зато не половину приложения. Ну и я не видел твой код, может он на самом деле не ООП, а процедурщина с классами.

> К чему все эти симфони и прочие фреймворки, если все равно пишутся бесконечные админки, круды и проверка форм?


Ну так с ООП и ORM формы и круды делать проще и быстрее. Это же ад, делать без готовых библиотек форму с валидацией и работой с БД.

> хайлоад на пхп не пишут,


фейсбук, википедия не хайлоад?

> На какую зарплату рассчитывать стажеру?


С этим на hh.ru или в wrk

> по другим языкам


Не знаю. Но я думаю если ты хорошо изучил PHP то с другимии языками ты и сам наверно справишься.
#531 #625345
>>625344
Ты разве ОП?
Циклы, переменные и функции - это основы. А фабрики абстрактных адаптеров - это ебанина.
Чего писать-то, те же скрипты на 300 строчек.
Почему не хочешь ответить на вопрос о зп? Сколько сам получаешь, например? А аноны, которые тут к успеху пришли? Друзья, знакомые?
#532 #625346
>>625344

>или в wrk


Там ничего толкового не будет точно, дам одни долбоёбы-версталы да сис. админы сидят у которые ждут полной автоматизации в настройке и развертывании сети, чтобы остаться безработными.
#533 #625347
>>625345
ОП в принципе тоже не совсем компетентный.
#534 #625355
>>625345

> Почему не хочешь ответить на вопрос о зп?


Потому что не хочу. Мне не нравится когда людей оценивают исключительно по этой цифре. Сам никогда не интересуюсь кто сколько зарабатывает.
#535 #625357
>>625355
Но это же показывает степень мастерства? Не? Просто так же не будут платить РНР разработчику.
#536 #625360
>>625357

Тогда тебе лучше ориентироваться на тренеров по дзюдо, владельцев нефтяных компаний и получателей господрядов - такому мастерству как у них, в нашем треде точно не научат.
#537 #625361
>>625355
Вообще это не имел ввиду. Сколько получает СРЕДНИЙ стажер по дс? А хуй с 3 годами стажа? А сеньор? А дальше что делать и какие перспективы?
#538 #625363
>>625361
Может тебе стоит определиться, чем ты хочешь занимать? Бек енд или можете тебе больше нравится фронтенд?
#539 #625365
>>625360
Хех. Ну в принципе да, если так подумать ЗП не показатель в некоторых случаях.
>>625361
В первую очередь надо выбирать занятие кодингом не судя по тому сколько получает кодер, а по заинтересованности в кодинге как таковому непосредственно.
#540 #625367
>>625363
Вротенд на РНР? ЩО?
#541 #625368
>>625345

>Почему не хочешь ответить на вопрос о зп? Сколько сам получаешь, например? А аноны, которые тут к успеху пришли? Друзья, знакомые?


ОП успешный человек! У него, очевидно, пассивный доход или уже накопленные капиталы раз у него есть время и на нас! А ведь он отвечает почти каждый день, и это длиться уже не первый год. Ты представляешь насколько ОП поразителен? говорите что он не компетентен? Я после его уроков диву даюсь какой у меня красивый и простой код. Я лично после его уроков за год-полгода устроился в веб-конторку с первого раза, просто оставив ссылку на свой гитхаб в резюме, и продолжаю идти к успеху который, как я хотел бы, не уступил успеху ОПа.
#542 #625369
>>625368
Ты случаем не семен ОПа?
#543 #625370
>>625369
Нет
#544 #625371
>>625365
Допустим, дальше что?
>>625363
Гениальный вопрос с учетом заголовка треда.
>>625368
Он охуенен, базара нет. Вопроса про зарплаты в отрасли это не снимает.
#545 #625372
>>625371

>Он охуенен, базара нет. Вопроса про зарплаты в отрасли это не снимает.


>базара


Тебя это ебать не должно.
#546 #625375
>>625371

>Допустим, дальше что?


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

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


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

>Он охуенен, базара нет. Вопроса про зарплаты в отрасли это не снимает.


Значит ты еще не определился для себя охуенен или нет, раз тебя волнует размер его хуя.
#547 #625378
>>625372
Иди нахуй, кукаретик.
>>625375
Да причем тут он, тупой ты уебан?
#548 #625381
>>625375

>развел верстку


А что, под нее отдельный тред?
#549 #625384
>>625378
Такс, такс, с такими нервишками ты много денег не заработаешь.
>>625381
Ну просто тред именуется PHP Тред, а не вебдев. Вёрстка по сути же не имеет отношение к программированию, больше, наверное творческий процесс. Ну знаешь, типа черчения и математики.
#550 #625385
>>625361

Тебе же дали совет зайти на hh.ru и сделать анализ рынка труда. Алсо, где-то тут в разделе есть зарплата-тред.
#551 #625386
>>625384

Верстка это программирование расположения блоков на странице.
#552 #625389
>>625340
Ты вообще читать умеешь?
->
>>625385

>Хэдхантерам и прочим фрилансим.ру не доверяю, хочу твоего мнения.

#553 #625401
>>625386
Больше подходит определение - кодовая разметка, ибо сводится всё к конкретному позиционированию объектов. Так или иначе всё гораздо примитивнее как по мне. Не в обиду сказано.
#554 #625405
>>625401

только почему-то многие верстальщики и php-разработчики даже эту «примитивную» технологию освоить не смогли и верстают наугад переставляя свойства. Быдлокодеры, в общем.
#555 #625408
>>625405

>php-разработчики


Примитивнее относительно даже скриптовых языков я имел в виду. Но говноедом PHPшника так или иначе нельзя назвать, если он верстает на похуй.
241 Кб, 563x522
57 Кб, 540x360
74 Кб, 600x450
39 Кб, 377x604
#556 #625409
>>625384

>>>625378


>Такс, такс, с такими нервишками ты много денег не заработаешь.


Да какой-то поехавший чсв в вкатился в тред что-то требует от нас. Его интеллигентно посылают нахуй, а он питушится от того что тут его величесивупетуху никто ничего не должен. Таким как он здесь не рады, мы тут обсуждаем кошек-мышек и аниме!
#557 #625413
>>625409
Человек просто запланировал зарабатывать много денег программированием.
#558 #625424
Есть ли какие-нибудь книги в которых рассматривается архитектура? Когда начинаю писать что-то крупнее сайта визитки все превращается в какую-то ебучую кашу. Что читать чтобы научиться писать красивый, понятный, структурированный и соответствующий принципам ООП код? Где на гитхабе можно посмотреть интересную реализацию того же MVC?
#559 #625427
>>625413
Не обращай внимание на тупого семена
#560 #625440
>>625413
Его поведение все равно не приемлемо.
149 Кб, 432x640
#561 #625443
Ткните, пожалуйста, носом в гайд, мануал или готовый простой скрипт, обрабатывающий хтмл форму и отсылающий писмо на заданное мыло.
#563 #625449
Какие задачи из оповского курса можно запихнуть в гитхаб для резюме на стажёра? Я меганюфаг, только вот задачи на второй уровень доделываю
#564 #625451
>>625449
Все.
#565 #625452
>>625451
Это вряд-ли. Мне даже своих студентов стыдно показывать, я уж не говорю про вещи попроще.
#566 #625456
>>625368
Два горячих чаю налил с разбега и по хардкору!
ОП - это мощь и глыба, плюс хороший человек.
У меня именно с такими, как наш ОП, ассоциируется практически всё то лучшее, что есть на анонимных имиджбордах: бескорыстная помощь, братство, освещение новых горизонтов, непредвзятая оценка.
#567 #625458
>>625452
Так ты делай нормально. Переделай их, чтобы бы было не стыдно.
#568 #625466
проигрываю с восторженных школьников, поклоняющихся опу
#569 #625468
>>625466

Но некоторые из них уже устроились на работу, ёпта. Хотя я тоже не очень отношусь к познаниям ОПа.
#570 #625477
>>625468
Как будто это что-то сложное.

И я ничего не имею ни против опа, ни против его малолетних поклонников. Просто это выглядит смешно, вот и все.
И флуда слишком много в треде, поэтому призываю всех хоть чуть-чуть думать перед тем как писать.
Желательно чтобы тред состоял из полезной инфы, то есть вопросов и ответов, а не чата как сейчас.
#571 #625483
>>625477
Ты первый начал.
#572 #625484
>>625466

>школьников


Но ведь мне уже почти 32 года!
Завязываю, простите. Хотя это и правда.
#573 #625491
>>625440
Да в чем неприемлемо-то? И для кого? Это двач, детка. Вежливо спросил, какие в среднем с зарплатами у проггеров на php разного уровня. Начались какие-то предъявы, нравоучения и оскорбления.
#574 #625518
>>625491
Тебе не менее вежливо предложили посмотреть на hh.ru.
Тут был анон из ДС с зп 120к у джуна, есть знакомый с зп 150к опять же в ДС, но там питон и он админ.
Хз, чё тебе надо, возьми да сам посмотри.
#575 #625521
>>625518
Ну попросил же мнение анонов
#576 #625523
>>625518

>с зп 120к у джуна


Ты хотел сказать 12к видимо
#577 #625524
>>625523
Или он под ДСом Минск имел в виду.
#578 #625533
>>625424
Бамп
#579 #625536
>>625523
>>625524
Лол
>>625518
120к. У джуна. Серьезно?
#580 #625538
>>625533
Эх, опять платина...

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

>>625536
Серьезно. Не путай стажера с джуниором.
Не путай веб-студии, которые занимаются версткой и cms, с крупными программистскими конторами.
Не занимайся щит-постингом на дваче, пиши код.
#581 #625540
>>625538
120 у джуна это как-то слишком прохладно, постоянно вижу вакансии в ДС с зараплатой что-то около 120 но это для сеньоров и мидлов, у джунов дай бог 60к.
#582 #625729
>>625185
ОП, сам сказал, кто до 10го еще не проверен откликнитесь. Ну ты где?
Диплом #583 #625762
ОП, посоветуй тем для диплома по сабжу. Чтобы был мотив обмазаться фреймворками, базами данных (мб не только SQL даже)
#584 #625791
>>619873 (OP)
ОП, привет.
Я снова проклятые регекспы принёс, посмотри, пожалуйста:
http://ideone.com/Z2veAt
Задача про опечаточников, вместе с заменой, по сути первая часть задачи там же содержится. Ты в прошлый раз мне посоветовал замену проводить через strtr() и бить строку на слова, что я и сделал (хоть и перестал чувствовать себя регексп-ниндзя).
И со всеми праздниками тебя! Спасибо, что тратишь своё время.
#585 #625846
1.Для чего нужен кэш?
2. приведите пример проекта, где красиво и правильно записаны эксепшены в логи.
#586 #625936
>>625375
Я уже практически не пишу в этом треде, смотря на все это безумие, когда задачки школьников на дивы и регулярки комментируют огромными пастами, а мои мини-приложения тонут в потоках задачек и флуда без внимания. Рак, геи, аниме, задачки, школьники, верстка убили этот тред.
#587 #625939
>>625762
Собственная ЦМС, базарю.
#588 #625953
>>625939
Ну не тролль ты. Или дай пример - цмс чего, кого, для чего...
#589 #625954
>>625484
Ёпт, а я думал, я тут самый старый.
26-лвл слоупок
#590 #625959
>>625791
Отличное решение, а у меня фуфло какое-то с кучей регулярок и без функций, при этом без замены кириллицы в латинских словах: >>623605
Заменить-то, пожалуй, не сложно, но только я бы снова лепил отдельную регулярку для этого...
А у тебя не понял, как так функция checkText() работает и всё передаёт без return?
Я сделал клавишу Shift вчера, там только столкнулся с тем, что return возвращает единожды, поэтому надо собирать то, что происходило в цикле через array_push в пустой массив, выводить его return'ом.
Снова вижу, что ни хрена не понимаю.

Я что-то не разберусь никак с нормальной заменой регулярок с помощью $1, $2 и так далее - какая-то каша на выходе, приходится несколько разных регулярок делать для такого, ОП уже отругал. Вот это подтянуть надо.
#591 #625966
#592 #625982
>>625959
Чёртов двощ, с трудом понял, троллишь ты или нет. Спасибо, если нет. У тебя даже компактнее как-то это всё, хотя способ выделения опечаток [] и правда выглядит топорно.
У меня, как видишь, для обратной замены ещё один массив с буквами, и ещё один регексп, только наоборот, так что...
А checkText() у меня ничего и не передаёт, она выводит словом из массива, и всё.
Про клавишу Shift только тебя не понял.
Насчёт $1 и скобок, я где-то прочитал годную статью, но не смог её найти сейчас. В мануале есть, посмотри пример с подмасками: http://php.net/manual/ru/function.preg-replace.php . Суть в том, что ты ставишь скобки в регэкспе, и можешь потом в preg_replace() в $replacement к ним обращаться, по номеру скобки, в том порядке, в котором они у тебя стоят, начиная с $1 ($0 это всё выражение вроде). Очень прикольно! Мне пришлось понять, когда Grammar Nazi делал, хотя чем дальше в лес, тем больше дров, хочется уже с ними закончить и ООП всякое пройти. Жду ОПа вот.
#593 #625983
>>625982

>выводит словом


слово за словом
#594 #625985
>>625982
Ноуп, даже и не думал троллить.

>У тебя даже компактнее как-то это всё, хотя способ выделения опечаток [] и правда выглядит топорно.


Да, надо бы сделать как раз через массив с переворачиванием регулярок с кириллицы на латиницу и наоборот и через '$1[$2]', как у тебя это реализовано. Так намного компактнее всё выходит.

>А checkText() у меня ничего и не передаёт, она выводит словом из массива, и всё.


Я вот как раз не знал, что там может быть просто echo, думал, что только return там работает. Думал, что иначе нельзя сделать какой-то результат доступным вне функции.

>Насчёт $1 и скобок, я где-то прочитал годную статью, но не смог её найти сейчас. В мануале есть, посмотри пример с подмасками: http://php.net/manual/ru/function.preg-replace.php . Суть в том, что ты ставишь скобки в регэкспе, и можешь потом в preg_replace() в $replacement к ним обращаться, по номеру скобки, в том порядке, в котором они у тебя стоят, начиная с $1 ($0 это всё выражение вроде). Очень прикольно!


Спасибо, бро, сейчас читаю. Вроде же всё понятно, действительно, всё даже и совсем не сложно. А я почему-то их у ОПа на сайте попробовал, как-то толком не пошло - я и забыл про них.
У меня и Grammar Nazi написан с кучей регулярок, за что ОП и отругал.
Перепишу всё теперь.

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


Я хочу потом ещё кучу всяких задачек пройти и весь учебник ОПа полностью без подсказок и возвращения к уже решённым задачам - хочу набить руку на этом, чтобы уже не задумываться о том, как там массив с помощью foreach разложить на ключи и значения и такого типа.
На разные функции хочу какие-нибудь задачки потом порешать, а то совсем неуверенно себя чувствую.
#595 #625987
>>625982
Клавиша Shift - это следующая задача, уже после опечаточника идёт.
#596 #626019
Ох щи, до чего же просто управляться с $n в preg_replace...
Вот так: что-то пропустишь или не придашь чему-либо должного значения, а потом лепишь кучу лишнего кода и выдаёшь топорные решения...
Спасибо анончику и ОПу, всё-всё переделаю теперь, где лепил лишние регулярки, вместо того чтобы просто использовать $n.
Также узнал (здесь звучит смех), что достаточно просто подставить в preg_replace массив из регулярок и массив из замен, чтобы всё работало так же, как работает при цикле с foreach и сложным массивом из массивов с регулярками и заменами...
Функция, оказывается, сама обходит всё значения в массиве, подставляя их в $pattern и (из другого массива) в $replacement.
Откровения уровня... короче, очень невысокого уровня.
#597 #626022
>>626019

>Также узнал (здесь звучит смех), что достаточно просто подставить в preg_replace массив из регулярок и массив из замен


Я тебе это еще месяц назад втолковывал.
#598 #626024
>>626022
OP, eto ti?
#599 #626025
>>626024
Нет, я еще до ОПа это говорил.
#600 #626026
>>625953
САП ОП и все наблюдающие за этой проблемой >>624650
>>624126
>>624077
>>624066
>>624051
>>622641
>>622533

В итоге я нашел.

Действительно, как я и предполагал изначально дело заключается в том, что PHP использует устаревший виндовый API , который работает только с ASCII или ANSI. Соответственно невозможно было никаким образом записать имя в файловую систему с любым Юникод символом под Виндой. Решение я нагуглил на стэк оверфлоу, чел написал класс для работы с winAPI, похоже, что напрямую через COM(ОП поправь если не так).

https://gist.github.com/nicolas-grekas/2665437 - решение.

Просьба кстати ознакомиться с поделием этого человека к ОПу и всем профи.
#601 #626029
>>626026

>с любым Юникод символом под Виндой


Т.е. с русским тоже бы не проканало?
мимокрок
Диплом #602 #626031
ОП, посоветуй тем для диплома по сабжу. Чтобы был мотив обмазаться фреймворками, базами данных (мб не только SQL даже)
#603 #626032
>>626022
У меня стремление всё усложнять же.
Наверное, пару недель назад, когда я возился с задачей на проверку и исправление ошибок и всех терроризировал ею?
Я просто как раз начал всё изучать числа 12-15 декабря, месяц назад, когда впервые открыл сайт ОПа.
#604 #626034
>>626029
Чому? Проканало бы.
#605 #626035
>>626031
Собственная ЦМС, базарю.
#606 #626036
>>626034
Так русский это же Юникод тоже, вот меня и смутило.
#608 #626040
>>626038
Да, да, уже понел, спасибо. Тормознул.
#609 #626051
http://ideone.com/1HTJJ2
Объясните, пожалуйста, аутисту, почему с русским Аргентина манит негра и вообще с чем-то русским работать не хочет, хоть и mb_internal_encoding('utf-8'); присутствует.
#611 #626053
>>626051
mb_substr
#612 #626054
#613 #626166
>>626035
Заебал, шутничок.
#614 #626179
>>626031
Сделай что-то типа соцсети для универа.
Преподы регистрируются, студентота. Могут выбирать факультет, курс, выкладывать файлы (фотографии, аудио- и текстовые файлы в разных форматах), переписываться друг с другом, подписываться на новости друг друга, ставить лайки и дислайки.
#615 #626182
Завожу свежий код
Циклы №1 http://ideone.com/AS8oDo
Циклы №2 http://ideone.com/KILTAI или вот так http://ideone.com/XTIYdg
#616 #626185
>>626179
Велосипед же. Кроме того, ИС универа уже есть итак.
41 Кб, 417x120
#617 #626189
Как такой паттерн называется?
#618 #626194
Как при помощи ПХП или какими-нибудь другими методами, определить движок сайта? Есть определённый форум, на нём есть блоги, надо узнать какая система используется для блогов.
#619 #626209
>>626185
На каком-нибудь Moodle, наверное?
Ну, тут у анона была годная идея в одном из тредов: сервис по уборке города.
Суть токова: анон проходит по городу и видит кучку грязи. Он фотает сию кучу, заходит на сайт, постит фотку и указывает место расположения (либо оно автоматически берётся из его данных). Далее анон-дворник берёт заказ - выставляет какую-нибудь плашку "в работе", быстро убирает кучку в этом городе, фотографирует и загружает готовый вариант.
За это другие аноны скидываются ему на пивасик либо лайкают и т.п.
Что-то уровня стартапа, а может даже выше.
#620 #626216
>>626209
200% не взлетит
#621 #626220
Вот моя клавиша Shift: http://ideone.com/WQK7H4
С каждой задачей немного яснеет в этой голове. Всё яснее и яснее, что правильно я пошёл 15 лет назад учиться на филологический факультет.
В этот раз регулярки подставляются в preg_replace не через foreach, а просто так.
При этом возникает вопрос: можно ли как-то избежать дублирования... - пока писал вопрос, понял, что можно сделать одну большую регулярку с | и разными знаками, сейчас исправлю.

>>626216
Даже в качестве диплома?
#622 #626226
>>626220
А зачем в дипломе использовать явно мертворожденную задачу? Куда потом ее развивать в магистерской?
#623 #626230
>>626226
Например, можно развивать вширь.
Сделать Бюро находок - для каждого города. Вещи, документы, животные.
Фотографировать разрушенные участки дорог, зданий, опасно висящие сосульки и т.п., чтобы можно было обратиться в ЖЭУ для устранения или коллективного обращения, сбора подписей.
Если бы такая система была у самих ЖЭУ, то уже сейчас, скорее всего, многие проблемы решались бы намного оперативнее.
Сейчас в группах по городам в соцсетях такое бывает - жалуются, сообщают о пропаже или находке вещей или животных.
А тут такой анончик со своим проектом.
Это что-то уровня Росямы, но только во всех сферах.
#624 #626232
>>626230
Да в том-то и дело, что уже есть Росяма, а пожертвования какие-то, это совсем другое, нищая страна, какое куда кто чего платить будет, лол.

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


У нас даже фотографирование хуево стоящих машин не работает. Алсо, есть всякие активные-сердитые гражданины уже давно. От нонейм хуя никому такая система не нужна абсолютно. Алсоалсо, у дворников нет телефонов с камерами, лол. Все эти пропажи-находки итак есть, они не работают, никто туда не ходит, местечковые форумы все сплошняком мёртвые.
#625 #626233
>>626226
Вот какой момент ещё: есть такой сайт vsezverushki.ru, на нём только по одной Москве можно отдать в дар или продать любое животное.
Посещаемость в районе 2к человек, что не особо и много.
Внимание, вопрос: во сколько такой сайт оценивается на известной бирже сайтов Telderi.ru?
Внимание, ответ: в 3 миллиона рублей.
Доход от размещения объявления на главной странице, месячный доход - выше 120 тысяч рублей. И это только Москва, а есть ведь и другие города.
А у вас всё ещё нет идей для собственных проектов.
#626 #626235
>>626232
Один проект для всего.
Покажи аналог, кроме Росямы, там же только ямы, ну ты понял.
И чтобы на всю Россию по городам.
#627 #626240
>>626233
Чтобы не быть голословным про зверюшек: http://www.telderi.ru/ru/viewsite/198901
Человеку давали больше миллиона рублей за него, но он же не дурак, чтобы продавать за годовую окупаемость.
#628 #626245
>>626235
Активный гражданин, сердитый гражданин, всякие прочие собянинские прожекты и начинания путиноидов.

>И чтобы на всю Россию по городам.


Паблосы вк. Кто сейчас пойдет на сторонние сервисы и как вообще узнает про них?
>>626233
Но есть же авито и ирр.ру, чем этот лучше?
И вконтакт тоже есть.
#629 #626247
>>626245
Я не пойму, чего тебе от нас то надо? Ты ждешь, что тебе кто-то предложит супер-уникальную и прибыльную идею?
#630 #626249
>>626245
Активный гражданин и т.п. - это не то, что я имею в виду. Там какие-то предложения по улучшению и тому подобное.
Нужен простой и удобный сайт для всякого такого - всего, что цепляет внимание сознательного гражданина.

>чем этот лучше?


Наверное, ничем. Про него знают разные крупные заводчики, питомники и прочие люди с деньгами (один какой-нибудь котёнок с родословной стоит от 15к рублей - самый дешёвый). Поэтому для них 200р за рекламу питомника или зверька в день на главной странице сайта - мелочи, окупающиеся с лихвой.
Но я тебе и говорю, что в соцсетях многое есть, что как раз даёт пищу для размышлений.
#631 #626251
>>626245
И да - в соцсетях всё смывает ещё получше, чем в /b, ну ты понял.
Сейчас есть новость, а через пять минут потонула среди кучи других, очень неудобно.
А тут разделение по толковым группам, всё на виду и понятно.
Я просто так это говорю, не пытаюсь что-то доказать. Просто мне кажется, что это вполне хорошая идея для приложения сил как для диплома, так и для последующей работы.
Но поступай как знаешь, конечно.
#632 #626254
>>626182
Ух ты, не совсем начинающий в треде?
Калькулятор Айфона считает верно, но там много повторов, ОП не одобрит.
$creditBalance = ( $creditBalance * $percent ) + $servicePayment - $monthlyPayment; - вот это повторяется, можно от этого избавиться.
В расчёте вклада анончика 10к под 10% недочёт - в первый год анону 16 лет, хотя он клал в 16, а прошёл уже год. Так, мелочь, остальное верно считает, однако дождись ОПа, он даёт делает отличные замечания.
#633 #626255
*даёт хорошие советы и делает отличные замечания
#634 #626257
>>626247
Про прибыльность вообще речи не шло, если затраты небольшие, то даже на самоокупаемость похер. Но так да - какую-то оригинальную идею хочу, которую анону самому лень реализовывать, а я возьму в качестве дипломной работы.
>>626249

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


Не очень понял. Вытащить из соц-сетей идею в качестве отдельного проекта? Троллейбус из хлеба какой-то.
>>626251
Спасибо, подумаю.
#635 #626264
>>626257

>Вытащить из соц-сетей идею в качестве отдельного проекта?


Соцсеть - это показатель интересов, проблем и желаний людей же. У людей проблемы - часто теряют вещи, видят разор или неустройство, хотят как-то повлиять на это, попивая чай у себя на кухне.
В соцсетях, как и на имиджборждах, можно орать, сколько душе угодно - почти никто не услышит, пока журналисты не сделают репортаж, например.
А тут сайт, который собирает всё в себя, каким-то образом формирует инициативные группы либо привлекает непосредственных исполнителей за какие-либо профиты (не обязательно, денежные). Например, меня вот лично сейчас раздражает, что дорожка у дома с обратной стороны не расчищена от снега. Идти ругаться в ЖЭУ мне не хочется, напишу-ка я на сайте, что вот такое есть, готов заплатить 100р анону-школьнику, если уберёт. На счету резервируются деньги, кто-нибудь выполняет, ну ты понял.
Это можно в любую сферу растянуть же.
Сломалась дверь в квартире, нужно поклеить обои, вынести строительный мусор и тому подобное - различные услуги - создаёшь заявку, находятся исполнители.
Привязка к региону, резервирование денег на самом сайте, чтобы исполнитель был уверен.
Короче, фриланс, но связанный с реальной работой или услугами.
Я не в курсе, есть ли именно такое на Авито? Чтобы не искать заявку, а создавать?
Так или иначе - идея имеет право на жизнь, как считаешь?
https://github.com/fxsloker/Student #636 #626291
>>622965

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


Ты случайно не думаешь ли что число моделей = числу контроллеров? Если так то ты плохо понял зачем они нужны. Контроллер = раздел сайта или страница, модель = сущность в БД. между ними не обязательно должно быть соотношение 1 к 1.

Далее: http://pastebin.ru/vKfLkBPw
#637 #626292
>>623029

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

>>623227

Что сложного в том чтобы сверстать что-то? Не за бесплатно же.

>>623239

TDG это просто класс где собраны методы работы с таблицей в БД. Он не обязан выглядеть как в зенде. У меня в уроке про паттерны работы с БД есть более простой пример, без всяких initialize.

> Смотри вот есть класс TableDataGateway, в нем есть метод initialize. Я правильно понимаю, что прямо в этом классе происходит подключение к бд?


Нет, это нелогично. Логичнее передать готовый объект PDO в конструктор. В зенде сделано по-другому - там базовый класс получает объект для работы с БД через какой-то статический метод. Но тебе делать так не стоит. Вот урок по теме: https://gist.github.com/codedokode/e1d31a31b37d5f635057

> Почему не подключаться к бд сразу в конструкторе?


Потому что это не задача класса TDG, подключаться к базе.

> Итак, я так понимаю, что в TableDataGateway я должен реализовать примитивные методы update, insert, where, select, которые будут применимы для всех моделей, а уже работая с каждой моделью, она должна будет наследовать этот класс и использовать эти методы?


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

> Вообщем объясни мне, ОП, как это все работает? Я хочу применить это в студентах и понять как оно устроено.


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

ServiceLocator/Manager это классы для создания объектов и передачи им нужных зависимостей, они мельком упомянуты в моем уроке про Dependency Injection.

> Создаю класс TableDataGateway, там создаю все эти "примитивные методы".


Это не обязательно.

> В самой модели Student в конструкторе будет создаваться объект класса UserDataGateway с аргументом "students" (имя таблицы).


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

Ты пытаешься смешать все в кучу, это не ООП подход. В ООП каждый класс занимается своим делом. Класс Student отдельно, классы TDG отдельно.

> Там будут использоваться такие же методы add, update, edit и т.д., которые будут вызывать аналогичные методы класса UserDataGateway


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

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


Методы контроллера не обязаны соответствовать методам модели.

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


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

Ну и урок по паттернам работы с БД, может ты не видел ссылку: https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md

>>623260

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

cEtegories - опечатка.

>>623281

Не, я чаще видел что таблицы во множественном.
#637 #626292
>>623029

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

>>623227

Что сложного в том чтобы сверстать что-то? Не за бесплатно же.

>>623239

TDG это просто класс где собраны методы работы с таблицей в БД. Он не обязан выглядеть как в зенде. У меня в уроке про паттерны работы с БД есть более простой пример, без всяких initialize.

> Смотри вот есть класс TableDataGateway, в нем есть метод initialize. Я правильно понимаю, что прямо в этом классе происходит подключение к бд?


Нет, это нелогично. Логичнее передать готовый объект PDO в конструктор. В зенде сделано по-другому - там базовый класс получает объект для работы с БД через какой-то статический метод. Но тебе делать так не стоит. Вот урок по теме: https://gist.github.com/codedokode/e1d31a31b37d5f635057

> Почему не подключаться к бд сразу в конструкторе?


Потому что это не задача класса TDG, подключаться к базе.

> Итак, я так понимаю, что в TableDataGateway я должен реализовать примитивные методы update, insert, where, select, которые будут применимы для всех моделей, а уже работая с каждой моделью, она должна будет наследовать этот класс и использовать эти методы?


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

> Вообщем объясни мне, ОП, как это все работает? Я хочу применить это в студентах и понять как оно устроено.


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

ServiceLocator/Manager это классы для создания объектов и передачи им нужных зависимостей, они мельком упомянуты в моем уроке про Dependency Injection.

> Создаю класс TableDataGateway, там создаю все эти "примитивные методы".


Это не обязательно.

> В самой модели Student в конструкторе будет создаваться объект класса UserDataGateway с аргументом "students" (имя таблицы).


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

Ты пытаешься смешать все в кучу, это не ООП подход. В ООП каждый класс занимается своим делом. Класс Student отдельно, классы TDG отдельно.

> Там будут использоваться такие же методы add, update, edit и т.д., которые будут вызывать аналогичные методы класса UserDataGateway


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

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


Методы контроллера не обязаны соответствовать методам модели.

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


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

Ну и урок по паттернам работы с БД, может ты не видел ссылку: https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md

>>623260

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

cEtegories - опечатка.

>>623281

Не, я чаще видел что таблицы во множественном.
#638 #626293
>>623358

> Для каждой из них я должен создать класс-модель этой сущности, свойства которой будут полями, которые есть в БД для этой таблицы, верно?


Да

> И еще должны быть классы, которые уже непосредственно работают с БД, типа select, update и т.д. причем опять же для каждого объекта/сущности свой такой класс в котором должны быть описаны все возможны методы для взаимодействия с БД?


Да, все методы которые тебе нужны. Те что не нужны можно не делать.

>>623401

Ты пишешь глупости, анон пока только изучает работу с Бд и хочет разобраться как это вообще делается. А потом и за доктрину возьмется. И кстати чем хорош пропел если есть доктрина? И чем твой совет поможет если анон хочет разобраться в паттернах работы с БД а не получить готовое решение?
https://github.com/nsdvw/file-sharing #639 #626294
>>623442

> $app->error(function (\Exception $e) use ($app) {


> $app->log->info($e);


А почему уровень логгирования такой низкий (info)? Типа неважная информация? И я не уверен что надо использовать логгер Слима, не лучше ли писать в стандартный лог ошибок PHP?

> Про html5 валидацию слышу второй раз в жизни. Ты имеешь ввиду эти атрибуты типа required и pattern?


Да

> Во-первых, это поддерживается не во всех браузерах,


Да, но это ведь не мешает пользователю работать с формой? Просто об ошибке он узнает позже, при отправке формы.

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

> мне просто не нравится внешний вид этих попапов


Да, поменять его (пока) нельзя: http://stackoverflow.com/questions/5328883/how-do-i-style-the-html5-form-validation-error-messages-with-css/6072950#6072950

Вот тут есть статья по переделке внешнего вида сообщений (сделать их самому), можешь попробовать сделать, но хорошо бы сделать это как-то универсально, чтобы можно было подключить к любому сайту: http://developer.telerik.com/featured/building-html5-form-validation-bubble-replacements/

> Helper\Token::init


Имя метода не говорит о том что он делает

На формы (включая логаут) надо поставить защиту от CSRF. У меня есть урок про нее.

> $isAjax =


> $author_id


Стиль наименования надо выдерживать одинаковый

> ($app->request->get('ajax') !== null) ? true : false;


!!$app->request->get('ajax')

> ajaxResponse($app->response, $uploadForm->getFile()->id);


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

https://github.com/nsdvw/file-sharing/blob/master/web/index.php#L55

> if ($isAjax) {


> ajaxResponse($app->response, null, $uploadForm->errorMessage);


Я думаю это надо перенести ниже, туда где идет вывод шаблона $app->render('upload_form.twig',...

> $uploadForm = new Form\UploadForm($app->request, $_FILES, $author_id);


Нужно ли форме ид автора? Может тогда лучше не id а полноценный обьъект передавать?

> $fileUploadService->upload($uploadForm)


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

> $loginForm = new Form\LoginForm($app->request);


> if ($app->loginManager->validateLoginForm($loginForm)) {


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

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

https://github.com/nsdvw/file-sharing/blob/master/web/index.php#L119

> Helper\Pager( $page, $app->fileMapper->getFileCount(), 15 );


Магическое число 15

> https://github.com/nsdvw/file-sharing/blob/master/web/index.php#L137


> $pageViewService = new Helper\PageViewService(


Сервисы лучше сделать через синглтоны слима наверно.

https://github.com/nsdvw/file-sharing/blob/master/app/Form/UploadForm.php#L11
Хранить текст в константах не очень удобно, например не получится сделать локализацию (перевод на другой язык).

> https://github.com/nsdvw/file-sharing/blob/master/app/Form/UploadForm.php#L66


> private function setFile()


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

https://github.com/nsdvw/file-sharing/blob/master/app/Helper/FileUploadService.php#L16

> $this->viewHelper = new ViewHelper;


Логично бы тоже передавать через конструктор. А то завтра ты захочешь например добавить аргументы в конструктор ViewHelper.

https://github.com/nsdvw/file-sharing/blob/master/app/Form/AbstractFormWithCaptcha.php
Странный класс. Нельзя сделать капчу обычным полем, а то так мы дойдем до FormwithTextarea, FormWithHiddenField и так далее.

https://github.com/nsdvw/file-sharing/blob/master/app/Form/AbstractFormWithCaptcha.php#L15

> if ($this->$field != $_SESSION['captcha']) {


Неправильно. Сессия общая для всех вкладок браузера. Что если открыть несколько форм с капчами? Что если на странице несколько форм с капчами?

> class AbstractMapper implements TransactionableInterface


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

Транзакции лучше сделать на уровне PDO или аналогичного класса. И есть еще интересный способ их сделать через анонимную функцию: http://doctrine-orm.readthedocs.org/projects/doctrine-dbal/en/latest/reference/transactions.html

Смотри функцию Connection#transactional($func). выгода такая: 1) не забудешь сделать коммит 2) при исключении транзакция откатится.

>>623458

Формально ActiveRecord и Datamapper это альтернативные подходы реализации ORM.

> И то и то - частный случай DBAL.


Нет. У нас DBAL это низкоуровневый объект вроде PDO.
https://github.com/nsdvw/file-sharing #639 #626294
>>623442

> $app->error(function (\Exception $e) use ($app) {


> $app->log->info($e);


А почему уровень логгирования такой низкий (info)? Типа неважная информация? И я не уверен что надо использовать логгер Слима, не лучше ли писать в стандартный лог ошибок PHP?

> Про html5 валидацию слышу второй раз в жизни. Ты имеешь ввиду эти атрибуты типа required и pattern?


Да

> Во-первых, это поддерживается не во всех браузерах,


Да, но это ведь не мешает пользователю работать с формой? Просто об ошибке он узнает позже, при отправке формы.

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

> мне просто не нравится внешний вид этих попапов


Да, поменять его (пока) нельзя: http://stackoverflow.com/questions/5328883/how-do-i-style-the-html5-form-validation-error-messages-with-css/6072950#6072950

Вот тут есть статья по переделке внешнего вида сообщений (сделать их самому), можешь попробовать сделать, но хорошо бы сделать это как-то универсально, чтобы можно было подключить к любому сайту: http://developer.telerik.com/featured/building-html5-form-validation-bubble-replacements/

> Helper\Token::init


Имя метода не говорит о том что он делает

На формы (включая логаут) надо поставить защиту от CSRF. У меня есть урок про нее.

> $isAjax =


> $author_id


Стиль наименования надо выдерживать одинаковый

> ($app->request->get('ajax') !== null) ? true : false;


!!$app->request->get('ajax')

> ajaxResponse($app->response, $uploadForm->getFile()->id);


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

https://github.com/nsdvw/file-sharing/blob/master/web/index.php#L55

> if ($isAjax) {


> ajaxResponse($app->response, null, $uploadForm->errorMessage);


Я думаю это надо перенести ниже, туда где идет вывод шаблона $app->render('upload_form.twig',...

> $uploadForm = new Form\UploadForm($app->request, $_FILES, $author_id);


Нужно ли форме ид автора? Может тогда лучше не id а полноценный обьъект передавать?

> $fileUploadService->upload($uploadForm)


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

> $loginForm = new Form\LoginForm($app->request);


> if ($app->loginManager->validateLoginForm($loginForm)) {


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

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

https://github.com/nsdvw/file-sharing/blob/master/web/index.php#L119

> Helper\Pager( $page, $app->fileMapper->getFileCount(), 15 );


Магическое число 15

> https://github.com/nsdvw/file-sharing/blob/master/web/index.php#L137


> $pageViewService = new Helper\PageViewService(


Сервисы лучше сделать через синглтоны слима наверно.

https://github.com/nsdvw/file-sharing/blob/master/app/Form/UploadForm.php#L11
Хранить текст в константах не очень удобно, например не получится сделать локализацию (перевод на другой язык).

> https://github.com/nsdvw/file-sharing/blob/master/app/Form/UploadForm.php#L66


> private function setFile()


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

https://github.com/nsdvw/file-sharing/blob/master/app/Helper/FileUploadService.php#L16

> $this->viewHelper = new ViewHelper;


Логично бы тоже передавать через конструктор. А то завтра ты захочешь например добавить аргументы в конструктор ViewHelper.

https://github.com/nsdvw/file-sharing/blob/master/app/Form/AbstractFormWithCaptcha.php
Странный класс. Нельзя сделать капчу обычным полем, а то так мы дойдем до FormwithTextarea, FormWithHiddenField и так далее.

https://github.com/nsdvw/file-sharing/blob/master/app/Form/AbstractFormWithCaptcha.php#L15

> if ($this->$field != $_SESSION['captcha']) {


Неправильно. Сессия общая для всех вкладок браузера. Что если открыть несколько форм с капчами? Что если на странице несколько форм с капчами?

> class AbstractMapper implements TransactionableInterface


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

Транзакции лучше сделать на уровне PDO или аналогичного класса. И есть еще интересный способ их сделать через анонимную функцию: http://doctrine-orm.readthedocs.org/projects/doctrine-dbal/en/latest/reference/transactions.html

Смотри функцию Connection#transactional($func). выгода такая: 1) не забудешь сделать коммит 2) при исключении транзакция откатится.

>>623458

Формально ActiveRecord и Datamapper это альтернативные подходы реализации ORM.

> И то и то - частный случай DBAL.


Нет. У нас DBAL это низкоуровневый объект вроде PDO.
#640 #626298
>>623442

Раз ты не знаешь уровни логгирования то почитай PSR http://www.php-fig.org/psr/psr-3/

Названия уровней придумали не они, эти уровни придуманы много лет назад, я даже не знаю откуда они взялись.
#641 #626299
>>626264

>1000 рублей за минет, безопасная сделка


>6435 предложений


>исполнитель выбран


>заказ в работе

#642 #626302
>>626264
Да. you.do или как-то так, уже есть.
#643 #626326
>>626302
Всё уже создано, до нас.
Впервые о нём узнал.
Неудобный сайт, правда, но всё на нём есть.
Не регистрировался, не вижу города, кроме Москвы и Санкт-Петербурга.

>>626299
Таких сайтов так-то тоже полно.
#644 #626334
ОП, здравствуй, если доберёшься - проверь, пожалуйста:
1) http://ideone.com/ivV3tG - про клавишу "Shift";
2) http://ideone.com/gXSbfE - про Йоду. Тут я не сохранял знаки препинания внутри предложений, решил, что так подразумевалось (глянул в примере, что их нет). А так вроде бы получилось всё.
Спасибо!
#645 #626339
>>626220
Я не ОП, но могу сказать, что из-за обилия комментариев читать просто невозможно. Я пишу комменты обычно сбоку, а не между строк, и вообще рекомендуют переменные и функции называть так, чтобы они сами за себя говорили, а комменты - если происходит особая, уличная магия какая-нибудь, неясная без подсказки.
вообще я не программист, можно меня не слушать
#646 #626340
>>626220
Ну и дам наводку: прогляди ещё раз урок про регекспы, там есть про разбиение предложений.
#647 #626341
>>626340
Блджад, разумничался, это ж не та задача...
#648 #626347
>>626339

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


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

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


Стараюсь так и называть.

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


У меня комменты - это разбитый на части алгоритм написания скрипта. Я обычно сначала пишу алгоритм, а потом пишу скрипт.
Я тоже не программист, поэтому всё пока коряво получается.
Спасибо, что посмотрел.

>>626334
Какое хорошее решение.
Всякие preg_replace_callback применяешь прямо вот так впервые? Так-то несложно вроде, но я бы вообще не додумался до такого.
Я пока оперирую только разложением до простейших шагов: отрезать часть строки, отрезать начальные буквы, поменять регистр у начальных букв, приклеить к предложениям и т.п. Что-то изящное пока неподвластно.
>>626340
Там у меня вроде всё нормально с этим.
#649 #626355
>>626347

>ОП сказал, что лучше сверху


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

>прямо вот так впервые


Ну нет, про preg_replace_callback() ОП подсказал, когда я граммарнаци делал (вообще долго с ней ковырялся). Теперь если что-то неочевидное надо сделать, ею пользуюсь, не знаю, хорошо это или нет.
Вообще признаюсь, опыт у меня кое-какой есть, потому и быстрее всё выходит.
#650 #626356
>>626254
Ок, я просто сяду вот тут и подожду ОПа.
#651 #626380
Если я делаю сайт используя MVC и допустим на разных страницах мне может приходить один и тот же GET или POST запрос (например авторизация, может быть на любой странице сайта), то есть в какой-то определенный контроллер я запихнуть обработку не могу. Где тогда лучше обрабатывать этот запрос?
#652 #626394
>>626380
Не должно быть такого.
Форма авторизации должна обрабатываться действием авторизации <form action="/login" method="post">
При успешной валидации редирект обратно на ту страницу, с которой был запрос. Если форма не прошла валидацию, подставить сообщение об ошибке и введенные пользователем данные в поля на странице авторизации.
https://github.com/codedokode/pasta/blob/master/forms.md
#653 #626402
>>626394
Спасибо, почему-то не додумался, что в action="" можно не только путь к конкретной странице указывать
#654 #626466
Делаю такой запрос.

SELECT name, comment, date, INET_NTOA(ip_address) FROM comments

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

{% for item in data %}
<tr>
<td>{{ item.name }}</td>
<td>{{ item.comment }}</td>
<td>{{ item.date }}</td>
<td>{{ ite.ip_address }}</td>
</tr>
{% endfor %}
#655 #626467
>>626031
Сделай экстремистский сайт, где вскрываются многомиллионные кражи из бюджета, попилы, дебильные указы чинушей, приводящие к разорению предприятий и страны, типа южного потока, заброшенные НЗП, военные преступления пидорах в чечне и украине. Посадят конечно, но зато какой проект.
#656 #626472
Весело хуярю html-теги через echo "<tag>";. Для разработки вообще никакого бугурта. В исходном коде все выведенное таким образом выглядит как одна очень длинная строка, что затрудняет отладку. Как сделать такие теги форматированными?
#657 #626483
>>626472
выпились
#658 #626515
Ладно, попробую вопрос попроще. Почему хтмлспешиалчарс возвращает > в оутпуте вместо тэгов.
#659 #626594
#660 #626597
>>625448
Две спасибушки тебе.
#661 #626617
>>626026
ОП? Почему ты не ответил на мой пост?
#662 #626619
>>626617
Твое время еще не пришло, анон. Жди смиренно.
#663 #626644
Не работает bindValue в PDO. Совсем никак. Потратил часа два в гугле, так и не нашел в чем проблема.
http://pastebin.com/kyyA8VQ9
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: :x' in /usr/share/nginx/html/student-list/app/Model/Model_StudentDataGateway.php:24 Stack trace: #0 /usr/share/nginx/html/student-list/app/Model/Model_StudentDataGateway.php(24): PDOStatement->bindValue(':x', 'Testvar', 2) #1 /usr/share/nginx/html/student-list/app/Controller/Controller_Form.php(34): Model_StudentDataGateway->add_student(Object(Model_Student)) #2 /usr/share/nginx/html/student-list/form.php(13): Controller_Form->process_post_request(Array) #3 {main} thrown in /usr/share/nginx/html/student-list/app/Model/Model_StudentDataGateway.php on line 24
#664 #626652
>>626644
А зачем плейсхолдер в кавычках?
#665 #626654
>>626652
Блять, не заметил. Спасибо.
1127 Кб, 320x240
#666 #626662
>>619873 (OP)
Ну что, опунь, я уже какое-то время учусь по твоим урокам, в кодинг уже какое-то время могу, но не в РНР, так что по мелочи не хотел тебя дёргать, но вот настала пора поинтересоваться, насколько грамотно с точки зрения эстетики, так сказать, написан код: http://ideone.com/n9iSCv
То есть, работает он отлично, но вот насколько принято писать вот так, не знаю.
#667 #626671
>>626662
Банк 1: после месячного взноса она уменьшается до -971.61787934484.
Зачем ты банку переплачиваешь? Остался должен 10 рублей. Плати 10 рублей, а не тысячу.
#668 #626683
Пропустил одну задачу, но вернулся и сделал.
http://ideone.com/Yjs5K9
Вопрос в том, стоит ли переделать её с использованием switch'а? Или пускай так и остается?
#669 #626690
>>626683
тебе бы хотя б elseif научиться использовать
3 Кб, 566x36
#670 #626692
>>626690
Руководствовался этим. Или я чего-то недопонимаю?
#671 #626693
>>626483
Охуительное решение, но оно мне не подходит. Что делать-то?
#672 #626696
>>626692
ты не правильно понял. Они не обязательны для существования конструкции в целом. Т.е. if достаточно. Но для компактной записи и вообще для торжества здравого смысла их надо использовать. Ну и плюс в задачах посложней без этого никуда
#673 #626704
>>626696
Про задачи посложнее я догадывался, а так - спасибо за разжевывание и критику, пойду переделаю.
#674 #626726
>>626662

>То есть, работает он отлично


Лол, абсолютно неверно всё считает...
#675 #626748
>>626662
Там у тебя в некоторых местах просто отнимается сумма, которую анон платит в месяц, не прибавляются проценты почему-то. Например, осталось выплатить 41000, а в другой месяц осталось выплатить 36000, такого типа.
Хотя в функции первой есть умножение на проценты, вот это всё.
Подход вообще не верен: там нужна переменная для общих выплат, а её не заметил у тебя. В минус не должно уходить: если после умножения на проценты и прибавления платы за обслуживание счёта остаётся меньше месячной выплаты - необходимо просто выплатить оставшуюся часть.
Также для обхода массива нужно использовать foreach, а не for, ОП пишет об этом на странице "Повторим?".
https://github.com/fxsloker/Student #676 #626817
#677 #626839
>>626472
Бамп вопросу. Просто нахуярить <?php ?> в html-код не выйдет, потому что у меня цикл под них.
#678 #626955
>>626839
Код вбрось.
#679 #626959
Как подключится к imap серверу imap.yandex.ru?
Нужно использование ssl. ssl://imap.yandex.ru не работает.
Интересует именно socket_extension.
fsockopen,stream_функции я знаю, но интересует именно то о чем выше писал.
#680 #626987
>>626472
>>626839
<?php
echo "<p>Больше быдлокода</p>", PHP_EOL;
echo "<h2>Богу быдлокода</h2>";
Надеюсь ОП меня за это не проклянет.
#681 #627012
>>626839
Цикл в хтмл тоже можно красиво запихнуть, типа
<?php foreach($arr as $key => $value):?>
htmlhtmlhtmlhtml
htmlhtmlhtmlhtml
<?php endforeach;?>
#682 #627075
>>626959
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($sock, "imap.yandex.ru", 993)
?
#683 #627154
>>627012
Сделал вот так.
>>626987
Где не получилось, дооформил.
#684 #627207
Как в jquery избавиться от "очереди" событий?
Например если сделать много кликов по элементу, то сработают все один за другим.
https://jsfiddle.net/3qz5n02q/
79 Кб, 604x453
39 Кб, 368x420
#685 #627265
Йода говорит: ideone.com/ipQ2yB

>PHP Notice: Undefined offset: 1 in /home/U8hptw/prog.php on line 12


>PHP Notice: Undefined offset: 1 in /home/U8hptw/prog.php on line 13


Сейчас не соображу, в чём там дело. Тешу себя мыслью, что соображу завтра.
Вроде бы всё у меня там работает и выглядит простым, как табуретка.
Гибкости не хватает мне, в следующий раз попробую совладать с call_back функцией, что ли, позавидовал простому и краткому решению братишки выше.
160 Кб, 466x243
#687 #627357
>>627265
У кого-то горит жёпа от Путина.
#688 #627384
>>627265
Лол, а я думал это реально путен в адидасе и пиджаке, даже не гуглил толком.
#689 #627411
>>627265
>>627266
Так и не разобрался, почему там вылезала ошибка. Наверное, передавать из одной функции в другую массив и там из неё сразу доставать значение ($array[n]) не считается правильным.
Также ОП говорит, что вообще неправильно массив раскладывать через for.
Сделал разложение массивов в обеих функциях через foreach - всё теперь без ошибки.

>>627357
Не политоты ради. Просто столкнулся с тем, что эту поделку в Photoshop'е считают реальностью - на полном серьёзе.

>>627384
Оригинал не находится в поиске по картинкам, когда ищешь по какой-нибудь фразе, вылезают только различные варианты подделки.
#690 #627490
Задача про "лиличку". Нихуя не понимаю, в подсказке идёт "разбить текст по символу \n", но сам текст дан в таком формате, что там нет \n и по нему нельзя разбить. Разбить по \n можно только в случае, если он прописан в самой строке. А там просто энтером отбито. Перепробовал все варианты. Так что же, вручную менять само стихотворение и добавлять \n?
#691 #627492
>>627490
уже рахобрался. Надо либо по \r\n (хз почему), либо PHP_EOL
#692 #627500
https://gist.github.com/codedokode/420c8c12a1edae25f0ec

>Пайп (вертикальная черта) позволяет перенаправить выход одной программы на вход другой. Программа ls выводит список файлов в каталоге. Программа head -10 читает строки с клавиатуры и выводит только первые 10 из них. Вот, как можно вывести имена первых 10 файлов:


>


>ls | head -10


>Пайп (вертикальная черта) позволяет перенаправить выход одной программы на вход другой.


А что за Пайп? Может кто-нибудь объяснить на примере как это работает? Я что смогу брать данные, например, из браузера и делать с ними что захочу в другой программе? Как это работает? Я не понимаю.
А причем тут ls и head?
#693 #627520
>>627500
Все понял.
#694 #627525
команда 2>&1 > file.txt
А почему синтаксис такой странный? Почему не 2> & 1> file.txt или 2&1 > file.txt? Так же понятней!
#695 #627567
>>627490
Про какую лиличку еще?
#696 #627576
>>627567
Аа, увидел и испугался этих задачек, аж ладошки вспотели.
А где предыдущие, почему не по порядку идёшь?
#697 #627581
>>625456
Я, например, даже когда научусь всему буду продолжать иногда заходить в клуб любителей php и помогать анонам, если буду знать как. Подозреваю, что здесь много таких же как я.
#698 #627584
>>627581

>Я, например, даже когда научусь


А как ты поймешь, что научился? Когда наступает этот сокровенный момент? Тебе приходит письмо из хогвартса или что?
#699 #627591
>>627584
Бывает открываешь код анона и становится смешно, и ты сразу понимаешь как правильно сделать. Вот это уже показатель того, что ты можешь поправить анона и дать ему совет.
#700 #627592
Друзья, а вы уже обсуждали квантовый компьютер от гугла и наса? https://www.youtube.com/watch?v=CMdHDHEuOUE
Это же такие перспективы! Такие как __мгновенная__ передача информации на n ≤ ∞
#701 #627595
>>627584
Думаю, когда сделаю задачу на файлообменник на slim'е
#702 #627597
>>627595
А сейчас ты что делаешь?
#703 #627600
>>627597
Задачу на студентов, а ты?
Пока ОПа нету, сижу читаю про линукс и верстку - настроение просто отличное от того, что я это понимаю и занимаюсь этим. Программирование это жизнь, это сила, это победа человеческого разума над законами природы!
#704 #627602
>>627600
Тоже задачу на студентов.
Вот моя: https://github.com/fxsloker/Student
Покажи свою.
#705 #627603
>>627600
Ну я кстати как раз на линупсах сижу, и работаю по большей части версталой.
#706 #627607
>>627602
А я уже подсматривал в твой гитхаб

>$router->run();


Мне тоже так предстоит делать или это какой-то особенный подход?

https://github.com/someApprentice/Students
#707 #627608
>>627607
У меня есть роутер, у тебя нет. В этом задании он не обязателен, просто мне интересно еще и роутер пилить. И все приложение у меня с него как раз и начинается, я так понял это паттерн FrontController. Хотя не уверен. Жду ответа ОПа и дизайн пилю пока для списка и формы.

Я в общем-то уже знаю как по-быстрому сделать эту задачу. Но я постоянно ковыряюсь, потому что хочу сделать не быстро, а правильно.
#708 #627610
>>627607
Кстати я гуглил разные mvc приложения на php. Часто делается так, $app->run(); и поехало. Ну я так сразу к роутеру обратился.
#709 #627611
>>627608

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


Я тоже уже примерно представляю как она делается, думаю сделаю быстро - мне главное понять принцип работы а дальше нужно просто выразить это в коде.
#710 #627612
>>627610

>Часто делается так, $app->run();


Я видел в слиме так делают еще
#711 #627621
>>627576
да я по порядку иду, сделал почти все и в треде выкладывал, пропустил 1 только, вроде, т.к. лень было
#712 #627628
>>627607
У тебя есть LoginController.php, то есть ты будешь делать форму входа? По заданию вроде просто после регистрации сохранять в куках юзера.
#713 #627637
>>627628

>У тебя есть LoginController.php, то есть ты будешь делать форму входа? По заданию вроде просто после регистрации сохранять в куках юзера.


Почему бы и нет?
#714 #627644
>>627637
Ну в принципе да, может тоже запилить. Еще я не увидел у тебя полей sex, gender, firstname, surname и т.д. Их не будет?
#715 #627647
>>627644
Будут, сейчас ОП проверит меня и буду допиливать.
#716 #627655
>>627581
Я так и делаю сам со своими месячными познаниями: разбираю код новичков. Те задачи, которые сам уже решил.
#717 #627732
>>627602
Объясните на пальцах, как гитхабом пользоваться?
#718 #627734
>>627600
Какой лвл?
300 Кб, 853x480
#719 #627737
Я знаю Джава Скрипт!
#720 #627755
>>627732
Что именно непонятно?
Качаешь пак с файлами, запускаешь на локалке или хостинге.
Пока не дошёл до БД и прочего - это сложно.
#721 #627757
>>627737
А он знает тебя?
#722 #627760
>>627755
я пока только задачи для перехода на второй лвл доделываю. Да вообще непонятно, что за файлы, как качать и как запускать. Пишу на phpstorm
#723 #627766
>>627760
Скоро дойдёшь, значит, и сам.
Надо локальный сервер установить, базы данных, всё это запустить, архив сайта с Гитхаба распаковать, запустить index.php, создать соединение с БД.
Либо сразу установить Денвер, там всё необходимое уже есть.
#724 #627775
>>627766
А если расшарить файлы, создать ветку, то по-другому.
#725 #627807
>>627734
А какая разница?
#726 #627809
>>627807
Да просто интересно, какой люд тут обитает со мной вместе и бьётся над задачками
#727 #627816
>>627809
А мне всегда интересно, изучал ли человек программирование прежде, когда припекает от лёгкости решения задач у многих. Сам я бьюсь над задачами уровня клавиши Shift или речи Йоды по нескольку часов.
Благодаря постоянному чтению учебника ОПа, сразу по стилю решения задачи многое становится понятно об общих познаниях человека.
Жаль, что некоторые задорно проходят первые задачки, а потом пропадают.
Куда делся, спрашивается, Олег, где Onyx, которые вроде отлично шли с самого начала.
#728 #627819
>>627816

>Олег, где Onyx


Потише, братишка, в этой ситуации, ты на АИБ сидишь или в убтном чятике? Какие Олег, какой Оникс? Оглянись вокруг, мы вдвоём. Ты да я
1120 Кб, 1799x1199
#729 #627823
ОП, посмотри, пожалуйста. Задача про Лиличку.

В phpstorm работает идеально, но ideone отказывается показывать правильно. Не знаю в чём причина.
попробуй в шторме. работает же!!

http://ideone.com/oZMTZp
#730 #627836
>>627809
Ты не должен оценивать людей по их возрасту
#731 #627837
>>627836
дело в том, что я старый и знание, что я не один такой тут меня греет. вот и всё
#732 #627845
Кто-нибудь читает доп литературу по PHP? В ОП-посте есть несколько книг, но они все 2006 года максимум. Какие книжки можно почитать для вникания?
#733 #627847
>>627837
Тебя будет греть сильнее денюжки которые ты будешь зарабатывать на программировании
#734 #627848
>>627847
мало тепла не бывает
#735 #627849
>>627848
т.е. много, лол, проебался
#736 #627861
>>627845
Зандстра из шапки и все. Книг по php нормальных нет. Смирись.
109 Кб, 910x512
#737 #627877
>>627837

>старый


>меньше 30

#738 #627878
>>627877
Тут вроде есть анон, которому 32.
#739 #627886
>>627837
Мне твенти сикс.
#740 #627897
>>627878
Вэт ваз ми, раз уж мы по-английски.
#741 #627925
Ебать я тупой стал, 25 лет ума нет, как можно было эту задач легко решить? я сделал через эпические костыли, но решение должно быть на поверхности.
http://ideone.com/ahVN35
#742 #627974
>>627525

2>&1 значит перенаправить данные, из потока №2 (поток ошибок stderr) в поток №1 (поток вывода stdout)

> значит перенаправить stdout в файл



Таким образом и stderr и stdout перенаправлены в один и тот же файл.

Погугли по этим словам.

> 2> & 1> file.txt


и что это должно значить?

> 2&1 > file.txt


и это?

Вообще, синтаксис такой по историческим причинам, написаны миллионы скриптов и никто их уже не переделает.
#743 #627975
>>627823

> explode("\r\n", $text);


Лучше разбивать по символу перевода строки \n (Enter как раз вставляет в текст \n или \r\n в зависимости от настроек редактора и способа перевода строк)

На ideone скорее всего перевод строки вставляется как просто \n а не \r\n отсюда и баги.

Скачивание phpstorm (что я не могу сделать, это надо много времени) вряд ли поможет.
#744 #627985
>>627592
Какое отношение научная фантастика имеет к PHP? Сука, козёл.
#745 #627996
Делаю тут задачу про список студентов, сделал все кроме поиска, не могу понять как реализовать поиск с джоинами в базе. В документе написано

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


Что это значит? Как их соединить? Или может забить хуй и сделать поиск через OR?
#746 #627999
>>627996
Попробовал сделать так
SELECT * FROM student_list JOIN(SELECT id, name || surname concatenated FROM student_list) T ON T.Id = student_list.id WHERE t.concatenated LIKE :pattern_bind ORDER BY student_list.id ASC LIMIT 15 OFFSET :offset_bind
ищет только по первому параметру после id (в моем случае это name)
#747 #628000
>>627925
Бро, задача решена неверно.
1. В итоге переменная $paymentTotal должна быть 61270 со многими копейками.
2. Функция intval не нужна, без неё можно обойтись, лучше посчитать со всеми копейками.
3. $creditBalance = ( $creditBalance * $percent ) + $servicePayment - $monthlyPayment; - повторяется в разных местах, а это значит, что может быть вынесено за пределы if с else.
4. Всегда первым делом надо к остатку прибавлять процент и 1000 за обслуживание кредита, после этого проверять, меньше или больше сумма $monthlyPayment.
#748 #628006
>>627999
Можно создать поле с ключами, куда заносятся через пробел значения остальных полей, например "Ваня Ерохин А56 Москва 1990 муж", и делать поиск по ней. Это как вариант, ОП может не одобрить. А есть ещё составные индексы.
#749 #628007
Как сделать лайки, как вконтакте? Чтобы по айпи запоминался проставленный лай и второй раз с того же айпи его не поставить. Понимаю только как сделать его динамическим через json, а вот как с одного айпи только сделать?
#750 #628010
>>628007
А в контакте не с айпи, там аккаунт может один раз лайкнуть.
#751 #628011
>>627999
Я нагуглил, полнотекстовый поиск называется. Используется примерно так match (index) against (search_string)
#752 #628013
>>628011
Index - полнотекстовый индекс
#753 #628014
>>628011
А если индексов несколько? Там же вся суть в том, чтобы искать во всей таблице.
#754 #628019
>>628007
Наверное, $_SERVER['REMOTE_ADDR'], при этом сохранять инфу об айпи и лайкнувшем, а дальше условия, чтобы не повторялся или айпи, или сам лайкнувший, если он залогинен.
#755 #628021
>>628014
А в нашем случае зачем несколько? У нас один поиск по все полям таблицы. Лучше ОПа дождаться.
#756 #628026
>>628014
Кстати а если CONCAT() использовать?
56 Кб, 524x700
#757 #628030
Забавно наблюдать, как тают fork'и у задач ОПа на Ideone - чем дальше по задачам, тем меньше форков.
#758 #628051
>>628030
Тоже заметил. Значит, у тех, кто дойдёт до конца, всё меньше и меньше конкуренции.
#759 #628060
>>628000
спасибо. добра
#760 #628094
>>628030
>>628051
Правда, но только отчасти. К этому времени я, например, скачал себе IDE, с которой удобно работать и просто копировал код опа
#761 #628096
>>628094
К этому времени - имею в виду к более сложным задачам
#762 #628097
>>628094
чем пользуешься? Я поставил NetBeans, но что-то не очень нравится.
#763 #628102
>>627996
С какими еще джоинами? У тебя там больше одной таблицы?
#764 #628109
>>628019
Каждому лайку таблицу с айпи лайкнувших что ли создавать и по ней проверять есть ли лайк у айпи к такойто записи?
#765 #628112
>>628109
Я долго размышлял над этой проблемой и решил, что понадобится как минимум три таблицы. Первая это сами публикации или что там у тебя лайкают, второе - таблица айпишников и третье - таблица лайков.
#766 #628115
>>628097
Штормом, всё пока нравится.
#767 #628119
>>628115
>>628112
А как же таблица с инфой о залогиненных?
Ещё желательна фича: лайк присваивается человеку, если он лайкнул незалогиненным, а потом в этой же сессии залогинился.
#768 #628121
>>628115
Случайно процитировал.
#769 #628124
>>628119
Я сказал минимум 3, можно и больше, а вот меньшим количеством таблиц не обойтись.
#770 #628125
>>628097
>>628115
Я тут попробовал с Дримвивером и Денвером - нещадно жрёт ресурсы ноутбука, не хотет.
Я пока на Идеоне, хотя там не особо удобно всё становится, когда код разрастается.
#771 #628148
>>627592

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

Для тех кто не знает - там примерно такая идея: вместо обычных битов которые принимают значение либо 0 либо 1, мы используем кубиты которые могут быть одновременно в 2 состояниях.Например 8 обычных битов могут быть в одной из 256 комбинаций, а вот 8 кубитов могут быть в этих 256 комбинациях одновременно. И соответственно мы можем делать какие-то операции надо ними всеми одновременно. Условно говоря, если есть задача найти пароль, хеш от которого равен x, то обычный компьютер может лишь перебирать пароли по одному, проверяя не имеет ли он нужный хеш. А квантовый может перебирать все возможные пароли одновременно, вычисляя все их хеши одновременно. По крайней мере это я так понимаю.

Ну это пока больше в теории существует. В реальности чтобы манипулировать кубитами нужны большие сложные установки, вакуум, температуры в районе абсолютного нуля (-273 градуса), кубитов там от силы несколько, чуть что все это сложное состояние разрушается. И ни одного пароля пока на квантовом компьютере не взломано.
#772 #628153
>>627996

Либо

WHERE name LIKE ... OR surname LIKE ...

либо

WHERE CONCAT(name, ' ', surname, ' '...) LIKE ...

Преимущества и недостатки способов попробй понять сам. Полнотекстовый поиск может и не подойдет так как он рассчитан на поиск по целым словам а не по кускам слов.
#773 #628158
>>627999

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

>>628006

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

>>628011

Может не помочь так как он рассчитан на поиск по словам а не фильтрацию по части слова.

>>628030

О, интересно, а я и не подумал что можно смотреть число форков. Там идеон еще раньше показывал последние программы на определенный язык - и наших было довольно много.
#774 #628187
>>628000
короче та же задача но уже с функциями http://ideone.com/WCiRRb
почему то не работает сложение int и float в строке
f ($dolg<$deposite){
\t$pereplata=$pereplata + $dolg;
\tbreak;\t
\t}

чтобы прибавить остаток к выплате и закончить выполнения цикла, в предыдущий разя я делал через фукнцию intval тоесть таким образом из флоат в инт перевел.
#775 #628193
>>628187
а епта понял свою ошибку, исправил http://ideone.com/WCiRRb , но бля какие то цифры странные мне кажется программа работает некорректно, потому что не выполняется последний шаг, ведь если остается допустим 3000 рублей заплатить, мы же ее не выплачиваем в этот месяц, а ждем следущего, и платим с коммисией вся хуйня
#776 #628254
>>628187>>628193
Бро, опять же неправильно считает, я же говорю, какая там цифра в том банке должна получиться: 61270 с копейками. Там как раз для проверки второй банк точно такие же параметры имеет, как в задаче на кредит за Айфон.
Не пойму, для чего так усложнять с float, с этой плавающей точкой?
Там же абсолютно простой алгоритм:
1. Имеем сумму кредита.
2. Умножаем её на 0.0n (сразу прибавляем таким образом процент к сумме кредита) и прибавляем комиссию за обслуживание кредита.
3. Проверяем, получившаяся сумма больше или меньше 5000, которые может выплачивать Анончик в месяц.
4. В соответствии с результатом проверки или продолжаем цикл выплат, или выплачиваем имеющуюся сумму (не забывай, что она у нас уже должна быть умножена на процент и к ней должна быть уже прибавлена комиссия за обслуживание кредита).
Всё.
Ещё замечание: лучше переводить названия переменных, а не писать транслитом.
Я не ОП, он пояснит теперь не скоро, наверное, я вообще недавно начал изучать РНР и возился с задачей на кредит Айфона несколько дней, зато потом сократил до нескольких строк её, изучил нормально работу циклов на ней.
С плавающими точками пока не работал и, честно говоря, не совсем понимаю, для чего она там.
#777 #628255
>>628254
*кредит на Айфон
Также усложнения с плавающей точкой особого нет, просто она там абсолютно ни к чему.
#778 #628267
>>628254
>>628255
ты можешь просто код исправить http://ideone.com/WCiRRb , или свой прислать как должно быть я не понимаю.
#779 #628279
Надо сделать одну работу с API Гугл Аналитикс, для этого подключаю вот эту библиотеку https://github.com/google/google-api-php-client#installation но не могу подключить, если скачиваю полный пакет и подключаю его таким образом:
require_once 'google-api-php-client/src/Google/autoload.php';
Получается такая ошибка:
Fatal error: Uncaught exception 'Exception' with message 'This library must be installed via composer or by downloading the full package. See the instructions at https://github.com/google/google-api-php-client#installation.' in C:\OpenServer\domains\zorge\otc\google-api-php-client-master\src\Google\autoload.php:14 Stack trace: #0 C:\OpenServer\domains\zorge\otc\index.php(2): require_once() #1 {main} thrown in C:\OpenServer\domains\zorge\otc\google-api-php-client-master\src\Google\autoload.php on line 14
#780 #628281
ОП, делаю твои задачи на ЖС, застрял на роботе на шестой задаче. Почему мое решение неправильное? Я не так понял условия?
https://jsfiddle.net/kkpjnqc1/2/
#781 #628282
>>628255
>>628254
переделал как ты сказал,
http://ideone.com/WCiRRb
все равно получается сумма 60260.891466803
#782 #628283
>>628279
Ну а ты композером ставил, или просто скачал и распаковал репозитарий?
#783 #628286
>>628282
а все теперь точно исправил получилось
56423.563121625
61268.718210807
51029.365496746,
короче спасибо за помощь, пиздец я долбоеб, ЗАТО АЙТИ ВЫШКА ЕСТЬ.
#784 #628289
>>628267
Лучше сам попробуй разобраться, это стоит того, я гарантирую.
>>628282
Бро, я не пойму обозначения у переменных. Почему месячная выплата называется $deposit?
Сейчас с телефона, тогда чуть позже.

>for($dolg;$dolg>=0;$month++)


Вот тут уже не вполне верно всё, там лучше из количества месяцев исходить, а не из общей суммы, потому что она не известна. Месяцы нам тоже не известны, но можно поставить хоть 100 - не суть важно.
#785 #628290
>>628286
Аа, ну тогда молодца!
#786 #628291
>>628279
Ты неправильно его подключаешь. Там же написано в инструкции как это правильно делать
#787 #628299
>>628286
Много лишнего кода, ОП не одобряет такое.
Там можно повторяющиеся части вынести из if и else.
А с привязкой цикла к $dolg > 0 - шикарная идея! А я и не понял сразу.
Теперь пропала зависимость от непонятного и с потолка взятого числа 20 месяцев.
Отличная находка, поздравляю себя, кому ещё это интересно
ОП вроде тоже говорил об ограничении цикла годами жизни, или я что-то путаю. Тоже не подсказал такого почему-то.
#788 #628304
>>628283
Скачал и распаковал, там кажется написано что так можно, если качаешь всю папку.
#789 #628305
>>628291
Мне сложно разобрать как это делается, можешь подсказать?
#790 #628309
>>628305
Ну посмотри, ты же делаешь require_once файла которого не существует. Autoload.php находится в папке vendor
#791 #628311
>>628309
В самих скачанных файлах есть autoload.php по тому адресу который я подключаю. И во всех примерах что находил в гугле, подключают именно так.
#792 #628316
>>628299

>Там можно повторяющиеся части вынести из if и else.


атвичаю нельзя это вынести, я уже 2 дня думаю как это сделать хз.
вышка-кун.
#793 #628328
>>628316
Если два дня, то вот: http://ideone.com/YfN1KR
Мы делаем общую переменную перед условиями с if и else, а далее её подставляем в условия.

А какая специальность, что именно изучал?
#794 #628329
>>628309
И даже вот здесь, используется такой пример https://developers.google.com/analytics/devguides/reporting/core/v3/quickstart/service-php?hl=ru
#795 #628393
пацаны, насколько важна вышка? Можно ли будет устроиться на работу, без вышки?
#796 #628431
>>628393
Вышка в постсовке настолько обесценилась, что всем похуй если скиллы есть. А вот для перевоза жопы в золотой миллиард, нужен диплом приличного места.
#797 #628490
Я что то не понимаю, хочу использовать composer, делаю всё как здесь http://open-server.ru/docs/#rabota-s-composer
Ввожу в командной строке путь к проекты C:\OpenServer\domains\mysite\>composer init
мне пишет """"""" не является внутренней или внешней командной и т.д.
#798 #628516
>>628490
В переменной PATH прописать путь к композеру.
#799 #628521
Написал адаптер для класса генератора превью, чтобы попрактиковать ооп. Правильно сделал?
https://github.com/nsdvw/PreviewGenerator

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

Опо-замечания приветствуются.
#800 #628558
>>628328
ну по сути в моем коде нет двух абсолютно повторяющихся строк, но твой чутка покороче да.

изучал МАТЕМАТИЧЕСКОЕ ОБЕСПЕЧЕНИЕ И АДМИНИСТРИРОВАНИЕ ИНФОРМАЦИОННЫХ СИСТЕМ. на первом курсе даже хуярили одновременно задачи на бейсике и на паскале. ЧТО БЫ КОД ЛУЧШИ ПОНЯТЬ. потом всякие с++, с#, ПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕ, ДАЖЕ ЛИСП был ебать ИСКУСТВЕННЫЙ ИНТЕЛЕКТ. ну все по чуть чуть, тонны матана, геометрии, УРАВНЕНИЯ МАТ ФИЗИКИ, ну в итоге нихуя ни кто ни чего не научился, из 50 человек, человек 5 работают в айти, в том числе и я, эникейщик в хелп деске, получаю 30, рядом сидят 1с получающие по 70-80, меня жопа в клочьях, решил перекатвыаться в кодинг. пока с натягом если честно.
#801 #628604
>>628558
Там одни и те же вычисления два раза повторяются, это имел в виду.
РНР вроде верный выбор в этом случае, потом должно быть проще перекидываться на другие языки. Сам надеюсь, что мне потом будет проще изучить уже JS для фронт-энда.
#802 #628635
Короче, лайки реализуются через сессии, аякс/json запросы. Так-то, шкальники. Продолжайте сидеть в своих регулярках и плодить таблицы.
#803 #628636
>>628635
И что, таблицы-то все равно нужны, долбоёбина. Причем тут json/аякс вообще? Это лишь способ добавления лайка в таблицу.
#804 #628651
>>628636
Лайк!
1019 Кб, 1199x1799
#805 #628704
ОП, не знаю, как скоро ты будешь, но вот решение на Чай с тортиком.
Буду ждать комментарий!

http://ideone.com/NmOdH8
#806 #628709
Регулярные выражение 1 задача, проверка номер телефона, не смог найти как сделать допущение о том что (скобка, пробел, минус) могут присутствовать а могут и быть в строке, поэтому сделал через такие эпические костыли.
http://ideone.com/6tiLc8
#807 #628710
Пытаюсь поставить через composer библиотеку с АПИ гугл аналитикс https://github.com/google/google-api-php-client, делаю всё как в документации, мне выводит следующую ошибку:
your requirements could not be resolved to an installable set of packages
Это значит в моём композере чего-то не хватает? Каких-то настроек?
#808 #628727
>>628636
Одна таблица нужна, а ты бы три наплодил, говношкальник ебаный. задачку решил уже?
#809 #628730
>>628709
http://ideone.com/S7ja4y - не воспринимает номер.

>([ ]|[-]|[(])


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

Вот паста ОПа, как минимум, все эти номера должно проверять верно:
----------

Задачу про номера телефонов надо проверить на большом числе телефонов, чтобы убедиться что твой код правильный. Но руками подставлять номера — долго и скучно. Пусть работает робот, а не человек!

Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 2 списка номеров (правильные и нет), добавь их в программу и напиши цикл, который их по очереди прогоняет через регулярку и проверяет что они определяются как надо (если нет — надо вывести какой именно номер не распознается правильно).

Вот список номеров:

Правильные: array('84951234567', '+74951234567', '8-495-1-234-567', ' 8 (8122) 56-56-56', '8-911-1234567', '8 (911) 12 345 67', '8-911 12 345 67', '8 (911) - 123 - 45 - 67', '+ 7 999 123 4567', '8 ( 999 ) 1234567', '8 999 123 4567');

Неправильные: array('02', '84951234567 позвать люсю', '849512345', '849512345678',
'8 (409) 123-123-123', '7900123467', '5005005001', '8888-8888-88',
'84951a234567', '8495123456a',
'+1 234 5678901', // неверный код страны
'+8 234 5678901', // либо 8 либо +7
'7 234 5678901' // нет +
);
#810 #628731
>>628704
с хуертиком, анус себе дернул уже мразота?
#811 #628732
>>628727
Ну давай сюда структуру такой таблицы, нешкольник.
#812 #628733
>>628730
ахаха тупой шкальник решает регулярку, спешите видеть.
#813 #628734
>>628732
ОП тебе на ротан давать будет, школомразь тупая.
#814 #628737
>>628734
Слив защитан, опущенец.
инб4: слил тебе на ротеш
#815 #628739
>>628558
ахаах бля, долбоеб с вышкой обученный как макака крестам и прочее функциональнищине не может веб и регулярки, вот это потеха.
128 Кб, 722x629
#816 #628741
>>628709

>как сделать допущение о том что (скобка, пробел, минус) могут присутствовать а могут и быть в строке


Для этого есть один из символов на скриншоте.
Почаще смотри на эту страницу в учебнике ОПа во время решения задач.
#817 #628742
>>628733

Обзывать окружающих школьниками лучше где-нибудь в /b

>>628732

С такой манерой общаться ты ответа вряд ли дождешься.
#818 #628744
Не знаю где спросить, спрошу в любимом треде :3

Анон, если ты юзал Vagrant, чем он лучше обычного VirtualBox'a с установленой руками ОС и веб сервером например nginx php-fpm? Есть какие-то профиты для сингл разработчика или нинужно?
#819 #628750
>>628744

Это на замена виртуалбоксу. Это система конфигурирования виртуалбокса. Там в конфиге можно прописать все нужные настройки виртуальной машины + установить какие-то программы (еслиречь о линуксе).

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

Альтернатива - распространять образ жесткого диска для вирт машины, но это менее удобно: образ тяжелый, ты не можешь в нем что-то поменять итд.
#820 #628751
>>628750

Там еще докер есть, он отличается от вагранта, но я наверно сейчас не смогу подробно расписать чем именно.
#821 #628756
>>626817
http://pastebin.com/ufnVLanq
ОП, в дополнение к этому еще бы хотел задать вопрос. Я как понимаю форма будет в action иметь значение "/". Значит мой роутер должен понимать гет у меня или пост и вызывать соответствующий контроллер и метод?

Вообще я хочу переписать свой роутер и сделать как у фреймворков. Где нибудь в index.php прописать все роуты моего приложения:

return array(
'/' => '/base/index',
....
);

Ну или как там делается:

$router = new Router();

$router->add('GET', array('/' => '/base/index'));

Или мне это нафиг не нужно и я все усложняю?
#822 #628757
>>628750
т.е. вот для меня как сингл разработчика не стоит игра свечь и можно дальше продолжать пользовать настроенную ВБ машину?
#823 #628760
>>628756

> Я как понимаю форма будет в action иметь значение "/".


Почему? Обычно ПОСТ обработчик формы располагается по тому же URL что и ГЕТ, например /register. Ты читал урок про формы?

> Значит мой роутер должен понимать гет у меня или пост и вызывать соответствующий контроллер и метод?


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

> Где нибудь в index.php прописать все роуты моего приложения:


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

> Или мне это нафиг не нужно и я все усложняю?


можно попробоавть если хочешь.
#824 #628761
>>628757

Да, это инструмент не для тебя. Хотя возможно тебе бы он пригодился если тебе например периодически приходится создавать ВМ например для тестирования.
#825 #628763
>>628761
Спасибо, анон.
На досуге может быть поиграюсь.
#826 #628764
>>628757
Я не он, но пользуюсь вагрантом поверх виртуалбокса. Сильно упрощает жизнь. Он может почти моментально поднимать машины из скрипта. После того, как вырубили свет и у меня приказал долго жить мой няшный дебиан я перешел на вагрант.
#827 #628765
>>628760
ОП, если что по ссылке на пастебин у меня тоже вопросы. На случай, если ты подумал, что там только твои ответы.
#828 #628770
Кстати, у меня жутко тормозит убунта на виртуалке. Чому?
#829 #628771
>>628741
блеванул с фронтенда.
250 Кб, 1920x1080
#830 #628775
Я-таки сделал первые четыре задачи
w1: https://ideone.com/sgIZfu
w2: https://ideone.com/DBu62z
w3: https://ideone.com/7hEeAu
w4: https://ideone.com/rdAHwD
#831 #628776
>>628770
С иксами?
#832 #628777
>>628756

>\tЯ все равно не понимаю. Вот есть у меня в контроллере addAction, он создает модель студента и запускает ее метод add, а там вызывается метод класса работы с БД тот же add? Или как? Мне не нравится это дублирование. И я не знаю других способов. Давай вот на этом моменте подробнее остановимся.



Неверно.

- у тебя скорее будет не метод addAction, а метод вроде registerAction. При ГЕТ запросе он выводит форму, при ПОСТ обрабатывает (читал урок про формы? задай вопросы если непонятно)

> он создает модель студента и запускает ее метод add


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

> а там вызывается метод класса работы с БД тот же add?


Он вызывается из контроллера:

$studentGateway->insert($student);

> Мне не нравится это дублирование.


Интуиция тебя не подвела, это действительно неправильно.

> А еще про 404 ошибку, думаю надо отдельный файл шаблона создать, и чтобы роутер вызывал метод indexAction в контроллере с аргументом '404' например. Верно?


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

https://github.com/fxsloker/Student/tree/master/vendor - папку вендор надо убрать из репозитория и добавить в гитигнор, зачем она? В репозитории должен быть в первую очередь твой код а не сторонний. Скачивающий запустит композер инсталл.

https://github.com/fxsloker/Student/blob/master/public/index.php#L12

> error_reporting(0);


Объясни зачем? Зачем ты включаешь игнорирование любых видов ошибок?

> https://github.com/fxsloker/Student/blob/master/app/students.sql#L33


> `sex` enum('0','1') NOT NULL,


не используй цифры в енумах, http://www.mysql.ru/docs/man/ENUM.html

mysql воспринимает числа как номер элемента и это ведет к трудноотлаживаемым багам.

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



> CREATE TABLE IF NOT EXISTS


чуть надежнее делать DROP + CREATE или только CREATE так ка кв базе может быть не та таблица что надо.

> FrontController это тот же роутер что ли? Он вызывает нужный контроллер и экшен. Значит мой роутер уже FrontController?


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

https://github.com/fxsloker/Student/blob/master/app/bootstrap.php#L13
строки длиннее 80 символов надо переносить как описано в PSR

> set_error_handler("exception_error_handler");


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

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


ну ок можешь сделать как хочешь

https://github.com/fxsloker/Student/blob/master/app/Router.php#L17

> strtolower($controllerName)


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

В режиме отладки полезно на странице 404 писать причину ошибки чтобы упростить себе же жизнь. Это не обязательно делать. ТАкже надо сделать отлов непойманных исключений и вывод страницы-заглушки со всеми нужными ХТТП заголовками.
#832 #628777
>>628756

>\tЯ все равно не понимаю. Вот есть у меня в контроллере addAction, он создает модель студента и запускает ее метод add, а там вызывается метод класса работы с БД тот же add? Или как? Мне не нравится это дублирование. И я не знаю других способов. Давай вот на этом моменте подробнее остановимся.



Неверно.

- у тебя скорее будет не метод addAction, а метод вроде registerAction. При ГЕТ запросе он выводит форму, при ПОСТ обрабатывает (читал урок про формы? задай вопросы если непонятно)

> он создает модель студента и запускает ее метод add


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

> а там вызывается метод класса работы с БД тот же add?


Он вызывается из контроллера:

$studentGateway->insert($student);

> Мне не нравится это дублирование.


Интуиция тебя не подвела, это действительно неправильно.

> А еще про 404 ошибку, думаю надо отдельный файл шаблона создать, и чтобы роутер вызывал метод indexAction в контроллере с аргументом '404' например. Верно?


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

https://github.com/fxsloker/Student/tree/master/vendor - папку вендор надо убрать из репозитория и добавить в гитигнор, зачем она? В репозитории должен быть в первую очередь твой код а не сторонний. Скачивающий запустит композер инсталл.

https://github.com/fxsloker/Student/blob/master/public/index.php#L12

> error_reporting(0);


Объясни зачем? Зачем ты включаешь игнорирование любых видов ошибок?

> https://github.com/fxsloker/Student/blob/master/app/students.sql#L33


> `sex` enum('0','1') NOT NULL,


не используй цифры в енумах, http://www.mysql.ru/docs/man/ENUM.html

mysql воспринимает числа как номер элемента и это ведет к трудноотлаживаемым багам.

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



> CREATE TABLE IF NOT EXISTS


чуть надежнее делать DROP + CREATE или только CREATE так ка кв базе может быть не та таблица что надо.

> FrontController это тот же роутер что ли? Он вызывает нужный контроллер и экшен. Значит мой роутер уже FrontController?


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

https://github.com/fxsloker/Student/blob/master/app/bootstrap.php#L13
строки длиннее 80 символов надо переносить как описано в PSR

> set_error_handler("exception_error_handler");


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

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


ну ок можешь сделать как хочешь

https://github.com/fxsloker/Student/blob/master/app/Router.php#L17

> strtolower($controllerName)


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

В режиме отладки полезно на странице 404 писать причину ошибки чтобы упростить себе же жизнь. Это не обязательно делать. ТАкже надо сделать отлов непойманных исключений и вывод страницы-заглушки со всеми нужными ХТТП заголовками.
#833 #628782
>>628756

> $_view;


зачем подчеркивание? так в php4 писали когда не было private/public.
#834 #628800
Сделал вот за минуту, вообще танцую.
http://ideone.com/M9c7wg
Советы/критика?
#835 #628803
>>628800
Лол, салага. Там же пару ерундовин прописать в ОПовском коде, какие советы-критика? Всё там у тебя верно, конечно же.
Я когда эти задачки начал в середине декабря решать, был уверен, что дойду до ООП к Новому году.
Сейчас думаю, дойти бы до ООП к началу-середине марта.
#836 #628807
>>628803
Просто до этого мне приходилось подумать над всякими там кредитными калькуляторами, а так да, очень просто когда-нибудь я дойду до ооп... когда-нибудь
#837 #628812
>>628807
За пять минут поигрался сейчас: http://ideone.com/eAd4Ye

Дойдём до ООП и перейдём, я базарю и гарантирую.
10 Кб, 387x447
#838 #628854
>>628812
determination
#839 #628906
>>627974

>Перенаправить и вывод, и ошибки в файл можно так:


>команда 2>&1 > file.txt


>и вывод, и ошибки


>&


В моем представлении символ > означает перенаправление, а символ & - логическое "и", пробел, опять же повторяюсь, в моем представлении, должен быть "разделителем" не знаю правильно назвать.
#840 #628909
>>627974

>Перенаправить и вывод, и ошибки в файл можно так:


>команда 2>&1 > file.txt


>и вывод, и ошибки


>&


В моем представлении символ > означает перенаправление, а символ & - логическое "и", пробел, опять же повторяюсь, в моем представлении, должен быть "разделителем" не знаю правильно назвать.
Следовательно, часть выражения 2>&1 мне кажется совершенно не связанной кучемалой. Получается: 2перенаправитьИ1 перенаправить в файл.тхт
По моему, 2перенаправить и 1перенаправить в файл.тхт или 2и1 перенаправить в файл.тхт 2> & 1> file.txt как-то логичней записть представляется представляется.

>Вообще, синтаксис такой по историческим причинам, написаны миллионы скриптов и никто их уже не переделает.


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

> 2>&1 значит перенаправить данные, из потока №2 (поток ошибок stderr) в поток №1 (поток вывода stdout)


А зачем тут тогда &? И почему первый раз мы не отделяем пробелами символ перенаправления, а второй разделяем? Не понимаю.
#841 #628913
$app['session']->set($itemid, array('ip' => $ip_address, 'likes' => 0));
Короче в сессии в силексе каждому лайку по уникальному айди создается значение айпи и кол-во лайков. Может быть либо 1 либо 0, т.к. больше одного нельзя ставить.Я так понимаю, что при лайкании с каждого нового айпишника значение айпи и лайк будет заново переписываться для айдишки лайка? Получается без таблиц не обойтись?
#842 #628914
что-то не понимаю принцип сессий.
#843 #628915
>>628914
Как кукисы только значения на сервере, а у пользователя только айди сессии.
#844 #628924
ОП, привет, проверь, пожалуйста
>>625791
>>626334
#845 #628935
http://namefuctionstar.esy.es/GuestBook/
вот зацените тестовое и лайки.
#846 #628939
>>628935
А соус где?
#847 #628951
>>628935

>Allah


>لا إله إلا الله محمد رسول الله


>20 лайков


Обосрался.
#848 #628972
Вы в курсе, что старый тред на 800 постов ещё посещаем ньюфагами и там даже пишут что-то? Да и в этом скоро 900 ростов. Пилите новый тред и суммоньте опа, а то он редко заходит
#849 #628973
>>628951
абу ну не сри
#850 #628974
бля ну нахуй так делать
#851 #628977
>>628854
http://ideone.com/eAd4Ye - смотри, как я могу.
Я, наверное, слегка поехал уже, но делаю сейчас задачу на числа прописью - она способствует.
#852 #628978
>>628972
Наверное, официальный тред не переписали в прикреплённом посте раздела.
#853 #628980
>>628972
Тут бамплимит 500 или 1000? Судя по тому что мы тонем и не всплываем, скорее всего 500.
#854 #628981
>>628775
С почином! Один маленький шажок для человечества, но зато какой огромный шаг для анона! Точнее, наоборот.
Рекомендуется со строчной буквы писать if, а также слитно писать elseif. А так всё правильно.
#855 #629048
>>628906

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

> как-то логичней записть представляется представляется.


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

> И почему первый раз мы не отделяем пробелами символ перенаправления


не знаю, по моему это ни на что не влияет

>>628913

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

Касательно вопроса, твоя задача разбивается на 2 независимые части:

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

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

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

>>628914

А гуглить пробовал?

https://www.google.ru/search?q=%D1%81%D0%B5%D1%81%D1%81%D0%B8%D0%B8+%D0%B2+php&newwindow=1&gbv=1&sei=5wKeVrHNLsisygOy7ZqYBw

на phpfaq неплохое объяснение

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

Алсо во многих случаях сессии не требуются. Я вообще не понимаю, почему их везде использовать пытаются. Надо наверно урок про них сделать.
#855 #629048
>>628906

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

> как-то логичней записть представляется представляется.


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

> И почему первый раз мы не отделяем пробелами символ перенаправления


не знаю, по моему это ни на что не влияет

>>628913

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

Касательно вопроса, твоя задача разбивается на 2 независимые части:

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

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

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

>>628914

А гуглить пробовал?

https://www.google.ru/search?q=%D1%81%D0%B5%D1%81%D1%81%D0%B8%D0%B8+%D0%B2+php&newwindow=1&gbv=1&sei=5wKeVrHNLsisygOy7ZqYBw

на phpfaq неплохое объяснение

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

Алсо во многих случаях сессии не требуются. Я вообще не понимаю, почему их везде использовать пытаются. Надо наверно урок про них сделать.
#856 #629049
>>628972
>>628978

Это потому что в шапке постоянно старая ссылка.

>>628980

500, ночью попробуем перекатиться.
#857 #629059
>>629048
идентификатор - это идентификатор записи в бд, к которой ставятся лайки. каждому пользователю в сессию свой айпи записываестя. у пользователя нет идентификатора, в глаза долбишься мразь тупая. ой все нахуй иди.
30 Кб, 1903x949
#858 #629061
Вброшу сюда, а потом в новый тред.
https://github.com/foobar1643/student-list
Сделал вот задачу из ОП-поста на список студентов, реализовал все что нужно было, код все равно получился говном (но работает). Подскажите что переделать, что сделано не так.

Поддержки mysql нет потому что мне лень было её ставить на сервер. Взял вместо неё postgresql, хотя в теории если поменять одну строчку в конфиге, то всё должно заработать и с mysql (дамп базы очевидно не подойдет).
#859 #629064
>>629061

постгрес можно использовать, никакой проблемы в этом нет. Насчет поля поиска, лучше было бы написать подсказку более конкретно, например "введите часть имени, фамилии, номера группы"
#860 #629066
>>629064
Я насчет текста и подсказок не особо задумывался.
#861 #629070
>>629061
Мне не нравится код. Как-то читать тяжело.
#862 #629078
>>628935
Неудобно, что страница после лайка полность перезагружается.
Аяксом или жквери можносделать без перезагрузки.
#863 #629085
>>629078
А можно аяксом без жеквери.
#864 #629094
>>629085
А жекверием нельзя?
#865 #629111
>>629094
Можно и с ним, и без него.
#866 #629116
Сосач, помоги, пожалуйста. Есть скрипт парсера youtube. В инпут вбиваем ключевые слова, на выходе получаем файл data.txt со списком спаршенных видео по ключам. Проблема в том, что скрипт добавляет несколько видео по кейворду, а нужно, чтобы добавлял только 1 видео. В PHP не шарю, поэтому прошу помощь здесь.
Код парсера:
<?php
//error_reporting();
@ini_set('max_execution_time', 0);
echo "<title>Парсер YouTube V2.1 (с) by Gogres</title>";
echo "<form method = \"POST\" >";
echo "Кейворды (по одному на строку):
медвед
креветка
<br><br>";
echo "<textarea name=\"keys\" cols=\"70\" rows=\"10\"></textarea><br>";
echo "<input name=\"page\" size=5 type=\"text\" value=\"1\"> :Количество страниц<br>";
echo "<input type=\"submit\" value=\"Click & Parse\">";
echo "</form>";

$data=fopen('data.txt','a');
if ($_POST['page']) $pages=$_POST['page']; else $pages=1;
if ($_POST['keys']){
$filename=$_POST['filename'];
$papkaname=$_POST['papkaname'];
$keys=split("\n", $_POST['keys']);

foreach ($keys as $k=>$key){
$key=trim($key);
$reskey=$key;
$key=urlencode($key);
$key=str_replace("%20", "+", $key);

for($i=0; $i<$pages; $i++)
{
$pageparse=file_get_contents("http://www.youtube.com/results?search_type=videos&search_query=".$key."&page=".$page);
if(strpos($pageparse, "/watch?v=")!=false)
{
$matches=array();
$pattern = "/href=\"\/watch\?v=([^\"]*)\"/sU";
preg_match_all($pattern, $pageparse, $matches);
$resultmovies=implode(" ", $matches[1]);
$resultmovies=str_replace("&hd=1", "", $resultmovies);
$resultmovies=str_replace("&feature=browch", "", $resultmovies);
$resultmovies=explode(" ", $resultmovies);
$resultmovies=array_unique($resultmovies);
$moviescount=count($resultmovies);
//$query="http://www.youtube.com/watch?v=".$resultmovies;
foreach($resultmovies as $movielink)
{

$link = trim($movielink);
if ($link!="EMPTY")
{
\t$text='<object width="425" height="350">';
\t$text.='<param name="movie" value="http://www.youtube.com/v/'.$link.'"></param>';
\t$text.='<param name="wmode" value="transparent"></param>';
\t$text.='<embed src="http://www.youtube.com/v/'.$link.'"';
\t$text.='type="application/x-shockwave-flash" wmode="transparent"';
\t$text.='width="425" height="350"></embed></object>';
fwrite($data, $text."\n");
\t}
}
sleep(1);
}

} }

}
fclose($data);

?>
#866 #629116
Сосач, помоги, пожалуйста. Есть скрипт парсера youtube. В инпут вбиваем ключевые слова, на выходе получаем файл data.txt со списком спаршенных видео по ключам. Проблема в том, что скрипт добавляет несколько видео по кейворду, а нужно, чтобы добавлял только 1 видео. В PHP не шарю, поэтому прошу помощь здесь.
Код парсера:
<?php
//error_reporting();
@ini_set('max_execution_time', 0);
echo "<title>Парсер YouTube V2.1 (с) by Gogres</title>";
echo "<form method = \"POST\" >";
echo "Кейворды (по одному на строку):
медвед
креветка
<br><br>";
echo "<textarea name=\"keys\" cols=\"70\" rows=\"10\"></textarea><br>";
echo "<input name=\"page\" size=5 type=\"text\" value=\"1\"> :Количество страниц<br>";
echo "<input type=\"submit\" value=\"Click & Parse\">";
echo "</form>";

$data=fopen('data.txt','a');
if ($_POST['page']) $pages=$_POST['page']; else $pages=1;
if ($_POST['keys']){
$filename=$_POST['filename'];
$papkaname=$_POST['papkaname'];
$keys=split("\n", $_POST['keys']);

foreach ($keys as $k=>$key){
$key=trim($key);
$reskey=$key;
$key=urlencode($key);
$key=str_replace("%20", "+", $key);

for($i=0; $i<$pages; $i++)
{
$pageparse=file_get_contents("http://www.youtube.com/results?search_type=videos&search_query=".$key."&page=".$page);
if(strpos($pageparse, "/watch?v=")!=false)
{
$matches=array();
$pattern = "/href=\"\/watch\?v=([^\"]*)\"/sU";
preg_match_all($pattern, $pageparse, $matches);
$resultmovies=implode(" ", $matches[1]);
$resultmovies=str_replace("&hd=1", "", $resultmovies);
$resultmovies=str_replace("&feature=browch", "", $resultmovies);
$resultmovies=explode(" ", $resultmovies);
$resultmovies=array_unique($resultmovies);
$moviescount=count($resultmovies);
//$query="http://www.youtube.com/watch?v=".$resultmovies;
foreach($resultmovies as $movielink)
{

$link = trim($movielink);
if ($link!="EMPTY")
{
\t$text='<object width="425" height="350">';
\t$text.='<param name="movie" value="http://www.youtube.com/v/'.$link.'"></param>';
\t$text.='<param name="wmode" value="transparent"></param>';
\t$text.='<embed src="http://www.youtube.com/v/'.$link.'"';
\t$text.='type="application/x-shockwave-flash" wmode="transparent"';
\t$text.='width="425" height="350"></embed></object>';
fwrite($data, $text."\n");
\t}
}
sleep(1);
}

} }

}
fclose($data);

?>
#867 #629158
Насколько сильно надо знать Гит и Гитхаб? Если научился создавать, добавлять, клонировать репозитарий через командную строку, этого достаточно? Я слышал что целые книги по Гиту выходят, нужно ли знать все эти подробности?
#868 #629159
>>629158
Для джуниора хватит того что ты описал.
#869 #629160
>>629158
Научись еще создавать ветки и работать с ними. Потом уже по обстоятельствам.
#870 #629169
>>629158
А где про это почитать? Вообще ничего не знаю по гиту пока что. И гитхабу(это ж сайт, не?)
#871 #629173
>>629169
Git - система контроля версий, GitHub - сайт, который работает на основе этой системы контроля версий. Так же существуют и другие системы контроля версий (Apache Subversion, Mercurial), но это уже другая история.

У гитхаба есть серия интерактивных уроков которые помогут понять новичку как это работает.
https://try.github.io/
#872 #629182
>>629173
Ох щи, я думал, что это просто сайт, на котором все компоненты системы выложены в виде структуры, можно тупо почитать код, скачать его и т.п.
#873 #629184
>>629182
Это одна из функций системы контроля версий.
7 Кб, 259x195
#874 #629194
>>629184
Я думал, что единственная...
Тэк-с, тэк-с, ещё и Гитхаб теперь изучать, ну наконец-то!
#875 #629223
Сделал задачу про айпад и функции, но мне выдают "Превышено ограничение на время".
http://ideone.com/bNsZj2
#876 #629227
>>629223
Значит попал в бесконечный цикл, проверь условие.
#877 #629239
>>629223
Ты все время увеличиваешь сумму кредита и ничего не отнимаешь от нее. Т.е. условие < 0 не наступит никогда.
1188 Кб, 390x414
#878 #629279
Почтото в старый ни кто перекат не кинул? Спасибо доброанону, который написал где новый тред.

PHP-ны. Скажите, как реализовать следующую задачу:(Пожалуйста, подробно, в вебе я вообще ни разу ничего не делал)
1)Создать страницу, на которой есть возможность просмотра видео.
2)На этой странице есть возможность залить видео. После заливки видео обрабатывается(обрезается на половину(тут по подробней распишите, пожалуйста, если можете)). Не знаю куда заливать, посоветовали бесплатное амазноновское хранилище. После заливки идет запись в БД о том, куда залито обработанное видео и есть возможность на странице воспроизвести это видео. Добра вам сразу!
Вектор #879 #629285
>>625135

>Советую показывать промежуточные варианты.


http://ideone.com/TxblFr - вот, первую часть сделал. Что надо исправить?
129 Кб, 500x730
#880 #629286
>>619873 (OP)
Анончики, помогайте, я застрял в бесконечном мысленном цикле и не могу выбраться. Задачка на проверку грамматики: http://ideone.com/VRhfc0
Почему при проверке в массив выводится только первая ошибка? После долгих размышлений я решил, что само регулярное выражение задано неправильно и вариант с "или-или" в данном случае - неверный выбор. Но если так, то получается, выражение можно заточить лишь под проверку конкретного предложения? Ткните пальцем в страницу из руководства, дайте подсказку, что угодно, я совсем запутался.
#881 #629291
>>629286
Потому-что preg_match_all
Вектор #882 #629295
>>629285
Черт! Забыл вывести "Всего" и "Среднее".
#883 #629298
>>629291
Это что-то новенькое. Но всё сработало, спасибо.
#884 #629302
>>629298

>Это что-то новенькое


Ты точно по урокам Опа занимаешься?
#885 #629304
>>629286
Вместо $lowerCase = mb_strtolower($text); можно просто в регулярку добавить модификатор i.
#886 #629306
>>629302
Там про preg_match_all дальше говорится, же после Граммар Наци.
Сам помню, как тыкался с имеющейся до этого информацией, а потом просто прочитал дальше на странице всё.
#887 #629317
>>629286
А почему вывод ошибок не сделал нормальный, чего var_dump-то всего лишь?
Если нужна подсказка для этого, то сделай вот так: раскладываешь циклом с foreach массив с ошибками на ключи и значения, другим циклом с foreach раскладываешь значения так же на ключи и значения - там же в массиве $mistakes у нас массивы в массивах. Далее просто выводишь в echo последние значения вложенных массивов. Если не получится сразу, то подсмотри: http://ideone.com/T4ewwV Но лучше сам пробуй сделать, конечно.
#888 #629357
>>629173
Cпасибо.

Ну что, когда перекатываемся? Тред трещит по швам
24 Кб, 500x254
#889 #629362
>>629357
Не дрейфь, сухопутная крыса. Всем оставаться на своих местах, держим курс в бездну!
https://github.com/MindiMakridi/filehosting #890 #629396
>>623492

https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L8

> "host" => $host,


Лучше назвать настройку db.host, чтобы было понятно что это за опция. И переменную тогда dbHost.

Добавление функций в твиг можно сделать без переменных:

$twig->addFunction(new Twig_SimpleFunction(...);

или можно вынести конфигурирование твига в метод класса, допустим, TwigHelper::initTwig(...). Хотя я не уверен, может лучше в index это оставить, давай пока оставим. Ну и помни что кроме экспортирования функций по одной есть еще вариант просто отказаться от статических методов и передать объект в твиг.

https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L84

> $comment = $file->getComment();


незачем передавать комментарий отдельной переменной, его можно получить в шаблоне через file.getComment()

> $pathToFile = $app->filesHelper->getPathToFile($id . $file->getFileName());


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

Надо либо функцию принимабщую объект File (не ошибешься) либо по отдельности id и filename. либо обе функции сразу.

Более того, вместо того чтобы передавать 4 переменных вроде pathToFile, relPathToThumb проще тут передать filesHelper в твиг.

> $app->get("/files/:id"


> $app->post("/files/:id",


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

> $fileName = $app->filesMapper->fetchFileName($id);


> $fileName = $fileName['filename'];


почему бы не возвращать сразу filename, а не массив?

> exit;


в слиме есть $app->stop(), он в отличие от exit корректно вызывает все нужные обработчики завершения скрипта в слиме.

https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L159
Создание папок для превьюшки наверно должно быть не здесь а в функции создания превьюшки.

https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L178

> if ($_FILES['userfile']['error'] == UPLOAD_ERR_OK) {


а где проверка на размер файла?допустим ли он?

Там еще не все я проверил, если я забуду и не напишу продолжение, напомни мне.
https://github.com/MindiMakridi/filehosting #890 #629396
>>623492

https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L8

> "host" => $host,


Лучше назвать настройку db.host, чтобы было понятно что это за опция. И переменную тогда dbHost.

Добавление функций в твиг можно сделать без переменных:

$twig->addFunction(new Twig_SimpleFunction(...);

или можно вынести конфигурирование твига в метод класса, допустим, TwigHelper::initTwig(...). Хотя я не уверен, может лучше в index это оставить, давай пока оставим. Ну и помни что кроме экспортирования функций по одной есть еще вариант просто отказаться от статических методов и передать объект в твиг.

https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L84

> $comment = $file->getComment();


незачем передавать комментарий отдельной переменной, его можно получить в шаблоне через file.getComment()

> $pathToFile = $app->filesHelper->getPathToFile($id . $file->getFileName());


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

Надо либо функцию принимабщую объект File (не ошибешься) либо по отдельности id и filename. либо обе функции сразу.

Более того, вместо того чтобы передавать 4 переменных вроде pathToFile, relPathToThumb проще тут передать filesHelper в твиг.

> $app->get("/files/:id"


> $app->post("/files/:id",


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

> $fileName = $app->filesMapper->fetchFileName($id);


> $fileName = $fileName['filename'];


почему бы не возвращать сразу filename, а не массив?

> exit;


в слиме есть $app->stop(), он в отличие от exit корректно вызывает все нужные обработчики завершения скрипта в слиме.

https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L159
Создание папок для превьюшки наверно должно быть не здесь а в функции создания превьюшки.

https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L178

> if ($_FILES['userfile']['error'] == UPLOAD_ERR_OK) {


а где проверка на размер файла?допустим ли он?

Там еще не все я проверил, если я забуду и не напишу продолжение, напомни мне.
#891 #629405
>>629396

>незачем передавать комментарий отдельной переменной


Это комментарий для модального окна, он может отличаться от того, что в объекте, например, когда пользователь введет невалидный коммент, он будет там отображаться.
#892 #629522
Переспрошу >>627804.
#893 #629523
>>623853
Оп проверь пожалуйста:
http://integer64.github.io/site-layout/exercise/mainTask/index.html
Сделал под ослика.
Можете начать тыкать в мои косяки
#894 #629538
Аноны, у вас есть ламповая конфа впашке?
78 Кб, 984x562
ЗАДАЧА ПРО IPAD #895 #629547
Анончик, проверь, пожалуйста, задачу про Ipad.

http://ideone.com/E1TKjj
116 Кб, 868x528
#896 #629589
Анон, выручай.

Дали какую то выгрузку. Логики с первого взгляда не вижу никакой. Сказали заебаш интеграцию с 1с на сайте, а я в душе не ебу что эти люди понимают под интеграцией.
Предоставить выгрузку в формате CommerceML отказались.

Не прошу ничего делать за меня, а прошу - подкиньте ключевых слов для поиска (интеграция с 1с не предлагать).
#897 #629605
Учусь, прохожу учебник ОПа.
http://ideone.com/H8NBFd

Получается вывести победу и проигрыш. Когда игрок=компьютер, почему-то не выводится надпись "Ничья!". Что я делаю не так?

} elseif (($anonDice1 + $anondice2) == ($compDice1 + $compDice2)) {
echo "Ничья!";
#898 #629619
>>629605

Когда сделал вот так, всё получилось. Почему?
http://ideone.com/OuuiCM

$aSum = ($anonDice1 + $anonDice2);
$cSum = ($compDice1 + $compDice2);

} elseif ($aSum > $cSum) {
\techo "Проиграл";
#899 #629623
Можно ли написать скрипт массовой рассылки сообщений в контакте? Вообще написать и используя АПИ контакта, чтобы можно было рассылать например всем участникам определённой группы (админом которой не являешься)
#900 #629624
>>628981
Спасибо, анон
Аноним #901 #629630
>>629116
Ну где PHP-макаки то? Элементарщина же.
231 Кб, 811x1253
#902 #629631
>>629624
Я-таки сделал задачу про рулетку
w5: http://ideone.com/dSvapD
#903 #629632
>>629631
Это оказалась задача W4.2, простите
#904 #629637
>>629547
Считает неправильно.
Ориентир для Софтобанка - 61270 с копейками.
Значит, у тебя и кредит за Айфон рассчитывался неправильно.

>$creditSum = ($creditSum / 100 * (100 + $percent)) + $servicePay - $payout


Забавно, можно проще всё представить.
Ошибка заключается у тебя в том, что ты не обновляешь сумму кредита перед всеми условиями с if и else.
>>629605
Ошибка в написании переменной вот тут: if (($anonDice1 == $anondice2) && ($compDice1 == $compDice2))
Отыщи сам, надо это тренировать тоже.
Подсказка: $anondice2 - должно быть $anonDice2
И эта же ошибка в другой строке, номер 16.
>>629619
Потому что тут переменные в одном месте названы без ошибок, а в 16 строке по-прежнему ошибка.
>>629624
Тебе спасибо, я так повторяю пройденный материал.
#905 #629638
>>629631
Хорошо.
#906 #629650
>>629547
Также в самой функции обозначь переменную $paymentTotal, иначе будет вылезать ошибка.
Вот твой исправленный калькулятор - но ни в коем случае не открывай, пока сам не попытаешься сделать: http://ideone.com/jaYrBg
Вот алгоритм:
1. Имеем сумму кредита.
2. Прибавляем к ней нужный процент и прибавляем комиссию за обслуживание кредита.
3. Проверяем, получившаяся сумма больше или меньше 5000, которые может выплачивать Анончик в месяц.
4. В соответствии с результатом проверки или продолжаем цикл выплат, или выплачиваем имеющуюся сумму и обрываем цикл (не забывай, что она у нас уже должна быть умножена на процент и к ней должна быть уже прибавлена комиссия за обслуживание кредита).
Всё.
#907 #629654
>>629650

>уже должна быть умножена на процент


То есть к ней должен быть прибавлен процент.
Я делал не в скобках, как ты, а через умножение суммы кредита на 0.0n - так всё экономится.
139 Кб, 811x548
#908 #629663
>>629638
Вроде бы получалась задачка про айфон
W5.1: http://ideone.com/AeH9Qm
#909 #629665
>>629637
Спасибо, добрый человек. Нашёл ошибку без спойлера, как только ты сказал "надо это тренировать тоже". После основной работы учусь, внимание уже не такое. Буду иметь в виду)
#910 #629668
Привет.
Короче, у меня депресузха походу начинается. Думал на этих каникулах в колледже буду вкалывать - изучать пхп и потихоньку пилить диплом. Диплом должен делаться с базой, которую нам должен был скинуть препод. Я думал что пхначну делать как он скинет базу.
Получилось, что базу он так и не скинул, до конца каникул осталось +-10 дней. Так на каникулах я почти ничего не учил, немного по мелочи пхп и mysql. Еще я расчитывал кстроитьсч на практику, то место куда мне нашли родители, сказали мол там будем погромирование и всё такое, оказалось что там пограммирования нет впринципе. Я понимаю, что каникулы и собственно свободные дни почти проёбаны, а я почти ничего и не делал, диплом даже и не начинал.
Для диплома надо как минимум знания php. Вижу тут у вас есть свои уроки, они норм повышают уровень? Или сразу в какую-то книгу вникать? Помогите пожалуйста. Сейчас почти утро, я сейчас лягу спать и буду вкалывать весь день как проснусь. Мне нужны ваши советы по этому поводу, что дрочить чтоб повышать уровень php. Спасибо, не бросьте в беде.
#911 #629670
>>629668
Добавлю, не скинул препод потому, что говорит мол траблы с компом. Вот так звёзды неудачно стали.
#912 #629675
>>629663
Нет, считает неверно. Должно получиться 61270 и много знаков после запятой.
У тебя в последний раз когда $creditBalance участвует в выражении с $paymentTotal - от него уже отнята месячная плата.
Вот тут:
if ($creditBalance < 5000) {
$paymentTotal += $creditBalance;
А нужно просто выплачивать чистый $creditBalance на тот момент.
#913 #629679
>>629668
Учебник ОПа отлично поможет в освоении синтаксиса, вообще всех основ. Если постоянно работать, то за месяц основы усвоишь, вплоть до БД.
Но писать код придется постоянно.
#914 #629685
>>629675

>А нужно просто выплачивать чистый $creditBalance на тот момент.


Но к нему уже должны быть прибавлены проценты и комиссия за кредит.
134 Кб, 600x1084
#915 #629700
>>629685
Чёт на 8 рублей отличается
http://ideone.com/AeH9Qm
#916 #629711
>>629700
Проценты от 262 рублей куда-то делись, там как раз будет столько.
629 Кб, 1600x2133
#917 #629714
>>629711
А, точно, теперь сходится, спасибо
http://ideone.com/AeH9Qm
#918 #629716
>>629700

>if ($creditBalance < 500)


Странный ориентир.
ОП проверял, подставляя в сумму кредита 1000 - должно выйти 2030 рублей.
А с твоим ориентиром - не факт.
#919 #629717
>>629714
http://ideone.com/X6MUaK - ноуп, считает неверно, если 1000 подставить.
Он при любых суммах должен считать одинаково правильно.
523 Кб, 1224x1632
#920 #629732
>>629717
Ну теперь вроде допёр: http://ideone.com/AeH9Qm
#921 #629735
Привет.
Карочи мне нужен скрипт. Если кому не трудно, то помогите позязя.
Есть страница /redirect.php, есть ссылки на неё вида /redirect.php?id=1 (2,3,4,5 итд).
Нужно редиректить трафик на разные url, в зависимости от значения параметра id (т.е. если id=1 то редирект на url1, если id=2 то на url2 итд).
С меня как и всегда огромное спасибо.
#922 #629736
>>629732
Хм, нет, бро: http://ideone.com/SvK7TK - если подставить 1000 в кредитбаланс.
Введи дополнительную переменную для суммы кредита, когда она увеличена на проценты и с прибавленной комиссией за кредит.
С ней именно оперируй, когда надо просто её и выплатить.
Просто каждый раз перед if проверяй, не стала ли чистая сумма кредитбаланса со своими 3 процентами и 1000 комиссии меньше 5000 возможной выплаты анончика.
Если стала - сразу выплачиваешь только её и прекращаешь цикл.
Попробуй так базарю, еще захочешь, поцене 38 рублей
#923 #629739
>>629623

В этом треде не обсуждаются вредоносные программы.
#924 #629749
Это нормально, что я над таким приложением провозился 18 часов согласно вакатайму?
Сейчас под лайки по айпи таблицы создаю.

https://github.com/toppestkek/GuestBook
#925 #629751
>>629736

>Просто каждый раз перед if


Просто каждый раз в if, опечатался.
За пределами условий в этом цикле получай сумму кредитбаланса со своими 3 процентами и 1000 комиссии, ну а дальше подставляй её в условия, хоть в if, хоть в else.
14 Кб, 200x200
#926 #629752
#927 #629754
>>629749

>Сейчас под лайки по айпи таблицы создаю.


Сломался-таки?
#928 #629785
>>629754
Нет, работает, но чувство мне подсказывает, что каждый раз заново переписывать лайку сессию по идентификатору на новый айпи неправильно.
#929 #629795
Переката не было?
https://github.com/MindiMakridi/filehosting #930 #629808
>>629795

Скоро будет

>>623492

https://github.com/MindiMakridi/filehosting/tree/master/templates
для шаблонов лучше поставить расширение вроде file.html.twig чтобы было видно что это шаблон, чтобы редактор подсвечивал синтаксис и тд

https://github.com/MindiMakridi/filehosting/blob/master/templates/filePage.html#L20
сделай-ка вывод даты в виде "12:00 Jun 12, 1991"

https://github.com/MindiMakridi/filehosting/blob/master/templates/filePage.html#L23

> {% if canEdit(token, file.getToken()) %}


странный набор аргументов у функции. По моему логичнее бы смотрелось if canEdit(file) или if canEdit(user, file). возможно эта функция спроектирована неверно?

https://github.com/MindiMakridi/filehosting/blob/master/templates/layout.html#L6

> <meta name="viewport"


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

> https://oss.maxcdn.com/respond/1.4.2/respond.min.js


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

https://github.com/MindiMakridi/filehosting/blob/master/templates/layout.html#L39

> <a href="http://filehosting.ru


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

> https://ajax.googleapis.com


Почему скрипты на стороннем сайте?

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

https://github.com/MindiMakridi/filehosting/blob/master/templates/filePage.html#L34

> <textarea


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

https://github.com/MindiMakridi/filehosting/blob/master/public/css/style.css#L1

> input[type="file"]{


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

> textarea.form-control


> .modal


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

https://github.com/MindiMakridi/filehosting/blob/master/lib/config.php
Странное название папки lib что значит "библиотеки"

https://github.com/MindiMakridi/filehosting/tree/master/models
не очень удалчное название так как в эту папку куча разных классов сброшена, не только модели

https://github.com/MindiMakridi/filehosting/blob/master/models/FilesMapper.php#L15
строки длиннее 80 символов рекомендуется переносить

https://github.com/MindiMakridi/filehosting/blob/master/models/FilesMapper.php#L71
логичнее назвать функцию editFileComment

> $STH


> DBH


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

https://github.com/MindiMakridi/filehosting/blob/master/models/helpers/FilesHelper.php#L10

> $this->rootDirectory = $root;


одинаковые вещи лучше называть одинаково

https://github.com/MindiMakridi/filehosting/blob/master/models/helpers/FilesHelper.php#L39

> return md5($salt1 . $cypher . $salt2);


Эта функция не добавляет ничего к токену, а лишь увеличивает его объем. На входе мы имеем комбинацию из 20 символов (20 ^ 36 вариантов, гугл говорит что это 6.87194767 × 10^46). На выходе получаем 128-битный хеш, 2^128 вариантов (2^128 = 3.40282367 × 10^38). То есть ты уменьшаешь число возможных вариантов, снижаешь стойкость ключа (хотя 2^128 тоже много), да еще и увеличиваешь длину (md5 генерирует 32 символа на выходе). Объясни-ка, с какой целью это делается?
https://github.com/MindiMakridi/filehosting #930 #629808
>>629795

Скоро будет

>>623492

https://github.com/MindiMakridi/filehosting/tree/master/templates
для шаблонов лучше поставить расширение вроде file.html.twig чтобы было видно что это шаблон, чтобы редактор подсвечивал синтаксис и тд

https://github.com/MindiMakridi/filehosting/blob/master/templates/filePage.html#L20
сделай-ка вывод даты в виде "12:00 Jun 12, 1991"

https://github.com/MindiMakridi/filehosting/blob/master/templates/filePage.html#L23

> {% if canEdit(token, file.getToken()) %}


странный набор аргументов у функции. По моему логичнее бы смотрелось if canEdit(file) или if canEdit(user, file). возможно эта функция спроектирована неверно?

https://github.com/MindiMakridi/filehosting/blob/master/templates/layout.html#L6

> <meta name="viewport"


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

> https://oss.maxcdn.com/respond/1.4.2/respond.min.js


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

https://github.com/MindiMakridi/filehosting/blob/master/templates/layout.html#L39

> <a href="http://filehosting.ru


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

> https://ajax.googleapis.com


Почему скрипты на стороннем сайте?

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

https://github.com/MindiMakridi/filehosting/blob/master/templates/filePage.html#L34

> <textarea


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

https://github.com/MindiMakridi/filehosting/blob/master/public/css/style.css#L1

> input[type="file"]{


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

> textarea.form-control


> .modal


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

https://github.com/MindiMakridi/filehosting/blob/master/lib/config.php
Странное название папки lib что значит "библиотеки"

https://github.com/MindiMakridi/filehosting/tree/master/models
не очень удалчное название так как в эту папку куча разных классов сброшена, не только модели

https://github.com/MindiMakridi/filehosting/blob/master/models/FilesMapper.php#L15
строки длиннее 80 символов рекомендуется переносить

https://github.com/MindiMakridi/filehosting/blob/master/models/FilesMapper.php#L71
логичнее назвать функцию editFileComment

> $STH


> DBH


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

https://github.com/MindiMakridi/filehosting/blob/master/models/helpers/FilesHelper.php#L10

> $this->rootDirectory = $root;


одинаковые вещи лучше называть одинаково

https://github.com/MindiMakridi/filehosting/blob/master/models/helpers/FilesHelper.php#L39

> return md5($salt1 . $cypher . $salt2);


Эта функция не добавляет ничего к токену, а лишь увеличивает его объем. На входе мы имеем комбинацию из 20 символов (20 ^ 36 вариантов, гугл говорит что это 6.87194767 × 10^46). На выходе получаем 128-битный хеш, 2^128 вариантов (2^128 = 3.40282367 × 10^38). То есть ты уменьшаешь число возможных вариантов, снижаешь стойкость ключа (хотя 2^128 тоже много), да еще и увеличиваешь длину (md5 генерирует 32 символа на выходе). Объясни-ка, с какой целью это делается?
http://integer64.github.io/site-layout/exercise/mainTask/index.html #931 #629809
>>623518

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

Надо бы сделать адаптивную версию, например для устройств меньше 800 по ширине. Протестировать можно в отладчике браузера, нажав иконку с смартфоном или на реальном устройстве, если оно у тебя есть. Размеры экранов: http://mydevice.io/devices/

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

В HTML коде нет метатега, переключающего режимы совместимости ИЕ.

Фраза digital & branding выделена у тебя ариалом, а на макете - курсивным шрифтом.

В бледно-сером блоке с 4 колонками Consectetur у тебя нет паддинга снизу, а на макете есть.

Над надписью Our Featured Works маргин у тебя намного меньше макета.

На кнопках ALL GRAPHIC ... правильный ли размер шрифта и паддинги? Что-то они у меня пикселя на 4 выше чем на макете.

Маргин под портфолио у тебя намного меньше чем на макете. зато над Get in Touch больше чем надо.

На html, body не задан основной стиль и размер шрифта (в данном случае как мне кажется, основной это шрифт которым написано Vestibulum id ligula porta euismod semper...).

> font-family: "Lato-Black"


> font-family: "Lato-Regular"


Неправильно подключен шрифт. Это одно семейство - Lato, просто с разеым весом и начертанием.

> <i class="logo-icon"></i><span class="logo-text">ebpaint
неудачно получилось, поисковик не проиндексирует настоящее название компании. Также, я думаю тут проще лого целиком сделать картинкой чем подключать шрифт ради нескольких букв.

> <i class="service-block-icon icon-android"></i>
Лишний тег, не несущий никакого смысла. Иконку можно сделать просто фоном на псевдоэлементе ::before

> data-all="All"


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

> data-id="Graphic"


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

> <span class="phone"


Сделай-ка телефон ссылкой с протоколом tel: чтобы она была кликабельна и звонибельна. А адрес - ссылкой на любой картографический сервис (например open street map, яндекс карты, гугл карты).

Также, разметь блок адреса по микроформату hcard https://yandex.ru/support/webmaster/hcard/general.xml . Микроформаты позволяют роботам извлекать информацию в понятном им виде. Проверь свою разметку валидатором, например http://hcard.geekhood.net/

> & # 64 ;


есть же & copy ;

Спрайты соц иконок вроде бы в PNG8, а не в PNG24 - почему?

Насчет эффекта при наведении на картинки портфолио - ты используешь изменение opacity, но я его уже кучу раз видел, так неинтересно, нельзя ли сделать тут немного другой эффект? Например картинки выводятся чуть более темными пока на них не наведена мышь (и по моему это реально сделать даже без ксс фильтров). Или при наведении снизу плавно выезжает название работы (его можно хранить в атрибуте, чтобы не создавать новых тегов в разметке). Подумай, можно ли тут что-то такое сделать. Может можно как-то CSS3 фильтры применить: http://habrahabr.ru/post/144852/
http://integer64.github.io/site-layout/exercise/mainTask/index.html #931 #629809
>>623518

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

Надо бы сделать адаптивную версию, например для устройств меньше 800 по ширине. Протестировать можно в отладчике браузера, нажав иконку с смартфоном или на реальном устройстве, если оно у тебя есть. Размеры экранов: http://mydevice.io/devices/

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

В HTML коде нет метатега, переключающего режимы совместимости ИЕ.

Фраза digital & branding выделена у тебя ариалом, а на макете - курсивным шрифтом.

В бледно-сером блоке с 4 колонками Consectetur у тебя нет паддинга снизу, а на макете есть.

Над надписью Our Featured Works маргин у тебя намного меньше макета.

На кнопках ALL GRAPHIC ... правильный ли размер шрифта и паддинги? Что-то они у меня пикселя на 4 выше чем на макете.

Маргин под портфолио у тебя намного меньше чем на макете. зато над Get in Touch больше чем надо.

На html, body не задан основной стиль и размер шрифта (в данном случае как мне кажется, основной это шрифт которым написано Vestibulum id ligula porta euismod semper...).

> font-family: "Lato-Black"


> font-family: "Lato-Regular"


Неправильно подключен шрифт. Это одно семейство - Lato, просто с разеым весом и начертанием.

> <i class="logo-icon"></i><span class="logo-text">ebpaint
неудачно получилось, поисковик не проиндексирует настоящее название компании. Также, я думаю тут проще лого целиком сделать картинкой чем подключать шрифт ради нескольких букв.

> <i class="service-block-icon icon-android"></i>
Лишний тег, не несущий никакого смысла. Иконку можно сделать просто фоном на псевдоэлементе ::before

> data-all="All"


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

> data-id="Graphic"


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

> <span class="phone"


Сделай-ка телефон ссылкой с протоколом tel: чтобы она была кликабельна и звонибельна. А адрес - ссылкой на любой картографический сервис (например open street map, яндекс карты, гугл карты).

Также, разметь блок адреса по микроформату hcard https://yandex.ru/support/webmaster/hcard/general.xml . Микроформаты позволяют роботам извлекать информацию в понятном им виде. Проверь свою разметку валидатором, например http://hcard.geekhood.net/

> & # 64 ;


есть же & copy ;

Спрайты соц иконок вроде бы в PNG8, а не в PNG24 - почему?

Насчет эффекта при наведении на картинки портфолио - ты используешь изменение opacity, но я его уже кучу раз видел, так неинтересно, нельзя ли сделать тут немного другой эффект? Например картинки выводятся чуть более темными пока на них не наведена мышь (и по моему это реально сделать даже без ксс фильтров). Или при наведении снизу плавно выезжает название работы (его можно хранить в атрибуте, чтобы не создавать новых тегов в разметке). Подумай, можно ли тут что-то такое сделать. Может можно как-то CSS3 фильтры применить: http://habrahabr.ru/post/144852/
Ответы 10-17 января #932 #629811
>>623576

> $originalamount


Надо писать $originalAmount

> if ($bills[5000] > 0) {


> if ($bills[1000] > 0) {


> if ($bills[500] > 0) {


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

> if ($bills[5000] >= floor($amount / 5000)) {


> $count5000 = floor($amount / 5000);


> } else {


> $count5000 = $bills[5000];


> }


Это короче и удобнее записать через min/max

> echo "\n\nWe are temporarily unable to give you amount of money you asked.


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

Сам алгоритм (так называемый жадный алгоритм) верный и годится для указанных в задаче номиналов купюр.
https://github.com/toppestkek/Test #933 #629813
>>623601

https://github.com/toppestkek/Test/blob/master/data.js#L2

> function Formdata


Название похоже на объект FormData из DOM, это верный путь к ошибкам и опечаткам. Надо назвать по-другому, также, функции надо называть начиная с глагола: сделайЧтоТо.

> div.inne rHTML = '';


> div.inne rHTML += 'Заполните поле "Пароль. Пароль должен быть длиннее 6 символов."';


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

> data.age.value.match(/^[-\+]?\d+/


Почему разрешен отрицательный возраст? И почему разрешено вводить мусор после цифр?

Далее тут http://pastebin.ru/YE0nSJpt спам фильтр не пропускает
Ответы 10-17 янв #934 #629814
>>623605

> $regexpSegment = array (


> '/A/u' => '[А]',


> '/a/u' => '[а]',


> '/B/u' => '[В]',


> '/C/u' => '[С]',


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

> $regexpSegmentClean = array (


> '/\\[А\\]/u' => 'А',


> '/\\[а\\]/u' => 'а',


> '/\\[В\\]/u' => 'В',


Это что-то неправильное. Зачем удалять ранее поставленные скобки? И как ты отличишь скобки в тексте от поставленных тобой?

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

>>623617

> строка if($foundAnimals["Dog"]) { превратилась в if (isset($foundAnimals["Dog"]) && $foundAnimals["Dog"])


if (!empty(...))

> abstract protected function setSymbol($symbol);


По моему это неправильно. Вот как надо понимать это надпись? Я читаю ее так: "если ты наследуешь мой класс ты обязан сделать метод который принимает на вход иконку животного, то есть позволяет ее поменять". А должно быть так: "если ты наследуешь мой класс то обязан ответить какая иконка у твоего животного". То есть должен быть метод getSymbol() возвращающий иконку животного в данный момент. А поле protected $symbol; можно выпилить вообще.

>>623632

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

>>623635

А погуглить?

>>623778

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

>>623782

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

>>623808

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

>>623826

Задачи на вектор и кошки-мышки решил? Из учебьника в Оп посте? Они помогут с основами, а дальше читай про SOLID, изучай фреймворки и смотри как в них все сделано. Была какая-то большая книга про ООП но я ее название забыл.
Ответы 10-17 янв #934 #629814
>>623605

> $regexpSegment = array (


> '/A/u' => '[А]',


> '/a/u' => '[а]',


> '/B/u' => '[В]',


> '/C/u' => '[С]',


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

> $regexpSegmentClean = array (


> '/\\[А\\]/u' => 'А',


> '/\\[а\\]/u' => 'а',


> '/\\[В\\]/u' => 'В',


Это что-то неправильное. Зачем удалять ранее поставленные скобки? И как ты отличишь скобки в тексте от поставленных тобой?

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

>>623617

> строка if($foundAnimals["Dog"]) { превратилась в if (isset($foundAnimals["Dog"]) && $foundAnimals["Dog"])


if (!empty(...))

> abstract protected function setSymbol($symbol);


По моему это неправильно. Вот как надо понимать это надпись? Я читаю ее так: "если ты наследуешь мой класс ты обязан сделать метод который принимает на вход иконку животного, то есть позволяет ее поменять". А должно быть так: "если ты наследуешь мой класс то обязан ответить какая иконка у твоего животного". То есть должен быть метод getSymbol() возвращающий иконку животного в данный момент. А поле protected $symbol; можно выпилить вообще.

>>623632

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

>>623635

А погуглить?

>>623778

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

>>623782

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

>>623808

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

>>623826

Задачи на вектор и кошки-мышки решил? Из учебьника в Оп посте? Они помогут с основами, а дальше читай про SOLID, изучай фреймворки и смотри как в них все сделано. Была какая-то большая книга про ООП но я ее название забыл.
Ответы 10-17 янв #935 #629815
>>623853

Ну давай начнем со скриншотов: https://www.browserstack.com/screenshots/6142c07ae33e5f6bb20e6fc9c2966da93984392b

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

>>623930

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

> как мне этот ответ обработать, чтобы получить ссылку на скачивание документа


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

>>623933

> нужно ли городить такие выражения $d = isset($arr['d']) ? $arr['d'] : '' если можно обойтись $d = $arr['d']


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

>>624192

Нужно

>>624248

Так трудно сказать. Может браузер пережевывает яваскрипт и рисует страницу, а может что-то еще виновато. Может например он какие-то данные на диск сохраняет, а тот медленный или занят. Хорошо бы в Хроме запустить внутренний инструмент для трассировки ( chrome://tracing/ ) и попробовать разобраться в результатах.

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

Также можешь выложить это на какой-нибудь хостинг - я или аноны скажут тебе сколько у них времени грузится.
Ответы 10-17 янв #935 #629815
>>623853

Ну давай начнем со скриншотов: https://www.browserstack.com/screenshots/6142c07ae33e5f6bb20e6fc9c2966da93984392b

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

>>623930

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

> как мне этот ответ обработать, чтобы получить ссылку на скачивание документа


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

>>623933

> нужно ли городить такие выражения $d = isset($arr['d']) ? $arr['d'] : '' если можно обойтись $d = $arr['d']


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

>>624192

Нужно

>>624248

Так трудно сказать. Может браузер пережевывает яваскрипт и рисует страницу, а может что-то еще виновато. Может например он какие-то данные на диск сохраняет, а тот медленный или занят. Хорошо бы в Хроме запустить внутренний инструмент для трассировки ( chrome://tracing/ ) и попробовать разобраться в результатах.

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

Также можешь выложить это на какой-нибудь хостинг - я или аноны скажут тебе сколько у них времени грузится.
Ответы #936 #629816
>>624281

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

А что насчет raw? Это отмена автоматического экранирования (применения функции htmlspecialchars) к выводимым данным. По стандартам ХТМЛ в теге скрипт и стайл данные интерпретируются как записаны, то есть например амперсанд пишется как амперсанд, а не & amp ; Потому требуется отменить автоэкранирование. Правда, в этом случае в данных не должно быть последовательности </скрипт, но джейсон_энкоде экранирует все слеши в виде \/ и потому защищает нас и от этого, от закрытия блока скрипт.

Заметь что это относится только к тегу скрипт/стайл. Данные в атрибутах тегов, например в онклик, надо экранировать через htmlspecialchars.

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


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

> Ну ладно, видимо это чисто ради систематичности: мы же экранируем в твиге все что нужно и не нужно, значит и здесь так же.


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

>>624325

В твоем случае код надо написать так, чтобы нотисов не было.

>>624331

> if (!Object.create) {


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

> if (arguments instanceof NetworkElement) {


> this._elements.push(arguments);


А если нет то что? Проигнорируем ошибку и притворимся что все верно? Почитай про принцип fail fast.

> if (this._elements instanceof Generator) {


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

И как в твоей программе например сделать элемент который днем генерирует, а ночью потребляет ток?

> if (powerExcess === 0) {


> break;


> powerExcess -= lines.getPowerAccumulated();
А мы в минус тут не уйдем?

> PowerLine.prototype.countDailyProfit = function(powerExcess) {


> this._powerAccumulated = this._powerCapacity;


Вот это хорошая мина замедленного действия. Из названия метода можно подумать, что он просто что-то считает, а он еще и меняет внутреннее состояние объекта. И вообще это поле _powerAccumulated оно плохое, так как оно никак не привязано ко времени, например оно само не сбросится на следующий день. Да и линия передачи не копит энергию, она ее передает - тут явно несоотвествие модели и реального объекта. Это поле надо выпилить.
Ответы #936 #629816
>>624281

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

А что насчет raw? Это отмена автоматического экранирования (применения функции htmlspecialchars) к выводимым данным. По стандартам ХТМЛ в теге скрипт и стайл данные интерпретируются как записаны, то есть например амперсанд пишется как амперсанд, а не & amp ; Потому требуется отменить автоэкранирование. Правда, в этом случае в данных не должно быть последовательности </скрипт, но джейсон_энкоде экранирует все слеши в виде \/ и потому защищает нас и от этого, от закрытия блока скрипт.

Заметь что это относится только к тегу скрипт/стайл. Данные в атрибутах тегов, например в онклик, надо экранировать через htmlspecialchars.

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


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

> Ну ладно, видимо это чисто ради систематичности: мы же экранируем в твиге все что нужно и не нужно, значит и здесь так же.


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

>>624325

В твоем случае код надо написать так, чтобы нотисов не было.

>>624331

> if (!Object.create) {


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

> if (arguments instanceof NetworkElement) {


> this._elements.push(arguments);


А если нет то что? Проигнорируем ошибку и притворимся что все верно? Почитай про принцип fail fast.

> if (this._elements instanceof Generator) {


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

И как в твоей программе например сделать элемент который днем генерирует, а ночью потребляет ток?

> if (powerExcess === 0) {


> break;


> powerExcess -= lines.getPowerAccumulated();
А мы в минус тут не уйдем?

> PowerLine.prototype.countDailyProfit = function(powerExcess) {


> this._powerAccumulated = this._powerCapacity;


Вот это хорошая мина замедленного действия. Из названия метода можно подумать, что он просто что-то считает, а он еще и меняет внутреннее состояние объекта. И вообще это поле _powerAccumulated оно плохое, так как оно никак не привязано ко времени, например оно само не сбросится на следующий день. Да и линия передачи не копит энергию, она ее передает - тут явно несоотвествие модели и реального объекта. Это поле надо выпилить.
#937 #629817
>>624896

> function makeFirstLetterUppercase($text) {


Название функции не соответствует тому что она делает

> $text = preg_replace('/\.[\s](\w)/u', '. $1', $text);


> $text = preg_replace('/(\w)\.(\w)/u', '$1. $2', $text);


> $text = preg_replace('/(\w)\,(\w)/u', '$1, $2', $text);


> $text = preg_replace('/(\w)[\s?]\,[\s?]*(\w)/u', '$1, $2', $text);


Нельзя ли это в одну замену сделать? Можно.

> foreach ($text as $key => $value) {


Нужно другое название для value, key надо удалить если ты ее не используешь.

> $text = explode('.', $text);


$sentences = explode(....);

>>624901

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

>>624935

Живой просто был занят

>>625054

Можно но лучше бы создание каких-то сервисов вообще вынести из контроллеров. Если это большой проект то стоит использовать DI Container, например от Симфони. Если маленький - можно сделать самописный ServiceLocator.

>>625126

Почитай алгоритм обработки форм https://github.com/codedokode/pasta/blob/master/forms.md

>>625339

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


Не возникнет

> просто не понимаю почему сейчас лучше процедурно


Потому что проект очень маленький и так проще и быстрее и написать и прочитать.

> Я бы классом сделал и внедрял её статически __construct(PDO Init::$pdo).


Не понял о чем ты. В аргументе нелзя писать PDO Init::$pdo.

>>625424

Есть книги "Совершенный код", есть книга Фаулера "Шаблоны проектирования корпоративных приложений", также можно посмотреть фреймворки вроде Симфони. В вебе придумыать архитектуру незачем, в большинстве случаев есть готовое решение или принцип решения.

>>625791

> function checkText($text, $patternRus, $patternEng){


$patternRus, $patternEng никогда не меняются, лучше внести их внутрь функции и убрать из скобок. То же самое с $replacementRus, $replacementEng

Лушче бы если checkText ничего не выводил а только возвращал результат.

> $array = explode (" ", $text);


array -> words

> if (preg_match('/^([а-яё.,;?!]+)([a-z]+)/ui'


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

>>625846

1) начни с презентации http://lib.custis.ru/WebAppCaching (при желании можно нагуглить и запись выступления). Вообще кеширование это попытка снизить нагрузку на систему ценой расхода памяти.

Вот еще статьи: https://www.google.ru/search?q=ruhighload+%D0%BA%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&ie=UTF-8&gws_rd=cr&ei=KvGeVtWYEuv4ywORpKPQAQ

2) Вот так было бы неплохо для начала (информация о запросе, время, стектрейс):

[12-01-2015 12:00:00] GET /some/page
IP: 10.10.10.x.
User-Agent: googlebot/1.2
Exception: the hell broke out
Stack:
#1 SomeClass::someMethod(123, "test") at file.php:12
#2 someFunction() at index.php:13
#937 #629817
>>624896

> function makeFirstLetterUppercase($text) {


Название функции не соответствует тому что она делает

> $text = preg_replace('/\.[\s](\w)/u', '. $1', $text);


> $text = preg_replace('/(\w)\.(\w)/u', '$1. $2', $text);


> $text = preg_replace('/(\w)\,(\w)/u', '$1, $2', $text);


> $text = preg_replace('/(\w)[\s?]\,[\s?]*(\w)/u', '$1, $2', $text);


Нельзя ли это в одну замену сделать? Можно.

> foreach ($text as $key => $value) {


Нужно другое название для value, key надо удалить если ты ее не используешь.

> $text = explode('.', $text);


$sentences = explode(....);

>>624901

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

>>624935

Живой просто был занят

>>625054

Можно но лучше бы создание каких-то сервисов вообще вынести из контроллеров. Если это большой проект то стоит использовать DI Container, например от Симфони. Если маленький - можно сделать самописный ServiceLocator.

>>625126

Почитай алгоритм обработки форм https://github.com/codedokode/pasta/blob/master/forms.md

>>625339

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


Не возникнет

> просто не понимаю почему сейчас лучше процедурно


Потому что проект очень маленький и так проще и быстрее и написать и прочитать.

> Я бы классом сделал и внедрял её статически __construct(PDO Init::$pdo).


Не понял о чем ты. В аргументе нелзя писать PDO Init::$pdo.

>>625424

Есть книги "Совершенный код", есть книга Фаулера "Шаблоны проектирования корпоративных приложений", также можно посмотреть фреймворки вроде Симфони. В вебе придумыать архитектуру незачем, в большинстве случаев есть готовое решение или принцип решения.

>>625791

> function checkText($text, $patternRus, $patternEng){


$patternRus, $patternEng никогда не меняются, лучше внести их внутрь функции и убрать из скобок. То же самое с $replacementRus, $replacementEng

Лушче бы если checkText ничего не выводил а только возвращал результат.

> $array = explode (" ", $text);


array -> words

> if (preg_match('/^([а-яё.,;?!]+)([a-z]+)/ui'


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

>>625846

1) начни с презентации http://lib.custis.ru/WebAppCaching (при желании можно нагуглить и запись выступления). Вообще кеширование это попытка снизить нагрузку на систему ценой расхода памяти.

Вот еще статьи: https://www.google.ru/search?q=ruhighload+%D0%BA%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&ie=UTF-8&gws_rd=cr&ei=KvGeVtWYEuv4ywORpKPQAQ

2) Вот так было бы неплохо для начала (информация о запросе, время, стектрейс):

[12-01-2015 12:00:00] GET /some/page
IP: 10.10.10.x.
User-Agent: googlebot/1.2
Exception: the hell broke out
Stack:
#1 SomeClass::someMethod(123, "test") at file.php:12
#2 someFunction() at index.php:13
#938 #629818
>>625985

> Я хочу потом ещё кучу всяких задачек пройти и весь учебник ОПа полностью без подсказок


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

>>626026

Код мутный, чего только это стоит

> catch (com_exception $e) {}



>>626051

Урок по теме https://gist.github.com/codedokode/ff99e357e9860ea169b8

>>626182

> Циклы №1



Код слишком сложно записан, надо сократить и упростить.

> ( $creditBalance x $percent ) + $servicePayment


Это повторяется много рз, попробуй избавиться от повторов

Если поставть долг = 1000 http://ideone.com/q0Zljl то считает неверно (ответ 2030р).

> Циклы №2



>$newAmount = ( $amountM = $percent );


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

Считает верно.

> или вот так


> $newAmount = ( $amountM $percent );


> $amountM = $newAmount;


Почему бы сразу в amountM и не класть результат? И кстати что значит M? Неудачное название.

>>626189

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

>>626194

Погугли, есть сайты

>>626220

> function makeFirstLetterUppercase($text, $regexpCut, $bigRegexp, $bigReplacement)


Тут $regexpCut, $bigRegexp, $bigReplacement явно не аргументы, а постоянные значения, значит они не дложны быть в скобках, а просто внутри функции определены.

> [\\.!?\\.\\.\\.]


Что это значит? От того что ты точку вписал 4 раза ничего не меняется. Кваждратные скобки значт "любой из символов"

Название переменной это существительное, а не глагол $cutTheText -> $sentences
findTheFirstLetters -> firstLetter
upTheFirstLetters -> firstLetter или head (голова)
countAllTheLetters -> letterCount
cutTheLittleFirstLetters -> tail (хвост)
theRightSentence -> correctSentence
implodeOnlyRightSentences -> text, result

Голова и хвост - традиционные названия для таких вещей.

> as $keys => $sentence


Если не исплоьзуешь keys то не надо ее писать

> $findTheFirstLetters = mb_substr($sentence, 0, 1);


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

> mb_substr($sentence, 1, $countAllTheLetters);


Можно просто mb_substr($sentence, 1), глянь мануал по этой функции

> mb_strlen($text, "UTF-8");


кодировку не надо указывать если ты задал mb_internal_encoding

> (\\.|!|\\?|\\.\\.\\.)


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

Это решение пока что не годится и требует доработки.
#938 #629818
>>625985

> Я хочу потом ещё кучу всяких задачек пройти и весь учебник ОПа полностью без подсказок


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

>>626026

Код мутный, чего только это стоит

> catch (com_exception $e) {}



>>626051

Урок по теме https://gist.github.com/codedokode/ff99e357e9860ea169b8

>>626182

> Циклы №1



Код слишком сложно записан, надо сократить и упростить.

> ( $creditBalance x $percent ) + $servicePayment


Это повторяется много рз, попробуй избавиться от повторов

Если поставть долг = 1000 http://ideone.com/q0Zljl то считает неверно (ответ 2030р).

> Циклы №2



>$newAmount = ( $amountM = $percent );


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

Считает верно.

> или вот так


> $newAmount = ( $amountM $percent );


> $amountM = $newAmount;


Почему бы сразу в amountM и не класть результат? И кстати что значит M? Неудачное название.

>>626189

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

>>626194

Погугли, есть сайты

>>626220

> function makeFirstLetterUppercase($text, $regexpCut, $bigRegexp, $bigReplacement)


Тут $regexpCut, $bigRegexp, $bigReplacement явно не аргументы, а постоянные значения, значит они не дложны быть в скобках, а просто внутри функции определены.

> [\\.!?\\.\\.\\.]


Что это значит? От того что ты точку вписал 4 раза ничего не меняется. Кваждратные скобки значт "любой из символов"

Название переменной это существительное, а не глагол $cutTheText -> $sentences
findTheFirstLetters -> firstLetter
upTheFirstLetters -> firstLetter или head (голова)
countAllTheLetters -> letterCount
cutTheLittleFirstLetters -> tail (хвост)
theRightSentence -> correctSentence
implodeOnlyRightSentences -> text, result

Голова и хвост - традиционные названия для таких вещей.

> as $keys => $sentence


Если не исплоьзуешь keys то не надо ее писать

> $findTheFirstLetters = mb_substr($sentence, 0, 1);


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

> mb_substr($sentence, 1, $countAllTheLetters);


Можно просто mb_substr($sentence, 1), глянь мануал по этой функции

> mb_strlen($text, "UTF-8");


кодировку не надо указывать если ты задал mb_internal_encoding

> (\\.|!|\\?|\\.\\.\\.)


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

Это решение пока что не годится и требует доработки.
#939 #629819
>>626240

Так он получил за сайт 3 млн?

>>626254

Да, про 16 лет это верно

>>626334

> про клавишу "Shift";


> '/([а-яёa-z]+)\\s([.,;:!?])\\s([а-яёa-z]+)/ui'


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

> [.]\\s|\\A


А где гарантия что там ровно 1 пробел?

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

> 2) про Йоду.



> $yodaText = [];


лишняя строка

В общем, верно.

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


Да, можно не сохранять

>>626339

Пусть пишет, он еще учится.

>>626347

Длинные комментарии лучше сверху

>>626380

Надо вынести авторизацию на отдельный УРЛ, например /login

>>626394

> редирект обратно на ту страницу, с которой был запрос.


При этом не забывайте проверять что эта страница на вашем сайте, а не на чужом

>>626472

Либо \n либо переходи на шаблоны

>>626515

Потому что она для этого и предназначена

>>626617

Отвечаю: код мутный
#939 #629819
>>626240

Так он получил за сайт 3 млн?

>>626254

Да, про 16 лет это верно

>>626334

> про клавишу "Shift";


> '/([а-яёa-z]+)\\s([.,;:!?])\\s([а-яёa-z]+)/ui'


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

> [.]\\s|\\A


А где гарантия что там ровно 1 пробел?

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

> 2) про Йоду.



> $yodaText = [];


лишняя строка

В общем, верно.

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


Да, можно не сохранять

>>626339

Пусть пишет, он еще учится.

>>626347

Длинные комментарии лучше сверху

>>626380

Надо вынести авторизацию на отдельный УРЛ, например /login

>>626394

> редирект обратно на ту страницу, с которой был запрос.


При этом не забывайте проверять что эта страница на вашем сайте, а не на чужом

>>626472

Либо \n либо переходи на шаблоны

>>626515

Потому что она для этого и предназначена

>>626617

Отвечаю: код мутный
Ответы 10-17 янв #940 #629820
>>626662

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

>>626683

Сделано верно, если хочешь можешь еще сделать через свитч или массив.

>>627207

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

>>627411

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

>>627490

Перевод строки это и есть либо символ \n либо 2 символа \r\n в зависимости от настроек редактора и операционной системы.

То есть

$a = "1
2";
$b = "1\n2";

это одинаковые строки если в редакторе конец строки кодируется с помощью \n

>>627500

Это работает только с консольными командами, выводящими данные в виде текста. ДА, можно брать результат и делать с ним что хочешь. В этом и сила командной строки.

>>627655

Ты молодец что помогаешь другим анонам.

>>627732

А ты гит изучил? Если нет, почитай git book для начала.
Ответы 10-17 янв #940 #629820
>>626662

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

>>626683

Сделано верно, если хочешь можешь еще сделать через свитч или массив.

>>627207

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

>>627411

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

>>627490

Перевод строки это и есть либо символ \n либо 2 символа \r\n в зависимости от настроек редактора и операционной системы.

То есть

$a = "1
2";
$b = "1\n2";

это одинаковые строки если в редакторе конец строки кодируется с помощью \n

>>627500

Это работает только с консольными командами, выводящими данные в виде текста. ДА, можно брать результат и делать с ним что хочешь. В этом и сила командной строки.

>>627655

Ты молодец что помогаешь другим анонам.

>>627732

А ты гит изучил? Если нет, почитай git book для начала.
#941 #629821
>>628112

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

>>628119

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

>>628125

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

>>628281

> var fn = [].shift.apply(arguments);


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

Ошибки у тебя есть. Например если в arguments много аргуменитов, а в args мало (названия кстати не очень удачные, лучше inner/outer наверно) то лиишние аргументы из arguments должны идти в конец списка, а у тебя не идут:

partialAny(fn, 1)(2, 3, 4, 5) -> fn(1, 2, 3, 4, 5)
Тред закрыт #942 #629827
Этот тред закрыт. Переходите в новый >>629822 (OP)

Не пишите здесь больше.

Ответы на посты с 18 по 20 января будут здесь сегодня или завтра. ответы на посты по 17 января идут выше. Если вас пропустили - напомните о себе в новом треде.

Этот тред закрыт.
#943 #632587
Аноны, которые оставили посты 18 и 19 января, с поста >>628328 по пост >>629306 !

Ответы на ваши ответы в новом треде:

>>632579\t
>>632580\t
>>632581
>>632582\t
>>632583\t
>>632586
#944 #633212
Аноны, с постами за 20 января, вам тоже всем ответил в новом треде: >>633207

Если пропустил - напомните в новом треде.
337 Кб, 1212x860
#945 #634221
И так, нужна помощь, я не знаю в какой раздел программирования идти, но мой вопрос связан с сайтами.
К делу:
Есть один сайт, как пример прbведу этот https://csgofast.com/. Я хочу его рипнуть и поставить к себе на хост с одной целью, но мне нужно что бы с этого сайта https://csgofast.com/ парсилась инфа "топ игроков, история" и т.п, ко мне на сайт, точнее на мой рип/шаблон.
Молю о помощи
Тред утонул или удален.
Это копия, сохраненная 2 февраля 2016 года.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски