«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Клуб изучающих PHP 90 Аноним 2017/06/03 14:06:06  №1000416 1
php-noob-1.png (33, 500x500)
500x500
cat-cafe-osaka.jpg (157, 1024x683)
683x1024
l0-sensei.jpg (34, 650x384)
384x650
just-google-it.jpg (156, 787x830)
830x787
Добро пожаловать в наш уютный тред. Тут мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет научиться программировать, кто-то - делать сайты, кто-то - просто размять мозги и заняться чем-то полезным.

Пожалуйста, пишите один большой пост вместо нескольких маленьких и не флудите не по теме.

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

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

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

Еще предыдущие треды ищутся в гугле по словам "клуб php" или в архиваче. Еще есть такой архив тредов: phpclub.rf.gd

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Что почитать

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

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

У ОПа нет аккаунтов и групп вконтакте, в фейсбуке, в твиттере, все "пхп-треды" там поддельные.

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

- Почему PHP? Потому что фейсбук и википедия на нем написаны, и вакансий море, и учить легко.
- Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.ru/6bfCY9lfl и получи личную немного устаревшую оффлайновую копию сайта (можно читать хоть на андроиде без интернета)
- Что надо знать чтобы найти работу - разработчику: PHP, SQL, HTML/CSS, JS, ООП, Git, композер, MVC, фреймворк. Верстальщику - HTML/CSS, JS, jQuery
- Можно подробнее про поиск работы, собеседования - нет, ОП писать не будет, но может кто из анонов захочет рассказать. Поищите тред перезвонивших, а также раздел /wrk/.
- Сколько времени надо изучать все это? - все зависит от тебя, но не меньше 6-8 месяцев
- Посоветуйте редактор кода - Sublime Text 3, Notepad++, PhpStorm
- Нужен ли ООП, фреймворки, MVC, git, composer? — Да, однозначно. Посмотри любую вакансию.
- Что самое главное для программиста? Умение аккуратно оформлять код.
- ОП, сделай за меня мою работу или домашнее задание? — Это конечно, хорошая идея, но нет.
- Подскажи сайты для поиска работы, я не умею гуглить? — hh.ru, geekjob.ru, moikrug.ru (склеен с brainstorage.me), fl.ru, upwork.com (бывший одеск). Имей в виду, что кроме фриланса есть еще постоянная удаленная работа (remote job) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.
Аноним 2017/06/03 14:07:21  №1000418 2
grammar-nazi.png (56, 500x644)
644x500
cat-sad.jpg (194, 1024x768)
768x1024
Код нужно писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.

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

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

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

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

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

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

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

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

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

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

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

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

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

Объясняй

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

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

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

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

Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
Ответы: >>1015476
Аноним 2017/06/03 14:10:53  №1000424 3
Ответы: >>1005550 >>1005551
Аноним 2017/06/03 14:15:02  №1000429 4
Ответы: >>1000431
Аноним 2017/06/03 14:27:02  №1000431 5
>>1000429
господа, не обращайте внимание на несоответствие цитаты и автора, потом исправлю, там неправильно БД перекатил просто
Ответы: >>1000495
Аноним 2017/06/03 16:48:38  №1000495 6
Снимок.PNG (4, 384x86)
86x384
>>1000431
Где подробнее почитать про двоеточие после списка параметров?
Ответы: >>1000509
Аноним 2017/06/03 17:16:41  №1000502 7
Господа, есть тут рабочие люди? Я в аухе от того, что у нас в конторе отказались от Yii2 и пропихнули Laravel. Все пропихнули под предлогом "в yii2 уебищные виджеты, нам нужно уходить от этих поделок". В итоге пришли к поделкам дятлов с гитхаба, которые чуть не с нуля каждый раз переписывать надо. Почему все дрочат на ларавел? Он из коробки для работы не годится, доки - просто пиздец говно. Есть у него киллерфичи какие-нибудь?
Аноним 2017/06/03 17:31:59  №1000508 8
Аноним 2017/06/03 17:36:02  №1000509 9
>>1000495
Собственно, мне стало интересно и я загуглил "что означает одинарное двоеточие после объявления функции в php"

Указывает тип возвращаемого значения.

http://php.net/manual/ru/functions.returning-values.php
Ответы: >>1000550
Аноним 2017/06/03 17:38:43  №1000510 10
>>1000502
Полагаю, потому что постоянная смена фреймворков создает рабочие места и повышает зарплаты, а стагнирование на одном - нет. То есть не стоит искать какую-то абстрактную истину и объективное превосходство.
Аноним 2017/06/03 17:40:37  №1000511 11
>>1000502
Не видел нигде документацию лучше чем для Laravel. Войти в фреймворк и писать REST API на нем можно через 4 дня уже, хуй знает в чем твоя проблема.
Аноним 2017/06/03 17:44:05  №1000515 12
>>1000502
Хайп и только, никаких киллер-фич нет. Там очень много статики (новичок может писать в привычном процедурном стиле) и eloquent-магии, которая постоянно стреляет по ногам как только ты собираешься делать что-то сложнее обычного CRUD'а. На пике высказывания одного из контрибьюторов в ядро PHP.

> "в yii2 уебищные виджеты
Это вообще какой-то странный аргумент, сейчас же такое повсюду на JS пишется и его фреймворках.

Аноним 2017/06/03 18:06:34  №1000519 13
>>1000502
Виджеты действительно говно почти все, так ведь их и не заставляют использовать.
Чисто по мне ларавел реально ужасен, исключительно громоздкий в тех местах, где этого не нужно, исключительно сахарный в тех местах, где важно понимание происходящего и так далее. Это еще просто мой вкус, хер бы с ним, опытные разрабы на любой фреймворк быстро переходят независимо от прозрачности. По зрелым соображениям он исключительно тормозной. Бенчи можно погуглить. Свои тоже проводил год назад, реально нет ничего лагучее этого дерьма. Брать ларавел - это стрелять себе в ноги, а потом докупать коляски, чтобы быть в состоянии передвигаться. Юи2 шустрее гораздо. Но для реальной скорости я и юи2 то не взял бы.
Ответы: >>1001035
Аноним 2017/06/03 18:47:49  №1000535 14
Аноны,посоветуйте редактор текстовый для убунту.спасибо
Ответы: >>1000646
Аноним 2017/06/03 19:20:21  №1000550 15
>>1000509
Спасибо, а что если тип возвращаемого значения указан как ?string , что значит знак вопроса?
Ответы: >>1000592
someApprentice 2017/06/03 20:05:31  №1000566 16
>>1000407
>Э? А почему оно должно меняться? Для обычных индексов надо заново запустить индексацию. Это индексер ведь выкачивает данные из базы и создает/обновляет индексы. Для RT-индексов надо дропнуть их и пересоздать заново наверно. Или может демон перезапустить.
Да, я имел ввиду что после индексации и перезапуска демона rt-индексы не обновляются.

sudo searchd --stop
sudo indexer --config sphinx.conf --all
sudo searchd --config sphinx.conf
#rt-индексы не обновились, нужно удалять их в ручную и перезагружать систему

searchd - на самом деле не запускает\выключает сам Sphinx? В документации написано что это всего лишь его инструмент
Ответы: >>1001955
Аноним 2017/06/03 20:43:22  №1000592 17
Аноним 2017/06/03 21:04:29  №1000607 18
если отбросить тему бабла,то какой язык лучше подойдет для своего проэкта?
Ответы: >>1000637
Аноним 2017/06/03 21:38:31  №1000637 19
Ответы: >>1000674
Аноним 2017/06/03 21:39:36  №1000640 20
Анончики,а есть тут кто из мухосрансков,после трех месяцев зубрежки с нул начавшие работать джунами/фрилансить за тарелку супа?
Ответы: >>1000755
Аноним 2017/06/03 21:42:26  №1000646 21
Ответы: >>1000652
Аноним 2017/06/03 21:49:10  №1000652 22
14627334761873.jpg (26, 492x289)
289x492
>>1000646
кек, он его осваивать будет дольше чем пыху.
Аноним 2017/06/03 22:42:46  №1000674 23
>>1000637
игра-головоломка на 2 игрока
Аноним 2017/06/03 23:43:42  №1000694 24
два чая.jpg (310, 1024x768)
768x1024
>>1000348
>Выглядит красиво, в т.ч. описание на гитхабе. Как верстал визуальную часть? Где хостил? За месяц, на мой взгляд, не плохо. Только названия коммитом типа "make it better" это неинформативно, название должно давать кратко понять, что произошло, и желательно чтобы коммиыт на каждую переделку/фичу были разными. Алсо, папка vendor на гитхабе не нужна, достаточно composer.json и ненавязчивое напоминание о зависимостях в md.

Взял дефолтный шаблон бутстрапа http://getbootstrap.com/examples/cover/ арендовал самый дешевый выделенный сервер за 130 руб https://ruvds.com/ru-rub/ получил голую убунту и доступ только через консоль, до сих пор удивляюсь как получилось так быстро настроить что-то рабочее, даже почту могу отправлять :)

>Откуда ты взял идею контроллеров и прочего?

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

Жаль что никто толком не отписался. То ли там баговать нечему, то ли просто застремались по ссылке пройти. На всякий случай еще раз оставлю http://bobylquote.ru/quote/
Ответы: >>1010339
someApprentice 2017/06/04 00:11:00  №1000716 25
Аноним 2017/06/04 00:19:06  №1000719 26
>>1000716
>ни одного комментария
>читабельно
Ну хуй знает
Ответы: >>1000924
Аноним 2017/06/04 00:25:33  №1000723 27
https://secure.php.net/manual/en/function.random-int.php

Что значит "Generates cryptographically secure pseudo-random integers"? Чем эта функция лучше mt_rand, при условии, что я генерирую числа в пределах 1 - 999999 для временного токена? Как понимаю, функция random_int отталкивается от каких-то более случайных значений, чем mt_rand, но работает в связи с этим дольше?
Ответы: >>1000752
Аноним 2017/06/04 04:56:50  №1000752 28
>>1000723

Почитай https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8_%D1%81%D1%82%D0%BE%D0%B9%D0%BA%D0%B8%D0%B9_%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80_%D0%BF%D1%81%D0%B5%D0%B2%D0%B4%D0%BE%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB

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

rand() использует линейный ГПСЧ, который абсолютно предсказуем и имеет относительно небольшой период https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D0%B3%D1%80%D1%83%D1%8D%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4

mt_rand() использует чуть более хороший вихрь Мерсена с большим периодом https://ru.wikipedia.org/wiki/%D0%92%D0%B8%D1%85%D1%80%D1%8C_%D0%9C%D0%B5%D1%80%D1%81%D0%B5%D0%BD%D0%BD%D0%B0

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

Вот еще статьи про генераторы

https://habrahabr.ru/post/151187/
https://habrahabr.ru/post/137864/


Аноним 2017/06/04 06:02:28  №1000755 29
>>1000640
Полгода обучения. Делаю проект для одного заказчика, на миску лапши хватает
Ответы: >>1000819
Аноним 2017/06/04 07:14:07  №1000758 30
Всем доброго утра. Хотел бы поинтересоваться, у меня есть один небольшой CRUD проектик со всякими свистелками, и там многочисленные методы которые отдают данные из бд шаблонам. Вот вопрос - как грамотно сделать абстракцию этих самых данных, т.к они все разбросаны по соответствующим моделям и чтобы мне вывести список какого то модуля мне надо делать зависимость к соответствующей модели. Это все очень не гибко выглядит. Да и хотелось бы чтобы было грамотное api в конце концов
Ответы: >>1001950
Аноним 2017/06/04 13:27:11  №1000819 31
14426731926991.jpg (46, 340x307)
307x340
>>1000755
Где нашел заказчика?
Аноним 2017/06/04 16:13:43  №1000924 32
3wVFfVZbNo.jpg (38, 640x360)
360x640
>>1000719
А зайчем там комментарии? И так вроде понятно все. Я не вбрасыватель этого кода, если что.
Ответы: >>1001022
Аноним 2017/06/04 16:21:29  №1000929 33
Анон, почему без if работает, а с конструкцией if уже не работает?
В html элементарная форма

if (isset($_POST["submit"])) {
$name = $_POST["firstname"];
echo "Hello, $name";
}
Ответы: >>1000939
Аноним 2017/06/04 16:38:50  №1000939 34
>>1000929
>$_POST["submit"]
А у кнопки name="submit"?
Ответы: >>1001032
Аноним 2017/06/04 16:44:24  №1000942 35
>>1000502
>пропихнули Laravel
Жиза.
Аноним 2017/06/04 17:35:03  №1000973 36
>>1000968

В старый тред написал случайно.
Ответы: >>1001278
Аноним 2017/06/04 18:50:55  №1001022 37
>>1000924
Дело в том, что код в котором не экономят на комментариях быстрее и проще понимать.
Ответы: >>1001031 >>1001117
Аноним 2017/06/04 19:12:29  №1001031 38
>>1001022
Ну и как бы ты поркомментировал гет корня, например? Ящетаю, что комментировать надо неочевидные вещи, а тут таковых нет.
Ответы: >>1001088
Аноним 2017/06/04 19:17:10  №1001032 39
>>1000939
Да, я думал, что нужно писать в value. Спасибо и сори за нубский вопрос.
Аноним 2017/06/04 19:25:26  №1001035 40
>>1000519
А что понимается под виджетами?
GridView какой-нибудь из коробки?

мимо вкатывающийся
Ответы: >>1001117
Аноним 2017/06/04 21:01:28  №1001088 41
>>1001031
Подозреваю, у тебя еще не было ситуации, чтобы ты открывал свой старый код, с которым не работал полгода-год. Тогда относительность понятия "очевидный" сыграет злую шутку.
Ответы: >>1001117 >>1001135
Аноним 2017/06/04 22:01:40  №1001117 42
>>1001035
Погуглил за тебя: https://www.tutorialspoint.com/yii/yii_widgets.htm
Суть в том, что такое гораздо проще писать на JavaScript из-за того, что он выполняется в браузере и позволяет манипулировать DOM'ом интерактивно. На PHP-виджетах такую штуку не сделать: http://tour.ubuntu.com/en/ (это эмуляция Ubuntu)
Тот факт, что в 2k17-м кто-то из-за PHP-виджетов меняет фреймворк, очень красноречиво говорит о компетенции таких разработчиков. Видимо, люди застряли в 2010-м и с тех пор никак не развиваются.

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

>>1001088
У меня такое было, когда процедурные портянки писал. Если разобраться с SOLID/GRASP и модульным (не браузерным) тестированием, то код на выходе будет гораздо проще в сопровождении.
Ответы: >>1001133
Аноним 2017/06/04 22:36:50  №1001130 43
Добрый вечер.
Недавно начал изучать php. Поставил задачу сделать небольшой сайтнебольшую информационную систему. Условно говоря, есть БД (предложение и спрос земельных участков), на данный момент реализована: авторизация, регистрация, изменение данных пользователя, форма заполнения пользователем предложения, вывод всех предложений пользователя.
Решил делать все сразу и походу разбираясь что и как, в следствии чего столкнулся с проблемой. https://ideone.com/XOXNOi

Структура вывода участков

пхп код : цикл выводящий html ровно столько, сколько товаров
И ПО ИДЕЕ я должен был с помощью кнопки отправлять значение переменной в сессию нужного товара. Но поняв, что я обосрался нужная переменная всегда будет принимать свое последнее значение (из за цикла) я приуныл и уже вторые сутки не сплю, пытаясь разрешить данную проблему. Понимаю, что подход может быть в корне не верный, но неужели нет выхода из сложившейся ситуации?
Ответы: >>1001139 >>1001155
Аноним 2017/06/04 22:57:46  №1001133 44
>>1001117
>Тот факт, что в 2k17-м кто-то из-за PHP-виджетов меняет фреймворк, очень красноречиво говорит о компетенции таких разработчиков. Видимо, люди застряли в 2010-м и с тех пор никак не развиваются.
Там всё-таки, скорее всего, просто вытягивают деньги у заказчиков и сами повышают собственную планку. Laravel более популярен в мире, чем Yii2, в среднем и зарплаты разработчиков выше.
Ничего личного, просто бизнес.
Анон выше сказал об этом.
А так всё верно, где-то видел статью на Хабре про то, что надо слать тех, которые говорят, "переписывайте на N, потому что это лучше/быстрее/молодёжнее" - и т.п., подставить любое. Чаще всего это не оправдано.
Аноним 2017/06/04 22:59:25  №1001135 45
>>1001088
Мы же здесь о конкретном случае говорим, что в этом контроллере комментировать?
Аноним 2017/06/04 23:04:14  №1001138 46
Когда в вакансиях пишут html/css/jsбиблиотека/фреймворк + ЖЕЛАТЕЛЬНО php/sql, то что они от меня хотят? Чтобы я мог с бд сам общаться? Вот рест апи могу запилить и там дальше уже делать, что нужно. Этого достаточно для дауна верстальщика? Что у вас там в бек-энде мастхев в моем случае? На ум еще только приходит что-то связанное с поддержанием сессии пользователя, который залогинился, еще куки там может...
Возможно вообще стоило не здесь спрашивать.
Аноним 2017/06/04 23:06:29  №1001139 47
>>1001130
Почему бы не выводить переменную в соответствии с нужным условием?
Объясни, что за переменная, для чего нужна именно? Всегда можно привязать такой вывод к ID или к счётчику - зависит от необходимости.
Ответы: >>1001154
Аноним 2017/06/04 23:26:01  №1001154 48
>>1001139
Вот допустим у нас 10 предложений
Все они вывелись на экран с помощью цикла
вывод html кода внутри которого представляет собой
-----файл-predlozheni9.php--------------
-------------------------------
for($i=0;$i<10;$i++){
echo "<div>Площадь:".$area." </div>";
$_SESSION['id']=$i; из за цикла значение переменной будет 9
echo '<a href="tovar.php">'
}
-------------------------------

---------tovar.php----------
-------------------------------
$id=$_SESSION['id']; и вот тут мне нужно значение товара, на которое я нажимал до этого, а я получу 9, вместо нужного
--------------------------------
Ответы: >>1001193 >>1001943
Аноним 2017/06/04 23:26:33  №1001155 49
>>1001130
почему все одним файлом?
Ответы: >>1001159
Аноним 2017/06/04 23:29:13  №1001159 50
>>1001155
что именно все?
запросы msq отдельным файлом держать?
Ответы: >>1001162
Аноним 2017/06/04 23:30:09  №1001162 51
>>1001159
разделить хтмл и пхп.в реале так не делают
Ответы: >>1001163
Аноним 2017/06/04 23:32:44  №1001163 52
>>1001162
мне показалось, что так удобнее на первом этапе, а чем больше пишу, начинаю понимать что лучше все структурировать хоть как то ))


Ответы: >>1001164
Аноним 2017/06/04 23:34:27  №1001164 53
>>1001163
для начала да.но когда проэкт станет больше,придется разбивать на файлы.каждый файл отвечает за какой то логический блок программы
Ответы: >>1001170
Аноним 2017/06/04 23:40:17  №1001170 54
>>1001164
>проэкт
Да ну тебя нахуй.
Аноним 2017/06/04 23:55:58  №1001178 55
В Slim framework нормально можно использовать Symfony библиотеки?
Ответы: >>1001943
Аноним 2017/06/05 00:54:28  №1001193 56
>>1001154
Немного не понимаю тебя опять.
Цикл же просто вывел десять (с 0 по 9) товаров, на что ты нажимал прежде?
А если тупо отнять от девяти 1 и такой $id вернуть, чтобы попробовать?
Такие тупые вопросы, которые я задаю, часто помогают натолкнуться на правильное решение, вообще когда объясняешь кому-то проблему - уже наполовину находишь решение, так что давай.
Ответы: >>1001200
Аноним 2017/06/05 01:20:46  №1001200 57
>>1001193
реализовал задуманное, использовал $_GET запрос и подключил файл
изначально не в том направлении думал ну или не догодался
Ответы: >>1001422
Аноним 2017/06/05 01:22:24  №1001202 58
Аноны, а как бы вы сделали автоматическую подгрузку комментариев после их добавления? (все это без перезагрузки страницы, естественно) У меня в голову лезут всякие дурные мысли типа по успешному завершению xhr post запроса вызвать функцию с еще одним xhr гет запросом, который будет брать все комменты и отображать последние. Сделал так, работает, но не уверен, что это правильное решение.
Ответы: >>1001204
Аноним 2017/06/05 01:24:41  №1001204 59
>>1001202
AJAX запросы каждую минуту с автоподгрузкой. Я так делал ещё в 2012, мне понравилось.
Ответы: >>1001206 >>1001858
Аноним 2017/06/05 01:36:11  №1001206 60
>>1001204
>каждую минуту
Долго же ждать. Надо моментально.
Ответы: >>1001207
Аноним 2017/06/05 01:36:57  №1001207 61
>>1001206
>Надо моментально.
Поставь проверку каждую секунду тогда.
Ответы: >>1001943
Аноним 2017/06/05 02:22:44  №1001216 62
Некоторые заказчики дают копейки за работу которая в разы больше стоит, например среднее приложение на yii2 - 10к, ну че за хуйня то
Ответы: >>1001218 >>1001425
Аноним 2017/06/05 02:33:15  №1001218 63
>>1001216
Зачем работать с нищебродами??? Попробуй писать Symfony2, говорят это самый высокооплачиваемый фреймворк.
Аноним 2017/06/05 06:52:17  №1001237 64
Вот у vps сразу обозначают мощности, скажем 2gb озу столько то герц, а как узнать какие мощности выделяет хостинг? ведь там указывается только кол-во гб под файлы
Ответы: >>1001305 >>1001311
Аноним 2017/06/05 06:53:25  №1001238 65
Сап посоветуйте хостинг. Хочу чтобы небыл Российский и подешевле.
Аноним 2017/06/05 07:17:14  №1001240 66
ОПчик, проверь уже студентиков. Я буксую, нихуя не учу уже неделю. Надо бы за js браться, но руки не доходят.
/Merkalov/
Аноним 2017/06/05 10:48:45  №1001278 67
Ответы: >>1001338 >>1002013 >>1002029
Аноним 2017/06/05 11:56:00  №1001305 68
>>1001237
я писал в тех. поддержку, ответили на все вопросы
Аноним 2017/06/05 12:10:51  №1001311 69
>>1001237

Обычно есть какой-то порог и по памяти, и по CPU, если ты его превышаешь, предлагают перейти на тариф подороже. Иногда еще в админке бывает график, который это показывает.
Аноним 2017/06/05 13:10:20  №1001338 70
>>1000968
>>1001278
Расшифровка ошибок делается как раз в шаблонах. Что-нибудь типа:
if ($error === 1) echo "Wrong integer";
Ну или что там у тебя в качестве шаблонов.
Ответы: >>1001846 >>1001943
Аноним 2017/06/05 15:55:01  №1001422 71
>>1001200
Вот мои тупые вопросы как-то помогли сориентироваться? Мне чисто с психологического аспекта это интересно.
Потому что по себе такое замечаю: стоит начать объяснять, как решение приходит само.
Ответы: >>1001520
Аноним 2017/06/05 15:57:18  №1001425 72
>>1001216
А какого типа приложение? Просто шаблон с курдами? Схерали это должно стоить больше, если вордпресс вообще все это из коробки делает?
Ответы: >>1001458
Аноним 2017/06/05 16:56:03  №1001458 73
>>1001425
Ну вот пили на вордпрессе то, для чего это говно лучше всего подходит, и рассуждения о цене свои среди подобных тебе домохозяек оставь.
Ответы: >>1001672
Аноним 2017/06/05 18:49:34  №1001520 74
>>1001422
честно, вчера был в таком состоянии, что не смог понять. что ты написал
я по другому сделал)
Аноним 2017/06/05 21:34:25  №1001638 75
Посоветуйте бесплатный хостинг с ssl
Мимонищук
Ответы: >>1001642
Аноним 2017/06/05 21:41:23  №1001642 76
Ответы: >>1001647
Аноним 2017/06/05 21:58:28  №1001647 77
>>1001642
Отлично, спасибо анон, буду пользоваться
Аноним 2017/06/05 22:33:21  №1001672 78
>>1001458
Так схерали это должно стоить больше, если это просто и по силам воннаби погромисту? Там gii все делает за тебя, композер и тп, а ты хочешь за голую хуиту 10к. Умерь аппетиты. Тут или что-то годное за большие деньги, или в пределах 10к несколько крудов. Охуевший совсем.
Ответы: >>1001682
Аноним 2017/06/05 22:50:46  №1001682 79
>>1001672
Я не хочу, я за это браться и не стал бы. Я тебе отвечаю просто. Если заказчик хочет хуйню, которая делается в два движения жопой на вп, но сделанную на фреймворке, притом за цену, как с вп - значит он куда-то не туда обратился. Или там не только круды.
Аноним 2017/06/06 01:56:16  №1001778 80
В чем преимущества doctrine2 от той же yii2 orm?
Ответы: >>1001943
Аноним 2017/06/06 08:37:52  №1001824 81
Написал для последнего задания регулярку

$regexp = '/\b([а-яё]+)([a-z]+)([а-яё]*)/ui';

В итоге при прогонке текста латиница выделяется скобками, но одна проблема - выделяет только первую латинскую букву в русском слове, последующие не выделяются. Была мысль запихать в цикл, чтобы прогоняло и ставило скобки, пока латиница в слове не закончится, но не выходит придумать, как это сделать.
Ответы: >>1001943
Аноним 2017/06/06 10:09:20  №1001840 82
>>1000502
Это хайп детка. Хуета когда станвоится на слуху, всем становится поебать что там на самом деле. Тупо вот про кодигнайтер, на котором писал последние 2 года нихуя не слышал вообще, ну кроме новостей с офф сайта, что там новая версия грядет и прочее ко-ко. Зато про ЛАравел куда больше инфо-шума чем про все блядь остальное. Ща уверен что если вакансии открыть, то будет 10 вакансий с требованиями его знать. Ну пойду хэло-ворд накачу на нем да можно резюмехи слать, почему нет.
Аноним 2017/06/06 10:38:13  №1001846 83
>>1001338

Я передаю в шаблон массив вида...

$errors = [
"field1" => "error desc",
"field2" => "error desc"
];

... и проверяю наличие ключей массива в шаблоне. Если определенный ключ есть, вывожу error description.
Аноним 2017/06/06 10:58:29  №1001853 84
Тысяча извинений за офтоп, пытаюсь осилить хтмл в подробностях, есть несколько вопросов:
1. Есть ли смысл НЕ закрывать одиночные теги? Типа <br />
2. Какой вообще смысл использовать method="get" вместо post?
3. Кто-нибудь вообще использует <code> <kbd> <samp> <var> <pre> ?
4.Посмотрел отличия XHTML от HTML, так и не понял: когда на практике используют XHTML?
5. Какой смысл в <output> FOR ??? Вроде без него и так нормально все показывает https://planner-rhinoceros-63366.bitballoon.com/
Аноним 2017/06/06 10:59:14  №1001854 85
>>1001853
не та ссылка
artist-salute-25183.bitballoon.com
Аноним 2017/06/06 11:08:18  №1001858 86
Ответы: >>1001943
Аноним 2017/06/06 11:28:12  №1001873 87
>>1001853
>2. Какой вообще смысл использовать method="get" вместо post?
Ссылки для поисковых систем, закладки для пользователя.
Обычно используют get для чтения данных, другие методы (post, put и т.д.) - для изменения.
Аноним 2017/06/06 11:29:30  №1001875 88
>>1001853
>4.Посмотрел отличия XHTML от HTML, так и не понял: когда на практике используют XHTML?
Никто не использует, он провалился. Последний стандарт HTML не совместим с ним.
Аноним 2017/06/06 11:40:32  №1001883 89
>>1001853
ну ты такой делаешь сайт

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

Ты просто у себя раскидаешь ссылки вида site.gg/user?id=123 и люди просто будут по ним кликать - изи
Аноним 2017/06/06 13:29:25  №1001923 90
>>1001853

1) в XHTML обязательно, в HTML не надо
2) это разные методы для разных целей, GET для получения информации, POST для внесения изменений
3) да, те, кто хочет вставить на страницу код, например в моем учебнике в ОП посте они используются
4) давно уже все разобрано тут

http://softwaremaniacs.org/blog/2005/12/19/xhtml-you-say/
http://softwaremaniacs.org/blog/2006/01/17/xhtml-once-more/

5) ответ можно поискать в спецификации HTML на англ:

https://html.spec.whatwg.org/multipage/forms.html#the-output-element

> The for content attribute allows an explicit relationship to be made between the result of a calculation and the elements that represent the values that went into the calculation or that otherwise influenced the calculation.

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

В HTML много необязательного. Например ты не обязан заключать время в тег time, но если захочется - то надо использовать именно этот элемент.
Аноним 2017/06/06 14:02:39  №1001943 91
>>1001824

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

>>1001778

doctrine2 использует Data Mapper, Yii2 - ActiveRecord.

Для начала ознакомься с этими паттернами если не знаешь их https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md

Главное отличие в том что с DM модели не привязаны к БД и не содержат кода для работы с БД. В теории, они не привязаны к доктрине тоже и в теории это позволяет заменить доктрину на другой DM, но я бы на это не рассчитывал. В то же время с Юи твои модели будут содержать код работы с БД и будут намертво привязаны к Юи.

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

>>1001338

Только вместо чисел лучше константы использовать.

>>1001858

Можно, там даже уже готовый протокол придуман (WAMP, Websocket application message protocol по моему).

>>1001207

Если много пользователей, серверу может стать тяжело.

>>1001178

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

>>1001154

Ты мыслишь не в парадигме REST. Идея REST как раз в том чтобы сессии были не нужны, а id нужного объекта содержался в URL.

Вот как с твоими сессиями скинуть кому-то ссылку на какую-то страницу?
Ответы: >>1002060
Аноним 2017/06/06 14:08:23  №1001950 92
>>1000758

Я не очень конечно понял вопрос, вот эту часть:

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

Постараюсь написать, что понял.

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

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

Можешь еще посмотреть например генератор админок для Симфони https://symfony.com/doc/current/bundles/SonataAdminBundle/index.html если не боишься.

Аноним 2017/06/06 14:14:22  №1001955 93
>>1000566

После searchd --stop надо проверять, например через ps, что он остановился. Тут все зависит, от того, что ты используешь - общесистемный демон (который скорее всего управляется через systemd) или демон, который ты руками запускаешь от своего пользователя. Судя по sudo, скорее всего ты пытаешься в обход systemd лезть к общесистемному демону.

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

> #rt-индексы не обновились, нужно удалять их в ручную и перезагружать систему
Это да, так как индексер обновляет только обычные. Я думаю, надо очистить данные из RT индексов, поменять конфиг, перезапустить демон. Проверить это можно через mysql клиент.

> searchd - на самом деле не запускает\выключает сам Sphinx
Если ты используешь версию из дистрибутива то лучше использовать стандартный способ управления демоном (скорее всего systemctl start/stop) а не обращаться напрямую. Так как там могут быть какие-то дополнительные скрипты или настройки добавлены от авторов дистрибутива.

Аноним 2017/06/06 14:55:12  №1001987 94
ОП, посоветуй пожалуйста. Допустим, я делаю тестхаб. Допустим, создаю тест, далее мне нужно создать вопрос к нему и соответственно передать в этот вопрос айди теста, как это сделать правильно? Я смог додуматься только до закидывания айди теста в урл, т.е. получается что-то вида .../question/create?id=322, оттуда я уже дергаю айди, вставляю в модель вопроса вместе с данными из формы и т.д. Использую Yii2, если это имеет значение.
Ответы: >>1001998
Аноним 2017/06/06 15:10:14  №1001998 95
>>1001987

Да, можно передавать id теста через query string, можно просто вписывать в URL вроде /tests/123/addQuestion/
Ответы: >>1002000
Аноним 2017/06/06 15:11:44  №1002000 96
Аноним 2017/06/06 15:23:40  №1002013 97
>>1001278

Оп, ответь пожалуйста на мой вопрос из прошлого треда.
Ответы: >>1002029
Аноним 2017/06/06 16:15:00  №1002029 98
>>1000968
>>1002013
>>1001278

Есть урок про обработку форм https://github.com/codedokode/pasta/blob/master/forms.md

Описанный там подход не годится? Т.е. одна функция-контроллер, которая обрабатывает и GET, и POST?

Соответственно мы либо

1) делаем чтобы addComment умела еще и выводить форму (и при ошибке мы ее видим)
2) либо делаем обработку формы в index

Ответы: >>1003272
Аноним 2017/06/06 16:46:31  №1002060 99
>>1001943
>Ты мыслишь не в парадигме REST. Идея REST как раз в том чтобы сессии были не нужны, а id нужного объекта содержался в URL.

>Вот как с твоими сессиями скинуть кому-то ссылку на какую-то страницу?

Концепция такая, что доступ на содержимое сайта дается только авторизованным пользователям.
Ответы: >>1002442
Аноним 2017/06/06 16:49:53  №1002063 100
Еще вопрос про веб в целом
Как вообще адаптируют страницу под разные разрешения экранов?
Каждое прописывают в хтмльном @media?
Или есть что-то с жс\пхп\...?
Ответы: >>1019250
Аноним 2017/06/06 18:08:33  №1002111 101
Ребята посмотрите пожалуйста код. Задача на ООП про докризисный период Комании "Вектор".
Сама задача тут http://archive-ipq-co.narod.ru/l1/pasta.html
Ответы: >>1002112 >>1002481
Аноним 2017/06/06 18:09:37  №1002112 102
Ответы: >>1002481
Аноним 2017/06/06 22:37:49  №1002377 103
Почему если у меня строка в кавычках из JSON, то strtolower() не работает?
Достал строку, пытаюсь её перевести в нижний регистр с кавычками - бесполезно.
Ответы: >>1002381
Аноним 2017/06/06 22:42:54  №1002381 104
>>1002377
>strtolower()
Надо mb_strtolower(), будь оно не ладно, всегда забываю.
Аноним 2017/06/07 00:30:14  №1002420 105
Ребят, на каком примерно уровне нужно знать php, чтобы попасть куда-нибудь джуниором хотя бы на 500$ в месяц? Что знать/уметь/практиковать?
Ответы: >>1002479
Аноним 2017/06/07 01:21:05  №1002442 106
>>1002060

Как одному авторизованному пользователю скинуть ссылку на товар другому авторизованному пользователю? Нужно использовать id в URL, а не в сессии.

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

Ответы: >>1002474
Аноним 2017/06/07 08:00:30  №1002474 107
>>1002442
>Нужно использовать id в URL, а не в сессии.
я так и сделал
Аноним 2017/06/07 08:45:58  №1002479 108
>>1002420
>на каком примерно уровне нужно знать php
на уровне знания
echo
foreach
if
function

>ы попасть куда-нибудь джуниором хотя бы на 500$ в месяц?
Ну то есть за три дня решил оповские задачки, далее берешь открываешь какой-нибудь htmlacademy и w3s, делаешь простейшую html страничку я не знаю там, форму регистрации какую-нибудь, на бутстрапе с сохранением юзера в базу.
Сюда потом вкидываешь, тебе пояснят где тут уязвимости и почему нельзя делать
$query = "INSERT INTO users (name, password) VALUES ($user_name, $user_password);";


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

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

Уж лучше изучать сеть, ооп, безопасность, базы данных, продвинутую верстку, js и прочее, уже работая с чем-то и имея миску супа, чем сидя дома дрочить регулярки и задачи на котиков-студентов месяцами прокрастинируя (как я делал в своё время), и спустя год всё равно устроиться туда же, куда мог бы устроиться тупо блядь сразу после прохождения первых уроков.
Ответы: >>1002547 >>1012377
Аноним 2017/06/07 08:55:41  №1002481 109
>>1002111
>>1002112
Я не оп, но отвечу.

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

у тебя в родителе должны быть не только геттеры, но и сеттеры(прочитай как раз что это). А когда создаешь наследника, то реализуешь не жесткое задавание всех параметров, а через сеттеры например. И в любой момент любому сотруднику заодно с их помощью можно будет зп поменять. Понимаешь?
Ответы: >>1002529
Аноним 2017/06/07 11:08:55  №1002529 110
>>1002481
То есть в классе Employee нужно добавить поля зарплаты, кофе и отчетов и сделать типа такой функции:
public function SetParam()
{
if ($this ->Profession == "Me")
{
$this -> solCoef = 400;
$this -> coffeeCoef = 15;
$this -> reportsCoef =150;
}
etc для других профессий
return $this;
}
А эти поля в классе профессии их вообще не определять.

И сразу еще вопрос по доступам к полям.
Ответы: >>1002548
Аноним 2017/06/07 11:58:07  №1002547 111
>>1002479
Пошёл ка я надрачивать джумлы с вордпрессами, и обмазываться несвежими говнами
Мимо такой же
Аноним 2017/06/07 11:58:08  №1002548 112
>>1002529
Не совсем понял что ты себе представил в голове, но откопал эту же задачу у себя на компе, точнее последнюю её версию, которую делал зимой и вот как у меня там было сделано. не помню выкладывал ли даже я её на проверку сюда, и если выкладывал, то получила ли она одобрение. Ща и разберемся.

пик 1 - все поля приватны, и доступ к ним только через геттеры и сеттеры, если не ошибаюсь, то это реализация инкапсуляции. То есть у тебя нельзя в коде в объект залезть и наворотить хуйни.
В общем вот тебе книгу залил хорошую, где в первых главах прям хорошо объясняется как и зачем так делать, у меня в своё время прям просветление от первых глав этой книги настало, до того как там про паттерны началась вода литься.
http://rgho.st/private/6FxD8kMsQ/988d18544217b8ca03c5b100e5a8c5a2

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

>public function SetParam()
Далее по твоей вот этой функции - я не совсем понял задумки, у меня вот такое вот васянство в итоге получилось: пик 2.

Суть в итоге всё та же. На выходе получаешь сотрудника, которому ты не можешь изменить никак его поля через:
$vasya->salary = 123;
Но можешь через:
$vasya->setSalary(123);
Из-за инкапсуляции.

Помоему в антикризисных мерах это необходимо будет, а когда ты пишешь
public $coffe = 20;
То это точно провал.

Ответы: >>1002563 >>1005478 >>1019755
someApprentice 2017/06/07 12:09:34  №1002556 113
https://postgrespro.ru/docs/postgrespro/9.6/ltree
>Для типа ltree определены обычные операторы сравнения =, <>, <, >, <=, >=. Сравнение сортирует пути в порядке движения по дереву, а потомки узла сортируются по тексту метки.

SELECT * FROM comments WHERE tree >= '51';

id | file | author | date | content | tree | depth
----+------+--------+---------------------+--------------+-------+-------
13 | 51 | Jack | 2017-06-07 03:11:26 | Hello World | 51 | 0
14 | 51 | Alice | 2017-06-07 03:11:38 | Hello Bob! | 51 | 0
15 | 51 | Bob | 2017-06-07 03:11:51 | Hello Alice! | 51.14 | 1
16 | 51 | Union | 2017-06-07 03:12:26 | Hello Jack; | 51.13 | 1
(4 rows)

Почему ничего не отсортировалось?
Ответы: >>1002562 >>1002608
Аноним 2017/06/07 12:13:29  №1002562 114
>>1002556
>Почему ничего не отсортировалось?
>всё отсортировано по id
Ты вообще нормальный?
Аноним 2017/06/07 12:14:38  №1002563 115
Аноним 2017/06/07 13:55:19  №1002608 116
>>1002556

Может ORDER надо добавлять?
Ответы: >>1002636
Аноним 2017/06/07 13:57:19  №1002613 117
14960565103042.jpg (477, 960x638)
638x960
Ответы: >>1002621 >>1002631
Аноним 2017/06/07 14:04:59  №1002621 118
>>1002613

Подожди еще немного, я постараюсь проверить. У нас всегда, к сожалению, большие задания с задержкой проверяются.
Аноним 2017/06/07 14:20:06  №1002631 119
>>1002613
>models
>views
>controllers
Это у вас в пэхэпэ такая бест практис - размазывать mvc по 100500 папкам? Нахуя объясните мне?
Ответы: >>1002637 >>1002638 >>1002670
someApprentice 2017/06/07 14:23:43  №1002635 120
Я по разному пытался писать. И даже пытался придумать рекурсивный запрос, но потом понял что ltree позволяет и так рекурсивно выбрать отсортированные записи. Нужно только разобраться как..!

SELECT * FROM comments WHERE tree >= '51' ORDER BY tree;

id | file | author | date | content | tree | depth
----+------+--------+---------------------+--------------+-------+-------
13 | 51 | Jack | 2017-06-07 03:11:26 | Hello World | 51 | 0
14 | 51 | Alice | 2017-06-07 03:11:38 | Hello Bob! | 51 | 0
16 | 51 | Union | 2017-06-07 03:12:26 | Hello Jack; | 51.13 | 1
15 | 51 | Bob | 2017-06-07 03:11:51 | Hello Alice! | 51.14 | 1
(4 rows)
Ответы: >>1002636 >>1002670 >>1002680
someApprentice 2017/06/07 14:24:12  №1002636 121
Аноним 2017/06/07 14:25:18  №1002637 122
>>1002631
Ты нашёл у кого спросить, я месяц как вкатился.
Аноним 2017/06/07 14:27:22  №1002638 123
>>1002631
А если классов будет, например, 100, ты будешь по все папке искать где контроллеры а где сервисы?
Ответы: >>1002641
Аноним 2017/06/07 14:31:00  №1002641 124
>>1002638
А зачем мне искать конкретно контроллеры или конкретно сервисы? Я буду искать файл с конкретным названием, а не все файлы, относящиеся к одному типу.
Ответы: >>1002644 >>1002670
Аноним 2017/06/07 14:32:19  №1002644 125
>>1002641
А как другой разработчик будет разбираться в твоем коде?
Ответы: >>1002651
Аноним 2017/06/07 14:39:06  №1002651 126
>>1002644
Что ты подразумеваешь под "разбираться"? От корки до корки читать его, лол? У него будет таск и он пойдет от entry point-а искать, где сидят те места, в которых нужно попилить, чтобы выполнить таск. Как ему в этом поможет разбиение по папкам?
Аноним 2017/06/07 14:45:42  №1002656 127
При чем тут таск, когда речь идёт о целой программе? По такой логике можно в одном файле вообще писать тогда. Главное таск решить!
Ответы: >>1002659
Аноним 2017/06/07 14:49:26  №1002659 128
>>1002656
>Главное таск решить!
Так и есть. Никому, кроме тебя самого, не интересно, как, где и что ты писал, главное - выполнение бизнес-требований.
Ответы: >>1002670
Аноним 2017/06/07 15:07:57  №1002670 129
>>1002631

Это не в PHP или MVC, а в любом языке хорошая идея раскладывать файлы по папкам. Раздражают например старые проекты на Си где 100 файлов свалены в одну папку и невозможно ориентироваться.

С папками гораздо удобнее: тут контроллеры, тут вспомогательные классы, тут работа с БД, тут шаблоны.

>>1002635

Ты читал урок https://github.com/codedokode/pasta/blob/master/db/trees.md ?

ltree это реализация Materialized Path. Выбирать ветку дерева надо не по условию >= 51, а по условию 51.* или как-то так. В уроке вроде есть какие-то пояснения про этот паттерн.

>>1002641

В PHP путь к файлу обычно соответствует имени класса. Если у тебя класс Symfony\HttpFoundation\Request то путь к нему будет вроде vendor/Symfony/HttpFoundation/Request.php

Урок про PSR-4, если интересно https://github.com/codedokode/pasta/blob/master/php/autoload.md

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

>>1002659

Написание плохого кода увеличивает затраты времени на его поддержку и развитие в дальнейшем.
Ответы: >>1002680
Аноним 2017/06/07 15:29:10  №1002677 130
посоветуйте хорошие статьи по введению в ООП для дауна
Ответы: >>1002681
someApprentice 2017/06/07 15:40:08  №1002680 131
>>1002670
>Ты читал урок https://github.com/codedokode/pasta/blob/master/db/trees.md ?
Да, хоть и признаюсь, что сначала не особо внимательно прочитал про этот паттерн, т.к. у меня глаз сразу пал на технологию где это уже реализовано.

>Выбирать ветку дерева надо не по условию >= 51, а по условию 51.* или как-то так.
Я и так тоже пробовал

SELECT * FROM comments WHERE tree ~ '51.*';

id | file | author | date | content | tree | depth
----+------+--------+---------------------+--------------+-------+-------
13 | 51 | Jack | 2017-06-07 03:11:26 | Hello World | 51 | 0
14 | 51 | Alice | 2017-06-07 03:11:38 | Hello Bob! | 51 | 0
15 | 51 | Bob | 2017-06-07 03:11:51 | Hello Alice! | 51.14 | 1
16 | 51 | Union | 2017-06-07 03:12:26 | Hello Jack; | 51.13 | 1

и даже после перепрочтения урока по бд добавлял к запросу ORDER BY tree. Результат получается такой же как и если просто отсортировать колонку tree как строку, как в примере выше >>1002635 .

Ответы: >>1002684 >>1019250
Аноним 2017/06/07 15:40:21  №1002681 132
>>1002677
есть книга про ООП,но она сука на английском
Аноним 2017/06/07 15:44:30  №1002684 133
>>1002680

Достаточно SELECT ... ORDER BY tree если значения поля tree правильно проставлены.
Ответы: >>1002685
someApprentice 2017/06/07 15:56:43  №1002685 134
>>1002684
Что имеется ввиду под словом 'правильно'? В моём случае, с комментариями, не получится выставить значения по порядку т.к. они добавляются произвольно, если вы это имеете ввиду. Я разве неправильно составил дерево? Я начинаю сомневаться что можно отсортировать комментарии и по дате (или хотя бы по их расположению в бд), и по порядку движения по дереву одним запросом.
Ответы: >>1002954 >>1002979
Аноним 2017/06/07 15:58:14  №1002686 135
если я покупаю сервер,там пхп и БД уже поставлены?
Ответы: >>1002687
Аноним 2017/06/07 16:03:10  №1002687 136
>>1002686
Если VPS, то нет. Читай у каждого дилера что он там предоставляет.
Аноним 2017/06/07 17:54:34  №1002722 137
Аноны, можно ли сделать чтобы бекграунд стретчился по размеру окна браузера стандартными средствами HTML или нужны всякие JS, CSS, PHP? И если есть возможность киньте статейку где про это нормально расписано для совсем ламеров. Заставили делать лабу
Ответы: >>1002739 >>1002789 >>1019250
Аноним 2017/06/07 18:52:06  №1002739 138
Аноним 2017/06/07 19:58:23  №1002775 139
Если я потратил часа 2, 2.5 на решение задачки про айфон в кредит, значит ли это что я конч? Вобще за сколько по времени анон-ньюфаг в php решает такие базовые задачки?
Ответы: >>1002944
Аноним 2017/06/07 20:11:47  №1002789 140
Ответы: >>1002804
Аноним 2017/06/07 20:26:04  №1002798 141
.png (3, 621x166)
166x621
Помогите написать простой скриптик, для дела нужно, с программированием почти не знаком.
При вводе 12 переадресовывало на 12.html при вводе asfd1 переадресовывало на asfd1.html
Ответы: >>1002817
Аноним 2017/06/07 20:35:14  №1002804 142
>>1002789
Еще и шортлинк сделал, совсем время свое не ценишь
Аноним 2017/06/07 21:07:12  №1002817 143
Ответы: >>1002855
Аноним 2017/06/07 22:21:32  №1002855 144
Аноним 2017/06/07 23:13:10  №1002879 145
Может кто про эту книженцию пояснить? Начал читать - автор изъясняется грамотно и доступно, намного понятней чем это делает Зандстра или это может я даун?.
Вообщем смущает то что год 2006, сильно ли это критично?
Ответы: >>1002906
Аноним 2017/06/08 00:34:22  №1002906 146
>>1002879
В вебе дохуя критичен даже 1 год, нормальные книги переиздают каждый год.
Ответы: >>1002929
Аноним 2017/06/08 02:14:33  №1002929 147
>>1002906
Я б не сказал. Нормальные книги как раз годами ценятся, там достаточно универсальные знания, а переиздают каждый год всякие апдейты к руководствам по новомодным технологиям.
Аноним 2017/06/08 03:28:49  №1002944 148
>>1002775
Все окей. У новичков в программировании она часто туго идет. Иногда по пару дней делают.
someApprentice 2017/06/08 05:31:07  №1002954 149
>>1002685
Возможно имелось ввиду добавлять к дереву ещё и id комментария. Гугл предлагает использовать функцию lastval(), но поскольку я использую ORM придётся сначала добавлять запись в бд, а затем обновлять её.

Очень плохое решение.
Ответы: >>1019250
Аноним 2017/06/08 05:32:50  №1002955 150
пыхачи, а есть преимущества у php перед asp.net?
Ответы: >>1002956
Аноним 2017/06/08 05:35:10  №1002956 151
>>1002955
Два схожих инструмента. У каждого свои профиты. Спрашивай подробнее.
Ответы: >>1002960
Аноним 2017/06/08 05:48:36  №1002960 152
>>1002956
скорость работы, скорость разработки, сопровождаемость проектов
Ответы: >>1002963
Аноним 2017/06/08 05:56:10  №1002963 153
>>1002960
Работал с asp.net пару лет назад, не знаю как сейчас, но скорость разработки довольно маленькая, в основном из-за того, что приходилось довольно долго исправлять непонятные незадокументированные баги, на некоторые msdn давал ответы, на некоторые давал неправильные, на некоторые вообще не давал.
Сопровождаемость - хз. Сейчас там сидит админ и админит это, периодически перезагружает сервак из-за каких то проблем с кешем. А так проект работает до сих пор.
Честно говоря PHP проще в этом отношении, всё задокументированно и описано в 1000 разных источниках. Относительно сопровождаемости запилил и всё работает. Вон 1с запилили свой битрикс на PHP5.3 и как-то всё это до сих пор не развалилось.
У asp есть довольно весомый профит в виде корпоративного саппорта из коробки всяких вкусностей. Например запилить сайт связанный с MSSQL можно буквально за день, а прикрутить авторизацию из домена - ещё сутки.
Ответы: >>1002985
Аноним 2017/06/08 08:23:25  №1002979 154
>>1002685

Ты разобрался вообще в том, как работает паттерн Materialized Path? У меня такое ощущение, что пока не разобрался в теории. А просто где-то увидел пример и пытаешься сделать по аналогии, не понимая принцип.

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

Для этого каждому комментарию верхнего уровня проставляется какое-то значение, которое возрастает. Например: порядковый номер, id, время вставки. Затем, когда вставляется дочерний комментарий, он наследует номер родителя и добавляет к нему собственный номер.

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

Ну к примеру путь 001.003.002 обозначает, что наш комментарий имеет 2 предков и сам список комментариев такой:

001
001.001 <- это идут дети комментария 001
001.002
001.003
001.003.001 <- это дети комментария 001.003
001.003.002 <- наш комментарий
.....

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

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

Если хочется оптимизировать по максимуму, то есть еще более эффективные способы хранения пути. В случае с числом, оно кодируется цифрами, каждая из которых занимает 1 байт. Байт может хранить одно из 256 значений, но мы используем только 10. Соответственно для более эффективного хранения было бы лучше задействовать какую-то систему кодирования, использующую больше символов - base64, base127 и так далее. Лишь бы она не использовала точку. Ну и надо учесть что для хранения строки используется скорее всего кодировка utf-8 и нужно чтобы используемые символы бы эффективно в ней кодировались.

Если не использовать ltree, то можно сделать путь бинарным и использовать все 256 возможных значений байта. То есть сделать например что 1, 1.5 или 2 байта кодируют один сегмент пути. А точки тогда становятся не нужны. Это дает максимальную плотность хранения данных.

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

> Гугл предлагает использовать функцию lastval(), но поскольку я использую ORM придётся сначала добавлять запись в бд, а затем обновлять её.
Номер можно вычислять заранее, ну и даже если требуется обновлять комментарий, это не проблема с использованием транзакций.
Ответы: >>1003004
Аноним 2017/06/08 08:55:56  №1002985 155
>>1002963
Нельзя сравнивать компилируемый язык со статический сторогой типизацией и скриптоговно.
Ответы: >>1002991
Аноним 2017/06/08 09:03:37  №1002991 156
>>1002985
Ну вот, скатил всё в срачь. Досвиданья мальчик юниор.
someApprentice 2017/06/08 09:47:18  №1003004 157
>>1002979
>Ты разобрался вообще в том, как работает паттерн Materialized Path? У меня такое ощущение, что пока не разобрался в теории. А просто где-то увидел пример и пытаешься сделать по аналогии, не понимая принцип.
Я прочитал всё что было написано в уроке по древовидным структурам и в ссылках по PostgreSQL. Скорей всего я действительно просто не понял принцип. Я не уверен что я даже сейчас до конца его понимаю, но сейчас у меня всё работает и не возникает никаких вопросов. Я хотел бы иметь больше интереса к тому как это работает, но, сейчас, всё что меня беспокоит, это задача по js, в которой у меня полно ошибок и которую я не могу начать не закончив хостинг. Сейчас я поставлю шаблонизатор, сделаю несколько мелких фиксов, и всё будет готово. Сейчас только справлюсь с прострацией.


> Гугл предлагает использовать функцию lastval(), но поскольку я использую ORM придётся сначала добавлять запись в бд, а затем обновлять её.
>Номер можно вычислять заранее, ну и даже если требуется обновлять комментарий, это не проблема с использованием транзакций.
>Номер можно вычислять заранее
А можно подсказку как это сделать?

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

>транзакции
О каких транзакциях идёт речь?
Ответы: >>1003007
Аноним 2017/06/08 09:50:49  №1003007 158
Ответы: >>1003017
someApprentice 2017/06/08 10:11:15  №1003017 159
>>1003007
>Номер нового комментария вычисляется подсчетом числа комментариев-детей у нужного родителя и увеличением его на 1.
А тут имелся ввиду порядковый номер, а не id. Мне более по нраву использовать id. Это очень критично делать лишний запрос чтобы его получить?

Ответы: >>1003019 >>1003020
Аноним 2017/06/08 10:18:02  №1003019 160
>>1003017

Я же выше написал, что есть разные варианты:

- порядковый номер
- id
- время вставки

Чтобы получить id, в postgres по моему есть SEQUENCE (генераторы id). В MysQL с автогенерацией id его нельзя получить до вставки, но может быть можно сделать аналог sequence на основе таблицы с единственной ячейкой (только придется с блокировками повозиться).

id имеет тот недостаток, что требует больше места для хранения. Сколько места нужно зарезервировать для 32- и 64-битных id, предлагаю рассчитать самостоятельно.
Ответы: >>1003028
Аноним 2017/06/08 10:19:49  №1003020 161
>>1003017

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

Ответы: >>1003028
someApprentice 2017/06/08 10:52:49  №1003028 162
>>1003019
Да, простите, я видел что вы писали про id, я просто думал что можно как-то получить id с помощью ORM доктрины заранее а не писать нативные запросы.

>>1003020
Не очевидное решение, которое усложняет код (правда другие решения ещё больше его бы усложнили, но зато не было бы лишнего запроса). Как вы сказали, что нужно выбирать из вариантов, я сомневался какой вариант лучше, либо сделать ещё менее понимаемым код и уменьшить нагрузку на бд, либо делать лишний запрос. По мне так, в глобальном смысле, лучше один раз написать сложный код, чем каждый раз происходил бы лишний запрос к бд.
Ответы: >>1003031 >>1003032
Аноним 2017/06/08 11:18:36  №1003031 163
>>1003028

Я уже написал, что в postgres можно отказаться от автоматической генерации id при вставке записи (Доктрина это поддерживает), получать id для новой записи из SEQUENCE и вписывать вручную куда требуется:

$ id = ... получение id
$comment->setId($id);
$comment->setParent($parent, $id); // проставляет путь

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

Для генерации id в таких случаях можно использовать например UUID ( https://ru.wikipedia.org/wiki/UUID ). Для комментариев это конечно будет переусложнением, но я хочу просто показать, что есть разные подходы.

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

> По мне так, в глобальном смысле, лучше один раз написать сложный код, чем каждый раз происходил бы лишний запрос к бд.
Я бы не назвал это сильным усложнением. Мне нравится вариант с номерами так как он позволяет делать более компактный путь, понятно что требуется запрос для вычисления номера, но это по моему не проблема.
Ответы: >>1003975
Аноним 2017/06/08 11:23:36  №1003032 164
>>1003028

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

Простой пример - подсчет числа комментариев к посту, выгоднее сделать SQL запросом (а еще выгоднее может быть просто хранить его в посте) чем выбирать все комментарии из БД.
Аноним 2017/06/08 11:31:14  №1003034 165
1.PNG (27, 905x258)
258x905
Анончики, помогите советом.

Есть один сайт, сделан на Битриксе. На этом сайте есть форма опроса. Как я понимаю, после нажатия на кнопку Submit данные из формы передаются в суперглобальный массив POST. А оттуда их забирает некоторый скрип, который их обрабатывает и записывает в базу данных.

Я делаю мобильное приложение и мне нужно реализовать в нём эту голосовалку. Т.е. мне нужно как-то наебать скрипт и отправить ему заполненный массив POST минуя формочку на сайте. Правильно я понимаю?

И воторой вопрос: как мне найти этот сраный скрипт в файловой системе сайта? Почему здесь action="/" стоит слэш, вместо имени скрипта?
Ответы: >>1003035
Аноним 2017/06/08 11:36:01  №1003035 166
>>1003034

Ты слышал что-нибудь про протокол HTTP и HTTP-клиенты? Без этого делать приложение будет затруднительно потому что в данной ситуации надо использовать библиотеку-HTTP-клиент.
Ответы: >>1003041
Аноним 2017/06/08 11:55:31  №1003041 167
>>1003035
Я понимаю, что мне нужен будет протокол HTTP для того, чтобы отправить POST на сервер. Ты мне лучше расскажи, как мне откопать в структуре сайта скрипт, обрабатывающий этот запрос?
Ответы: >>1003043
Аноним 2017/06/08 12:08:26  №1003043 168
>>1003041

В атрибуте action формы не требуется указывать "имя скрипта". Там указывается URL, на который отправляются данные формы методом POST. Соответственно, этот URL разбирается программой на сервере, если это Битрикс, то тебе придется разбираться, как именно он анализирует URL запроса и где там находится обработчик этого запроса. Я не специалист по Битриксу.

Скорее всего этот запрос обрабатывает какой-то модуль голосования, встроенный в Битрикс. Так что я бы погуглил документацию битрикса по этому вопросу.
Ответы: >>1003044
Аноним 2017/06/08 12:13:29  №1003044 169
>>1003043
Блин, фигово. Я думал может есть какие-то способы выдрать путь к скрипту из настроек формы. Спасибо. Пошёл читать документацию.
Аноним 2017/06/08 15:14:42  №1003128 170
Где ошибка?Не ругай сильно
Аноним 2017/06/08 15:22:04  №1003135 171
>>1003128
Ошибка на Ideone.
Он сейчас тупит с функциями с mt.
Пробуй лучше тут: https://3v4l.org/
Аноним 2017/06/08 15:23:05  №1003136 172
>>1003128
Ещё у тебя "erore_reporting", лолка.
Аноним 2017/06/08 15:23:12  №1003137 173
Аноним 2017/06/08 16:41:47  №1003163 174
>>1003128
Вот те рабочий код еще на всякий случай.
И старайся в следующий раз еще и код ошибки демонстрировать
<?php

error_reporting(-1);

echo "Бросаем кубик...\n";

$min = 1;
$max = 6;
$rand = mt_rand($min, $max);

echo "Выпало: $rand";
Ответы: >>1003171
Аноним 2017/06/08 17:00:33  №1003171 175
>>1003163

спасибо все куда проще былоу меня сейчас другая проблема
Ответы: >>1003172 >>1003173 >>1003192
Аноним 2017/06/08 17:02:44  №1003172 176
>>1003171
Скинь код текстом на пастебин чтоли
Ответы: >>1003175
Аноним 2017/06/08 17:04:38  №1003173 177
>>1003171
В 17 строке /n должен быть внутри ковычек "блабла\n";
Аноним 2017/06/08 17:07:49  №1003175 178
Ответы: >>1003177 >>1003181
Аноним 2017/06/08 17:09:25  №1003177 179
>>1003175
Огонь. Код теперь работает?
Аноним 2017/06/08 17:10:49  №1003181 180
>>1003175
В 11 строке забыл в конце ; поставить
Ответы: >>1003185
Аноним 2017/06/08 17:12:21  №1003185 181
>>1003181
теперь в 22 показывает ошибку
Ответы: >>1003197
Аноним 2017/06/08 17:22:06  №1003192 182
>>1003171
ВСЕ РЕШИЛ нужно было добавить exit(); после каждой строки
Ответы: >>1003196 >>1003200
Аноним 2017/06/08 17:26:05  №1003196 183
>>1003192
хотя теперь каждый раз пишет что победил ии хотя результат может говорить о обратном
Ответы: >>1003199
Аноним 2017/06/08 17:27:48  №1003197 184
>>1003185
В 22 линии не else, а elseif
В 14 $copmSum замени на $compSum
В 16 не $anonDise2, а $anonDice2
Ответы: >>1003199
Аноним 2017/06/08 17:28:52  №1003199 185
Ответы: >>1003207
Аноним 2017/06/08 17:29:29  №1003200 186
>>1003192
Потому что exit срабатывает только 1 раз когда встречается впервые. Он тупо прекращает дальнейшее выполнение скрипта. http://php.net/manual/ru/function.exit.php
Аноним 2017/06/08 17:31:17  №1003204 187
Аноним 2017/06/08 17:36:50  №1003207 188
>>1003199
Жесть, человече))) Подумай немного и посмотри на условие предпоследнее и последнее. elseif ($anonSum > $compSum) {
echo"Человек победил\n";
} elseif ($anonSum < $compSum) {
echo "ИИ лучше всех\n";
}
Ответы: >>1003210
Аноним 2017/06/08 17:41:13  №1003210 189
>>1003207
Да я уже заметил Спасибо <3
Ответы: >>1003217
Аноним 2017/06/08 17:49:32  №1003217 190
>>1003210
Можешь еще в конце добавить
else {
echo "Божественное вмешательство\n";
}
Аноним 2017/06/08 19:23:24  №1003256 191
Почему у меня 0 в ответах? Мне нежно через цикл все находить или через функции в цикле? Пожалуйста укажите на ошибку!Решать не нужно!!!!!
Ответы: >>1003264
Аноним 2017/06/08 19:58:18  №1003264 192
>>1003256
Опять начинаешь, реактивный? Поправил тебя http://ideone.com/BgG9LI

У тебя вычислился $otvet один раз и не изменялся.
Ответы: >>1003267
Аноним 2017/06/08 20:03:28  №1003267 193
Ответы: >>1003269
Аноним 2017/06/08 20:08:04  №1003269 194
>>1003267
Я прикалывался, бро. Через год для тебя все будет изи-бризи.

Да тебе надо в цыкле вычислять otvet на каждой итерации.
Он у тебя оди раз вычислился а потом только использовался.
Ответы: >>1003271
Аноним 2017/06/08 20:11:50  №1003271 195
Аноним 2017/06/08 20:13:36  №1003272 196
>>1002029
>делаем чтобы addComment умела еще и выводить форму (и при ошибке мы ее видим)

Что значит выводить форму? Как это? Мне не чтобы все формы страницы обрабатывал один метод контролера, он очень толстый получится.
Ответы: >>1003273 >>1003354 >>1006199
Аноним 2017/06/08 20:14:06  №1003273 197
Аноним 2017/06/08 20:18:21  №1003275 198
Добрый анон, вот цикл из задачки про полиндром. Подскажи, что не так и почему не работает? Вобще, в том ли я ключе думаю?

for ($i=0; $i <= $halfLenght; $i++) {
if (mb_substr($text, $i, $i + 1) == mb_substr($text, gmp_neg($i)/инверсия переменной/ ) {
echo "Полиндром!";
}
else{
echo "Не Полиндром";
}
Ответы: >>1003276 >>1003281 >>1019250
Аноним 2017/06/08 20:21:12  №1003276 199
>>1003275
Ой, обосрамс, извиняюсь
Сейчас залью на ideone
Аноним 2017/06/08 20:24:51  №1003281 200
Ответы: >>1003333 >>1003348 >>1003350
Аноним 2017/06/08 22:09:08  №1003333 201
>>1003281
В 9 строке закрывающую скобку забыл ")" в if
Аноним 2017/06/08 22:37:21  №1003348 202
>>1003281
Я со скуки тебе написал готовое решение
Аноним 2017/06/08 22:38:04  №1003350 203
Аноним 2017/06/08 22:45:58  №1003354 204
>>1003272
Использовать один метод контроллера для POST и GET запросов это следование принципу DRY.
А толстый контроллер это контроллер, в котором содержится бизнес-логика. Например в контроллере происходит хеширование пароля или отправка HTTP-запроса к стороннему API через curl или file_get_contents какой-нибудь. Оба этих сценария по хорошему нужно обернуть в объект, а из контроллера только управлять ими по принципу чёрного ящика. Хотя, мне кажется что люди, не пишущие юнит-тесты, этого никогда не поймут.
Ответы: >>1003458 >>1006199
Аноним 2017/06/08 23:10:47  №1003364 205
А можно каким то образом посмотреть как устроены функции в php? Например, посмотреть код функции count() или любой другой?
Ответы: >>1003385 >>1003386
Аноним 2017/06/09 01:11:02  №1003385 206
Аноним 2017/06/09 01:11:10  №1003386 207
>>1003364

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

Вот исходный код интерпретатора PHP: https://github.com/php/php-src

Си, как ты можешь заметить, внешне напоминает PHP, но есть и отличия:

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

Например код в PHP: $a = 1 соответствует такой строчке на Си: int a = 1;

Вот функция на Си, которая вызывается при вызове функции count в PHP: https://github.com/php/php-src/blob/master/ext/standard/array.c#L776

Тут видно, что идет проверка типа аргумента функции count и в зависимости от этого вызываются другие функции. Вот кусочек кода который отвечает за массивы:

> zend_long cnt; // объявляется переменная типа zend_long
> ...
> case IS_ARRAY:
> cnt = zend_array_count(Z_ARRVAL_P(array));
> ...
> RETURN_LONG(cnt);

То есть вызывается функция zend_array_count. Вот ее код:

https://github.com/php/php-src/blob/master/Zend/zend_hash.c#L295

К сожалению, чтобы его понять, придется изучить не только Си, но и способы хранения php-данных (вроде массивов). Они описаны например тут https://romka.gitbooks.io/php-internals-book-ru/

Я могу сказать, что в случае с count(), там в структуре, представляющий php массив, хранится число элементов и count просто возвращает это значение.
Аноним 2017/06/09 10:18:46  №1003458 208
>>1003354

Но что тогда должны делать остальные экшны? Они все public методы и вызываются роутером через URL формата http://localapp/controller/action. Т.е. как они тогда вообще могут взаимодействовать с пользователем, если у них отнять POST и GET методы?
Ответы: >>1019251
Аноним 2017/06/09 10:31:36  №1003464 209
Могут ли хелперы в MVC обращаться к супер глобальным переменным вроде Cookies? Или только контроллеры могут с ними работать.
Ответы: >>1003476 >>1006199
Аноним 2017/06/09 11:15:56  №1003476 210
>>1003464
В кодигнайтере через хэлперы и сделано.
Пишешь:
$this->load->helper('cookie');
А потом через методы хэлпера работаешь с куками (в контроллере например)
Я хз карчое что ты имеешь в виду.
Ответы: >>1003497
Аноним 2017/06/09 11:57:03  №1003497 211
Ответы: >>1006199
Аноним 2017/06/09 17:26:02  №1003617 212
Аноны, получил свой первый заказ в жизни. Заказ состоит в том, чтобы написать плагин к вордпрессу. Вот требования: https://pastebin.com/vk08xFBP

Дайте, пожалуйста совет, с чего вообще начать? Ведь это мой первый проект.
Аноним 2017/06/09 17:48:04  №1003628 213
Как трекать среднее время сессии за день для юзера? Как ее вообще трекать? Php, laravel.
Ответы: >>1003884 >>1003920 >>1006198
Аноним 2017/06/10 06:04:30  №1003884 214
Аноним 2017/06/10 11:10:54  №1003920 215
>>1003628
Записать время логина, записать время логаута. Если нет логаута, записать время автоматического логаута.

Написать хранимку с одной строчкой: дайтдифф между двумя датами.
Аноним 2017/06/10 13:32:01  №1003975 216
>>1003031
У нас тимлид сделал генерацию ключей заказов на стороне сервера, т.к. сервера стоят у клиентов + центральный сервер куда все потом сходится. В итоге получили конфликты значений ключей и долго слушали матюки от клиентов, почему некоторые заказы не проходят в систему. Потом дизайн поменяли, добавив id клиента,где все генерируется.
Ответы: >>1003982
Аноним 2017/06/10 13:44:27  №1003982 217
>>1003975

Потому стоит изучать опыт других разработчиков. Я упоминал выше UUID и его алгоритм формирования, но есть еще другие системы, например в Twitter Snowflake ключ содержит 64 бита: https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake.html

Ну и есть презентация по теме, если кому интересно: https://www.slideshare.net/davegardnerisme/unique-id-generation-in-distributed-systems
Аноним 2017/06/10 13:47:17  №1003983 218
Вопрос по CSS.
Как сделать, чтобы таблица
<table>
<tbody>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
при изменении масштаба экрана и на телефона была адаптивной? Что она хочет от меня, я сейчас зарыдаю уже в голос...
Там бутстрап, не понимаю, как совладать с этой сучкой.
Она при изменении масштаба или на мобилах улезает вбок, нельзя даже прокрутить до её края.
Мне нужно, чтобы на мобилах она была просто по размерам контейнера, в которой находится, там можно будет раздвинуть, увеличить и так посмотреть.
Бесит уже, не могу просто.
Ответы: >>1003989
Аноним 2017/06/10 13:56:38  №1003989 219
Ответы: >>1004061 >>1004095
Аноним 2017/06/10 14:05:03  №1003992 220
Подскажите, как вывести в задании про случайное имя именно все четыре случайные слога, пушто я не догоняю этого. Я получил каждый слог, но вывести именно их в одно имя не получается.
Ответы: >>1004063 >>1006198
Аноним 2017/06/10 16:21:03  №1004061 221
>>1003989
Бро, спасибо, хотя всё это я так-то пробовал.
Но после твоей ссылки понял, что надо стили и для <tbody>, <tr> и <td> тоже переопределить для другого разрешения, а заодно ещё и <p>, <ul> и <li>, которые там есть внутри.
Я пердолилися только с самой <table>, вот те раз.
Аноним 2017/06/10 16:26:38  №1004063 222
>>1003992
Делай конкатенацию внутри цикла: получившийся слог, затем к этому получившемуся новый слог, потом другой новый.
$name .= $syllable;
Аноним 2017/06/10 17:06:11  №1004095 223
>>1003989
Верстка это ад, сука, ничего не получается всё равно.
Бутстрап столько всего переопределяет, что обосраться можно.
Ответы: >>1004318 >>1006198
Аноним 2017/06/11 06:20:07  №1004313 224
>>1000416 (OP)
Оп, привет.

>Но задачу на SPA хорошо бы сделать. Мало кто сейчас такие штуки умеет делать.

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

Решил для фронт-энд части использовать React (потому, что он и Angular на Upwork делят проекты 50/50, но React новее);
Серверная часть - Silex (потому что почти Symfony).

И то, и другое, мне не знакомо. С чего начать?

План такой:
0. чтения мануалов и создание хелоувордов React/Silex.
1. определиться с функционалом, и сделать варфрейм интерфейса;
2. проектирование бд;
3. создание части функционала серверной части при помощи Silex (регистрация?);
4. верстка необходимого части интерфейса для проверки серверной части;
5. интеграция React;
6. повторение п. 4 и 5 до полной готовности приложения.

Прочел туториал Реакта про игру Tic-tac-toe, сейчас возьмусь за доки и туты по Silex.

Какую версию ES использовать, ES3 или уже можно перейти на ES2015?


Ответы: >>1006198
Аноним 2017/06/11 07:28:13  №1004318 225
Ответы: >>1005134
Аноним 2017/06/11 12:10:39  №1004355 226
Ответы: >>1006197
Аноним 2017/06/11 13:26:31  №1004372 227
1.jpg (12, 260x184)
184x260
Аноны, не разбираюсь в этих ваших кудахтерах от слова совсем.
Это было вступление
Есть магазин на битриксе. У товара есть перечеркнутая цена. Как убрать эту полоску? С меня как всегда
Ответы: >>1004442
Аноним 2017/06/11 14:51:34  №1004404 228
У вас наверное самый ньюфагоориентированный тред,спасибо анонче
мимоньюфаг
Аноним 2017/06/11 15:34:24  №1004440 229
аноний,phpstorm удобная штука,но дорогая.я вот думаю накатить на второй раздел ОС и каждые 30 дней удалять,а проекты хранить на диске С.как идея?
Аноним 2017/06/11 15:35:32  №1004442 230
>>1004372
Отредактировать шаблон компонента/стили.
Аноним 2017/06/11 15:35:54  №1004444 231
>>1004440
Крякни ее, дебил. Ключи в инете гуглятся сразу же.
Аноним 2017/06/11 15:36:57  №1004445 232
>>1004440
Активируй его на левый сервер лицензий, нахуя эти заморочки с удалением.
Ответы: >>1004447
Аноним 2017/06/11 15:37:37  №1004447 233
Аноним 2017/06/11 15:38:58  №1004448 234
Ньюфаг вкатился.
<?php
define("kurs", 65.52);
$US_dolars = 650;
$roubles = $US_dollars * kurs;
echo "У вас $roubles рублей";
?>

Выдает ноль, яннп!
Ответы: >>1004449 >>1006197
Аноним 2017/06/11 15:40:46  №1004449 235
>>1004448
У тебя названия переменных разные, дятел.
Ответы: >>1004450
Аноним 2017/06/11 15:41:19  №1004450 236
>>1004449
Прогу прощения аноны, пожалуйста только не бейте.
Буду внимательней
Аноним 2017/06/11 15:43:59  №1004456 237
phpstorm vs netbens?
Ответы: >>1004490 >>1004546
Аноним 2017/06/11 15:51:18  №1004463 238
$this устарел?
Ответы: >>1006197
Аноним 2017/06/11 16:20:31  №1004482 239
Ответы: >>1004526
Аноним 2017/06/11 16:39:53  №1004488 240
>>1004440
Можно получить student license отправив им фото своего студня, как сделал я. Продление раз в год.
Аноним 2017/06/11 16:41:40  №1004490 241
>>1004456
бобы работают шустрее, вернее phpstorm тормозит настолько, что пользоваться им не приятно.
Аноним 2017/06/11 18:00:06  №1004526 242
Ответы: >>1004539
Аноним 2017/06/11 18:12:57  №1004539 243
>>1004526
что непонятно в тексте по ссылке?
Аноним 2017/06/11 18:23:34  №1004542 244
>>1004440
Найди в инстаграме любое фото студенческого билета (большинство студенток их очень любит фоткать после поступления, чтобы похвастаться) и зарегай левую почту , чтобы получить лицензию студенчесскую
Аноним 2017/06/11 18:32:28  №1004546 245
>>1004456
оба тормозят мой комп.я пользуюсь саблаймом
Ответы: >>1004549
Аноним 2017/06/11 18:38:12  №1004549 246
image.png (43, 443x198)
198x443
>>1004546
Да идите вы. Это сейчас у меня два проекта в шторме открыто, бывает и по 4. Нередко параллельно с другими иде. Как вы умудряетесь в 2017 лагадром у себя устраивать? У меня ведро 2010 года, лол.
Ответы: >>1004550
Аноним 2017/06/11 18:39:03  №1004550 247
Ответы: >>1004557
Аноним 2017/06/11 18:50:02  №1004557 248
image.png (23, 987x34)
34x987
>>1004550
Бичовый АМД на 4 ядра, 8 оперативки, без ссд. На скрине все, что сейчас запущено.
Ответы: >>1006197
Аноним 2017/06/11 19:24:44  №1004570 249
Аноним 2017/06/11 19:40:39  №1004576 250
>>1004571
Ну это пиздец. У меня нетбук мощнее. Мать с процем ищи подходящую бюджетную, сейчас как бы нет проблем с железом под комфортную разработку.
Аноним 2017/06/11 22:10:02  №1004649 251
2.jpg (188, 1157x1078)
1078x1157
https://tjournal.ru/44940-wow-42

Что думаете, господа? После таких новостей хочется всё бросить. В айти вообще возможно вкатиться не дроча код по 100 часов в неделю на протяжении 4-5 лет?
Ответы: >>1004653 >>1004878
Аноним 2017/06/11 22:12:20  №1004653 252
>>1004649
Ебанина уровня дом-2, забей.
Ответы: >>1004657
Аноним 2017/06/11 22:18:12  №1004656 253
>>1000416 (OP)
Как работать с русскими строками?
Есть $a = "собака";
Я хочу сделать $a[5] = 'и'; и нихера. Через фигурные скобки тоже никак. Как-то попроще, чем mb_substr можно?
Ответы: >>1004688 >>1006197
Аноним 2017/06/11 22:18:56  №1004657 254
>>1004653
н-н-н-о... дуров... лайкну...
Аноним 2017/06/11 23:08:15  №1004688 255
>>1004656
Пиздец, даже mb_substr_replace нет, итераторов, похоже, тоже нет? Это хотя бы во фреймворках решается как-то?
Аноним 2017/06/12 01:10:40  №1004738 256
1.png (10, 619x144)
144x619
2.png (33, 659x513)
513x659
Как в Slim в контроллере сделать проверку введенного в значения, и если там пусто, то перенаправить на домашнюю страничку, иначе отправить по нужной страничке и передать в нее имя?

1й пик роут
2й пик контроллер

Сейчас выходит какая-то параша.
Ответы: >>1006197
Аноним 2017/06/12 14:54:35  №1004875 257
Суп, есть один сайт anjuta.ru. Если ткнуть бронирование - квитанцию, сохраняется форма квитанции в виде экселя. Внезапно понадобилось изменить пару строчек в этой квитанции, какие мои действия, это сложно? Что надо знать? Парень, который делал сайт, куда-то уехал, я смогу поменять это, если я вообще в пыхе не разбираюсь?
Ответы: >>1004876 >>1004882
Аноним 2017/06/12 14:55:01  №1004876 258
anjuta.PNG (48, 1036x103)
103x1036
Аноним 2017/06/12 14:59:20  №1004878 259
>>1004649
Чет на первый взгляд скорее хрень. На выходе будет хороший кодер, но никак не программист. Наговнокодят костылей в погоне за скоростью (а в команде из нескольких балбесов без опыта проект превратится в полный пиздец), а потом на реальных проектах свои велосипеды за собой потянут. От такого старательного джуна команда конечно будет рада, но проектировать тоже кто-то должен.
Аноним 2017/06/12 15:05:49  №1004882 260
>>1004875
Меняешь пару строк в квитанции, сохраняешь, проффит.
Ответы: >>1004884
Аноним 2017/06/12 15:09:44  №1004884 261
>>1004882
Мне надо, чтобы посетители скачивали измененную квитанцию
Ответы: >>1004891
someApprentice 2017/06/12 15:29:01  №1004889 262
>>1000396
>> Как остановить setInterval, который был вызван в предыдущем событии?
>Есть clearInterval, но проще использовать setTimeout.
>clearInterval
А как его вызвать на интервале который был вызван до него?

//После клика на другой блок, интервал на первом кликнутом блоке не остановился
https://jsfiddle.net/tux1yebv/

>setTimeout
А зачем тут setTimeout, который вызывается всего один раз с делеем? Он сбрасывает setInterval?


>> Как лучше сохранять не отправленные сообщения?
>Можно сохранять их в localStorage. Но тогда есть риск, если пользователь на каком-нибудь общем компьютере набирал сообщение, то потом его может найти и прочесть другой человек. Можно сохранять сообщение на сервер. Но тогда может человек сотрет сообщение, а на сервере оно сохранится. Тоже некрасиво.
Мне нравиться вариант с сохранением на сервер, но где именно? Можно сделать отдельную таблицу unsendedmessages в БД.

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

С другой стороны, я видел, как в популярных мессенджерах, на разных устройствах\приложениях сохраняются свои не отправленные сообщения.

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


>Еще одна вещь - мне кажется, хорошим тоном было бы до отправки сообщения в чате писать информацию о том, куда сохраняется история этого чата. Чтобы пользователь знал, где будут храниться его сообщения. Никто почти так не делает, я только один раз видел это в каком-то линуксовом мессенджере, он спрашивал, надо ли сохранять историю. И это многое говорит об отношении разработчиков к приватности пользователя.
А какую именно информацию нужно написать? Расположение сервера где находиться БД? Или просто уведомить о том что сообщения сохраняются либо в БД, либо локально (в течении сессии)?

А что если один пользователь захочет хранить историю а другой нет? Тогда в любом случае сообщения будут храниться в одном экземпляре (если денормализовать сообщения на inbox и outbox).

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

http://phpclub.rf.gd/pr/res/919074.html#934872
>Если ты хочешь хранить сообщения на сервере (для истории и синхронизации), то надо хранить их зашифрованными. А ключ хранить где-то в другом месте. Но может быть лучше вооще их не хранить? Или хотя бы спрашивать пользователя, хочет ли он вести запись истории или нет. Программа, которая уважает приватность пользователя, не должна ничего записывать без его согласия.
>ключ хранить где-то в другом месте
А можете посоветовать где лучше всего хранить ключ?


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

notify = function () {
//отсылаем уведомление
$.ajax(...);
}

getNotify = function () {
//получаем уведомление
$.getJSON(...);

setTimeout(function() {
//сбрасываем уведомление
$.ajax(...);
},

1000
);
}

$(textarea).on('keypress', function(e) {
notify();
});

setInterval(function() {getNotify();}, 1000);

Наверно, тут никакого рассинхрона не будет, я не знаю. Я слишком запутался в вопросе как работают счётчики.

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

>В случае с использованием comet, вебсокетов или аналогичных технологий уведомление можно никуда не сохранять, а просто переслать от одного клиента другому (через демон-ретранслятор на сервере или может быть даже напрямую, если есть возможность установить peer-to-peer соединение между клиентами).
Подождите, я только изучу эти технологии прежде чем что-то спросить. Конечно написание демона-ретранслятора или установление p2p соединения (хотя в браузеры уже встроен WebRTC и должно быть не сложно) представляется мне чем-то сложным.


>Также, перед проектированием АПИ, советую почитать про REST и HATEOS (и далее, стандарт про шаблоны URL https://tools.ietf.org/html/rfc6570 ), но тут конечно есть разные мнения, ну к примеру в иделогии REST одним запросом нельзя получить несколько несвязанных массивов данных, а HATEOS раздувает размер ответа.
Это мне тоже нужно сначала изучить прежде чем что-то спросить.


>Насчет MVC, там у тебя все запутано. Ну вот например тут модель лезет в DOM:

>https://github.com/someApprentice/chat/blob/master/public/js/chat.js#L51
>Модель ведь по задумке должна хранить данные и реализовывать логику работы приложения, а не считать величину отступа где-то на странице.
Получается считать величину отступа нужно в отоброжении?

>> $('.contacts-not-found').remove();
>Вот вместо постоянного копирования этих кусков кода, обычно удобнее найти элемент и сохранить ссылку на него в переменную и далее работать с этой ссылкой. Это сделает и код аккуратнее, и заодно и ускорит работу, так как $(..) имеет сложность O(N) от числа элементов DOM на странице, там оптимизирован только поиск по id.
А где обычно создаются такие переменные? В самом вверху, перед "классами" MVC?

>Вот еще пример плохого использования jQuery: $('textarea[name="message"]').val($('textarea[name="message"]').val() + "\n");
Как тогда по другому добавить перенос на новую строку по нажатию Ctrl + Enter?


>> Contreller.prototype.getConversation = function(withUser) {
>> $.getJSON('api/getmessages.php?with=' + withUser, function(results) {
>> window.history.pushState({}, '', '/conversation.php?with=' + withUser);
> Во-первых, с историей лучше работать через JS-библиотеку, это позволит поддерживать браузеры без pushState(). Во-вторых, если со страницы диалогов вызвать эту функцию, в историю не запишется переход на ту же самую страницу? В-третьих, ты делаешь переход только после получения ответа, это плохо, так как при проблемах со связью и обновлении страницы переход не произойдет. Ну и нет обработки ошибок при выполнении запроса.
>Вообще, для работы с историей, есть такая штука, как клиентский роутер: https://www.google.ru/search?q=js+router&newwindow=1&gbv=1&sei=TWEyWc6YBYLVsAHegKrACg
Клиентский роутер это и есть JS-библиотека о которой вы упомянули в начале? Если нет, то что есть JS-библиотека в таком случае?

>Ну и нет обработки ошибок при выполнении запроса.
А что за обработка ошибок должна быть? Имеется ввиду та которая присходит при неудачном получении JSON?
Ответы: >>1006196
Аноним 2017/06/12 15:34:34  №1004891 263
>>1004884
Сохрани изменённую квитанцию на сервер же.
Ответы: >>1004893
Аноним 2017/06/12 15:45:04  №1004893 264
>>1004891
Это легко или легче пять соток заплатить какому-нибудь студентику, чтобы он это сделал?
Ответы: >>1004901
someApprentice 2017/06/12 15:49:12  №1004895 265
Забыл ещё спросить для расширения кругозора:

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

Спасибо.
Ответы: >>1005563
Аноним 2017/06/12 16:03:27  №1004901 266
Аноним 2017/06/12 17:39:01  №1004956 267
rUTSju2AzIE.jpg (143, 719x960)
960x719
Хеллоу ворлд!

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

А вот как организвать всю эту обработку в целом — я не знаю. Вот например, нужно несколько тысячь записей автоматически в БД сделать и их обновлять — как такое делается вообще-а? Что нужно почитать? Что-то про cron? Какие фреймворки стоит использовать? Все что я делал в PHP происходило в браузере, и я вообще не представляю, что делать с этим.
Ответы: >>1004966 >>1005218 >>1005562
Аноним 2017/06/12 17:52:46  №1004966 268
>>1004956
Ты знаешь что такое parser? Если нет, то загугли как его сделать на php. Если хорошо знаешь php, то легко сможешь написать собственный.
Ответы: >>1005218
Аноним 2017/06/12 18:43:19  №1004995 269
Какой пакет для программирования на PHP установить? Чтобы спокойно кодить примеры с учебников и т.д.? Кто что устанавливал? Только вкатываюсь.
Ответы: >>1005110 >>1005563
Аноним 2017/06/12 22:34:34  №1005110 270
Аноним 2017/06/12 22:57:32  №1005126 271
Это что реально оптимальный вариант кеширования динамики? Класть ключи в бд и делать класс-наследник от мемкашед?
https://habrahabr.ru/post/111508/
Ответы: >>1005128 >>1005562
Аноним 2017/06/12 22:58:53  №1005128 272
>>1005126
>2011
Нет, не оптимальный.
Ответы: >>1005131
Аноним 2017/06/12 23:08:52  №1005131 273
>>1005128
а какой оптимальный?
Аноним 2017/06/12 23:13:09  №1005134 274
>>1004318
Что бля?!
Нет, другой анон.
Так и не разобрался с той пердой, чёт приуныл.
Аноним 2017/06/12 23:46:48  №1005145 275
2017-06-1222-02-09.png (48, 1219x916)
916x1219
2017-06-1222-01-33.png (102, 992x1062)
1062x992
2017-06-1222-07-02.png (121, 1920x1080)
1080x1920
2017-06-1223-49-33.png (117, 1920x1040)
1040x1920
Недели не прошло, как спам посыпался, причем стереотипный такой, про дилдаки и увеличение члена. Откуда? Странички толком не проиндексированы даже.

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

Самая мякотка, что сильно не хватает знания линукса. ЛАМП, ВАМП, ВАГРАНТ, это хуйня, а боевой ВДС - совсем другое. Делаю одно - отваливается другое. А самое паршивое, когда не отваливается, а работает через раз, как мой фтп. Я уже не человек, а мистер Робот нахуй.

Сори за оффтоп, всё равно мертвый сезон.
Ответы: >>1005147 >>1005562 >>1006196
Аноним 2017/06/13 00:01:31  №1005147 276
>>1005145
Аноны спамят в шутку, вангую.
Ответы: >>1005149
Аноним 2017/06/13 00:10:48  №1005149 277
>>1005147
Бля. Тогда обидно

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

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

Аноним 2017/06/13 02:01:51  №1005169 278
Аноны подскажите все ли я правильно сделал.

http://ideone.com/32QpwQ Задание: дан текст из нескольких предложений, предложение состоит из русских слов, разделенных пробелами. Написать программу, переставляющую слова в предложениях в обратном порядке. Знаки препинания в конце предложений (точка, восклицательный знак) можно не сохранять. не смог сделать на русском, что бы большие буквы были в начале предложения и маленькие в конце.

http://ideone.com/XnwxXg Дана сумма, находящаяся в банке на счету, в рублях. Вывести ее в текстовом виде вроде "шестнадцать миллионов десять тысяч три (16010003) рубля". может как то это можно оптимизировать или вообще все неправильно...

http://ideone.com/9fc5tF Задача: написать программу, имитирующую работу обычного кнопочного калькулятора (если у тебя нет калькулятора, можешь попробовать запустить его на телефоне/айфоне/компьютере). Калькулятору на вход дается строка, содержащая целые числа и знаки «+», «-», «» и «=». По знаку «=» калькулятор выводит ответ. Порядок действий не соблюдается (как и в обычном калькуляторе), то есть 2+22= выведет 8.

http://ideone.com/8hUwnm вывести выигрышные места в считалке

http://ideone.com/MSiND0 вывести текст вертикально

Спасибо.
Аноним 2017/06/13 03:27:41  №1005181 279
Ответы: >>1005182 >>1006194
Аноним 2017/06/13 03:27:58  №1005182 280
Аноним 2017/06/13 03:42:58  №1005185 281
>>1005169
СПОЙЛЕРЫ ЧТОБЫ НЕ ЗАСПОЙЛИТЬ СЮЖЕТ КОДА!!!
Ответы: >>1005562
Аноним 2017/06/13 07:35:41  №1005201 282
>>1005169
Нахуя спойлеры, поехавший
Аноним 2017/06/13 09:25:00  №1005218 283
>>1004966
>>1004956
Да не, мне не парсер нужен. Мне нужно просто понять, как php используется для автоматизированного бекенда.
Я просто фронтендер и php использовал для того, что называется "бизнес-логика". Мне просто нужен какой-то пример приложения на php, которое работает в фоновом режиме и обрабатывает данные базы хм, наверное, парсер как раз и подойдет для примера.
Ответы: >>1005233
Аноним 2017/06/13 10:08:52  №1005233 284
>>1005218
Если речь идет про cli, то все как обычно. Пишешь значит код, запускаешь как консольное приложение. Хош через крон, нехош так нахуй крон, похуй ваще, епта.
Можно заебенить вполне себе живучий воркер и запустить его каким-нибудь способом в виде демона например.
Ты сформулируй яснее сначала, а то хуйню какую-то несешь из которой не ясно, что именно тебе надо. Файлы, базы, апдейты, херь какая-то. Тебе как надо, типа запустил один раз, оно один раз отработало и все? Или же запустил и забыл, а оно там само работает до конца аптайма?
Аноним 2017/06/13 10:31:14  №1005238 285
ОООООППППП
Аноним 2017/06/13 13:47:46  №1005325 286
Не удаётся нагуглить, спрошу тут. Какие есть готовые пакеты для перевода DateInterval в текстовое представление (1 hour, 3 hours, 1 час, 2 часа)? Не хочется велосипедить, имея в арсенале Twig.
Встроенный фильтр date [1] твига умеет только форматировать через метод DateInterval::format, который очевидно ничего не знает о человекочитаемых единицах времени. Есть расширение [2] которое как раз переводит единицы времени и правильно определяет число (множественное/единственное) для разных языков, но оно почему-то работает только с DateTime, а мне нужен именно DateInterval + оно считает time ago, что не подходит.
Вот тут [3] такая же ситуация.

[1] https://twig.sensiolabs.org/doc/2.x/filters/date.html
[2] https://github.com/twigphp/Twig-extensions/blob/master/lib/Twig/Extensions/Extension/Date.php
[3] https://github.com/mikemadisonweb/DateIntervalTwigExtension/blob/master/src/Madison/Twig/DateIntervalExtension.php
Ответы: >>1005335 >>1005561
Аноним 2017/06/13 14:05:18  №1005335 287
>>1005325
У тебя вопрос в итоге в чем? В том, что ты не можешь сделать так что бы у тебя вместо:
1 часов, 2 часов, 3 часов, 4 часов, 5 часов, 6 часов...
выводилось по умненькому:
1 час, 2 часа, 3 часа, 4 часа, 5 часов, 6 часов
?

Или ты просто не понимаешь как интервал из массива вывести в виде строки?

Ответы: >>1005336 >>1005561
Аноним 2017/06/13 14:14:29  №1005336 288
>>1005335
> выводилось по умненькому:
> 1 час, 2 часа, 3 часа, 4 часа, 5 часов, 6 часов
Да, только для разных языков и без велосипедов, должны же быть готовые решения. Тут [1][2] есть даже примеры склонения слов для английского и русского и мне бы подошло это расширение, если бы оно работало с DateInterval.

[1] https://github.com/mikemadisonweb/DateIntervalTwigExtension/blob/master/src/Madison/Twig/DateIntervalExtension.php#L146
[2] https://github.com/mikemadisonweb/DateIntervalTwigExtension/blob/master/src/Madison/Twig/DateIntervalExtension.php#L32
Ответы: >>1005388 >>1005561
Аноним 2017/06/13 16:34:09  №1005388 289
Аноним 2017/06/13 18:22:36  №1005418 290
Анон, пни куда посмотреть где я накосячил. Задача про айпад.
http://ideone.com/81UVOP
Ответы: >>1005428 >>1005561
Аноним 2017/06/13 18:55:10  №1005428 291
Ответы: >>1005559
Аноним 2017/06/13 21:09:36  №1005452 292
последняя.jpg (165, 1168x507)
507x1168
Когда в методе стоит возвращать null, а когда выбрасывать исключение? Ситуация следующая:

http://ideone.com/SwUO54

Какой в данном случае способ лучше? Запутался после слов опа пикрелейтед.
Ответы: >>1005453 >>1005561
Аноним 2017/06/13 21:10:40  №1005453 293
>>1005452

Склоняюсь к тому, что ситуация из второго абзаца пикрелейтед и в таких случаях лучше null.
Аноним 2017/06/13 22:54:40  №1005478 294
Ответы: >>1005514
Аноним 2017/06/14 01:11:18  №1005514 295
>>1005478
У них счётчик навернулся. Или считает только скачки зарегестрированных юзеров. Только что скачал, а ничего не поменялось.
https://github.com/Merkalov/Students Аноним 2017/06/14 03:18:18  №1005550 296
>>997929
>>1000424

> Куки на 10 лет + привязка к IP-адресу.
Вообще, тут есть недостатки. У многих провайдеров динамический IP. В случае с беспроводным интернетом или с DSL-модемом - при пересоединении получаешь новый адрес. В теории можно определять по IP-адресу подсеть (через базу спарсенную с whois) и привязываться к подсети, но за 10 лет и это может поменяться, и надо поддерживать базу.

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

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

> ЗАКРЫВАЙТЕ ФОРМЫ
Эти ошибки можно обнаружить, проверив HTML код валидатором вроде этого https://validator.w3.org/ также есть какие-то расширения для браузеров, позволяющие быстро отправить страницу на валидацию.

По коду:

> https://github.com/Merkalov/Students/blob/master/README.md
Тут стоит еще кратко описать как развернуть проект (какие программы нужны, каких версий, какие команды выполнить, какой конфиг подправить).

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

Публичная папка у тебя есть, но она сделана как-то не так. Идея публичной папки в том, что в конфиге веб-сервера она прописывается как корневая папка и соответственно за ее пределами файлы недоступны снаружи. И значит index.php должен лежать в ней. Так будет безопаснее ну и как-то логичнее разделить файлы на публичные и непубличные.

Ну например сейчас у тебя можно скачать SQL дамп из-за этого.

В дампе не надо указывать имя БД, так как это не позволяет его залить в другую БД. Не нужно в дамп прописывать CREATE DATABASE.

> CREATE TABLE `info` (
Плохое название таблицы. Любая таблица хранит информацию, так что слово info ничего не значит. Также, я не очень понял зачем тут 2 таблицы для хранения информации о пользователях. Не помешал бы комментарий. Название можно было бы сделать user_profile или user_details.

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

https://github.com/Merkalov/Students/blob/master/config/127_0_0_1.sql#L33
> `userID` varchar(255) NOT NULL,
Это ссылка на таблицу users? Тогда тип явно должен быть не varchar. Также, если связь 1-1, то незачем делать 2 разных id, можно сделать userId первичным ключом.

Также, у тебя там как-то непонятно сделана привязка к IP, а можно с нескольких разных IP заходить?

> `name` text NOT NULL,
TEXT позволяет хранить до 65536 байт, что явно много для имени. Нужно использовать тут varchar.

> `gender` varchar(11)
Тут лучше подойдет ENUM (или на худой конец TINYINT). В коде пол надо сделать константами.

> `numberGroup` varchar(11)
11 символов многовато для номера группы

> varchar(255)
Кстати у varchar ограничение - не 255, а по моему 65535, но фактически там есть еще ограничение на размер строки таблицы в 65535 байт, один символ в utf8 занимает несколько байт, так что реально получится меньше.

> https://github.com/Merkalov/Students/blob/master/config/127_0_0_1.sql#L161
> ALTER TABLE `users`
> ADD PRIMARY KEY (`id`),
> ADD UNIQUE KEY `id_3` (`id`),
Эти индексы дублируют друг друга.

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

> https://github.com/Merkalov/Students/blob/master/config/Database.php
Вот ты сделал класс-фабрику для получения объекта Medoo. А для других классов ты тоже сделаешь свои фабрики для каждого? Если нет, то почему? Ну и посоветую почитать урок про DI https://github.com/codedokode/pasta/blob/master/arch/di.md

> https://github.com/Merkalov/Students/blob/master/index.php#L6
> ini_set('display_errors',1);
Это лучше прописывать в php.ini, иначе как твой код выкладывать на продакшен?

> require_once(ROOT . '\vendor\autoload.php');
Бекслеши не работают в линуксе. Лучше использовать прямые слеши.

> define('ROOT', dirname(__FILE__));
Зачем константы? Почему не просто переменная? У переменной ограничена зона, где она доступна в то время как константа доступна глобально, что поощряет использовать ее где попало.

> //Вызов FrontController
> use Controllers\FrontController;
use ставят в самом начале файла, а не в конце. Почитай PSR-1 и 2.

> $router = new FrontController();
Одинаковые вещи нужно называть одинаково.

> $this->routes = include($routesPath);
Лучше require, почему - смотри в мануале

> $url = mb_strtolower($_SERVER['REQUEST_URI']); //в нижний регистр
> trim($url, '/');
Вот это плохая идея. У тебя из-за этого получится так, что одной странице соответствует множество URL. Это плохо и с точки зрения логики (УРЛ это ведь идентификатор страницы и он должен быть единственный) и с точки зрения поисковой оптимизации. То же касается слешей, не надо делать 2 УРЛ отличающиеся только наличием слеша. Лучше выбрать один вариант, а при неправильном расположении слешей или регистре букв можно редиректить на правильный URL.

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

> } elseif ($total == $counter) {
Как-то переусложнено. Лучше писать так:

foreach ($routes as $route) {
if (...) {
return $this->handleRoute(...);
}
}

// вывод 404 ошибки

> $controllerName = ucfirst(array_shift($segments)) . 'Controller';
Лучше просто писать имя контроллера как есть в конфиге. Тогда оно например найдется при поиске по имени класса. То же касается и имени метода (хотя это мое мнение, во многих фреймворках делают как у тебя).

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

> self::_redirect('404', 302);
Вот я у каждого первого встречаю эту ошибку. Где такому учат? Редирект это ответ с кодом 302, он имеет смысл "искомая страница есть, но она в другом месте", а надо выдавать страницу с кодом 404. Почитай про коды статуса ответа в протоколе HTTP.

И не стоит начинать название функции с подчеркивания.

> ob_start(); //Уворачиваемя от вывода любой инфы, ведь мы всюду суём заголовки
Может лучше сначала вывести заголовки, а только потом тело страницы?

> https://github.com/Merkalov/Students/blob/master/controllers/InfoController.php#L26
> public function actionMyInfo()
> ob_start();
Зачем это тут второй раз? Есть же в фронт контроллере? И конечно не надо пытаться костылем заткнуть неудачную архитектуру.

> https://github.com/Merkalov/Students/blob/master/models/Cookie.php
Тут почему-то все методы статические. Однозначно стоит почитать про DI.

Класс Cookie назван неправильно. Он что, хранит информацию о какой-то куке? Нет.

То же самое касается метода checkCookie. "Проверить куку". Непонятно из названия, что делает этот метод, что он возвращает, а комментариев нет.

> $hash_cookie = md5($_POST['email']);
Ок, то есть зная email мы можем автоматически сгенерировать куку для авторизации от его имени?

Ответы: >>1019307
https://github.com/Merkalov/Students Аноним 2017/06/14 03:19:40  №1005551 297
>>997929
>>1000424

https://github.com/Merkalov/Students/blob/master/models/Student.php
Какой паттерн тут реализован? Прочитай урок, если не знаешь: https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md

Класс назван неправильно. Он что, хранит информацию о студенте? Нет. Значит название должно быть другое - например, StudentTableGateway или StudentDbHelper, или что-то еще такое.

Принцип MVC у тебя не соблюдается. Идея MVC в отделении кода обработки HTTP-запроса от внутренней логики приложения, а у тебя в одном классе смешана работа с БД, разбор параметров POST-запроса, работа с авторизационными куками и определение текущего пользователя. Вот у тебя есть метод addInfo(), а как его вызвать с произвольными данными, не полученными из формы? Чтобы допустим добавить студента программно, не через форму? Разумеется, с пустыми куками?

И перечитай внимательно урок https://github.com/codedokode/pasta/blob/master/arch/mvc.md

Особенно это:

> Например, в программе на PHP Модель не должна обращаться к внешним переменным вроде $_GET/$_POST/$_SESSION/$_COOKIE и не должна ничего выводить через echo. Все необходимые данные она получает через аргументы функций, и возвращает результат через return.

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

У тебя пока нет MVC, просто ты назвал папки controllers, models и views.

> public function searchID($searchQuery)
> "OR" => [
> "name" => $searchQuery,
> "surname[REGEXP]" => $searchQuery,
Это позволяет искать по части имени? Мне кажется, тут прямой SQL запрос был бы понятнее и читабельнее, чем сложная конструкция из массивов.

Ну и результат поиска помещается в переменную $userID - там только один id хранится, судя по названию?

> $full_name = $database->select('info',
> return array_shift($full_name);
Что-то я не очень понимаю, там разве нет метода для выборки единственной записи?

> public function getInfoSomeStudents($startLimit, $sort, $typeSort)
Тут нет проверки переменных sort и typeSort, это безопасно? Тут не сделают SQL инъекцию?

https://github.com/Merkalov/Students/blob/master/models/Helper.php
Этот класс назван неудачно, название ничего не говорит о содержании, также, у тебя валидатор зачем-то намертво привязан к массиву POST и не способен проверять данные из других источников.

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

https://github.com/Merkalov/Students/blob/master/models/Url.php
Класс назван неудачно.

https://github.com/Merkalov/Students/blob/master/models/Page.php
Неудачное название, плохо что HTML перемешан с PHP, на пагинатор зачем-то возложена функция подсчета записей в БД, и вообще пагинатор получился неуниверсальный и его нельзя использовать с другими табличными и нетабличными данными. Опять же, ты пока не можешь отделить работу с БД от подсчета страниц и формирование URL ссылки от формирования HTML тега <a>.

У тебя маленькое приложение и вся работа с БД должна быть собрана в 1-2 классах, а не размазана по приложению.

Наверняка, тебе что-то непонятно, задавай вопросы тогда.

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

Также, если вдруг не делал задачу про Вектор, то советую сделать, чтобы лучше разобраться с ООП.
Аноним 2017/06/14 04:29:32  №1005559 298
>>1005428
Спасибо, анон. Я затупил, там на изичах все.
Аноним 2017/06/14 04:42:55  №1005561 299
>>1005452

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

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

При этом функция все равно может выбросить исключение - ну например если id не числовой или если не удается соединиться с БД (PDO выбрасывает исключение PDOException в этом случае). То есть мы различаем штатные и нештатные ситуации таким образом.

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

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

> if (!isset($file)) {
Проверять на null надо через is_null или === null

>>1005418

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

У тебя есть return, но значение никуда не сохраняется, надо писать $x = func(...); чтобы его сохранить.

Ты же пишешь $a = mt_rand(1, 6), так же надо делать и тут.

>>1005336
>>1005325

Увы, не знаю, готового решения. Можно запилить что-то на основе http://php.net/manual/ru/class.messageformatter.php но если тебе нужен только один язык (русский), то может проще написать кодом.

В JS есть такие библиотеки: https://www.google.ru/search?q=js+time+library&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&newwindow=1&gbv=1

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

То, что встроено в DateTime - это по сути интерфейс к древней сишной функции http://man7.org/linux/man-pages/man3/strftime.3.html и конечно никаких склонений она делать не умеет.

>>1005335

У него вопрос, какие есть готовые библиотеки или расширения, чтобы не изобретать то, что уже изобретено.
Аноним 2017/06/14 04:43:31  №1005562 300
>>1004956

По крону запускать если нужно периодически, если одноразово, то руками в конcоли, можно через nohup, если долгая задача. Если запускать при загрузке сервера, то надо оформить скрипт как сервис в systemd.

>>1005185

Пусть будут спойлеры, что плохого-то.

>>1005145

Спам автоматизирован, боты просто ходят по интернету, ищут все формы, анализируют названия полей, подставляют в них подходящие данные и отправляют. Кроме капчи, можно проверять поддержку JS, а также делать поля-ловушки, которые не видны человеку, но которые бот может охотно заполнить. Особенно если оно называется name или email.

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

FTP советую не использовать, он небезопасен и передает все в открытую, если есть SSH доступ, то можно использовать SCP и программы, работающие поверх SSH.

>>1005126

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

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

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

Это называется "зависимость", то есть ключ user:123 зависит от записи в таблице пользователей с id=123 и он устаревает когда эта запись меняется в БД.

Но когда запись в кеше формируется на основе нескольких записей из БД, ситуация становится сложнее. Ну например, мы решили хранить в кеше зачем-то 5 последних постов пользователя. Теперь ключ кеша зависит от всех этих постов - если пользователь удалит или переименует пост, мы должны обновить ключ кеша. Для этого мы проставляем ключу теги с id постов, например [post123, post243, post565, post777, post 888]. Теперь, когда пользователь обновляет пост с id 888, мы находим все зависящие от этого поста ключи кеша по тегу post888 и удаляем или обновляем их.

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

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

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

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

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

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

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

- http://lib.custis.ru/%D0%9A%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%B2%D0%B5%D0%B1-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%D1%85_-_%D1%87%D1%82%D0%BE,_%D0%B3%D0%B4%D0%B5,_%D0%BA%D0%BE%D0%B3%D0%B4%D0%B0
- https://www.google.ru/search?q=%D0%BA%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5+%D0%B2+%D0%B2%D0%B5%D0%B1-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%D1%85&newwindow=1&gbv=1&sei=o4tAWcHbLsri6ATJtL34Bg
Ответы: >>1005637 >>1006764
Аноним 2017/06/14 04:44:37  №1005563 301
>>1004995

Ручками PHP, а если надо, то и Апач. В Оп посте есть частичная полезная информация.

>>1004895

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

Ну например, одна из проблем баз данных - число транзакций (изменений данных) в секунду. Она упирается в необходимость сбросить данные на диск и дождаться ответа о том, что данные физически записаны на поверхность диска (или в ячейки флеш-памяти, если это SSD), а не находятся где-то в кеше ОС или кеше жесткого диска. Только после получения ответа от ОС, что данные сброшены, СУБД сообщает клиенту (PHP коду) о завершении транзакции. Операция сброса на диск по моему назвыается sync() в Линуксе.

Причин, почему есть такое ограничение, много:

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

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

Случайный доступ относительно медленный. В тестах дисков всегда меряют 2 скорости - скорость последовательного чтения или записи большого файла и скорость случайного чтения 4Кб кусочков (соответствуют размеру сектора). И если первая скорость меряется десятками и сотнями мегабайт в секунду, то вторая намного меньше, особенно на магнитных (не SSD) дисках. В магнитных жествикх дисках головка может перемещаться только по радиусу (между дорожками). Магнитный диск крутится, и надо дождаться, пока нужный сектор окажется под головкой, потом перемещаться на другую дорожку, снова ждать. При скорости 15 000 обор/мин, мы имеем 250 оборотов в секунду и это ограничивает число операций случайного доступа, даже если предположить, что головка перемещается мгновенно.

Чтобы меньше ждать, СУБД кешируют сектора с данными в памяти - в MySQL это наызвается innoDB Pool cache. В этом случае нам не надо тратить время на чтение сектора, он уже есть в памяти. Но с записью ждать все равно приходится.

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

Информацию об этом можно поискать где-то тут на англ

- https://dev.mysql.com/doc/refman/5.7/en/optimization.html
- https://dev.mysql.com/doc/refman/5.7/en/innodb-storage-engine.html

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

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

Также, разработчики вконтакте выложили код некоторых своих хранилищ, и там есть интересная информация по теме:

- https://github.com/vk-com/kphp-kdb/blob/master/docs/ru/DBMS_Storage_Comparison.wiki
- https://github.com/vk-com/kphp-kdb/blob/master/docs/ru/KittenDB_Texts.wiki

Вконтакте использует специализированные хранилища на Си, которые оптимизированы на работу с разными типами данных (сообщения, лайки, фото, списки друзей, поиск). И конечно для максимальной скорости чтения они стараются все данные хранить в памяти.
Аноним 2017/06/14 06:59:24  №1005579 302
Как вывести трансляцию с вебкамеры на сайт?
Ответы: >>1005599
Аноним 2017/06/14 08:13:09  №1005599 303
Аноним 2017/06/14 09:46:46  №1005616 304
1.PNG (4, 412x98)
98x412
2.PNG (4, 412x110)
110x412
3.PNG (58, 670x1100)
1100x670
3ee0f8f2-e128-4848-b7ae-0d1d7a84d3d5 (107, 736x1048)
1048x736
Интересно ваше мнение про передачу параметров в методы классов. Это очень важный вопрос, который сводит меня с ума долгое время, надеюсь на feedback опытных программистов. Прочитайте вдумчиво.
Пока выполнял студентов, столкнулся с тем, что мои классы, связанные с отображением, требуют много разнообразной и слабо связанной между собой информации. Например, на скриншоте под постом отображению страницы требуются:
список студентов $students,
текст для показа режима работы сайта пользователю,
массив (возможно, пустой) текстовых сообщений пользователю,
набор ссылок для перемещения по результатам данного поискового запроса.
Для передачи параметров есть следующие способы:
1) Передавать параметры в виде набора аргументов (так передаются параметры внутреннему методу контроллера на первом пике).
Преимущества: сразу видно, какие данные и какого типа нужны методу извне; легко получить контекстную помощь IDE, меньше грамматических ошибок.
Недостатки: любое изменение параметров метода заставит менять сигнатуры всех его вызовов (добавлять/убирать параметр); невозможно использовать метод при наследовании или объявить в абстрактном классе.
2) Передавать параметры в виде array или arrayObject. В т.ч. рекомендуемый ОПом DependencyContainer.
Преимущества: можно использовать одну сигнатуру для всех вызовов метода даже в случае, если в методе что-то сильно меняется.
Недостатки: полностью отсутствует контекстная помощь IDE; приходится подглядывать а) в справку метода, где нужно описать подробно все необходимые записи в array и их тип, б) в source класса, который я хочу передать в качестве параметра. Если я хочу передать в array объект StudentMapper, то IDE мне не поможет, придётся лезть в StudentMapper и смотреть, какие аргументы требуют его методы; вероятность ошибки возрастает стократно. Если это не дно, то где оно?
3) Передавать параметры в виде объекта класса, в котором отдельными методами захардкодены типы получаемых данных и объектов. То есть, нелюбимый ОПом паттерн Registry.
Преимущества: можно использовать одну сигнатуру; можно использовать контекстную справку IDE внутри метода, которому передан Registry.
Недостатки: если делать Registry один на несколько клиентских классов, то в него придётся пихать данные для всех этих классов, тем самым в Registry будет маловразумительная каша, и класс, который передаёт параметры клиенту через Registry не будет точно знать, какие данные клиент оттуда возьмёт. Следовательно, IDE не сможет подсказать, от каких зависимостей (dependencies) зависит клиент.
Если же писать Registry отдельно для каждого клиентского класса или метода, то нужно написать много дополнительных классов. Помощь IDE станет лучше, но не будет идеальной.

Итак, какой метод вы предпочтёте в такой ситуации и почему? Если можно изменить ситуацию, то как бы вы это сделали?
Ответы: >>1005631 >>1005757 >>1006128
someApprentice 2017/06/14 10:30:51  №1005629 305
>>1000397
>Насчет MVC, там у тебя все запутано.
>Модель ведь по задумке должна хранить данные и реализовывать логику работы приложения, а не считать величину отступа где-то на странице. У тебя тут не MVC, а просто часть кода случайно помещена в классы с названиями Controller и Model.
>Вообще, по поводу JS, я конечно могу дать такой урок про MVC, но учти, что он довольно сложный https://github.com/codedokode/pasta/blob/master/js/minesweeper-mvc.md Может быть ты что-то из него захочешь взять. Только помни, что не стоит переусложнять код без необходимости.

https://github.com/codedokode/pasta/blob/master/js/minesweeper-mvc.md#Контроллер
>Контроллер отвечает за обработку команд пользователя.
То есть внутри него должны вызываться события? У меня не получилось так сделать https://jsfiddle.net/0ocuy4a9/

Ещё я заметил у себя такое переусложнение:
https://github.com/someApprentice/chat/blob/master/public/js/chat.js#L9
https://github.com/someApprentice/chat/blob/master/public/js/chat.js#L175-L181
, хотя можно было просто написать $.get(...).

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


>В document.ready у тебя код идет стеной. Но лучше было бы, возможно, разбить экран на компоненты (список контактов, диалог и тд), и каждый реализовать в своем классе.
Если события должны будут быть вне классов, то если разбить код на компоненты, события относящиеся к этим компонентам должны быть сразу под ними?
Ответы: >>1005668 >>1006127
Аноним 2017/06/14 10:32:13  №1005631 306
Capture.JPG (117, 1115x559)
559x1115
>>1005616

Не опытный. Тоже пользовался разными подходами, третий пункт сразу отмел, поскольку ёбнешься с таким количеством кода, который ещё и будет нарастать со временем. Пишу пока просто в Нотепаде, но даже так и первый и второй способы одинаково ущербны. НО! первый мне кажется более правильным с точки зрения программирования вообще. Я например, часто забываю положить какие-то данные в массив, или запятую поставить, или ставлю лишнюю запятую. Не говоря уже о том, что получаются раздражающие ситуации вида пикрклкйтед.
Ответы: >>1006127
Аноним 2017/06/14 10:51:32  №1005637 307
>>1005562
>Спам автоматизирован, боты просто ходят по интернету, ищут все формы, анализируют названия полей, подставляют в них подходящие данные и отправляют. Кроме капчи, можно проверять поддержку JS, а также делать поля-ловушки, которые не видны человеку, но которые бот может охотно заполнить. Особенно если оно называется name или email.
>
>FTP советую не использовать, он небезопасен и передает все в открытую, если есть SSH доступ, то можно использовать SCP и программы, работающие поверх SSH.

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

SCP погуглю

Моё увожение.
someApprentice 2017/06/14 11:53:47  №1005668 308
Ответы: >>1006127
Аноним 2017/06/14 13:03:21  №1005716 309
Так и не дошло как решить. Всякое пробовал в ответе 1 или 0 всегда. Выше анон кидал готовый вариант но там
он использовал незнакомые мне (действия?)
Аноним 2017/06/14 13:08:29  №1005725 310
>>1005716
Мб $reply нужно считать внутри for, а $i объявить в аргументах? Или ты что-то другое пытаешься сделать\понять?
Ответы: >>1005728
Аноним 2017/06/14 13:09:54  №1005728 311
>>1005725
Да внутри...спасибо
Аноним 2017/06/14 13:10:23  №1005731 312
Ответы: >>1005735
Аноним 2017/06/14 13:10:27  №1005732 313
>>1005716

Команда $reply = $i x $i выполняется только один раз, перед началом цикла. Но тебе ведь наверно надо ответ вычислять на каждом шаге заново, значит это действие лучше перенести в тело цикла.

А вместо этой команды логично поставить $i = 1, она должна только в начале и выполняться.
Ответы: >>1005735
Аноним 2017/06/14 13:12:21  №1005735 314
Аноним 2017/06/14 13:15:19  №1005738 315
Товарищи пхписты, есть ли годная книга по ms sql если я совсем нулевой в этом вашем эСКуэЛЬ?
Аноним 2017/06/14 13:49:03  №1005751 316
>>1005716
Всегда обсираюсь, когда приходят такие ребята, а через пару месяцев они уже ебашат студентов, а ты сидишь как сыч и деградируешь, плак, плак
Ответы: >>1005757
Аноним 2017/06/14 14:16:09  №1005757 317
>>1005616
Блядь, я такую стену текста на ideone нахуярил, что бы пояснить почему второй подход пиздат, и как охуенно и элегантно всё работает, но после того как нажал run, почему-то всё полетело попизде, так что нахуй это говно. В итоге вот этот прав >>1005751
Ответы: >>1005766 >>1005788 >>1006126
someApprentice 2017/06/14 14:30:21  №1005764 318
Как в postreSQL складывать строку с результатом функции?

INSERT INTO comments (..., tree) VALUES (..., '123.' + nextval('comments_sequence_id'));
Ответы: >>1006126
Аноним 2017/06/14 14:35:29  №1005766 319
>>1005757
Лучше использовать 3v4l.org

Но да, второй вариант действительно проще использовать.

Даже не представляю зачем тот анон так раздул этот вопрос.
Ответы: >>1005779
Аноним 2017/06/14 14:53:50  №1005779 320
>>1005766
Почему лучше? Какие аргументы?
Как ты исправишь отсутствие контекстной помощи ide при добыче объектов из array? inb4 не использовать помощь
Аргументы, аргументы.
Аноним 2017/06/14 15:01:10  №1005788 321
>>1005757
http://ideone.com/uWAvxM
держите, накатал стену блядь (еще раз, но в два раза ужатее), которую никто в итоге не осилит или не поймет
Ответы: >>1005790 >>1005807 >>1006126
Аноним 2017/06/14 15:04:57  №1005790 322
>>1005788
Тоже мне стена, у меня хелоуворлды многословнее!!!!
Ну а так зря ты распинался, во-первых таки да, поддерживается по дефолту в фреймворках, а значит сразу заметят, как только работать начнут. Ну а во вторых он про вьюху кажется спрашивал, там есть еще некоторые плюсы в сторону этого подхода именно.
Ответы: >>1005878
Аноним 2017/06/14 15:25:02  №1005807 323
>>1005788
Это прекрасно смотрится, когда речь идет о передаче простых данных: строк, чисел. Но представь, что нужно передать объект. А потом, внутри метода, которому ты передал объект, что-то получить от него. Ты передал объект, но редактор внутри кода не может знать, какого он типа. Не может тебя поправить, подсказать. Тебе придется вручную по буковкам, как в стандартном нотпаде, писать вызов каждого метода, который тебе от объекта нужен, и каждый аргумент проверять по справке этого объекта. Тут что-то не так. Что ты на это скажешь?
Ответы: >>1005878 >>1006126
Аноним 2017/06/14 16:27:32  №1005878 324
>>1005790

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

>>1005807
>Но представь, что нужно передать объект.
ну и передаешь объект в чем проблема.
Если у тебя несколько объектов одного класса то передаешь массив объектов. С ними инфа 99% будет удобнее работать через foreach
> но редактор внутри кода не может знать
Почему я уже в третьем посте за сегодня читаю какой-то бред про редактор? Ты сам себе программист, или придаток к редактору? Не можешь отследить что у тебя в коде откуда растет?
>Что ты на это скажешь?
Скажу, что:
> Тут что-то не так.
Аноним 2017/06/14 19:32:50  №1006019 325
Стоп, стоп, стоп. Я все торчу на палиндромах и сейчас абсолютно случайно узнал, что символ из строки можно доставать подобным образом: $text[2] - выдаст второй символ. А я бля сидел неделю, ковырялся, думал как доставать символы с конца строки. Жаль что этого не было в уроке.
Ответы: >>1006026 >>1006052
Аноним 2017/06/14 19:47:09  №1006026 326
>>1006019

$text[2] - это не второй символ, а третий (отсчет идет с нуля) байт. Латинские буквы помещаются в один байт, а русские занимают два, и русскую букву ты так точно не достанешь.

- https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md
- https://github.com/codedokode/pasta/blob/master/cs/strings.md

Потому в моем учебнике такому и не учат.
Ответы: >>1006050
Аноним 2017/06/14 20:07:56  №1006050 327
>>1006026
Черт! Как же тогда доставать символы с конца?
Можешь намекнуть, а не писать решение что бы я сам допер?
Ответы: >>1006069 >>1006084
Аноним 2017/06/14 20:11:11  №1006052 328
>>1006019
function palindrom_test ($word) {
if (reverse($word)==$word){
return true;
}
return false;
}

Что не так?
Ответы: >>1006068 >>1006069
Аноним 2017/06/14 20:28:17  №1006068 329
>>1006052
Так вот как? Надо перевернуть слово, а не сравнивать по буквам? Тогда как? Записать слово в массив, затем перевернуть массив и сравнить?
Аноним 2017/06/14 20:28:32  №1006069 330
>>1006050

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

Во-вторых, если в mb_substr передать отрицательное число, то это воспринимается как отступ от кона строки: http://php.net/manual/ru/function.mb-substr.php

>>1006052

В php нет готовой функции reverse наверно.

Ответы: >>1006135
Аноним 2017/06/14 20:49:39  №1006084 331
>>1006050
>Можешь намекнуть, а не писать решение что бы я сам допер?
> А я бля сидел неделю
Ой да кому ты пиздишь, мамкино ленивое хуйло))))
https://3v4l.org/T5HLN
Ответы: >>1006135
Аноним 2017/06/14 22:16:07  №1006126 332
>>1005764

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

Про склеивание строк и строковые функции можно прочесть тут https://postgrespro.ru/docs/postgrespro/9.6/functions-string

>>1005807

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

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

>>1005788

Твой код с массивами имеет серьезный недостаток: никак не документируется, какие поля должны быть в массиве, в каком формате должны быть значения (например, время - строкой или в виде числа unix timestamp?). Никак не проверяется наличие каких-то лишних полей. Со временем по мере развития проекта обнаружится, что функция вызывается с разными наборами полей, и приходится в ней писать условия, проверяющие, есть ли там какое-то поле, прежде чем с ним что-то сделать. Ну и вообще сложно понять, какой именно массив надо передать в функцию.

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

Вот урок по теме https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md

>>1005757

Я пишу ответ в редакторе (sublime) и он не теряется даже если пропадет питание (хотя у меня ноутбук и есть время на сохранение).
Ответы: >>1006958
Аноним 2017/06/14 22:16:26  №1006127 333
>>1005668

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

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

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

class Controller
{
init()
{
// инициализируем представление, задав обработчик для кнопки
$('#some-button').click(this.handleSomeButtonClick.bind(this));
}

handleSomeButtonClick(e)
{
...
$('#some-field').text('Hello');
}
}

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

init()
{
// Вью можно и не создавать, а передавать снаружи, но не очень
// понятно, в чем выгода
this.view = new SomePageView(...);
this.view.findSomeButton().click(this.handleClick.bind(this));
}

handleClick()
{
this.view.findSomeField().text('Hello');
}

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

Можно усилить инкапсуляцию так, чтобы вью не выдавал ссылки на элементы DOM наружу:

init()
{
this.view.setButtonClickHandler(this.handleClick.bind(this));
}

handleClick()
{
this.view.setSomeFieldText('Hello');
}

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

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

class SomeView
{
// Контроллер можно передавать снаружи, а не создавать
init(controller)
{
controller.setView(this);
this.findSomeButton().click(controller.handleClick.bind(controller));
}

setSomeFieldText(...) { ... }
}

Наконец, есть еще варианты, когда контроллер и представление объединяют в один класс (React например предлагает такую возможность).

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

Если добавить модель, то конечно ситуация становится сложнее, можно попытаться прочитать этот большой урок https://github.com/codedokode/pasta/blob/master/js/minesweeper-mvc.md

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

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

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

>>1005631

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

>>1005629

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

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

Ну например у тебя перемешан поиск элеиментов с логикой обработки событий и туда же вставлен код отправки аякса-запросов, по всему коду раскиданы конструкции вроде $('.message:first-child'). Это, по моему мнению, плохой стиль. Гораздо удобнее было бы вынести поиск элементов куда-то отдельно, в метод или сохранить ссылки на них в переменные. И вынести взаимодействие с АПИ тоже отдельно. У тебя нет никакого разделения, просто код идет стеной, как у начинающих.

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

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

> хотя можно было просто написать $.get(...).
Не забудь только прочитать мой урок про работу с аяксом.

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

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

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

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

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

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

Уточняй, если что-то непонятно.
Ответы: >>1006143 >>1006380
Аноним 2017/06/14 22:17:24  №1006128 334
>>1005616

Обычно при выводе шаблона используют второй подход (метод вида render($template, array $args)). Так например работает шаблонизатор Twig. Так приходится писать меньше кода. Но вообще, другие подходы тоже имеют право на жизнь.

Ну например, мы бы могли завернуть шаблон в функцию и описать все параметры и их типы:

<?php
function showIndexPage($a, $b, $c, Something $something) {
?>
... код шаблона...

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

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

Можно в этот класс добавить метод render, который будет вызывать шаблон так, что объект будет доступен через $this. Но тогда это будет уже не ViewModel, а View. Что-то похожее было в ZF1, там был объект Zend_View.

Что касается кода с третьей картинки, то в нем все явно смешано в кучу. Я вижу, что ты передаешь Registry в конструктор View, это явно плохая идея, так как в шаблон лучше передавать какие-то конкретные данные, а не все объекты-сервисы. Зачем в шаблоне объект PDO? Он там точно использоваться не должен. И data mapper в шаблоне не нужен. Не забывай, что задача View - отображать переданные ему данные, а не самостоятельно их получать.

> 1) Передавать параметры в виде набора аргументов
Вполне нормальный способ.

> Недостатки: любое изменение параметров метода заставит менять сигнатуры всех его вызовов (добавлять/убирать параметр);
Это плюс, если ты добавил в шаблонен новый параметр, то гарантированно придется найти все вызовы шаблона и добавить передачу этого параметра, иначе вылетит ошибка. В варианте с массивом ошибку труднее найти, так как список параметров не описан нигде.

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

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

> В т.ч. рекомендуемый ОПом DependencyContainer.
Это совсем не то. DI Container используется для получения сервисов (например дата мапперов, валидаторов). В шаблон его передавать незачем, и эти сервисы там не нужны. Ты что-то путаешь.

> 3) Передавать параметры в виде объекта класса, в котором отдельными методами захардкодены типы получаемых данных и объектов. То есть, нелюбимый ОПом паттерн Registry.
Нет, если это класс, который написан специально для данного шаблона, то правильнее это назвать ViewModel.

- http://design-pattern.ru/patterns/registry.html
- http://designpatternsphp.readthedocs.io/ru/latest/Structural/Registry/README.html

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

Такие понятия как DI container, registry - они относятся не к передаче данных в шаблон, а к поиску сервисов, зависимостей для класса. Конечно, View не должен обращаться ни к DI Container, ни к Registry.

Задавай уточняющие вопросы, если что-то еще непонятно.


Аноним 2017/06/14 22:31:17  №1006135 335
>>1006069
Спасибо!

>>1006084
Все было так же как и у тебя, но все равно не работало. А не работало из за того что $i в цикле было 0. Собсна я именно с этим тупил около недели.

Аноним 2017/06/14 22:43:37  №1006143 336
>>1006127
Валидация выше по коду. При именовании SQL ориентировался на статью http://citforum.ru/database/articles/naming_rule/
, если вникнуть, всё просто запоминается. А как бы ты предложил на моем примере назвать всё, просто вот из интереса?

А вот как раз третье это да. Нужно больше сущностей. И в моем случае это даже снизит объем кода!
Ответы: >>1006164 >>1006209
Аноним 2017/06/14 23:32:42  №1006164 337
>>1006143
>При именовании SQL ориентировался на статью
>Citforum
>Королевство Дельфи
Не делай так больше.

Возьми стандарт у Алана Бьюли и Тома Кайта, они спокойно писали «... WHERE street_id = street.id AND ...» и это никому не мешало.
Аноним 2017/06/15 00:13:14  №1006194 338
>>1005181

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

>>1005169

> не смог сделать на русском, что бы большие буквы были в начале предложения и маленькие в конце.
Читай урок https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md

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

> http://ideone.com/32QpwQ йода
> (\\.)|(\\!)|(\\?)
Вместо этого лучше использовать квадратные скобки. Ну и круглые скобки тут не требуются, без них будет то же самое.

> foreach ($arrayOffers as $key=>$value){
Плохие названия переменных. $key не нужна, а $value надо было назвать $sentence (предложение). array писать в названии переменной не надо, достаточно множественного числа.

> [\s]+
Квадратные скобки не требуются.

Ошибки надо исправить:

> PHP Notice: Undefined variable: editedText in /home/z0nZFe/prog.php on line 14
> PHP Notice: Undefined variable: editedTextFull in /home/z0nZFe/prog.php on line 18

> $editedText = strtolower($editedText);
Этой строчкой ты многократно обрабатываешь уже обработанный текст, это неэффективно.

Названия переменных довольно неудачные.

> http://ideone.com/XnwxXg сумма прописью
> $millions = array(
> 0 => 'миллионов',
> 11 => 'миллионов',
> 1 => 'миллион',
Ну тут одно и то же повторяется. Этот массив не нужен, так как в русском слово может быть в одной из 3 форм в зависимости от 2 последних цифр числа и надо просто написать несколько ифов, выбирающих 1 из 3 вариантов.

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

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

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

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

> PHP Notice: Undefined variable: text in /home/XTUN1t/prog.php on line 118
> PHP Notice: Undefined variable: numberOn in /home/XTUN1t/prog.php on line 139

> http://ideone.com/9fc5tF калькулятор
Не хватает вывода окончательного ответа.

> http://ideone.com/8hUwnm считалка
В общем-то алгоритм верный, но можно было обойтись без перестройки массива. Можно было обходить массив в цикле, увеличивая счетчик на каждом шаге и удаляя текущий элеимент, когда счетчик доходит до $skip.

> http://ideone.com/MSiND0 вертикальный текст
$array, $value - неудачные названия переменных.

Определить максимальную длину строки можно с помощью array_map и max.

> $longHigh = ($longHigh>$long)? $longHigh : $long;
Тут стоило использовать max()/min()

> PHP Notice: Undefined variable: longHigh in /home/09pNsX/prog.php on line 13
Ошибка

> ($array as $key => &$value){
Зачем тут & ?

Ну и код отформатирован не по стандарту, смотри второй пост треда.
Аноним 2017/06/15 00:14:13  №1006196 339
>>1005145

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

>>1004889

> А как его вызвать на интервале который был вызван до него?
В clearInterval надо передать идентификатор таймера, который вернула функция setInterval. Это уже твоя проблема, куда его сохранить.

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

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

> Мне нравиться вариант с сохранением на сервер, но где именно? Можно сделать отдельную таблицу unsendedmessages в БД.
Можно. Можно назвать ее drafts.

Хотя конечно с точки зрения приватности не очень хорошо сохранять неотправленные сообщения на сервере.

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

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

> Или просто уведомить о том что сообщения сохраняются либо в БД, либо локально (в течении сессии)?
Я думаю, что можно вывести краткое напоминание и/или тут же ссылку на настройки или кнопку. Например так: "История переписки сохраняется в вашем аккаунте на сервере. [Подробнее]"

> А что если один пользователь захочет хранить историю а другой нет? Тогда в любом случае сообщения будут храниться в одном экземпляре (если денормализовать сообщения на inbox и outbox).
Тут возможны варианты. Можно сделать, чтобы у каждого была своя история со своими настройками, можно - чтобы не было.

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

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

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

> Получается считать величину отступа нужно в отоброжении?
да, а еще лучше попробовать решить проблему средствами CSS.

> А где обычно создаются такие переменные? В самом вверху, перед "классами" MVC?
Логично сделать их свойствами объекта View.

> Как тогда по другому добавить перенос на новую строку по нажатию Ctrl + Enter?
Я имел в виду не копипастить $('textarea[name="message"]') два раза.

> Клиентский роутер это и есть JS-библиотека о которой вы упомянули в начале? Если нет, то что есть JS-библиотека в таком случае?
Я имел в виду библиотеку для управления историей. Вроде history.js https://github.com/browserstate/history.js/

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

Вообще, наивно было бы думать, что ajax-запросв всегда сработает успешно. Вот что может произойти:

- может нарушиться связь с интернетом, или произойти проблема где-то на полпути. Это проявляется в том, что срабатывает обработчик ошибки с кодом 0. Причем в неудачных случаях, если пакет для установления TCP соединения потерялся где-то в сети, он сработает только после таймаута в 30-60 секунд.
- сервер может быть отключен/недоступен
- на сервере может произойти ошибка, это проявляется в HTTP статусе ответа, не равном 200, или в неверном Content-Type ответа
- при попытке раскодировать JSON может произойти ошибка, если он некорректный

Вопрос, как твое приложение будет вести себя в этих случаях? Или в случае поездки в метро, когда интернет появляется и пропадает периодически.
Ответы: >>1006380 >>1006764 >>1007639
Аноним 2017/06/15 00:14:34  №1006197 340
>>1004738

> Как в Slim в контроллере сделать проверку введенного в значения, и если там пусто, то перенаправить на домашнюю страничку, иначе отправить по нужной страничке и передать в нее имя?
Использовать редирект. Имя можно передать через параметр в URL.

>>1004656

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

>>1004557

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

>>1004463

А что вместо него?

>>1004448

Константы принято писать большими буквами.

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

>>1004440

Это все равно будет нечестно и не по лицензии.

>>1004355

Не даем готовых решений, но можем проверить или подсказать, если что-то непонятно.
Аноним 2017/06/15 00:14:54  №1006198 341
>>1004313

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

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

Ну попробуй, ладно, почему бы и нет. Посмотри тогда Google calendar, там что-то похожее по смыслу.

> План такой:
Вполне хороший план.

> . верстка необходимого части интерфейса для проверки серверной части;
Если есть АПИ, то его можно тестировать курлом или автоматизированными тестами (!это тоже интересная тема!)

> Какую версию ES использовать, ES3 или уже можно перейти на ES2015?
ES5 можно использовать (Реакт наверно ниже ES5 не поддерживается, проверь этот момент). Но конечно если хочется перфекционизма то можно было бы писать на ES3, чтобы обеспечить максимальный охват. Ведь ES5 дает не так много новых фич, и они прекрасно реализуются вспомогательной библиотекой совместимости. Увы, когда речь идет о бизнесе, то там часто нет времени, и недостаточно квалификации разработчиков (особенно если это вкатывальщики), и пишут просто как попало, не особо заморачиваясь даже с тестированием.

>>1004095

надо изучать CSS, а не тыкаться наугад.

>>1003992

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

>>1003628

Для начала надо определиться, что ты считаешь "временем сессии". И тогда станет понятнее, что надо измерять.
Аноним 2017/06/15 00:15:11  №1006199 342
>>1003497
>>1003464

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

В твоем случае можно вынести работу с CSRF токенами в отдельный класс. А можно и не выносить, но добавить слово xsrf в название функций.

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

>>1003272

А ты точно читал урок https://github.com/codedokode/pasta/blob/master/forms.md ?

> Мне не чтобы все формы страницы обрабатывал один метод контролера, он очень толстый получится
Я это и не предлагаю, я предлагаю обрабатывать одним методом как GET, так и POST запросы к одной отдельной форме. Для другой формы - сделать другой метод.

>>1003354

> Оба этих сценария по хорошему нужно обернуть в объект,
Только важно, чтобы этот объект не был замаскированным контроллером.
Аноним 2017/06/15 00:24:54  №1006209 343
>>1006143

Все равно код плохой так как у тебя нет отделения кода вставки данных в БД от кода обработки параметров запроса, все смешано вместе.

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

По поводу названий - нужно разделять слова и не использовать непонятные сокращения:

invoice_date или invoiceDate
asset_id или assetId

По поводу статьи - она дает дурные советы.

> Имя должно быть как можно короче. Оптимально - 2-4 буквы, максимум до 10.
Почему? Видимо во время написания статьи не было автодополнения и автор просто устал печатать запросы руками. Это не повод делать непонятные имена.

> И если названия таблицы и пяти соединенных справочников будут несокращенными словами в 16-20 символов, то это порадует лишь поклонников языка Шекспира, но успешно затуманит смысл простейших SQL-запросов
Не согласен.

> "группа пользователей" - "ugroup", "группа домов" - "hgroup".
user_group, house_group

> если у вас уже есть таблица 'документ' (doc),
То ее лучше называть documents.

> CSTRTYPE
street_types

> JCALCOP
calc_operations_log

Это конечно мое личное мнение, основанное на опыте работы с проектами с сотнями таблиц.

> Три поля с одинаковыми названиями в результате запроса. Какое безобразие!
Не сталкивался с проблемами из-за этого.

Стремление сокращать названия нездоровое. Автор экономит себе 5 секунд на наборе кода, а потом кто-то другой теряет минуты, пытаясь понять этот код.
Аноним 2017/06/15 05:03:28  №1006287 344
Ответы: >>1006388
Аноним 2017/06/15 12:38:26  №1006380 345
>>1006127
>> хотя можно было просто написать $.get(...).
>Не забудь только прочитать мой урок про работу с аяксом.
У меня есть пара небольших вопросов, но они возникли в задаче с файлхостингом, поэтому мне будет удобней спросить на её примере, когда я её вброшу.

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

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

<div class="im_history_messages" ng-class="{im_history_messages_group: historyPeer.id < 0}" style="margin-top: 43px;">...</div>

>Это компоненты еще иногда называют виджеты. В архитектуре MVC у каждого виджета будут свои контроллер, вью и ViewModel (ViewModel - это модель, управляющая не данными и бизнес-логикой приложения, а данными отдельно взятого компонента).
ViewModel это просто обычная логика компонента, которая могла бы называться просто Model? Я просто запутался в терминологии.

>>1006196
>> А зачем тут setTimeout, который вызывается всего один раз с делеем? Он сбрасывает setInterval?
>Его преимущество в том, что если произойдет ошибка то новый таймер не создастся и скрипт остановится. А в случае setInterval, если в коде ошибка, то этот код все равно будет продолжать вызываться.
То есть его нужно будет вызывать рекурсивно, если нужно будет вызывать код, например, каждую секунду?

>> А что если один пользователь захочет хранить историю а другой нет? Тогда в любом случае сообщения будут храниться в одном экземпляре (если денормализовать сообщения на inbox и outbox).
>Тут возможны варианты. Можно сделать, чтобы у каждого была своя история со своими настройками, можно - чтобы не было.
>
>Вообще, если подумать, сейчас почти все мессенджеры сохраняют полную историю всех переписок. Что, если человек что-то писал N лет назад, а сейчас ему неудобно за эти слова? Когда мы общаемся лично, то никакой истории не сохраняется, так ли она вообще нужна? Хотя наверно есть люди, которым наоборот, хочется иметь полную историю сообщений.
Иногда хранить историю нужно, чтобы удобно было найти какую-то информацию, например номер телефона скинутый собеседником.

Я ещё подумаю как тут лучше сделать.

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

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


Ответы: >>1006398 >>1007389
Аноним 2017/06/15 12:59:32  №1006388 346
>>1006287
Потому что она работает: Первый раз ты итерируешь массив и на первом элементе уменьшаешь $count - 1 = 2, затем ты передаешь этот же массив в функцию и заново его итерируешь, но уже со значением $count = 2, и уменьшаешь его ещё на -1, $count - 1 = 1, и заново вызываешь функцию, но уже со значением $count = 1, и снова уменьшаешь его на -1, $count - 1 = 0, затем снова вызываешь функцию со значением $count = 0, и пропускаешь все элементы массива. Далее начинается следующая итерация массива где мы первый раз вызвали функцию рекурсивно (т.е. второй раз за всю программу в целом) где наше значение $count уже равно 2, и повторяешь те же действия, и так далее...
Аноним 2017/06/15 13:14:27  №1006398 347
>>1006380

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

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

При этом данные в ViewModel могут не совпадать с данными в Model. Ну например если мы делаем виджет формы редактирования данных о студенте, то его ViewModel может содержать измененные пользователем данные, которые пока не перенесены в модель приложения.

То есть мы можем рассматривать виджет как мини-приложение, у которого есть своя собственная модель данных (ViewModel). Хотя возможен и случай, когда виджет работает с переданной ему снаружи моделью. Тогда ViewModel нету.
Аноним 2017/06/15 17:00:11  №1006486 348
Вот такую инфу можно писать в конфиге? В дальнейшем валидатор получает ее в __construct(), создает регулярки на проверку данных и сообщения при ошибки ("Имя не должно превышать N символов) на основании этой инфы. Или же валидатор индивидуально пишется под уже существующие показатели?
Ответы: >>1006500 >>1006511
Аноним 2017/06/15 17:20:59  №1006500 349
>>1006486

Можно, но смысла нет так как вряд ли пользователю нужно менять эти цифры и проще просто прописать их в валидаторе. А так получается ненужное усложнение кода.
Ответы: >>1006786
Аноним 2017/06/15 17:37:25  №1006511 350
>>1006486
Все правильно делаешь, только не перебарщивай. Всякую срань выносить в конфиг не нужно, но то что потенциально может изменится - выноси в конфиг.
Аноним 2017/06/15 18:20:26  №1006552 351
какой фреймворк посоветуете?
Ответы: >>1006562 >>1006581 >>1006626
Аноним 2017/06/15 18:27:30  №1006562 352
bitrix[1].png (26, 547x306)
306x547
>>1006552
Спецназ веб-программирования.
Аноним 2017/06/15 18:54:33  №1006581 353
Аноним 2017/06/15 19:37:04  №1006626 354
Ответы: >>1006632
Аноним 2017/06/15 19:47:52  №1006632 355
Аноним 2017/06/15 23:44:10  №1006764 356
2017-06-1523-43-25.png (107, 1920x1040)
1040x1920
2017-06-1523-43-10.png (124, 1920x1040)
1040x1920
>>1005562
>а также делать поля-ловушки, которые не видны человеку
Запилил. А то спам всё равно идёт. Посмотрим.

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

По поводу работы с сессией в модели согласен, чуть переделал. Но создавать или передавать весь объект Request в модель - не очень. Пока так оставлю, спать хочется.
Ответы: >>1006812 >>1007347 >>1007389
Аноним 2017/06/16 00:14:43  №1006786 357
>>1006500

А вдруг пользователю захочется поменять длину комментариев? Вай нот.
Ответы: >>1006813
Аноним 2017/06/16 00:51:51  №1006812 358
>>1006764

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


Ответы: >>1006878 >>1007347
Аноним 2017/06/16 00:53:04  №1006813 359
>>1006786

Тут надо взвешивать плюсы и минусы. Плюс в том, что у пользователя больше возможностей для настройки, минус в том что конфиг усложняется и утяжеляется и труднее разобраться, какие места в нем надо менять обязательно, а какие можно не трогать.
Аноним 2017/06/16 09:17:03  №1006878 360
>>1006812
Бля, я об этом даже не догадывался, попозже исправлю, уже придумал как
Аноним 2017/06/16 12:49:01  №1006958 361
>>1006126
>Тут наверно удобнее просто выбрать нужные данные в PHP и там с ними работать, чем пытаться все сделать одним сложным запросом.
>
>Про склеивание строк и строковые функции можно прочесть тут https://postgrespro.ru/docs/postgrespro/9.6/functions-string
Даже не знаю почему я сразу не заметил функцию concat().

Почему выдается ошибка: could not determine data type of parameter? Такого не может быть чтобы не определился тип параметра.

$q = prepare("INSERT INTO comments (..., tree) VALUES (..., text2ltree(concat(:file, '.', currval('comments_id_seq'))))");
...
$q->bindValue(':file', ...);

Я тестировал, и это определённо из-за того что как-то неправильно передаётся параметр :file. То есть если подставить за место этого параметра какое-нибудь значение или просто вставить переменную, то ошибки не будет.

Что касается генерации id программно, то можно вызвать persist($comment) и получить id, но в мануале доктрины сказано, что на такой метод не следует полагаться:

>http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-objects.html
Generated entity identifiers / primary keys are guaranteed to be available after the next successful flush operation that involves the entity in question. You can not rely on a generated identifier to be available directly after invoking persist. The inverse is also true. You can not rely on a generated identifier being not available after a failed flush operation.

Иначе, я даже не догадываюсь как получить id программно.
Ответы: >>1007245 >>1007389
Аноним 2017/06/16 12:58:41  №1006965 362
Два вопроса.

Первый: я запилил сайт одностраничник. html+css, обработка действий пользователя на js, логика работы с данными на php, база mysql. Всё хорошо, но теперь требуется сделать из сайта многостраничник. Чтобы статьи вставлять. И у меня два стула: либо делать (и осваивать, как это вообще делается), либо вытащить из сайта всю полезную начинку и тупо прикрутить её к Вордпрессу. Мне бы хотелось выбрать первый вариант, но не чрезмерно ли он затратен по времени разработки?

Второй: если таки перепиливать и добавлять статьи, то как хранить их тексты? Понятно, что в базе. А дальше? Одна статья в одной ячейке? Или одна статья - одна строка таблицы, а в ней каждый абзац в отдельной ячейке? А как хранить прикреплённые картинки?
Ответы: >>1006982 >>1007388
Аноним 2017/06/16 13:45:20  №1006982 363
>>1006965
>Первый: я запилил сайт одностраничник. html+css, обработка действий пользователя на js, логика работы с данными на php, база mysql. Всё хорошо, но теперь требуется сделать из сайта многостраничник. Чтобы статьи вставлять. И у меня два стула: либо делать (и осваивать, как это вообще делается), либо вытащить из сайта всю полезную начинку и тупо прикрутить её к Вордпрессу. Мне бы хотелось выбрать первый вариант, но не чрезмерно ли он затратен по времени разработки?
Создание разных страниц это типовая задача. Время рассчитывай сам.

>Второй: если таки перепиливать и добавлять статьи, то как хранить их тексты? Понятно, что в базе. А дальше? Одна статья в одной ячейке? Или
одна статья - одна строка таблицы, а в ней каждый абзац в отдельной ячейке? А как хранить прикреплённые картинки?
>одна статья - одна строка таблицы
>Одна статья в одной ячейке
Вот это.

CREATE TABLE article (..., content);

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

https://secure.php.net/manual/ru/features.file-upload.post-method.php
Ответы: >>1006988 >>1007388
Аноним 2017/06/16 13:49:46  №1006988 364
>>1006982
>Сохраняешь их на диск, и в базе хранишь путь к ним.
Это-то понятно. Я имел в виду, как в базе это всё хранить?

Одна строка - одна статья, и в ней нулевая ячейка - id, первая - текст статьи, вторая - путь к прикреплённой сверху статьи картинке. Так?
Ответы: >>1006992
Аноним 2017/06/16 13:54:29  №1006992 365
Ответы: >>1007005
Аноним 2017/06/16 14:05:16  №1007005 366
>>1006992
А если нужно вставлять много картинок в произвольные места текста? Не лучше ли вставлять в ячейку абзацы и/или указания на пить к файлам картинок? А когда нужно их вынуть, просто перебирать в foreach ячейки, пока не кончатся.
Ответы: >>1007013 >>1007388
Аноним 2017/06/16 14:19:34  №1007013 367
>>1007005
>А если нужно вставлять много картинок в произвольные места текста?
>в произвольные места текста
Тогда нужно использовать разметку в контентной части (html-тэг <img>).

>Не лучше ли вставлять в ячейку абзацы и/или указания на пить к файлам картинок?
Не лучше. Ты что знаешь сколько у тебя абзацев будет?
Ответы: >>1007014
Аноним 2017/06/16 14:23:16  №1007014 368
>>1007013
>Ты что знаешь сколько у тебя абзацев будет?
Дык foreach же. Будет перебирать, пока не кончатся.
Ответы: >>1007017
Аноним 2017/06/16 14:26:28  №1007017 369
>>1007014
'Дык' в таблицу тоже будешь вставлять с помощью foreach?
Ответы: >>1007025
Аноним 2017/06/16 14:45:57  №1007025 370
>>1007017
Так, давай опишу подробно, о чём я думаю.
Нужно отрисовать статью. Запрашиваем в базе строку с нужным id, затем в цикле foreach делаем что-то вроде:
$article .= "<p>"."вставить текст из ячейки"."</p>"
А потом этот $article вставляем в страницу. А если вместо текста в ячейке ссылка, то оформляем её соответственно. В чём недостаток такого подхода?
Ответы: >>1007046
Аноним 2017/06/16 15:12:09  №1007046 371
>>1007025
В том что ты не знаешь сколько у тебя будет абзацев и соответственно сколько ячеек будет в таблице.
Аноним 2017/06/16 16:38:17  №1007093 372
Создаешь значит таблицу - статьи:
В ней например такой набор столбцов:
id - ид
header - тут заголовок твоей статьи будет
text - тут хранишь отформатированный в html текст статьи, без всякого разбиения на обзацы, че это вообще за высер? А если надо переписать статью или вырезать обзацы или склеить 2 а 1?
author - имя автора или id юзера если у тебя в системе есть юзеры
image - ссылка на картинку например, если у тебя статья с картинкой или превьюхой.
url - тут хранишь чпу например, что бы при создании статьи его указывать самому или система за тебя это делала.
ну это если ты хочешь на сайте что бы урлы к статьям были не вида site.qw/article/123
а например site.qw/srticle/shok_eto_po_nashemu
ну для начала подойдет имхо.

Ответы: >>1007097
Аноним 2017/06/16 16:41:16  №1007095 373
image.png (34, 806x563)
563x806
Анон, очень долго не хотел сюда писать т.к. боюсь, что засрут
Научи меня циклам в php
До этого писал только на Pascal, решил выбрать своим первым языком PhP, начал с сайта из ОП-поста
И вот там была простейшая задача написать таблицу умножения чисел самих на себя, с чем я уже не смог справиться
Укажи на мои ошибки, что я делаю не так и как это фиксить?
Ответы: >>1007103 >>1007105 >>1007388
Аноним 2017/06/16 16:47:01  №1007097 374
Ответы: >>1009092
Аноним 2017/06/16 16:55:23  №1007103 375
image.png (7, 427x116)
116x427
>>1007095
То что написал переводится как
Ответы: >>1007150
Аноним 2017/06/16 16:57:52  №1007105 376
>>1007095
Второй аргумент функции for определяет при каком условии цикл будет продолжать выполнение. У тебя стоит $x = 9, что присваивает значение, а не возвращает true. Не уверен почему твой цикл не уходит в бесконечность, потому что $x = 9, возвращает 9, что в свою очередь является истинным значением.

https://secure.php.net/manual/ru/control-structures.for.php
>В начале каждой итерации оценивается выражение expr2. Если оно принимает значение TRUE, то цикл продолжается, и вложенные операторы будут выполнены. Если оно принимает значение FALSE, выполнение цикла заканчивается.
Ответы: >>1007110 >>1007149
Аноним 2017/06/16 17:01:39  №1007110 377
>>1007105
>$x = 9
Оператор присваивания = почему-то не выделился..(
Аноним 2017/06/16 18:26:04  №1007149 378
>>1007105
Точно, я же вчера сделал такую же ошибку и потом исправил
Спасибо большое
Аноним 2017/06/16 18:26:58  №1007150 379
>>1007103
Ну вайл это понятно, но я сейчас фор прохожу :)
Аноним 2017/06/16 18:32:02  №1007151 380
image.png (28, 782x428)
428x782
Не хочу засорять тред такими тупыми вопросами, но я не знаю куда податься
Из-за этого я 2 месяца назад забросил пхп, из-за этого сейчас ничего не получается
Почему в моей программе не входит в цикл?
Алсо, если есть какие-то правился при написании цикла, то был бы рад услышать
Ответы: >>1007158 >>1007253 >>1007388
Аноним 2017/06/16 18:43:57  №1007158 381
>>1007151
Цикл будет дрочиться покуда условие $x==9 = true. У тебя оно изначально false. Поменяй на $<=9
Ответы: >>1007159
Аноним 2017/06/16 18:46:56  №1007159 382
Аноним 2017/06/16 18:59:31  №1007165 383
Посоветуйте какой фреймворк взяться учить человеку, который относительно недавно освоил это ваше ООП и что-бы не стыдно было в резюме указать при устройстве на работу
Ответы: >>1019251
Аноним 2017/06/16 20:17:29  №1007195 384
Есть модель File со свойствами access и accessHash. Первое может принимать свойства "free" и "pass". Если стоит pass, значит нужно вызвать сеттер на accessHash. Как мне поступить чтобы обязать пользователя заполнить свойство accessHash?

1)Сделать сигнатуру сеттера setAccess с параметрами access и accessHash вместо одного параметра access.
2)Явно не заставлять заполнять свойство, но проверять в валидаторе, что если есть значение "pass", то значит должно быть заполнено свойство access.
3)Что-то другое.

И еще вопрос, который косвенно относится к первому и тоже меня интересует. Модель вообще не должна контролировать в сетерах получаемые значения, это должен выполнять валидатор? Если да, то не должна до такой степени, что если в свойстве будет объект определенного класса, то в сеттере модели не ставить тайпхинт ClassName, а все потом через inctanceof в валидаторе? Или тайпхинт можно оставить
Ответы: >>1007211 >>1007387
Аноним 2017/06/16 20:57:51  №1007211 385
>>1007195
if ($file->access == ''pass") {
$file->accessHash = ...;
}

>Модель вообще не должна контролировать в сетерах получаемые значения, это должен выполнять валидатор?
Может и контролировать, сеттеры для этого и нужны чтобы преобразовать значение в нужный формат, если нужно.
Но валидатор лучше делать отдельно.
Ответы: >>1007216 >>1007388
Аноним 2017/06/16 21:03:44  №1007216 386
>>1007211

И где этот код должен быть?
Ответы: >>1007219
Аноним 2017/06/16 21:05:36  №1007219 387
>>1007216
>И где этот код должен быть?
Там же где и заполняются остальные значения.
Аноним 2017/06/16 21:29:17  №1007232 388
Значения который не хранятся в свойствах модели, имеют гетер который взаимодействует с другими свойствами (например конкатенация firstname и surname = fullname) и не имеют сеттера, должны ли они иметь свой столбец в базе данных?
Ответы: >>1007240 >>1007387
Аноним 2017/06/16 21:36:42  №1007240 389
someApprentice 2017/06/16 21:44:31  №1007245 390
>>1006958
>Иначе, я даже не догадываюсь как получить id программно.
Точно, я забыл, что вы советовали получать его из uuid и ещё кучу способов.
Ответы: >>1007387
Аноним 2017/06/16 21:58:50  №1007253 391
>>1007151
советую нетбинс юзать, там есть аутокомплит конструкций, типа for
Ответы: >>1007387
Аноним 2017/06/17 00:48:30  №1007347 392
Аноним 2017/06/17 03:08:27  №1007387 393
>>1007253

Надо не полагаться на автокомплит, тем более начинающему.

>>1007245

Получить новый id из Postgres можно запросом SELECT nextval('x') (можно использовать SELECT без таблиц). Также можно отказаться от получения id из БД и генерировать их, по алгоритму UUID, Twitter Snowflake или любому другому. Я не вижу правда в этом особой выгоды в данной ситуации.

>>1007232

Нет, зачем? Лишний столбец будет занимать лишнее место, и требовать усилий по обновлению при изменении исходных столбцов.

>>1007195

Удобнее всего сделать в модели 2 метода: setFreeAccess() и setPasswordAccess($password). Если свойства модели приватные, то задать "неправильную" комбинацию свойств в обход этих методов не получится, даже случайно или по ошибке.

Заметь, что мы тут просто используем возможности ООП (инкапсуляция), а база данных тут вообще не при чем. Инкапсуляция как раз и помогает защититься от перевода объекта в недопустимое состояние.

> Модель вообще не должна контролировать в сетерах получаемые значения, это должен выполнять валидатор?
Тут есть варианты:

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

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

Ну и как дополнение, можно еще для подстраховки добавить правила в БД - с помощью конструкций вроде CHECK ( https://postgrespro.ru/docs/postgrespro/9.5/ddl-constraints ), которые будут отлавливать ошибочные данные, которые каким-то образом (из-за невнимательности разработчика) обошли валидацию. Ну к примеру мы можем на уровне БД указать что цена должна быть целым числом больше нуля.

Не забудь использовать "соленый", а не обычный хеш пароля. И сделать константы для значений типов доступа (или использовать true/false).
Аноним 2017/06/17 03:08:57  №1007388 394
>>1007211

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

>>1007151

Надо указывать условие продолжения, а не останова цикла. Ну то есть $x <= 9

>>1007095

= это присваивание
== это проверка на равенство

>>1006965

Вообще, взять вордпресс или другую CMS может быть быстрее.

> Понятно, что в базе. А дальше? Одна статья в одной ячейке? Или одна статья - одна строка таблицы, а в ней каждый абзац в отдельной ячейке? А как хранить прикреплённые картинки?
Хранить код статьи в формате HTML. Возможно, что ты будешь делать какие-то преобразования этого HTML кода, в таком случае делается 2 ячейки - исходный код, введенный пользователем и преобразованный код для вывода на сайте.

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

>>1006982

> Создание разных страниц это типовая задача.
Там еще надо прикручивать редактор, фильтр HTML, плагины к редактору, загрузчик картинок, улучшатель HTML и тд.

>>1007005

Сделать таблицу картинок и связь многие-ко-многим со статьями.
Ответы: >>1007463
Аноним 2017/06/17 03:09:22  №1007389 395
>>1006958

> Я тестировал, и это определённо из-за того что как-то неправильно передаётся параметр :file. То есть если подставить за место этого параметра какое-нибудь значение или просто вставить переменную, то ошибки не будет.
А что именно передается в bindValue? Скорее всего, что-то не то.

> Иначе, я даже не догадываюсь как получить id программно.
SELECT nextval(...);

>>1006764

> По поводу работы с сессией в модели
Можно просто разбить модуль капчи на M, V и С. Пусть контроллер (или помощник для вызова из контроллера) работает с сессией или куками, модель отвечает за логику, а вид отображает эту капчу. Если грамотно подойти к делу, может быть даже получится универсальный модуль, который можно прикрутить к любому сайту. А может конечно и нет.

>>1006380

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

- flex, новая технология, которая не везде есть. С ее помощью можно выделить часть экрана под область сообщений, и задать выравнивание блока сообщений по нижнему краю. Ну и не забыть про overflow, чтобы при большом числе сообщений блок не растягивался, а появлялась бы прокрутка. Минус - работает в новых браузерах
- display: table - работает начиная с ИЕ8 и древних фаерфоксов. Это как flex, только слабее по возможностям и со своими недостатками. Табличное отображение позволяет прижать содержимое ячейки (зоны сообщений) вниз. Тут есть проблемка - чтобы сделать прокрутку, блоку сообщений надо задать высоту, и задать ее в виде 100% (=высоте окна) наверно не получится, значит придется этот момент сделать через JS (определение доступной высоты блока и изменение ее при измнеении размера окна)
- прижать блок сообщений вниз с помощью абс. поз. Работает тоже везде, и можно задать высоту как 100% от зоны для вывода сообщений (при условии что не используется display: table, так как абс. поз. не работает с элементами таблиц).

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

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

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

> То есть его нужно будет вызывать рекурсивно, если нужно будет вызывать код, например, каждую секунду?
Не совсем рекурсивно, но да, примерно так:

function doStep() {
...
setTimeout(doStep, t);
}
setTimeout(doStep, t);

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

Советую почитать, как сделаны секретные чаты в Телеграм. Или например как сделано хранение шифрованных сообщений в iMessage. Вот тут что-то есть по теме: https://techcrunch.com/2014/02/27/apple-explains-exactly-how-secure-imessage-really-is/ (если нет, то можешь сам погуглить).

Также, можно почитать про шифрование диска в Андроид:

- https://nelenkov.blogspot.ru/2012/08/changing-androids-disk-encryption.html
- https://source.android.com/security/encryption/
- https://source.android.com/security/encryption/full-disk

Как я понимаю, там используется такая схема: генерируется ключ, им шифруется диск. А ключ шифруется паролем пользователя и сохраняется. При смене пароля перешифруется только ключ.

Кстати, так же можно и уничтожать сообщения: вместо их уничтожения достаточно уничтожить ключ, которым они зашифрованы, что гораздо быстрее.
Ответы: >>1007465 >>1025540
Аноним 2017/06/17 09:57:42  №1007436 396
Почему в FOSUserBundle по пути "login" нормально переходит, а по "register" ошибка, мол, по такому руту нет, а если написать со слэшем "register/", то всё нормально? Вроде ничего не менял по части рутинга.
Ответы: >>1019251
Аноним 2017/06/17 13:28:32  №1007463 397
>>1007388
>Неудачный код, так как никто не запрещает где-то в другом месте выставить недопустимую комбинацию свойств. Лучше использовать инкапсуляцию или хотя бы методы-сеттеры, задающие правильную комбинацию свойств.
Да, вы правы, конечно, если нужно жестче прописать значения и всегда задавать нужную комбинацию, то лучше задать это в сеттере. Я просто не подумал, что лишняя гибкость кода не всегда хорошо и привёл упрощенный пример.
Надеюсь тот анон увидит это замечание.
Аноним 2017/06/17 13:40:05  №1007465 398
>>1007389
>> Я тестировал, и это определённо из-за того что как-то неправильно передаётся параметр :file. То есть если подставить за место этого параметра какое-нибудь значение или просто вставить переменную, то ошибки не будет.
>А что именно передается в bindValue? Скорее всего, что-то не то.
Я пытался даже передать строку сверх-принудительно $q->bindValue(':file', (string) "123", PDO::PARAM_STR);
К тому же, это не имеет значения что передавать - concat() должен преобразовать всё в строку в любом случае.

Вот подробности ошибки:
An exception occurred while executing 'INSERT INTO comments VALUES (nextval('comments_id_seq'), :file, :author, CURRENT_TIMESTAMP, :content, text2ltree(concat_ws('.', :filetree, currval('comments_id_seq'))), :depth)' with params [24, "A", "H", "123", 0]: SQLSTATE[42P18]: Indeterminate datatype: 7 ERROR: could not determine data type of parameter $4

Подозрительно, что на деле :filetree получается "123", а не "123.currval(..)"
Если избавиться от функции concat(), то всё будет ок, только нельзя будет вставить currval().

>> Иначе, я даже не догадываюсь как получить id программно.
>SELECT nextval(...);
Да, я так и делаю, только не получается почему-то.
Аноним 2017/06/17 17:41:27  №1007538 399
Подскажите как лучше всего сделать поддержку разных переводов?
Мне нужно сделать 2 языка: русский и английский по дефолту.
Есть какие-то удобные средства для этого?
Ответы: >>1007545
Аноним 2017/06/17 17:51:20  №1007545 400
Ответы: >>1007835
Аноним 2017/06/17 18:44:06  №1007572 401
Вопрос: если поставлю в виртуалхосте document root в папку .../Students/public, то уже не смогу как раньше ввести виртуалхост/Students, чтобы попасть в папку проекта. Значит, если я захочу иметь на одном сайте несколько пректов в разных папках, мне нужно будет парсить URL через фронт-контроллер в /public?
Ответы: >>1007642 >>1019251
Аноним 2017/06/17 19:52:27  №1007608 402
https://www.youtube.com/watch?v=cGrIAFycpwA

Смотрел кто-нибудь? Чет начал вроде интересно, но по факту автор вроде как просто хуярит код и на выходе получается что вжух и всё работает. Ни зачем, ни почему. Может я конечно еще мало посмотрел и толком нихуя не понял. Ну в общем жду от вас какого-нибудь фидбека.
Ответы: >>1010381
Аноним 2017/06/17 20:26:38  №1007639 403
https://github.com/someApprentice/filehosting

А как работает middleware? В документации довольно схематично это описано. Это просто, то что вызывает до и после контроллера?
Например

$app->get(...)->add(foo())->add(bar());

Сначала вызывается bar(), затем foo(), затем контроллер, затем снова foo(), затем снова bar(), я правильно понимаю?


А как делаются несколько соединений в Доктрине? Нужно создавать несколько EntityManager'ов?


А как работает функция readfile()? Почему если посреди кода вызвать в этой функции .php файл, он не выполниться? В документации же написано, что он выводит файл. (Хотя, это другое определение, в отличение от include, где написано включает и выполняет файл.)


В самом интерфейсе мозиллы, в форме выбора открытия или сохранения файла, тип определяется как HTML документ, хотя в загрузках отображается нормально. (В хроме проверить не получилось т.к. он сразу предлагает выбрать путь сохранения.)
Все заголовки выдаются здесь https://github.com/someApprentice/filehosting/blob/master/src/Controller/DownloadController.php#L97-L98

Что я сделал не так?


https://gist.github.com/codedokode/9424217
>прикрутить загрузку файлов простым перетаскиванием на страницу с помощью jQuery плагина (конечно по хоршему надо бы заставить написать тебя загрузчик с нуля, чтобы разобраться в яваскрипте и DOM, но это наверно сложовато)
У меня был загрузчик и на чистом js https://github.com/someApprentice/filehosting/blob/bfeedf404e8ab28de6c6bae87a1e1a679b890b6f/public/js/dragndrop.js

Но у меня есть несколько вопросов:
Функцию отмены запроса нужно выполнять после его отправки, т.е. её нужно вызвать в событии onprogress, если нужно. Я правильно понимаю?
Вы выше привили пример какие ошибки могут произойти >>1006196
Я правильно понимаю, что эти ошибки нужно обрабатывать так:

>- может нарушиться связь с интернетом, или произойти проблема где-то на полпути. Это проявляется в том, что срабатывает обработчик ошибки с кодом 0. Причем в неудачных случаях, если пакет для установления TCP соединения потерялся где-то в сети, он сработает только после таймаута в 30-60 секунд.
xhr.status == 0
xhr.ontimeout

>- сервер может быть отключен/недоступен
xhr.status == 503

>- на сервере может произойти ошибка, это проявляется в HTTP статусе ответа, не равном 200, или в неверном Content-Type ответа
xhr.status != 200 or xhr.resultType == null

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


А как реализуются каталоги? В бд сохраняются колонки с именем, урл и деревом, и затем это урл обрабатывается контроллером?


А зачем пишутся Doc-блоки, если PHPDoc всё равно не используется?
И какие тэги были бы всегда желательны?

Мультиязычность
https://arhivach.org/thread/261841/#996038
>Стоит наверно сделать разные URL для разных версий страниц, иначе нельзя дать ссылку на страницу на определенном языке и они не будут нормально индексироваться. Википедия напримр использует на каждый язык свой поддомен. Можно использовать и папку в URL.
А что насчет выдавания страницы с нужным языком по геолокации? Такие страницы тоже индексируются как надо потому что, как я полагаю, роботы гугла находятся в разных странах и выдают результат тоже в соответствии с геолокацией.
Ответы: >>1010326
Аноним 2017/06/17 20:30:30  №1007642 404
>>1007572
>Вопрос: если поставлю в виртуалхосте document root в папку .../Students/public, то уже не смогу как раньше ввести виртуалхост/Students, чтобы попасть в папку проекта. Значит, если я захочу иметь на одном сайте несколько пректов в разных папках, мне нужно будет парсить URL через фронт-контроллер в /public?
>парсить URL через фронт-контроллер в /public?
Это называется роутер. Но обычно он делается для одного сайта.
Аноним 2017/06/17 23:51:21  №1007720 405
стоит ли вкатываться ради пары-тройки месяцев подработки? Или пыха испортит меня мимо навыки крестов и питона с джангой
Ответы: >>1007752 >>1007911
Аноним 2017/06/18 02:11:39  №1007752 406
>>1007720
Вкатывайся смело, коль деньги нужны.
мимо-питонист
Аноним 2017/06/18 12:49:41  №1007835 407
>>1007545
Попробовал gettext: не работает, что может быть не так? setlocale всегда возвращает false

putenv('LC_ALL=en_EN');
echo setlocale(LC_ALL, 'en_EN') == false ? "false" : "true";
bindtextdomain("test", "../Locale");
textdomain("test");
echo gettext("This is a text!");


Пути:

root/application/index.php
root/Locale/ru_RU/LC_MESSAGES/test.mo


msgid "This is a text!"
msgstr "Переведенная строка!"
Ответы: >>1007924 >>1008048
Аноним 2017/06/18 12:51:58  №1007836 408
Bootstrap.php и другие файлы, не содержащие в себе классы, нужно класть в /src, или в другую папку?
Ответы: >>1007846 >>1007911
Аноним 2017/06/18 13:03:28  №1007838 409
Привет.Если не сложно проверьте... вроде все работает НО есть чувство что можно было сделать короче https://pastebin.com/PDisAxKv
Ответы: >>1007846
Аноним 2017/06/18 13:56:28  №1007846 410
>>1007836
>Bootstrap.php и другие файлы, не содержащие в себе классы, нужно класть в /src, или в другую папку?
Обычно кладётся в /src.

>>1007838
Вроде всё правильно...
Аноним 2017/06/18 16:16:50  №1007911 411
>>1007836
Куда удобно, туда и клади, главное - не в публичную папку. Религиозное следование догмам не сделает твой код лучше, попробуешь написать гем для руби - поймёшь, что никакой папки src/ у них нет и там вообще многое по-другому. Главное руководствоваться здравым смыслом. Для улучшения кода есть объективно более полезные подходы - например юнит-тестирование.

>>1007720
На вёрстке гораздо быстрее можно начать зарабатывать + не нужно разбираться с экосистемой (CMS, фреймворки). Ещё вёрстка всегда пригодится в будущем, даже если на С# пишешь, а от PHP польза сомнительная.
Аноним 2017/06/18 17:02:21  №1007924 412
>>1007835
Читай документацию.

> Returns the new current locale, or FALSE if the locale functionality is not implemented on your platform, the specified locale does not exist or the category name is invalid.
Аноним 2017/06/18 17:06:32  №1007928 413
Если ОПу будет удобней могу запилить юнит тесты для части заданий , чтоб вкатывальшики по меньше просили проверить задание опу , или хотябы задавали вопросы напрямую по оптимизации кода
someApprentice 2017/06/18 17:08:06  №1007930 414
Ответы: >>1007935 >>1010325
Аноним 2017/06/18 17:13:11  №1007935 415
>>1007930
в 2017 делать всё на прототипах , когда есть ES2016 и всякие фичи для поддержки браузеров , алсо js в php треде
Ответы: >>1007940 >>1010324
someApprentice 2017/06/18 17:15:58  №1007939 416
>>1007928
Можешь попробовать, у нас кстати есть проект https://github.com/someApprentice/phpClub , куда это можно было бы включить.

Если что, мой имейл указан в профиле.
someApprentice 2017/06/18 17:16:25  №1007940 417
Ответы: >>1007960
Аноним 2017/06/18 17:48:48  №1007960 418
Аноним 2017/06/18 17:54:20  №1007965 419
Методы валидатора (function checkSomeField()) могут возвращать вместо TRUE и "some message" коды ошибок? Если да, то можно их в валидаторе расшифровывать или отдельный класс нужен?
Ответы: >>1007971 >>1010323
Аноним 2017/06/18 18:05:43  №1007971 420
>>1007965

Дело в том, что метод проверки свойства сущности из СущностьValidator мне понадобился в СущностьHelper (проверка аргумента). Не хочется для public методов возвращать mixed результат.
Аноним 2017/06/18 19:08:38  №1008025 421
>>1007928
Учти, что вкатывальщики твои тесты у себя на локалке не поднимут и по-хорошему нужен сайт, куда можно вставить решение и проверить на каких тестах что упало, вроде этого: https://dkab.github.io/jasmine-tests/
Ответы: >>1008046
someApprentice 2017/06/18 19:35:19  №1008043 422
https://arhivach.org/thread/261841/#996038
>Также, работу с АПИ наверно было бы лучше вынести в отдельный класс. Чтобы иметь возможность писать что-нибудь вроде backend.getMessages(...). Это позволит, может быть, позже туда вкрутить поддержку кеширования данных и оффлайн-режима.
Что-то мне не очень понятно как возвращать ответ из ajax, с помощью такой функции. Или вы имели ввиду чтобы getMessages() выводил шаблон с полученными сообщениями, а не возвращал json?
Ответы: >>1010323
Аноним 2017/06/18 19:43:29  №1008046 423
>>1008025
если быть точнее что то по типу CodeCombat

юззер заходит , пишет или копипастит решение , оно прогоняется юнит тестом и выдаёт верно или нет , при том что сам код в функционалом стиле
Аноним 2017/06/18 19:48:17  №1008048 424
>>1007835

en_EN - такой локали нет. Есть только en_US, en_GB и может еще какие-то для других англоязычных стран.

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

locale -a

http://ru.manpages.org/locale

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

В винде про локали можно поискать где-то тут https://msdn.microsoft.com/ru-ru/library/windows/desktop/dd318716(v=vs.85).aspx

Я для переключения языков использовал не локаль, а textdomain - можно сделать разные домены для разных переводов. Можно использовать функцию http://php.net/manual/ru/function.dgettext.php где домен указывается явно.
Аноним 2017/06/18 19:50:56  №1008051 425
>>1007928

Я думал насчет юнит тестов, но вопрос, будут ли выводимые сообщения на русском языке и будет ли понятно пользователю, в чем проблема? Я там писал какой-то свой велосипед для этого, посмотрю, может его можно выложить.
Ответы: >>1008059
Аноним 2017/06/18 20:03:10  №1008059 426
>>1008051
текст ошибок можно же менять , алсо если найдёшь анон кинь тут ссыль плиз , я просто не разу дело с песочницами не имел , интересно как работает , помню игра такая была , название не вспомню , давалось задание и 2 игрока кодили на скорость , на разных языках , там всё очевидно тестами покрывалось , которые присылали как и задание в пул реквесты
Ответы: >>1008201
Аноним 2017/06/19 00:14:26  №1008163 427
Когда можно использовать трейты? Вот такой трейт у меня используют два хелпера TokenHelper и AuthHelper, может быть здесь лучше обойтись агрегированием (переделать трейт в класс хелпер и добавить его в вышеперечисленные классы)?
Ответы: >>1008196 >>1010322
Аноним 2017/06/19 03:21:16  №1008196 428
>>1008163
Трейты используются там где есть проблемы с множественным наследованием , если у вас этих проблем нет то выносите в хеллпер
Аноним 2017/06/19 04:29:35  №1008201 429
>>1008059
>>1007928

Вот мои недописанные проекты на эту тему:

https://github.com/codedokode/task-checker - библиотека, позволяющая писать сценарии для проверки задач. Пока на уровне демо-версии.

https://github.com/codedokode/guarddog - утилита, позволяющая ограничить программу с помощью seccomp-bpf (фильтра системных вызовов linux). Вроде работает.

https://github.com/codedokode/guardbox - демон, который должен был по задумке принимать HTTP-запросы на выполнение программ и запускать их в песочнице, но который не работает и на который я пока не вижу особого смысла тратить время

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

- seccomp-bpf
- неймспейсы (linux kernel namespaces)
- ulimit
- bind mounts
- tmpfs

Кастомизация и логирование ошибок Аноним 2017/06/19 13:21:11  №1008291 430
Когда-то смотрел какой-то урок, где учитель показывал, как отключить дефолтные PHP ошибки и вместо них показывать свой текст, а сами сообщения ошибок логировать в файл. Проебал урок, никак не могу нагуглить - подскажи, анон, как реализовать подобное?
Ответы: >>1008293
Аноним 2017/06/19 13:22:59  №1008293 431
Ответы: >>1008304
Аноним 2017/06/19 13:45:52  №1008304 432
Аноним 2017/06/19 13:56:02  №1008307 433
Поясните про MVC. До того, как взялся плотно изучать PHP - строил архитектуру своих сайтиков так: входной файл, в который подключаются необходимые либы и два файла страницы: верхняя часть, где хранится php код без вского вывода на экран и нижняя часть самого вывода. Я так понял это и есть MVC? И если да, то что чем является? Входной файл является моделью, файл страницы с пхп кодом - контроллером, а вывод содержимого на экран - видом?
Ответы: >>1008308 >>1010322
Аноним 2017/06/19 14:00:25  №1008308 434
Аноним 2017/06/19 17:48:47  №1008410 435
Помогите начинающему верстале. К основному файлу index.php не подключается файл со стилями. При этом не подключался только тогда, когда находился в style/main.css. Когда удалил папку style и поместил стили рядом с индекс, то всё заработало. Не первый раз уже такая херня, кто знает в чём проблема?
Ответы: >>1008413 >>1008424 >>1010322
Аноним 2017/06/19 17:50:52  №1008413 436
>>1008410
Какой путь до папки со стилями прописан в index.php?
Ответы: >>1008414
Аноним 2017/06/19 17:54:35  №1008414 437
Ответы: >>1008421
Аноним 2017/06/19 18:10:43  №1008421 438
>>1008414
Где сам index.php расположен, в корневой директории?
Слэш добавь перед style, например.
Аноним 2017/06/19 18:17:52  №1008424 439
>>1008410
Погугли про относительные и абсолютные пути
Аноним 2017/06/19 18:29:33  №1008426 440
Поддался на кукареки хайпопетухов и пытался вкатиться в ноджс, как же збс, что дропнул эту хуйню и продолжил изучение божественного ПэХэПэ
Аноним 2017/06/19 20:03:49  №1008453 441
Помогите с доделкой алгоритма про поиск пути.
http://prntscr.com/flngg7 - как визуально выглядит после действия алгоритма.
http://ideone.com/dIQpTL
Сделал аналог поиск пути Дейкстры, но получается что высчитываю только минимальный по времени путь с начальной до последний точки.
Я бы мог сделать что бы постился путь, но для этого нужен список пройденных точек, а он содержит даже бесполезные.

То есть нужно как то отделить правильные точки, от неправильных и это я не могу придумать.
Ответы: >>1010322
Аноним 2017/06/19 21:09:43  №1008503 442
освоил базу и простенькие скрипты.что почитать по реальной разработке динамических сайтов?
Ответы: >>1008527
Аноним 2017/06/19 22:01:33  №1008527 443
>>1008503

Делай задачу про студентов из ОП поста. Там подробнейшие комментарии и много советов.
Аноним 2017/06/20 10:02:21  №1008623 444
Ответы: >>1010321
someApprentice 2017/06/20 19:48:13  №1008889 445
Помогите разобраться с npm

Если наша директория выглядит так:

App
App/public
App/src

То когда мы пишем в консоле App# npm install somePackage , то в корневой папке приложения App создается папка node_modules, но папка где нужно запросить пакет находиться в директории ниже, в App/public (или, возможно, даже ещё ниже App/public/js). Это не имеет значения и require() в любом случае найдет нужный пакет? Или нужно ещё где-то настроить расположение нужной директории?
Ответы: >>1008912 >>1010321
Аноним 2017/06/20 20:57:47  №1008912 446
Аноним 2017/06/20 23:01:12  №1008967 447
Всем хай, знаю отношение к PHP мало имеет. Накатил Ubuntu (на работе она тоже), хочу поднять WEB-сервер (доп. опыт) и учить Lavarel на нем. Вопросы:
1. Какая версия mysql оптимальна для Lavarel? Поставил 5.7, но боюсь проблем с STRICT модом.
2. Как избавиться на Ubuntu от вечного использование sudo, на работе я могу через vi, xdg-open и любые другие комманды писать без судо. Дома - дико не удобно.
3. Какие есть годные инет уроки, можно и англ туториал, нашел кучку русских бормочащих под нос - не ахти.
Ответы: >>1008968 >>1008974 >>1010321
Аноним 2017/06/20 23:01:48  №1008968 448
Аноним 2017/06/20 23:16:05  №1008974 449
>>1008967
laracasts
либо удали судо и седи под рутом , либо не запускай то что надо под судо лол
Аноним 2017/06/21 05:17:08  №1009048 450
tables.png (14, 418x272)
272x418
Вывод.png (21, 491x292)
292x491
Помогите плиз
Есть 2 таблицы Mysql(пик 1)
Есть код https://pastebin.com/ejSnv5HW
Есть то что выходит при работе кода(пик2)
Как сделать чтобы в столбце клиент выводило имя клиента соответсвующее его client_id
Ответы: >>1009066
Аноним 2017/06/21 09:10:33  №1009066 451
>>1009048
Уже нашел ответ "Переписать запрос
И в запросе сделать join с таблицей клиента"
Аноним 2017/06/21 10:20:57  №1009092 452
>>1007097
Сделал. Нормально получилось. В качестве редактора nicEdit прикрутил. Есть к нему претензии, но всё работает. Теперь в админке могу создавать, править и удалять статьи. Теперь надо будет перепилить всю вёрстку сайта, избавившись от рудиментов и костылей. Мне уже страшно. Бэк хоть логичен, что напрограммировал, то и получил. А фронт - неведомая ёбаная хуйня. Покрасил стену в красный - провалился потолок. Прикрутил потолок - перекосилась дверь и окна. Поправил их - дом вообще развалился нахрен.
Ответы: >>1010320
Аноним 2017/06/21 11:07:04  №1009103 453
ОП, подскажи пожалуйста. Есть IP с которого парсится сайт, этот сайт в ответ на большую нагрузку дал бан по IP, был совершен переход парсинга на бесплатные прокси из-за чего скорость парсинга упала в 4+ раз, каким образом можно добиться меньшей зависимости от банов? IP спуфинг на уровне PHP реализовать нельзя, покупать платные прокси? Реализовывать какие-то облачные сервисы или как? Сейчас вот задача стоит, а я вообще не в теме, тот же многопоточный парсер я могу написать под большинство сайтов, а вот с обходом защит не сталкивался и спросить не знаю где.
Ответы: >>1010320
Аноним 2017/06/21 13:48:12  №1009175 454
Анон, поясни, почему все так хейтят PHP?
Ответы: >>1009185 >>1010320
Аноним 2017/06/21 14:00:21  №1009185 455
>>1009175
Долбоебы так самоутверждаются.
Ответы: >>1009189
Аноним 2017/06/21 14:05:55  №1009189 456
>>1009185
Ну дыма без огня то не бывает, причина то есть какая-то?
Ответы: >>1009213
Аноним 2017/06/21 14:55:13  №1009213 457
>>1009189
низкий порог входа , соответственно квалификация мамкиных фрилансеров соответствующая , хотя при учёбе на 1 курсе , понял что на яве гавнокодить можно огого как
Ответы: >>1009217 >>1009219 >>1010320
Аноним 2017/06/21 15:04:49  №1009217 458
>>1009213
Это единственная причина?
Ответы: >>1009220
Аноним 2017/06/21 15:05:55  №1009219 459
>>1009213
Ни один жаббашарп не позволяет пейсать SQL-запросы между тегами <title> и </title>.
Ответы: >>1009228 >>1009237
Аноним 2017/06/21 15:08:33  №1009220 460
>>1009217
Низкий уровень зарплаты, работа в подвалах (это где в вентиляцiи крыска здохла), перерывы между контрактами, голод, выпавшие зубы, страх и нищета.
Мало-средние васяны-кооператоры из 80-х, вечные вакансии, десятилетиями висящие в Интернете.
Умение разбираться в чужом коде...
Ответы: >>1009239
Аноним 2017/06/21 15:20:49  №1009228 461
>>1009219
Охуенно. Надо будет попробовать.

Олсо, видел и сопровождал сайты, написанные на аспнете (шарп). Это был полный пиздец, написанный душевнобольными.
Аноним 2017/06/21 15:37:42  №1009237 462
>>1009219
как там в 2000 году норм ? В 2к17 есть ORM , Doctrine и тд. которые как бы намекают что писать свой SQL вообще не нужно , для 70% комерц дерьма
Ответы: >>1010320
Аноним 2017/06/21 15:38:48  №1009239 463
>>1009220
мы про PHP тут говорим а не про какой-то C++ лол
Аноним 2017/06/21 20:04:34  №1009440 464
Смотрю уроки про Standard PHP Library - так называется тема урока. Это вообще нужная хуйня? Кто-то шарит? Как часто использует? Пиздец занудное непонятное нахуй нужное говно. Классы итераторов эти ебучие
Ответы: >>1009590 >>1009877
Аноним 2017/06/21 20:37:37  №1009468 465
tb.png (17, 529x316)
316x529
Безwqqwqwwqqwымянный.png (6, 207x274)
274x207
Ответы: >>1009476
Аноним 2017/06/21 20:44:20  №1009476 466
Аноним 2017/06/21 20:53:48  №1009484 467
Есть таблица:
Id---product_id---prop_id
1----2-------------2
2----2-------------1
3----6-------------2
4----7-------------3
5----7-------------2
6----3-------------2
Как получить id всех товаров у которых есть свойство 1 И 2?
Ответы: >>1009494 >>1009497
Аноним 2017/06/21 21:08:30  №1009494 468
>>1009484
Что значит "свойство"? В каком-то столбце имеется 1 и 2?

SELECT id FROM table_name WHERE product_id = 1 OR product_id = 2 AND prop_id = 1 OR prop_id = 2
Ответы: >>1009498
Аноним 2017/06/21 21:11:40  №1009497 469
>>1009484
SELECT prod_id FROM qwe WHERE prop_id IN (1,2) GROUP BY prod_id;
Ответы: >>1009584
Аноним 2017/06/21 21:12:32  №1009498 470
>>1009494
prop_id от слова проперти , что и есть свойство
Аноним 2017/06/21 22:50:14  №1009584 471
>>1009497
Он выберет товары которые содержат свойство или 1 или 2 а мне нудно чтоб товар содержат и оба единовременно
Ответы: >>1009592 >>1009877
Аноним 2017/06/21 22:53:18  №1009588 472
Хочу делать бэк и фронт интернет-магазинов, как считаете, что лучше выбрать для этого?
Есть соблазн закопаться в какую-нибудь цмску и пилить пирожки.
Аноним 2017/06/21 22:54:20  №1009590 473
>>1009440
А мог бы уже сайты делать.
Да, нужны, на практике все понятнее.
Ответы: >>1009847
Аноним 2017/06/21 22:56:38  №1009592 474
>>1009584
Отвечу сам себе, скорее всего верный ответ
SELECT prod_id FROM qwe GROUP BY prod_id WHERE COUNT(id) = 2 AND (prop_id = 1
Аноним 2017/06/21 22:59:29  №1009595 475
OR prod_id = 2) но как быть если для prod_id нужна сложная логика? Типа prod_id = 2 AND (prod_id = 1 OR prod_id = 3) ???
Ответы: >>1009628 >>1009877
Аноним 2017/06/21 23:24:48  №1009628 476
>>1009595
Отступы добавить и скобки.
Аноним 2017/06/22 00:26:15  №1009669 477
Join'и таблицу саму на себя в первой будет выборка prop_id 1, во второй 2 на пересечении получишь то что тебе нужно. Если в будущем появится необходимость пересечь больше свойств - такой запрос будет слишком медленным, так как каждое свойство это join. В этом случае смотри в сторону денормализации таблицы.
Ответы: >>1009877 >>1010320
Аноним 2017/06/22 00:27:44  №1009670 478
В данном случае это будет inner join
Аноним 2017/06/22 01:16:32  №1009681 479
Ответы: >>1009682
Аноним 2017/06/22 01:22:17  №1009682 480
>>1009681
Сам нашел, пздц, запятую забыл поставить.
Аноним 2017/06/22 08:23:33  №1009723 481
Есть тут кто-нибудь, кто может сейчас помочь по PHP?
Ответы: >>1009753
Аноним 2017/06/22 09:49:30  №1009753 482
>>1009723
Ты задавай вопрос, а ответит кто-то или нет это уже зависит от вопроса. Думаю на просьбу "сделайте мне курсач/сайт бесплатно без смс" добровольцев не найдется
Ответы: >>1009771
Аноним 2017/06/22 10:32:19  №1009771 483
>>1009753
Да, я решил отказаться от идеи, и помощь теперь нужно только в нахождении ошибки.
https://pastebin.com/FeyveKfg - не добавляет запись в базу, хз почему, найти никак не могу.
Ответы: >>1009773 >>1009789
Аноним 2017/06/22 10:33:55  №1009773 484
Аноним 2017/06/22 10:56:29  №1009789 485
>>1009771
Оберни названия колонок в ``. А вообще всегда надо смотреть логи ошибок
Ответы: >>1009798
Аноним 2017/06/22 11:09:01  №1009798 486
>>1009789
каких именно? если после тех которые после инсерт, то не из-за этого.
Вот это работает - https://pastebin.com/gUkezpNh
Ответы: >>1009803
Аноним 2017/06/22 11:16:11  №1009803 487
>>1009798
datetime это тип данных в sql, в то же время у тебя это название колонки, отрабатывающий запрос ниже без неё, чтобы указать, что это название колонки юзай `` вокруг.

mysql_query(" INSERT INTO payments(`service_name`,`service_cost`,`summ`,`datetime`)
VALUES ('$service_name','$service_cost','$summ','$datetime') ");
Ответы: >>1009812 >>1010319
Аноним 2017/06/22 11:22:54  №1009812 488
>>1009803
добавил как ты написал, ничего не изменилось
Ответы: >>1009814
Аноним 2017/06/22 11:24:09  №1009814 489
>>1009812
Значит смотри логи ошибок или включи вывод ошибок на экран.
Ответы: >>1009819
Аноним 2017/06/22 11:27:46  №1009819 490
Ответы: >>1009821
Аноним 2017/06/22 11:30:39  №1009821 491
l0-php-w001.png (41, 620x1069)
1069x620
>>1009819
Пик-релейтед в ОП-посте.
Или в гугле любая ссылка по отображению ошибок.
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
Ответы: >>1009829
Аноним 2017/06/22 11:50:52  №1009829 492
>>1009821
написало что это не работает:
<?php $result = mysql_query(" SELECT * FROM services "); ?>
хотя оба выпадающих списка работают
Аноним 2017/06/22 12:09:02  №1009836 493
Пздц, как можно было не заметить
$service_id = strip_tags(trim($_POST['service_id']));
$detail_id = strip_tags(trim($_POST['detail_id']));
$summ = strip_tags(trim($_POST['summ']));
$datetime = strip_tags(trim($_POST['datetime']));

mysql_query(" INSERT INTO
payments(service_name,service_cost,summ,datetime)
VALUES ('$service_name','$service_cost','$summ','$datetime') ");

Создал одни переменные, в инсерте совсем другие(первые две)
Из-за кавычек кстати тоже не работало
Ответы: >>1010319
Аноним 2017/06/22 12:40:30  №1009847 494
>>1009590
>Да, нужны
ну ок (((
досмотрел эту залупу. След тема PDO - интересная тема, схавалась на лету, а следом за ней пошло опять говнище под названием Reflection API, что по этому поводу скажешь? Очень нужное?
Ответы: >>1009877
Аноним 2017/06/22 13:23:02  №1009877 495
>>1009847
>>1009440
Что там в Reflection и SPL изучать? Итерабельный объект, это объект, по которому можно пройтись foreach'ем. Пример - класс ошибок валидации в symfony/validation: https://github.com/symfony/validator/blob/master/ConstraintViolationList.php#L113
На рефлексии работает разного рода магия, тот же ActiveRecord в Laravel. Без понимания этой магии сложно написать что-то сложнее TODO-приложухи. Ну и я бы советовал не уроки от Васянов смотреть, а пилить что-то своё. В какой-нибудь консольной игре на PHP однозначно можно применить итераторы с SPL.

>>1009669
Не нужен джойн там.

>>1009584
select product_id
from tovar
GROUP BY product_id
having sum(if(prop_id = 1, 1, 0)) and sum(if(prop_id = 2, 1, 0))

>>1009595
Через sum(if(condition, if_true, if_false))
Ответы: >>1009909 >>1009919
Аноним 2017/06/22 13:57:05  №1009909 496
>>1009877
>Не нужен джойн там.
Каким образом ты можешь без JOIN'а связать одним запросом разные записи связанные только по product_id ?
с Join'ом это выглядит так

SELECT pr1.product_id FROM `table` as pr1
INNER JOIN `table` as pr2 USING(product_id)
WHERE pr2.prop_id = 1 AND pr1.prop_id = 2
Покажи как ты считаешь это может выглядеть без JOIN'а и учти что таблица нормализована.
Ответы: >>1009919
Аноним 2017/06/22 14:03:51  №1009912 497
о, аноны, а мне поможете скорректировать запрос?

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

пишу так
select sd.* from sd_dilers sd
LEFT JOIN sd_orders so ON so.shop_id = sd.id
WHERE so.date >= '2017-06-19 13:33:18
'

не выхходит
Ответы: >>1010319
Аноним 2017/06/22 14:10:35  №1009919 498
>>1009909
>>1009877
>select product_id
>from tovar
>GROUP BY product_id
>having sum(if(prop_id = 1, 1, 0)) and >sum(if(prop_id = 2, 1, 0))

Неоптимизированный запрос, даже в моём варианте с джоинами на 3+ джоинах отработает быстрее.
Пик-1 сравнение (первый - твой, второй - мой). Визуал эксплейны на обоих запросах пик 2-3
Ответы: >>1009928 >>1010319
Аноним 2017/06/22 14:13:57  №1009928 499
>>1009919
Алсо тест проводил на таблице с 8.7кк записей, пик - пересечение на 4ёх параметрах
Аноним 2017/06/22 15:22:11  №1009972 500
кот.jpeg (6, 259x194)
194x259
Автор, если ты все еще сидишь в этих тредах, то большое спасибо за уроки! Ты няша!
Аноним 2017/06/22 15:55:33  №1009985 501
Часто ли программисту php в повседневной работе приходится применять регулярные выражения?
Ответы: >>1009992 >>1010319
Аноним 2017/06/22 16:00:13  №1009988 502
Нужно ли передавать класс Util со статическими методам в другие классы (агрегировать его), чтобы явно указать зависимость класса-получателя от него?
Ответы: >>1010029 >>1010319 >>1011750
Аноним 2017/06/22 16:06:09  №1009992 503
Аноним 2017/06/22 16:24:31  №1010000 504
Вот для JavaScript написали TypeScript со строгой статической типизацией, а есть ли что-нибудь подобное для PHP?
Ответы: >>1010008 >>1010046
Аноним 2017/06/22 16:39:43  №1010008 505
Аноним 2017/06/22 17:34:42  №1010029 506
>>1009988
Не обязательно. Но тогда ты должен написать в нём методы так, чтобы они не меняли состояния программы, а "считали" что-то, т.е. получали на вход какое-то значение, а на выходе возвращали новое.

Например: $mb = transformBytesToMegaBytes($file->getSize());

Плохой пример:
transformBytesToMegaBytes($file)
{
...
$file->setSize($mb);
}
Аноним 2017/06/22 18:08:54  №1010034 507
https://pastebin.com/1HpmVxgY
96 строка, не берется $id, помогите плиз, если вместо $id подставить число соответсвующее $id то все нормально сохраняется.
Ответы: >>1010035 >>1010318
Аноним 2017/06/22 18:13:38  №1010035 508
>>1010034
А у тебя $_GET["id"] существует после сабмита? Ты же сабмитишь не на http://...?id=xxx
Аноним 2017/06/22 18:49:50  №1010046 509
>>1010000
в 7 есть опция в php ini , для строгой типизации
Ответы: >>1010318
Аноним 2017/06/22 18:55:46  №1010047 510
Html тег title задается во view или контроллере?
Ответы: >>1010116 >>1010318
Аноним 2017/06/22 19:56:47  №1010084 511
Error и NotFound страницы можно представить как контроллеры, которые создаются в обработчике ошибок? Чтобы передать например туда urlHelper, который в шаблоне даст ссылку на главную страницу?
Ответы: >>1010107 >>1010318
Аноним 2017/06/22 19:58:51  №1010086 512
Пыхаинъекции еще осуществимы или про них можно навсегда забыть и переключиться на sql и xss?
Ответы: >>1010318
Аноним 2017/06/22 20:18:09  №1010107 513
964898900.jpg (112, 1280x691)
691x1280
последняя.jpg (33, 783x197)
197x783
>>1010084

Выглядит, правда, это немного странно (пик 1). Наверное лучше как на пик 2?
Аноним 2017/06/22 20:27:08  №1010116 514
>>1010047

Его значение, имею ввиду.
Аноним 2017/06/22 21:36:53  №1010174 515
https://github.com/someApprentice/filehosting/ Аноним 2017/06/23 05:21:13  №1010316 516
>>1000716

>>1000716

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

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

Также, я вижу, ты там прикрепляешь защиту от csrf как middleware. Но тут есть подвох, где гарантия, что ты не забудешь прикрепить это middleware? Лучше было бы включить защиту по умолчанию для всех POST и аналогичных (PUT, DELETE) запросов, а потом сделать опцию для отключения ее там, где это не требуется.

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

Сессию также плохо использовать для авторизации, так как она удаляется через 20-30 минут неиспользования.

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

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

Также, в случае с CSRF обрати внимание на этот момент: https://github.com/slimphp/Slim-Csrf#token-persistence

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

https://github.com/someApprentice/filehosting/blob/master/config/config.ini
Я думаю, что в конфиг не нужно выносить настройки, которые пользователь поменять все равно не может (тип БД и кодировка). Их можно просто прописать где-то в коде создания соединения с БД.

https://github.com/someApprentice/filehosting/blob/master/config/cli-config.php
Это наверно не совсем конфиг

https://github.com/someApprentice/filehosting/blob/master/config/sphinx.conf
Для конфигов есть интересная фича, которая позволяет не копипастить какие-то куски по всему конфигу (например, путь к корневой папке, где хранятся файлы индексов): http://sphinxsearch.com/blog/2013/11/05/sphinx-configuration-features-and-tricks/

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

APP_DB_HOST=database
APP_DB_PASS=123456
APP_SPHINX_ROOT=/var/lib/sphinxsearch

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

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

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

Плюсы этого подхода описаны тут: https://12factor.net/config Дополнительынй плюс в том, что переменные окружения доступны программе на любом языке программирования. Как вариант, есть php-библиотека dotEnv, парсящая такие конфиги напрямую.

Минусы там не описаны, и в восторженных статьях их тоже почему-то не пишут, но я-то понимаю, что тут не все просто:

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

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

Библиотеки

- https://github.com/vlucas/phpdotenv
- https://github.com/josegonzalez/php-dotenv

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

https://github.com/someApprentice/filehosting/blob/master/src/Types/Ltree.php
Вот тут, раз уж ты определил тип для ltree, можно было бы в PHP сделать более удобное представление. Ну например, представлять путь в виде массива значений. Или в виде объекта TreePath с разными удобными методами манипулирования путем (добавление значений, получение глубины, и тд).

https://github.com/someApprentice/filehosting/blob/master/src/init.php#L49
Параметры соединения со сфинксом почему-то в конфиг не вынесены в отличие от БД.

Также, в ридми нет описания, как развернуть проект. Да и ридми самого тоже нет.

> $basePath = rtrim(str_ireplace('index.php', '', $c['request']->getUri()->getBasePath()), '/');
Вот эта строчка как-то странно выглядит - она точно правильная? Там не dirname() должно быть или что-то такое?

https://github.com/someApprentice/filehosting/blob/master/src/Model.php
Вот тут класс по моему неправильно назван. Это модель чего? По моему ту