«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Клуб любителей изучать PHP/webdev 95 Аноним 2017/10/26 23:14:41  №1082507 1
php-noob-1.png (33, 500x500)
500x500
cat-cafe-osaka.jpg (157, 1024x683)
683x1024
welcome-to-php.png (188, 853x480)
480x853
just-google-it.jpg (156, 787x830)
830x787
Добро пожаловать. Тут мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет сделать себе блог, кто-то приобрести новую профессию, кому-то просто нечего делать.

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

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

Предыдущий тред был тут: >>1067944 (OP) . Еще предыдущие треды ищутся в гугле по словам "клуб изучающих php" или в архиваче.

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

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

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

С чего начать

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

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

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

Ты прошел весь учебник? Молодец, но это были лишь основы языка 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 3/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. У нас в треде были люди, которые практически с нуля учились и смогли найти работу.
- Что будут спрашивать на собеседовании если 0 опыта - гонять по теории, по официальному мануалу PHP, давать дурацкие задачки на переворачивание строк, гонять по SQL (транзакции, внешние ключи, напиши запрос), по JS (как сделать анимацию при нажатии кнопки), ну погугли, не ленись
- Можно подробнее про поиск работы, собеседования - нет, ОП писать не будет, но может кто из анонов захочет рассказать. Поищите тред перезвонивших, а также раздел /wrk/
- Сколько времени надо изучать все это? - все зависит от тебя, но не меньше 6-8 месяцев
- Нужен ли ООП, фреймворки, MVC, git, composer? — Да, однозначно. Посмотри любую вакансию.
Оформление кода Аноним 2017/10/26 23:15:49  №1082509 2
grammar-nazi.png (56, 500x644)
644x500
Код нужно писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.

Если тебе лень выравнивать код руками, закачай его на 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
Аноним 2017/10/26 23:18:23  №1082512 3
Ответы: >>1091604 >>1091606
Анон, с лопающейся головой 2017/10/27 00:18:35  №1082534 4
Продублирую из последнего треда.
Попробовал осилить палиндром.
Вот только на ideone видимо открутили mb модуль.
Нашел альтернативу: http://phpfiddle.org/
Но без понятия как линковать оттуда код, поэтому линк бросаю на ideone:
https://ideone.com/hlU88a
Может кому-то не лень будет копипастнуть оттуда код.
Ответы: >>1082537
Аноним 2017/10/27 00:27:47  №1082537 5
>>1082534

Вообще список алтьтернатив написан маленькими буквами в учебнике внизу:

> Ideone не работает!11 Ну так открой Гугл и найди сайты вроде https://repl.it/languages/php , http://phptester.net/ , http://sandbox.onlinephpfunctions.com/ , http://codepad.org/ или http://www.runphponline.com/

Ищутся по словам "run php online".

Эх ... никто не читает примечания.

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

> Конвертирую полученную строку в массив;
Ты забыл флаг PREG_SPLIT_NO_EMPTY, без него в массив добавляется 2 пустых строки (проверь через var_dump)

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

Переменную $n наверно проще вычислить из $i чем считать в цикле.

Переменную $k лучше было назвать понятнее, например, $errors.

После нахождения первого несовпадения из цикла можно выходить - какой смысл проверять дальше?

А так, алгоритм вроде верный.
Ответы: >>1082539
Аноним 2017/10/27 00:33:42  №1082539 6
>>1082537
Спасибо. Поработаю над твоими замечаниями. Отдельное спасибо за доп. задачи в предыдущем топике. Ну прям реально спасибо.
Аноним 2017/10/27 00:42:46  №1082541 7
>>1080981
>Если ты знаешь ООП.
К сожалению, еще не начал изучать.

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

Вот: https://ideone.com/XhydTt#stdin. Правильно ли дописал? А то может я неправильно понял. Если правильно, то можно было как-то лучше? Спасибо.

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

И что будет если вернется true ? false ?

что будет если искать товар с параметром false?

Я обязательно сейчас буду пытаться понять, просто кусочек написал, чтобы разбираться потихоньку
Ответы: >>1082554
Аноним 2017/10/27 00:49:16  №1082543 8
Есть один Апач. В htdocs создал директорию example с сайтом и кинул туда htaccess:
RewriteEngine On
RewriteRule ^(.)$ /public/index.php?$1 [L, QSA]
А в паблик кинул такой:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.
) index.php?$1 [L,QSA]
Хочу редиректить все запросы к localhost/example/ на индекс, но что-то совсем не выходит. В чем может быть проблема? Гугли почти весь день, но что-то не выходит ничего.
Ответы: >>1082554
Аноним 2017/10/27 01:13:35  №1082554 9
>>1082541

Ответил тут >>1082551 (только дальше лучше отвечать в этом новом треде).

>>1082543

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

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

статья https://habrahabr.ru/company/sprinthost/blog/129560/
Ответы: >>1083048
Аноним 2017/10/27 02:36:24  №1082572 10
Привет, ещенедостаточноночной.

Суть такова, имеется csv файл с заменами для страницы, на странице размещаются ссылки вида сайт/страница/залупакентавра, и по каждой из ссылок сайт выдает страницу с заменами блоков из csv со строки с id залупакентавра. Строк в csv минимум десяток.

Собсна я уже джва дня не могу вкурить как это делается, подскажите куда копать. Да, я дно.

Типа по идее еще и апач нужно напрягать, чтобы он конвертировал ссылки.
Аноним 2017/10/27 09:28:33  №1082594 11
Какой дружелюбный оп пост.
Знающие аноны, я начал изучать js, после хотел html/css.
Все это для работы в вебе.
Возможно я сделал неверный (джихат) выбор.
Прошу объяснить, почему и как правильнее начать?
Почему с php и только после него js.
Ответы: >>1082606 >>1082611 >>1082786
Аноним 2017/10/27 09:55:55  №1082606 12
>>1082594
Для начала надо разобраться зачем это все нужно и чего ты хочешь. Html/css для веба надо знать всем. А вот про языки - пхп это бек-енд, язык на котором бишут движок сайта. А жс это фронтенд, вот разберись с этим и учи что тебе интересней.
Ответы: >>1082613
Аноним 2017/10/27 10:10:40  №1082611 13
>>1082594
Ладно, даже если это толстота, скажу тем кто невинно это прочитал.
Значит так любой язык (даже HTML с XML) - Самостоятелен и не является выходящим из другого, а лишь может служить дополнением. Это значит, что язык можно учить любой и в любом порядке. Хочешь учи CSS без HTML, хочешь наоборот, хочешь вместе - Решай сам. Тут нянек НЕТ и если ты не можешь разобраться даже в таких простых вещах, то не то, что программирование, но и любое другое дело точно не для тебя и зря ты за него взялся. Так же в ОП посте есть замечательная картинка в которой есть упоминание о таком замечательном ресурсе как Google.
Так-же в ОП посте есть ссылки и на HTML с CSS и на JS и на всё, представляешь!? Там ВСЁ написано! Невероятно!
Вернемся к теме о самодостаточности языков для тех кто не умеет пользоваться мозгом:
Для начала определим, зачем нам нужен тот или иной язык программирования(Определение которого я не буду давать, уж слишком смешно), но чтобы это сделать, нам нужно узнать зачем тот или иной нужен - берем и заходим сюда https://www.google.ru/ и вбиваем в строку поиска: Языки программирования для веба. Нам выдает результаты Языки для веб-разработки и о чудо! Полный список определений веб-разработчиков! Например:
Backend | Front-end | Full-stack
Читаем, что мы узнали? Что есть веб-разработчики серверной части, графической части ЮИ и гибрида того и другого.
А что нужно каждому из этих трех видов разработчиков, кроме последнего, который должен знать все? Правильно! Свои языки, которыми они будут программировать.
Для фронта нужны языки, которыми он сможет манипулировать с графическим интерфейсом пользователя, а для того, чтобы узнать какие языки для этого подходят, берем и снова гуглим Front-end разработчик и там будет описано всё, что нужно. А вкратце три языка - HTML&CSS&JS, как думаешь, в каком порядке лучше учить?
Тоже самое делаем и со всем последующим, а именно вот тебе схемка:
Вопрос -> Гугл -> Решение.
Кстати когда я загуглил нашел следующее:
https://habrahabr.ru/post/12778/
https://geekbrains.ru/posts/road_to_web_development
https://habrahabr.ru/post/306716/
Неужели так сложно думать?
И задавайте вопрос максимально конкретно и развернуто, на ваши блякания врятли кто ответит и если вы думаете, что данный вопрос точно сложный и относится к вопросу тематики треда - ДОБРО ПОЖАЛОВАТЬ
Ответы: >>1082612 >>1082633
Аноним 2017/10/27 10:16:06  №1082612 14
>>1082611
Спасибо за развернутый ответ, добрый человек.
Очень информативно.
Согласен, пишу херню вместо того чтобы разобраться.
Частично оправдаю это тем, что туп, ленив и последние две недели живу только на кофе (работа+курсачи)
Покурю по больше о бэк и фронте, решу что больше подходит и ближе к диплома начну спокойно изучать.
Добра тебе.
Ответы: >>1082615 >>1082616
Аноним 2017/10/27 10:16:37  №1082613 15
Аноним 2017/10/27 10:17:54  №1082615 16
>>1082612
Это тебе спасибо, теперь у нас есть паста для платины.
Аноним 2017/10/27 10:18:22  №1082616 17
>>1082612
Чел, ты сквозишь неуверенностью в себе. Не надо оправдываться, мы совершаем глупости для того, чтобы их не повторять после. Продуктивной работы тебе
Ответы: >>1082620
Аноним 2017/10/27 10:23:03  №1082620 18
>>1082616
Только ты не всегда можешь знать, когда ты глупость совершаешь.
Аноним 2017/10/27 10:58:54  №1082633 19
>>1082611
Ну js точно имеет смысл учить только после html/css, а в остальном ты прав.
Аноним 2017/10/27 11:12:38  №1082636 20
Анчоусы, как внутри устроены индексы в MySQL?
Ответы: >>1092703
Аноним 2017/10/27 17:08:34  №1082786 21
>>1082594
Без разницы, какой язык учить на начальном этапе. Это тоже самое, что выбирать учить английский или немецкий, если вообще не имеешь понятия, как разговаривать даже на родном.
Аноним 2017/10/28 00:35:48  №1083048 22
>>1082554
>1) допиши код findItems, чтобы все это работало
У меня не получается сделать задание. Одни ошибки и null'ы. https://ideone.com/rh7w82 . Код переделывал пару раз достаточно сильно.

Лучше читать мануал тогда по функциям?
Ответы: >>1083049 >>1083064 >>1083065
Аноним 2017/10/28 00:36:13  №1083049 23
>>1083048
Сам себе отвечаю.
> лучше читать мануал по функциям

Лучше! Все иду читать.
Аноним 2017/10/28 01:05:02  №1083064 24
>>1083048

Ошибка тут:

> if($checkWeightLessThan100){ //если вес меньше 100 то

Во-первых, у переменной тут неудачное название. Можно подумать, что сюда можно передать только функцию, которая проверяет, что вес меньше 100 - но на самом деле сюда можно передать любую функцию и назвать переменную лучше было бы "проверятель условия". Для таких функций-"проверятелей", что объект соответствует каким-то условиям, есть устоявшееся название - предикат ($predicate).

(вот пример вопроса на английском и видно, что там в ответах часто используется это слово: https://stackoverflow.com/questions/122105/what-is-the-best-way-to-filter-a-java-collection )

Во-вторых, ты не вызываешь функцию. Ты пишешь

if ($check...)

что значит "если переменная $check... не пуста". Разумеется, она не пустая - мы передали в нее функцию и if всегда срабатывает.

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

$checkResult = $predicate($item);

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



Аноним 2017/10/28 01:06:55  №1083065 25
>>1083048

Что касается ошибки на ideone, ты там неправильно написал имя переменной.
Движок статистики на бекенде Аноним 2017/10/28 02:40:45  №1083085 26
Анон, посоветуй опен-сорс движок статистики на сервер.

Надо трекать количество некоторых событий - суммарно, за выбранный период, с фильтрацией по каким-то ключам или без фильтрации. Как я это представляю: я из php отправляю движку некое событие в стату, он записывает это в какую-то (любую) базу, и где-то у него есть интерфейс, где все это можно посмотреть.
Ответы: >>1083207
Аноним 2017/10/28 12:46:04  №1083163 27
php-noob-15.png (85, 950x750)
750x950
Привет, аноны, начал решать простые задачи по по пхп, которые в шапке есть и тут уже с трудностями столкнулся.
На первом пике задача, которую надо доработать, чтобы, остаток по кредиту в минус не уходил. Попытался запилить проверку условием, только какого то хуя, она не проходит и начинает код сразу, после if выполнять, под спойлером код сам код тащемта

<?php

error_reporting(-1);

$creditBalance = 40000; / Долг анона перед банком /
$percent = 1.03; / Банк начисляет 3% в месяц от суммы /
$servicePayment = 1000; / А также 1000 рублей в месяц комиссии за обслуживание счета /
$monthlyPayment = 5000; / Анон платит 5000 р в месяц, это все, что ему дает мама на завтраки /
$paymentTotal = 0; / Сколько всего отдал банку анон /

/ Посчитаем расходы 20 раз на 20 месяцев вперед /
for ($month = 1; $month <= 20; $month ++) {
$creditBalance = ( $creditBalance * $percent ) + $servicePayment;
echo "{$creditBalance}\n";
if($creditBalanc < 5000) { $paymentTotal = $paymentTotal - $creditBalance;
$creditBalanc % $monthlyPayment;
echo "{$month} месяц спутя: долг = {$creditBalance} руб, выплачено всего {$paymentTotal} руб. \n";
echo "С меня хватит!\n";
break;
}
else {
$creditBalance = $creditBalance - $monthlyPayment;
$paymentTotal = $paymentTotal + $monthlyPayment;
echo "{$month} месяц спустя: долг = {$creditBalance} руб, выплачено всего {$paymentTotal} руб. \n";
}
}

Помогите разобраться, чому так выходит?
Ответы: >>1083183 >>1094210
Аноним 2017/10/28 12:48:45  №1083164 28
image.png (78, 970x506)
506x970
Уебищно получилось вставить.
Ответы: >>1083197
Аноним 2017/10/28 13:33:01  №1083183 29
>>1083163
имена переменных посмотри. Не $creditBalanc,а $creditBalance
Ответы: >>1083187
Аноним 2017/10/28 13:35:20  №1083186 30
А все, решил, просто руки из жопы.
Аноним 2017/10/28 13:35:50  №1083187 31
>>1083183
Да я там с именами накосячил, да и вообще весь цикл через жёпу сделал.
Аноним 2017/10/28 14:15:11  №1083197 32
>>1083164

Выработай себе привычку вывод делать с помощью printf(), а не интерполяцией:

echo "{$month} месяц спустя: долг = {$creditBalance} руб, выплачено всего {$paymentTotal} руб. \n";

printf("%d месяц спустя: долг = %0.2f руб, выплачено всего %0.2f руб. \n", $month, $creditBalance, $paymentTotal);
Аноним 2017/10/28 14:40:33  №1083207 33
>>1083085
Нашел piwik, кто-нибудь работал с ним?
Ответы: >>1083399
Аноним 2017/10/28 14:51:38  №1083214 34
кто-нибудь зарабатывает на своем сайте? расскажите плес а то жрать нечего
Ответы: >>1083428 >>1094210
Аноним 2017/10/28 21:29:15  №1083399 35
>>1083207

Я работал. Немножко странновато, но ваще кошерно
Аноним 2017/10/28 22:10:44  №1083428 36
>>1083214
ставь жс майнер и гони туда траф, если уж совсем голодный, лал
Ответы: >>1083451
Аноним 2017/10/28 22:40:48  №1083451 37
>>1083428
интересная тема кстати но чет хз)0 ты пробовал?
Аноним 2017/10/29 01:41:58  №1083537 38
Что то какая то фигня с установкой mysql на винду. Просит либу плюсов 2013 года, которая у меня уже стоит. Похоже придется ручками все ставить, надеюсь гайд в шапке еще актуальный.
Ответы: >>1094210
Аноним 2017/10/29 03:08:49  №1083552 39
Решаю задачу из темы регулярные выражения. Суть задачи. Найти правильный номер и привести в общий порядок его.

Решил проверить как приводить в общий порядок и столкнулся с кое-чем интересным. https://ideone.com/DF6Vkq
Я понимаю, что это типичная ошибка и даже вижу из-за чего из-за того что повторение {10} вне скобок, но почему-то (из-за моей криворукости 100%) все равно не исправляется. Спасибо! Сейчас еще покопаюсь, может ошибку найду, тогда сразу сюда напишу, чтобы не отвечали.
Ответы: >>1083554 >>1083576
Аноним 2017/10/29 03:23:35  №1083554 40
>>1083552
Я понял. Я дебил. Извините меня. лол
Ответы: >>1083576
Аноним 2017/10/29 05:49:05  №1083576 41
>>1083554
>>1083552
Так. Я вернулся сюда)) Я сделал, возрадуюсь сам себе и попрошу проверить на верность решения и говнокод( и как от него можно исправиться)

https://ideone.com/JkLWm0#stdin
Ответы: >>1084686 >>1094211
Аноним 2017/10/29 19:10:32  №1083880 42
Попытался сделать вывод постов как на этой борде:
http://sqlfiddle.com/#!9/3a12a/1
Посты идут группами - первый пост + до 3-х последних. Группы между собой сортируются по дате последнего поста в треде (в моём случае - по ID).
На таблице с тысячей постов запрос работает очень медленно, порядка нескольких секунд. Не понимаю как учитывать бамп-лимит. Можно подсказку?
Ответы: >>1083935 >>1085795
Аноним 2017/10/29 20:14:09  №1083919 43
Percona или MariaDB?

Ответ обоснуйте
Ответы: >>1084116
Аноним 2017/10/29 20:42:03  №1083935 44
>>1083880
Сори, но разве на каждый тред не создается своя таблица?
Ответы: >>1085795
Аноним 2017/10/30 02:01:36  №1084074 45
^\W[+7|8]\W[0-9]\W[0-9]\W[0-9]\W[0-9]\W[0-9]\W[0-9]\W[0-9]\W[0-9]\W[0-9]\W[0-9]\W$

Вот моя регулярка на номера https://regex101.com/r/qF7vT8/3.

Eсли я обозначил в регулярном выражении поиск только цифр и любого символа, кроме букв, цифр и знака подчёркивания, то почему он воспринимает Люсю?
Ответы: >>1084088
Аноним 2017/10/30 02:42:21  №1084088 46
>>1084074
> ^\W[+7|8]\W[0-9]\W[0-9]\W[0-9]\W[0-9]\W[0-9]\W[0-9]\W[0-9]\W[0-9]\W[0-9]\W[0-9]\W$
unicode поставь, смертный
Ответы: >>1084100
Аноним 2017/10/30 03:50:55  №1084100 47
>>1084088

Да, странно, что на regex101 надо включать этот флаг явно.

Надо справа поставить флаги mgu вместо mg (m - чтобы ^ и $ применялись к каждой строке, а не ко всему тексту, g - чтобы он не останавливался на первом совпадении, а искал все).


Аноним 2017/10/30 05:23:49  №1084116 48
Аноним 2017/10/30 08:30:29  №1084135 49
Как делается сортировка товаров по популярности? Неужели отдельное поле создается типа views и апдейтится при каждом просмотре страницы товара?
Ответы: >>1084149 >>1085795
Аноним 2017/10/30 10:04:17  №1084149 50
Аноним 2017/10/30 11:43:43  №1084176 51
Почему оно берёт и 7 и +8, если в выражении явно указано, что или +7 или 8?
Ответы: >>1084216
Аноним 2017/10/30 11:50:29  №1084179 52
Вот что не так? Где я неверно написал выражение?
Ответы: >>1085793
Аноним 2017/10/30 12:56:16  №1084216 53
>>1084176

Что, по твоему значат квадратные скобки? Ну вот например, в чем разница между abc и [abc]? Или a|b и [a|b] ?
Аноним 2017/10/30 12:58:25  №1084218 54
sup,
есть динамическая таблица которая генерирует name = val1; name = val2; name = val3 ... к новым созданым ячейкам (это всё делается в цикле)
Теперь эту таблицу нужно передать в mysql.
как это правильно сделать?
Могу я это сделать через
for ($i = 0; $i < count($_POST['val']); $i++)
а потом $Val = $_POST['val'][$i]; ?
я сделал так, на при нажатии на сабмит, выдает пустую страницу пхп файла (т.е что-то пошло не так)
у первого элемента name = val1;
у элемента под ним (элемента новой созданой строки таблицы) name = val2; и тд
Ответы: >>1085793
Аноним 2017/10/30 13:43:18  №1084232 55
Пытаюсь решить задачку на рекурсию от ОПа, которую он в прошлом треде постил:
>1) Дан список категорий товаров в виде такого массива:

>$categories = [
>// id, название, parentId, кол-во товаров
>[1, 'Бытовая техника', null, 0],
>[2, 'Телевизоры', 1, 0],
>[3, 'LCD-телевизоры', 2, 20],
>[4, 'Телевизоры с газоразрядным дисплеем', 16],
>[5, 'Стиральные машины', 1, 0],
>[6, 'Холодильники', 1, 0],
>...
>];

>Для каждого товара указан уникальный id категории, >название, id родительской категории или null, если ее >нет, количество товаров в этой категории без учета >категорий-детей. Используя эти данные:

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

>Например, для категории 3 вернет массив [1, 2, 3] >(Бытовая техника -> Телевизоры -> LCD-телевизоры). А >для 1 - массив [1].

>б) Напиши функцию, которая для любой категории >вернет массив id ее потомков. Например для id = 2 >функция должна вернуть массив [3, 4]

>в) Напиши функцию, которая вернет массив >категорий-сестер (то есть категорий, имеющих того >же родителя). Для id = 2 функция должна вернуть >массив [5, 6]

>г) Напиши функцию, которая выведет список >категорий в виде дерева "лесенкой", с указанием >числа товаров с учетом дочерних категорий:

>Бытовая техника (36)
>- Телевизоры (36)
>-- LCD-телевизоры (20)
>-- Телевизоры с газоразрядным дисплеем (16)
>Стиральные машины
>Холодильники

Блядский врот, в прошлом треде увидел это и весь день пытаюсь решить. А в итоге что? А в итоге я тупо и нихуя не могу, хоть уже и с опытом работы овер год. Причем рекурсивная поебень 1 раз всего нужна была в работе, и в итоге тупо стаковерфлоу помог. Не попадайтесь в мою ловушку кароче, не тратьте время на это.
Ответы: >>1084256 >>1085029 >>1085793
Аноним 2017/10/30 14:48:34  №1084256 56
>>1084232
А как такое решать? Может кто-нибудь подскажет в каком направлении думать?
Ответы: >>1085793
Аноним 2017/10/30 17:01:14  №1084349 57
Может кто-нибудь на пальцах объяснить, как в yii делается разграничение прав на доступ к страницам для разных групп пользователей?
Ответы: >>1084378
Аноним 2017/10/30 17:48:31  №1084378 58
>>1084349
как сам захочешь, так и делается
Аноним 2017/10/30 19:16:46  №1084433 59
Вот. Теперь она правильная?
Аноним 2017/10/30 19:18:17  №1084435 60
>>1084433
Да ты просто гуру регулярок.
Аноним 2017/10/30 19:52:18  №1084467 61
Ответы: >>1084474
Аноним 2017/10/30 19:58:08  №1084474 62
>>1084467
>>1084433
Можешь так заменить 10 цифр после +7 или 8.
Регулярка станет красивее и более читаема.
Аноним 2017/10/30 20:42:12  №1084516 63
>>1084433

Ты копипастишь одно и то же много раз:

\W*[0-9]\W*[0-9]\W*[0-9]

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

- +, *, ?, {N}, {N,M}

Пример:

abc+ соответствует словам abc, abcc, abccc, abccc

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

(abc)+ соответствует словам abc, abcabc, abcabcabc
(abc){3} соответствует слову abcabcabc

Используй эту возможность.

Также, ты используешь \W - но ведь это включает все знаки, вроде % или $, которые в номерах вряд ли встретятся. Лучше перечислить конкретные символы, которые допустимы между цифрами номера.


Ответы: >>1084752 >>1084765
Аноним 2017/10/30 21:18:34  №1084558 64
Ответы: >>1085793
Аноним 2017/10/30 22:41:38  №1084627 65
Как разбить строку на слова, пробелы убрать и все это добавить в массив?
Ответы: >>1084632
Аноним 2017/10/30 22:45:02  №1084632 66
>>1084627
Пример:

$text = "Кот собака кит дельфин";

Из этого получить массив с 4 элементами
Ответы: >>1084677 >>1084698 >>1084699
Аноним 2017/10/30 23:15:20  №1084657 67
ОП любезно набросал мне задачек в прошлом треде:
-----

1) Дан список товаров на складе вида (название, вес), например:

ром, 50 кг
сахар, 100 кг
ром, 35 кг
сахар, 20 кг
болты, 200 кг

Как видно, некоторые товары повторяются. Напиши программу, которая принимает на вход список товаров (в каком виде - придумай сам) и выводит сгруппированный по товарам список, для примера выше это будет:

ром, 85 кг
сахар, 120 кг
болты, 200 кг

-----

2) Дан текст, найди в нем слова, которые встречаются больше 1 раза. Текст может содержать слова на русском языке, пробелы между ними и знаки препинания. Пример текста: "Ехал Грека через реку, видит Грека - в реке рак." (повторяется слово "Грека").

-----

3) Дан текст, найди в нем слова, в которых идет 3 или более согласных подряд.

-----
Пилю результат:
1) https://ideone.com/RQ1WDk
2) https://repl.it/N2om/0
3) https://repl.it/NXrw/1
Еще опчик как-то издавна загадал запилить таблицу умножения столбиками:
https://ideone.com/Ez74yF
Ответы: >>1084787 >>1085792
Аноним 2017/10/30 23:48:39  №1084677 68
Ответы: >>1084687
Аноним 2017/10/30 23:55:12  №1084686 69
optimusPrime.png (28, 995x411)
411x995
Ответы: >>1084689 >>1085791
Аноним 2017/10/30 23:56:14  №1084687 70
>>1084677
Это конечно хорошее решение, но мое непонимание подсказывает мне, что это не PHP, да? Но спасибо все равно
Аноним 2017/10/30 23:58:30  №1084689 71
>>1084686
Да. У тебя красивее и читабельнее получилось. Молодец!
Аноним 2017/10/31 00:08:21  №1084698 72
>>1084632
Сделал. Но как быть, если пробелов больше одного? https://ideone.com/Wp6UjX
Регулярками не получается потому что косожопый наверное
Ответы: >>1085791
Аноним 2017/10/31 00:08:25  №1084699 73
>>1084632
Антош, ты как уроки от ОПа читаешь, там же было про енто:
$text = "Кот собака кит дельфин";
$regExp = '/\s+/';
$a = preg_split($regExp, $text, -1, PREG_SPLIT_NO_EMPTY);
var_dump( $a);
Ответы: >>1084702
Аноним 2017/10/31 00:11:44  №1084702 74
>>1084699
Спасибо большое! Извиняюсь за свою косожопость и слепоту.
Аноним 2017/10/31 01:50:18  №1084752 75
>>1084516
Как тогда указать, что скобки, пробелы и тире может идти между цифрами?

И оно так не работает.


Почему оно на флажки жалуется? https://ideone.com/npYxHz
Я выставил те, что были в regexpe101.
Ответы: >>1085791
Аноним 2017/10/31 01:53:51  №1084753 76
https://ideone.com/oxrw9f

Оно нормально массив выводит?
Что за единичные 8 и +7?
Это совпадения или косяк?
Ответы: >>1084755 >>1085791
Аноним 2017/10/31 01:55:39  №1084755 77
Ответы: >>1084756
Аноним 2017/10/31 01:56:20  №1084756 78
>>1084755
Почему на g ругается, а на остальные нет?
Ответы: >>1085791
Аноним 2017/10/31 02:04:00  №1084760 79
Я не понимаю, как убрать одиночные цифры и оставить только номер.
https://ideone.com/sTy16m
Ответы: >>1084827 >>1085791
Аноним 2017/10/31 02:21:06  №1084765 80
1.png (41, 876x743)
743x876
Безымянный.png (29, 784x698)
698x784
>>1084516
указание конкретных символов он не видит.
Ответы: >>1084768 >>1084772
Аноним 2017/10/31 02:35:19  №1084768 81
>>1084765

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

(\s[+]-[(][)]) значит "1 пробел, за ним 1 плюс, за ним один минус, за ним одна скобка и еще одна скобка"

Аноним 2017/10/31 02:39:50  №1084772 82
>>1084765

Еще дополню.

Вот примитивные конструкции, из которых составляются регулярные выражения:

- привязка к краям строки ^ и $
- привязка к краю слова: \b
- один конкретный символ: a
- один любой символ: .
- один символ из определенной группы: \s, \d, \w
- один любой символ из набора [1234a-f]
- один любой символ, кроме указанных [^abc]
- одно из выражений: (X|Y|Z)
- повторение выражения указанное число раз: вопрос, звездочка, плюс, {N,M} в сочетании с круглыми скобками

Разумеется, ты должен знать все указанные выше конструкции наизусть.

Мануал по ним есть тут, увы, не самым понятным языком написан http://php.net/manual/ru/pcre.pattern.php

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

Если тебе что-то непонятно, то я готов ответить на какой-то конкретный вопрос.

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

Ответы: >>1085787
Аноним 2017/10/31 02:57:14  №1084776 83
Раз уж тут SQL тоже, то у меня как у нуба следующий вопрос: как на время запроса добавить значение какому-то полю?

Вот задание:

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

Задание я сделал, но надо добавить 1 балл. Собственно, я даже не понял куда чё добавлять. Описание, блять, 10 приступов шизофрении из 10. Ебал рот того, кто писал эту непонятную хуйню.

Собственно, мне нужен не UPDATE, а как-то добавить к столбцу ball +1 значение на время запроса. То есть, нужно примерно так: были оценки "14, 15, 16", а нужно чтобы оценки стали "15, 16, 17". Как это сделать, может кто показать на примере? Пытался гуглить - чет нихуя не нашёл подобного.
Спасибо, няши.
Ответы: >>1084777 >>1084779
Аноним 2017/10/31 02:58:16  №1084777 84
>>1084776
>как на время запроса добавить значение какому-то столбцу
фикс
Аноним 2017/10/31 03:01:55  №1084779 85
>>1084776

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

найти машины, у которых балл < (средний балл + 1)

Ничего в таблице менять не надо. Надо просто написать WHERE ball < average_ball + 1

Ответы: >>1084794 >>1084810
Аноним 2017/10/31 03:38:50  №1084787 86
Ответы: >>1085789
Аноним 2017/10/31 04:05:06  №1084794 87
>>1084779
Короче, вот моя процедура:

CREATE PROCEDURE get_cars_list
AS
SELECT g.car_name
FROM garage g
JOIN test_drive td ON g.id_car = td.id_test_drive
GROUP BY g.car_name
HAVING AVG(td.ball) < (SELECT AVG(td.ball) FROM test_drive td JOIN classes c ON td.id_test_drive = c.id_sportcar)
ORDER BY g.car_name
GO
EXEC get_cars_list
GO

Я пытался сделать так, как ты говоришь, но у меня начали повторяться поля из-за +1. Походу я тебя как-то не так понял или у меня где-то косяк. Покажи где что менять, если не трудно. Спасибо.
Ответы: >>1094211
Аноним 2017/10/31 06:09:42  №1084810 88
>>1084779
Спасиб большое, анон, без тебя бы я не разобрался. Няк!
Ещё хотел уточнить, если после "HAVING (подзапрос, который выведет '4') < (подзапрос, который выведет '5')" потом выбираются поля, то я всё правильно решил? Просто слишком дохуя полей, под 500+ тех, которые попадают под условие "4 < 5". Думаю, может подвох где-то. Алсо, если связываю с другой таблицей, то поля дублируются чому-то.
Ответы: >>1085789
Аноним 2017/10/31 08:43:46  №1084827 89
Аноним 2017/10/31 16:48:05  №1085025 90
Всем привет.

У меня вопрос по Dependency injection. У автора есть замечательный урок https://github.com/codedokode/pasta/blob/master/arch/di.md, который я много раз перечитывал, пока не понял наконец суть.

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

Во всех библиотеках, которые я смотрел, классы, которым нужны зависимости, создают их внутри конструктора, т.е. используют hidden dependencies. Пример (я не для АПИ инсты пишу, просто эта библиотека вроде как должна быть хорошо написана, она ведь популярная!1): https://github.com/mgp25/Instagram-API/blob/master/src/Instagram.php

А это расходится с идеей о DI. И так во всех билиотеках, которые я видел. Где-то в лоб создаются классы в конструкторе, где-то это завуалировано типа StaticFactory::buildConstructorArgs, но никто их снаружи не передает.

Короче, вопрос: как правильно в случае с библиотекой передавать зависимости? Или если вы видели примеры либ, где реализовано иначе, просьба скинуть сюда.
Ответы: >>1085287 >>1085294
Аноним 2017/10/31 17:00:07  №1085028 91
x95c8a731.jpg (34, 604x453)
453x604
В догонку к предыдущему посту еще пример:
https://github.com/guzzle/guzzle/blob/master/src/Client.php строки 65 и 75. Ну в общем в любую библиотеку зайдите, там везде в конструкторе классы создаются.
Ответы: >>1085287
Аноним 2017/10/31 17:01:44  №1085029 92
Ответы: >>1085789
Аноним 2017/10/31 17:45:10  №1085047 93
Какой файл для конфига лучше использовать json или php?
Ответы: >>1085286
Аноним 2017/10/31 19:44:55  №1085103 94
Аноны, у меня вот такой вопрос: как в SQL посчитать количество полей, связанных с каждым полем? Бля, хуево объяснил.
Короче, в задаче нужно посчитать количество работ по каждой группе. Каждая группа - это поле в столбце групп.

То есть, нужно посчитать количество выполненных работ по каждому полю. Допустим, столбец "Имя группы" имеет поле "АИБ-12", а количество выполненных группой работ "9". Или столбец имеет поле "АИБ-22", а количество выполненных группой работ "2". Как это сделать? Я примерно прикинул, понял что и где связать, но сука как мне вот это реализовать? Пытался сам допереть - так и не дошло.
Ответы: >>1085109
Аноним 2017/10/31 20:01:14  №1085109 95
Ответы: >>1085127
Аноним 2017/10/31 20:19:20  №1085127 96
>>1085109
А, то есть делаю связь, потом COUNT, потом GROUP BY столбец Группы, столбец Домашние работы? Сейчас попробую, спасибо. Не знал, что GROUP BY может даже такую хуйню вытворять в запросе.
Аноним 2017/10/31 22:50:13  №1085218 97
sup, есть вопрос касательно редактирования файлов с пхп кодом.
Например, у меня есть аккаунт на хостинге, а на моём компьютере сервера нету (т.е и нету пхп), тогда мне нужно каждый раз для просмотра написаного в окне браузера закидать этот файл на хостинг, или может есть какое-то другое решение?
Ответы: >>1085224 >>1085225 >>1085286
Аноним 2017/10/31 22:54:19  №1085224 98
Ответы: >>1085229
Аноним 2017/10/31 22:55:21  №1085225 99
>>1085218
есть решения, например настроить deployment в шторме, а на локальной машине держать копию файлов, которая будет заливаться на сервер при изменениях. но если ты задаешь такой вопрос, то лучше не заморачивайся, делай как сам описал.
Ответы: >>1085229
Аноним 2017/10/31 23:00:57  №1085229 100
>>1085225
>>1085224
phpstorm платный же, а с торрентов скачать не могу :С
Сам саблайн использую.
А что, иначе никак?
> на локальной машине держать копию файлов, которая будет заливаться на сервер при изменениях
а что, этот процесс можно как-то автоматизировать?
Ответы: >>1085278
Аноним 2017/10/31 23:56:56  №1085261 101
>>1083067

> \\W*?
В самом начале и в самом конце это можно не писать

> *?
Здесь вопрос работает не так, как ты думаешь. Квантификаторы (плюс, звездочка, {N} и тд) нельзя ставить друг после друга (только если взять часть выражения в круглые скобки). Знак вопроса здесь влияет на "жадность" звездочки - мануал http://php.net/manual/ru/regexp.reference.repetition.php

Если ты не знал про это, то лучше исправить.

В остальном верно.
Ответы: >>1085269
SomeApprentice Аноним 2017/11/01 00:14:38  №1085268 102
Ответы: >>1087406
Аноним 2017/11/01 00:43:01  №1085278 103
>>1085229
в шторме есть раздел deployment, там указываешь реквизиты доступа к серверу, дальше жмешь "download from server", он выкачивает весь сайт оттуда, и потом в deployment configuration ставишь "деплоить при сохранении. т.е. он при каждом сохранении локального файла будет его отгружать на сервер.

а как в саблайме сделать - хз. я думаю там наверняка плагины есть для деплоя.
Ответы: >>1085281
Аноним 2017/11/01 00:48:01  №1085281 104
>>1085278
я нашёл плагин sftp для сублайма, пока он устраивает
Аноним 2017/11/01 01:06:06  №1085286 105
>>1085218

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

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

Ищи решения для автоматизации деплоя. Я например в простых случаях пишу bash скрипт с вызовом rsync, который закачивает измененные файлы куда нужно.

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

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

Если тебе не нравятся скрипты для командной строки, то можно попробовать поискать какие-то GUI-программы, но я не уверен, что они существуют и что они удобные. Что это за программист, который не может автоматизировать свою работу через bash скрипт? Гайд по командной строке ждет тебя в ОП-посте.

Алсо погуглил за тебя:

- https://habrahabr.ru/post/211733/ (рекомендую и другим анонам почитать комментарии). Вот например человек из Badoo пишет про деплой: https://habrahabr.ru/post/211733/#comment_7287769
- https://www.google.ru/search?q=%D0%B4%D0%B5%D0%BF%D0%BB%D0%BE%D0%B9+%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2+%D0%BD%D0%B0+%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80&newwindow=1&dcr=0&gbv=1&sei=tur4WcaHLYjB6QT09pH4Dg

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

- зайти на сервер по ssh и редактирвоать код на сервере консольным редактором
- подмонтировать папку с сервера по WebDAV/sftp/samba (нужны админские навыки) как внешний диск
- использовать редактор или плагин для синхронизации файлов

>>1085047

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

Также есть еще ini (есть функция чтения ini в PHP), XML, YAML и dotEnv.
Аноним 2017/11/01 01:06:37  №1085287 106
>>1085025

> Сейчас пишу библиотеку для композера для работы с АПИ одним, и чем больше функционал, тем больше получается зависимостей.
Странно. Мне кажется, для работы с HTTP АПИ зависимость должна быть одна - HTTP-клиент (в идеале какой-нибудь PSR-интерфейс, а не конкретная библиотека).

> Но проблема в том, что это не MVC-приложение и что там как таковой контроллер - это не тот контроллер, который ты делаешь, а его пишет пользователь по твоим примерам.
А зачем там контроллер и вообще MVC?

> Пользователь делает очень простые штуки типа "передать логин и пароль от сайта, создать сущность, отправить сущность на сайт"
Для этого не нужно MVC. Смотри, как это красиво делается в ООП:

$apiClient = new MegaApiClient(зависимости, логин, пароль);

$entity = new SomeEntity();
$entity->setName('Иван');
$apiClient->createEntity($entity);

> я не для АПИ инсты пишу, просто эта библиотека вроде как должна быть хорошо написана, она ведь популярная
> Instagram's Private API
Не думаю, что она "хорошо" написана, если использует недокументированное АПИ.

> IMPORTANT: We do NOT throw any exception here for users who are
> // running the library via a webpage. Many webservers are configured
> // to hide all PHP errors, and would just give the user a totally
> // blank webpage with "Error 500"
Опять же, это неправильно. Они затачивают библиотеку под неграмотных пользователей, которые не умеют работать с ошибками и пишут ради них костыли, а надо писать для грамотных.

Что касается DI:

> $this->account = new Request\Account($this);
Это "композиция" ( https://ru.wikipedia.org/wiki/%D0%90%D0%B3%D1%80%D0%B5%D0%B3%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) ) - объект API содержит в себе под-объекты, которые независимо от него не используются. Логично потому их создавать в конструкторе. Подменить их на другие объекты нельзя, так как они по сути являются неотъемлемой частью текущего класса.

> $this->settings = Settings\Factory::createHandler(
> $this->client = new Client($this);
А вот это зависимости и тут стоило бы использовать DI.

Вообще, в библиотеках можно увидеть такие решения, как шаблон проектирования "фасад":

- http://dron.by/post/pattern-proektirovaniya-fasad-facade-na-php.html
- http://designpatternsphp.readthedocs.io/ru/latest/Structural/Facade/README.html (как всегда, бредовый код в примере)
- http://www.javenue.info/post/4

Что-то похожее есть в Доктрине: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/getting-started.html#obtaining-the-entitymanager (смотри вызов Setup::createAnnotationMetadataConfiguration и EntityManager::create).

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

Паттерны Facade и Builder никак не мешают использованию DI и созданию нужных объектов вручную.

Библиотеки конечно могут не следовать принципу DI - но причины надо спрашивать у их авторов. Может в этом есть какая-то выгода? Ну не знаю, когда есть DI, например, можно сделать логгирование всех HTTP запросов, а без DI?

> Пример библиотек с DI

Вот:

- https://github.com/google/google-api-php-client (старенькая, но с DI)
- https://github.com/doctrine/doctrine2


>>1085028

Так-то да, handler - это по идее зависимость, но тут просто при отсутствии конфига она подбирается автоматически. Но опять же, никто не запрещает ее передать явно.
Ответы: >>1085513 >>1102057
Аноним 2017/11/01 01:13:59  №1085294 107
>>1085025

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

Передавай туда уже созданный и настроенный объект для работы с API.
Аноним 2017/11/01 04:23:28  №1085322 108
Снимок.PNG (58, 982x679)
679x982
Вопросы по апачу. Я его распаковал, запустил. Больше ничего не устанавливал, так как запустился, хотя написано в гайде это: "На сайте apachelounge написано, а ты не прочел, что надо установить дополнительно библиотеку Visual C++ Redistributable for Visual Studio (не саму Visual Studio) с сайта майкрософт. Вернись и найди ссылку". Стоит ли качать, если ошибки никакой не было при запуске?

Зашел в распакованные файлы и открыл по адресу ../Apache24/bin/ApacheMonitor.exe
Запустилось. Но не работает. Я как понимаю, ничего мне качать дополнительно не нужно, а просто настроить конфиг?
Ответы: >>1085328 >>1085658
Аноним 2017/11/01 06:05:06  №1085328 109
Снимок1.PNG (3, 347x45)
45x347
Снимок2.PNG (10, 776x387)
387x776
Снимок3.PNG (14, 897x200)
200x897
Снимок4.PNG (10, 779x163)
163x779
>>1085322
Я установил Visual C++ Redistributable for Visual Studio(рис 1). Вот как выглядел распакованный апач на диске D(рис 2). Но так как в readme(рис 3) написана директория, то я заново распаковал, но уже на диск C:(рис 4), но все также запускается и не работает. По ссылке http://localhost/
ничего не отображается(Не удается получить доступ к сайту
Сайт localhost не позволяет установить соединение.)
Ответы: >>1085330
Аноним 2017/11/01 06:25:58  №1085330 110
>>1085328
Также пишет no service installed я прописал httpd.exe -k install
Ответы: >>1085331
Аноним 2017/11/01 06:33:13  №1085331 111
>>1085330
Также пишет no service installed я прописал httpd.exe -k install но все равно не работает*. Я исправил прошлый пост.

Это запуск был через ApacheMonitor.exe

Но сейчас запустил через httpd.exe и все заработало: мне написало It works. Тогда почему же через монитор не работает и пишет no service installed ?

Очень сильно извиняюсь за спам. Я не хотел наспамить.
Ответы: >>1085612
Аноним 2017/11/01 10:44:39  №1085363 112
logo-og.png (28, 1200x630)
630x1200
Привет, котоны. Настраиваю веб-сервер на centos 6.9, нужно установить phpmyadmin, который работал бы под php7. Как это сделать? В репозиториях epel и remi такого нет.
Ответы: >>1085375 >>1085658
Аноним 2017/11/01 11:27:15  №1085375 113
Ответы: >>1085380
Аноним 2017/11/01 11:49:53  №1085380 114
>>1085375
Теперь у меня другая проблема. Залил свой проект Laravel на сервер под апачем, главную страницу в браузере видно, но при переходе по ссылкам такая ерунда:
The requested URL /catalog was not found on this server.
Что делать чтобы это исправить?
Ответы: >>1085404
Аноним 2017/11/01 13:00:58  №1085404 115
>>1085380
Ладно, с этим тоже сам разобрался.
Ответы: >>1085430
Аноним 2017/11/01 13:56:45  №1085430 116
>>1085404
Если будут проблемы, то еще обращайся!
Аноним 2017/11/01 14:04:01  №1085432 117
>>1082507 (OP)
Пацаны, помогите, я сейчас на стенку полезу. Сделал запись с помощью php функции shmop, в разделяемую память, попытался считать её с С++, и вместо передоваемой переменной получил какоето большое десятичное число. Как это пофиксить?
Ответы: >>1085658
Аноним 2017/11/01 14:48:41  №1085440 118
Блять, бесполезные уёбки, какую кодировку использует php по умолчанию?
Ответы: >>1085457 >>1085527
Аноним 2017/11/01 15:22:16  №1085457 119
>>1085440
По умолчанию использую твою сестру, про кодировку не знаю нихуя.
Ответы: >>1085472
Аноним 2017/11/01 15:55:51  №1085472 120
>>1085457
У меня нет сестры, ты даже этого не знаешь.
Аноним 2017/11/01 16:43:10  №1085513 121
>>1085287

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

> А зачем там контроллер и вообще MVC?
Он не нужен, я имел в виду, что в случае с MVC я примерно понимал, как реализуется DI, а в случае с библиотекой - нет.

> Смотри, как это красиво делается в ООП:
У меня сейчас примерно так получается:
$credentials = new CredentialsManager(login, password);

$settings = new Settings(); // создаем, только если надо что-то поменять
$settings->setOptionalSetting('true');

$client = new Client($credentials, $settings);
...

А если не создавать Settings и не менять там настройки, то Client создастся с настройками по умолчанию:

class Client
{
private $settings;
public function __construct(CredentialsManager $credentials, Settings $settings = null)
{
$this->settings = isset($settings) ?? new Settings();
}
}

Но это получается и не DI, и не Builder.
Такое вообще корректно? Не засмеют при приеме на работу меня, когда я им покажу такой код в кач-ве портфолио?
Ответы: >>1085657
Аноним 2017/11/01 16:48:37  №1085520 122
Yii.
Как воспользоваться во вью результатом поиска по связанным страницам?
Есть таблица flight с полем id. И таблица photo с полями id, n_flight. К одному id таблицы flight могут относится несколько одинаковых n_flight.
В модели:
public function getPhoto() {
return $this->hasMany(Photo::className(), ['n_flight' => 'id']);
}
В контроллере:
$query = "SELECT * FROM flight WHERE data_vyezda between :date1 and :date2";
$listFlight = flight::findBySql($query, [':date1' => $date1, ':date2' => $date2])->with('photo')->asArray()->all();
return $this->render('manager', compact('model', 'listFlight'));
Во вью:
echo count($listFlight->photo);

И в результате выводит "0", хотя там их больше нуля. Если распечатать $listFlight, то там будут в том числе и данные из связанных страниц. Но как ими воспользоваться?
Ответы: >>1085657
Аноним 2017/11/01 16:56:14  №1085527 123
>>1085440
Которая указана в default_charset php.ini
Ответы: >>1085546
Аноним 2017/11/01 17:08:22  №1085546 124
Аноним 2017/11/01 17:18:07  №1085556 125
Дилемма: есть несколько родственных сущностей (есть одинаковые свойства, но есть и уникальные свойства) и тут встает вопрос хранения в БД всего этого добра.
Либо заводить под каждую сущность отдельную таблицу (в итоге их будет 4) либо хранить в одной таблице, но поля которые уникальные для некоторых сущностей делать по умолчанию NULL. Из плюсов - если что-то поменяется в сущностях - достаточно задействовать существующее уже поле, из минусов: при поиске и выборках всегда придется джоинить эту таблицу на ту (категории) в которой хранится тип сущности (одной категории может соответствовать несколько сущностей). Общая таблица - будет по размеру как 4 таблицы каждой сущности - соответственно поиск будет медленее чем по 4 отдельным таблицам.
Алсо, всё это на Yii2, поэтому тут оба варианта реализуются легко, просто в варианте где общая таблица - опишу для каждой модели сущности свои уникальные правила.

На данный момент если я вместо одной таблицы - заведу 4, это будет малая кровь, так как пока ещё нет реальных данных, но через месяц - придется уже делать помимо изменения структуры ещё и миграцию.
Ответы: >>1085565 >>1085657
Аноним 2017/11/01 17:20:15  №1085559 126
Алсо, пикрелейтед - если хранить всё в одной таблице
Ответы: >>1085565
Аноним 2017/11/01 17:27:36  №1085565 127
>>1085559
>>1085556
Наверное всё же нормализую данные и заведу 4 таблицы, будет потом путаница если в одной, плюс жирнющие индексы
Аноним 2017/11/01 18:38:55  №1085612 128
Снимок666.PNG (12, 623x331)
331x623
Снимок777.PNG (11, 772x358)
358x772
>>1085331
Добавлю к еще одной проблеме. Скрипт не отображается. Запускал через httpd.exe( он пишет кстати в консоли AH00558: httpd.exe: Could not reliably determine the server's fully qualified domain name Set the 'ServerName' directive globally to suppress this message

Ответы: >>1085657
Аноним 2017/11/01 19:48:16  №1085657 129
>>1085612

Скрипт не выполняется, так как в конфиг Апача не прописано, что надо выполнять PHP скрипты с помощью модуля mod_php.

Тебе надо прописать в конфиге Апача директивы LoadModule и SetHandler как описано тут: http://php.net/manual/ru/install.unix.apache2.php (тебе нужно только то, что касается этих директив, остальное не нужно).

> ould not reliably determine the server's fully qualified domain name Set the 'ServerName' directive globally to suppress this message
Ну тут же написано, какую директиву надо прописать (ServerName), чтобы убрать предупреждение. Документацию по ней можно найти на офоциальном сайте Апача на англ.

>>1085556

Это называется наследование таблиц. Тут есть 3 стандартных паттерна: Class TI, Concrete TI, STI: https://www.google.ru/search?q=%D0%BF%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD%D1%8B+%D0%BD%D0%B0%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F+%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&newwindow=1&dcr=0&gbv=1

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

Также есть еще подход EAV (Entity-Attribute-Value) для случаев, когда есть много необязательных атрибутов (вроде свойств разных товаров или объявлений).

> Общая таблица - будет по размеру как 4 таблицы каждой сущности - соответственно поиск будет медленее чем по 4 отдельным таблицам.
Это если нет индексов.

>>1085520

Ты прочел документацию по моделям в Юи и по настройке связей (отношений) между ними?

Алсо, поле this->photo вообще существует и доступно ли снаружи?

>>1085513

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

> isset($settings) ?? new Settings();
Это неправильное использование ??

> Но это получается и не DI, и не Builder.
Странно что у тебя HTTP клиент не является зависимостью.
Ответы: >>1085690 >>1085802 >>1086030
Аноним 2017/11/01 19:48:34  №1085658 130
>>1085432

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

>>1085363

Его можно вручную скачать, создать виртуальный хост и установить.

>>1085322

Если все работает, то ставить VC++ Redist не требуется.

> Зашел в распакованные файлы и открыл по адресу ../Apache24/bin/ApacheMonitor.exe
Это не сам Апач, а программа для управления им (остановка/запуск). Если Апач установить как сервис (службу, то есть программу, работающую в фоновом режиме), и если у ApacheMonitor есть достаточно прав, то он может управлять запуском/остановкой Апача. Более того, можно будет сделать автозапуск службы Апача. Но это все можно делать и без монитора, в стандартной программе для управления службами, которая встроена в Windows (services.msc).

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

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

> Также пишет no service installed я прописал httpd.exe -k install
Эта команда сработала успешно? Ей нужны права администратора, чтобы добавить Апач в список служб Windows.

> Но сейчас запустил через httpd.exe и все заработало: мне написало It works.
Так и дложно быть. Ты просто запусакешь веб-сервер вручную.

> Тогда почему же через монитор не работает и пишет no service installed ?
Потому что служба не установлена. Открой services.msc (пуск -> выполнить) и проверь, что там нет Апача.

Аноним 2017/11/01 20:49:13  №1085690 131
>>1085657
> Зачем CredentialsManager? Там что-то сложное?
Там будут еще пароли от БД. А пока он собирает валидирует данные и, в принципе, все. Так-то уже не знаю, может правда уберу его.

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

> Это неправильное использование ??
Сорри, $settings ?? new Settings() конечно же

> Странно что у тебя HTTP клиент не является зависимостью
Да, буду его через аргумент конструктора передавать. Это недоработочка
Аноним 2017/11/01 22:10:53  №1085749 132
Парни, вот такая тема, недавно начал изучать, некоторые задачи вообще не представляю как делать, ну т.е. вообще полный 0. Понимание придёт с практикой? Нужно больше задач решать? Или как тут быть? Может почитать чего?
Ответы: >>1085771
Аноним 2017/11/01 22:16:18  №1085756 133
И еще вдогонку есть ООП, есть классы, свойства, методы, объекты, наследование и т.п. Я не понимаю как писать код на нём, если без ООП я могу что-то написать, то ООП это вообще как дремучий лес, что делать?
Аноним 2017/11/01 22:30:37  №1085771 134
>>1085749
не ссы, все придет. главное - изучать хорошие материалы (сайт ОПа, например) и писать много кода.

не забегай вперед, не старайся сразу все изучить.
Аноним 2017/11/01 22:44:10  №1085787 135
Ответы: >>1085790
Аноним 2017/11/01 22:46:31  №1085789 136
>>1085029

null не надо добавлять в массив, так как это не категория.

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

> if ($goods[0] == $id) {
Это очень неудачный код, так как глядя на эту строчку, не понять, что значит $goods[0] ? Первый товар в списке товаров? Лучше было бы $category['id'] == $id.

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

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

>>1084810

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

> Ещё хотел уточнить, если после "HAVING (подзапрос, который выведет '4') < (подзапрос, который выведет '5')" потом выбираются поля, то я всё правильно решил?
Скорее всего нет, так как 2 позапроса в HAVING это странно.

>>1084787

Почему надписи в echo транслитом? Кириллица должна по идее работать. Или у тебя что-то не работает? Неудобно читать.

Имена переменных тоже не стоит называть транслитом.

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

- на вход - получает параметры кредита в виде чисел
- на выходе - выдает текстовую строку

Как дальше работать с этой строкой? Как например найти самый выгодный кредит?

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

Также, в коде я вижу еще одну проблему:

for (...) {
if (...) {
$result = "Vsego bilo viplacheno ...";
}
}

return $result;

Тут видно, что переменная $result создается только если цикл выполнится хотя бы раз, и если if сработает, а что, если нет? Будет попытка вернуть значение несуществующей переменной. Это неправильно. Ты пишешь код, который так и просит сделать в нем ошибку. Лучше было сделать return "Vsego bilo..." и тогда проблемы бы не было.

То есть вот такой ерунды не должно быть:

if (...) {
$x = 100;
}

return $x;

так как здесь нет гарантий что переменная $x будет создана.
Аноним 2017/11/01 22:47:03  №1085790 137
>>1085787

Одна группа квадратных скобок лишняя.
Аноним 2017/11/01 22:47:48  №1085791 138
>>1084760

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

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

>>1084753

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

>>1084756

Потому что флаг g используется только на regex101 (искать все совпадения с регуляркой, а не только первое), в PHP он не используется.

>>1084752

Флаг g не работает в PHP.

> Как тогда указать, что скобки, пробелы и тире может идти между цифрами?

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

>>1084698

Пройтись по массиву циклом и перенести во второй массив только не-пустые элементы.

>>1084686

\W соответствует вообще любым символами вроде % или @, которых не должно быть в номере телефона.
Аноним 2017/11/01 22:48:16  №1085792 139
>>1084657

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

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

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

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

Группировка товаров 1) https://ideone.com/RQ1WDk

Формат массива выбран неудачно. Из-за него ты делаешь лишний цикл, чтобы извлечь данные. Лучше было сделать так:

['ром', 100],
['ром', 50]

Или так:

['name' => 'Ром', 'weight' => 100],
...

Имена переменных выбраны не очень удачно:

$db -> $items
$result -> $itemsWeight

Алгоритм выбран верно.

Повтор слов 2) https://repl.it/N2om/0

Разделение текста на слова можно было сделать так (без регулярок, которые ты скоро изучишь):

- разбить текст на массив слов по пробелу
- удалить из слов знаки препинания с помощью strtr
- удалить из массива пустые элементы (если где-то есть 2 пробела или знак препинания, окруженный пробелами)

Названия переменных плохие и код тяжело читать. Сравни:

foreach ($arr as $slovo1)
foreach ($words as $word)

Алгоритм переусложнен. Тут есть такие варианты:

- обойдя массив слов в цикле, найти число повторов с помощью count и array_intersect
- обойдя массив слов в цикле, построить массив вида [слово => число повторов] и далее на его основе делать выводы
- сделать то же самое с помощью стандартной функции array_count_values

Тебе надо стараться использовать стандартные функции, где возможно, а не писать циклы лишний раз. Список функций: http://php.net/manual/ru/ref.array.php

Слова с согласными 3) https://repl.it/NXrw/1

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

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

Названия i, j, k вообще ничего не говорят.

Код выровнен не по рекомендации PSR, посмотри пример: http://www.php-fig.org/psr/psr-2/#11-example особенно, расстановку фигурных скобок около else.

Таблица умножения https://ideone.com/Ez74yF

Перевод строки можно было сделать в разы проще:

for () {
for () {
....
}
echo "\n"; // перевод строки
}

А так, логика правильная.
Аноним 2017/11/01 22:48:37  №1085793 140
>>1084558

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

Также, обрати внимание, в мануале написано, что можно передать массив строк для поиска и массив выражений для замены: http://php.net/manual/ru/function.preg-replace.php

>>1084256

Если ты прошел урок на массивы и на строки из учебника в ОП-посте (или любого другого учебника), то вообще должен уметь решать. В первой задаче нужно завести массив вида [название товара => суммарный вес]. Затем обойти в цикле массив товаров, и для каждого товара увеличивать вес в массиве.

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

>>1084232

Плохо, если не можешь, ведь задача не такая и сложная.

>>1084218

Я не очень понял вопрос.

> есть динамическая таблица которая генерирует name = val1; name = val2; name = val3 ... к новым созданым ячейкам
Что за динамическая таблица? SQL-таблица? HTML-таблица? Как она что-то генерирует?

> Теперь эту таблицу нужно передать в mysql.
Что значит "передать в MySQL"?

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

>>1084179

Ты неправильно используешь квадратные скобки.
Аноним 2017/11/01 22:48:57  №1085795 141
>>1084135

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

- https://web.archive.org/web/20151025152301/https://habrahabr.ru/company/mailru/blog/206494/ (нынешняя версия на хабре сломана инвалидами)

>>1083935

Нет конечно. Зачем городить огромное количество одинаковых таблиц? И как потом с ними работать? Как например выбрать 3 последних поста из любых тредов? Как получить 3 самых старых треда?

>>1083880

У тебя конечно не хватает внешних ключей.

Тормоза при джойне у тебя могут быть из-за отстутвия индексов по полям, по которым производится джойн (теория https://ruhighload.com/post/%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%B0%D0%BC%D0%B8+%D0%B2+MySQL )

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

Для учета бамп-лимита его надо как-то сформулировать. Пусть у нас у постов есть поле added. Что такое бамп-лимит? Он значит, что дата бампа поста определяется так:

- дата добавления 500-го поста, если постов >= 500
- или дата добавления последнего поста, если постов < 500

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

Для этого мы выберем все посты в треде. К каждому посту мы приджойним список постов того же треда, добавленных ранее (earlier) и список постов, добавленных позже (later). Затем сгруппируем все это в одну группу и таким образом, мы можем для каждого поста p получить количество постов до и после него в треде. Мы используем COUNT(DISTINCT) так как просто COUNT будет выдавать неверные цифры из-за 2 джойнов.

Какой пост нам нужен? Нам нужен либо 500-й пост (то есть пост, перед которым идет 499 других постов), либо если его нет, последний пост (то есть пост, после которого идет 0 постов).

- выбираем все посты 1 треда (p)
- приджойниваем к каждому p все остальные посты, которые написаны раньше (earlier)
- приджойниваем все посты, написанные позже (later)
- группируем по p.id (то есть получаем группу с later и earlier на каждый исходный пост)
- выбираем (HAVING) группу, у которой COUNT(DISTINCT earlier) = 499 ИЛИ (COUNT(DISTINCT later) = 0 и COUNT(DISTINCT earlier) < 499)

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

Значит, можно сделать один джойн - приджойнить к посту все другие посты треда. Затем после группировки, мы можем найти число постов раньше/позже текущего просто посчитав число постов у которых other.added < p.added или наоборот:

- выбираем все посты одного треда (p)
- приджойниваем к каждому p все остальные посты треда (other)
- группируем по p.id
- выбираем группу, которая соответствует 500-му или последнему посту, то есть HAVING SUM(other.added < p.added) = 499 OR (SUM(other.added > p.added) = 0 AND SUM(other.added < p.added) < 499)

Так мы получим таблицу вида

ОП-пост | дата бампа

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

SELECT FROM (SELECT ...) AS threads t JOIN posts p ...

Сложные джойны с подзапросами удобно писать с использованием слова WITH, которого нет в MySQL, но есть в postgres и вроде бы в стандарте SQL: https://www.postgresql.org/docs/9.1/static/queries-with.html

Теперь про оптимизацию

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

Вообще, выбрать 3 последних поста из одного треда довольно легко:

SELECT ... WHERE thread_id = ? ORDER BY added DESC LIMIT 3

Если есть индекс по (thread_id, added), то это очень быстро.

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

SELECT t.id, fp.text AS first_text,
(SELECT p.text FROM post p WHERE p.thread_id = t.id ORDER BY p.id DESC LIMIT 1) AS last_text
FROM thread t
JOIN post fp ON fp.id = t.id ;

Демо: http://sqlfiddle.com/#!9/3a12a/5

Хотя MySQL не позволит использовать LIMIT в некоторых подзапросах ( https://dev.mysql.com/doc/refman/5.7/en/subquery-restrictions.html ), тут это сработает. Аналогично можно добавить подзапросы для выборки 2-го и 3-го с конца треда постов.

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

(
выбрать все ОП-посты
UNION
выбрать все последние посты
UNION
выбрать все предпоследние посты
UNION
выбрать все 3-и с конца посты
)
отстортировать и удалить дубликаты

Либо с помощью выбора 4 постов в виде колонок и затем джойна на искуственную таблицу из 4 строк:

выбрать ОП-пост и последние 3 поста как 4 колонки
сджойнив на таблицу из 4 строк
так, что каждой строке соответствует 1 колонка

Этот запрос (в теории) эффективней, так как джойн таблицы на себя требует обхода N x N строк, а в запросе с UNION мы обходим N + N + (N x 2) + (N x 3) строк, если я ничего не путаю.

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

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

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

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

SELECT t.id, t.bump_date
FROM threads t
ORDER BY t.bump_date DESC
LIMIT 10

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

- сделать таблицу top_posts, связывающую тред, ОП пост и 3 последних поста
- сделать в таблице тредов поля post1_id, post2_id и post3_id или одно поле last_posts (тогда мы делаем выборку в 2 шага: выбираем треды, извлекаем id последних постов и делаем новый запрос с WHERE id IN (список id))

Можешь попробовать сделать все эти варианты.
Ответы: >>1085797
Аноним 2017/11/01 22:49:56  №1085797 142
>>1085795

> Он значит, что дата бампа поста определяется так:
Дата бампа треда конечно же.
Аноним 2017/11/01 22:53:13  №1085802 143
Снимок.PNG (19, 658x280)
280x658
>>1085657
>Тебе надо прописать в конфиге Апача директивы LoadModule и SetHandler как описано тут: http://php.net/manual/ru/install.unix.apache2.php (тебе нужно только то, что касается этих директив, остальное не нужно).

Посмотри, правильно ли я указал LoadModule? Я добавил символ решетки, чтобы как другие параметры былоКуда указывать SetHandler? У меня Apache на диске С, в то время как PHP на диске D, ничего страшного?
Ответы: >>1085809 >>1085811
Аноним 2017/11/01 23:02:11  №1085809 144
>>1085802

Ты не пробовал прочесть документацию по директивам (увы, все на англ., кто бы перевел?):

https://httpd.apache.org/docs/2.4/handler.html
https://httpd.apache.org/docs/2.2/ru/handler.html
https://httpd.apache.org/docs/2.4/mod/core.html#sethandler

https://httpd.apache.org/docs/2.4/mod/mod_so.html#loadmodule

В общем про конфиги: https://httpd.apache.org/docs/2.4/configuring.html#syntax

Решетка обозначает комментарий.

В директивах должны быть указаны корретные пути к файлам.
Ответы: >>1085951
Аноним 2017/11/01 23:04:12  №1085811 145
>>1085802

Также обрати внимание на замечание тут

https://httpd.apache.org/docs/2.4/platform/windows.html

> The directives that accept filenames as arguments must use Windows filenames instead of Unix ones. However, because Apache may interpret backslashes as an "escape character" sequence, you should consistently use forward slashes in path names, not backslashes.

Ответы: >>1085951
Аноним 2017/11/01 23:50:41  №1085844 146
14946773284720.gif (46, 272x220)
220x272
Ответы: >>1085898 >>1085899 >>1087085
Аноним 2017/11/02 00:56:47  №1085898 147
Ответы: >>1085899
Аноним 2017/11/02 00:59:38  №1085899 148
15072151235990.jpg (518, 1700x1734)
1734x1700
Аноним 2017/11/02 02:44:15  №1085951 149
попаболь.PNG (29, 693x435)
435x693
попаболь2.PNG (16, 1542x739)
739x1542
попаболь3.PNG (14, 1570x766)
766x1570
>>1085809
>>1085811
Я почитал. Более-менее начал понимать, но что-то настроить пока не получалось. Загуглил гайд на хабрахаре https://habrahabr.ru/post/203012/#anchor01 и попробвал также сделать, только со своей директорий. В итоге у меня не находит ни info.php, ни index.html, лол. Зато появляется надпись "Index of /

localhost/" где localhost являеется гипер ссылкой. Дальше они пустые все
Ответы: >>1085953 >>1085966
Аноним 2017/11/02 02:46:58  №1085953 150
попаболь4.PNG (12, 618x158)
158x618
Ответы: >>1085980
Аноним 2017/11/02 03:26:36  №1085966 151
Ответы: >>1087085
Аноним 2017/11/02 04:13:17  №1085980 152
>>1085953
Короче. Я решил заново поставить апач, а то я в конфиге много чего переделал. Ничего не добился, только время потратил, лол.
Ответы: >>1085988
Аноним 2017/11/02 04:53:21  №1085988 153
>>1085980
Так. Я настроил. Оп не отвечай, я насторил.
Аноним 2017/11/02 10:24:33  №1086030 154
>>1085657
>
>Тут есть 3 стандартных паттерна: Class TI, Concrete TI, STI:
Спасибо! А такой вопрос: есть ли в yii2 "из коробки" возможность сохранять релейшны из формы или для каждой формы придется делать каскадное сохранение/удаление/редактирование потомков?
Ответы: >>1087085
Аноним 2017/11/02 10:51:18  №1086040 155
.png (194, 388x475)
475x388
Вспомнил про openshift, что можно нахаляву себе что-нибудь поставить.
А там какие-то пресеты для php: PHP, CakePHP + Mysql, Laravel + Mysql
и нужно ссылки еще на гитхаб давать, чтобы оно само там приложение билдило.

Поэтому вопрос CakePHP или Laravel - нормальные фреймворки? Популярные?
Ответы: >>1087085
Аноним 2017/11/02 16:43:44  №1086173 156
Господа ГУРУ, ньюфагодебил просит совета. Встала у меня задачка реализовать простую динамическую страничку, собственно вот как задумал я:

Сервер: windows, apache, php, mysql

Скрипт: крутится php-скрипт, отсылающий JSON запросы и получающий JSON ответы. полученные данные обрабатывает и результаты помещает в БД.

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

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

Подскажите, где я сосну и почему я такой уродился?
P.S. Познания в php,html,css чуть выше, чем "Hello world".
Аноним 2017/11/02 16:50:30  №1086177 157
>>1086173
Ах да, данные обновляются раз в 5 секунд. Объем одного "тика" обновления - ~ 1000 символов.
Аноним 2017/11/02 18:45:46  №1086259 158
>>1086173
Майскуль - говно, ставь тырпрайзную бд: оракл, мсскуль, постгре.
Ответы: >>1086266 >>1086334
Аноним 2017/11/02 18:50:54  №1086266 159
>>1086259

Как убедительно аргументировано.
Ответы: >>1086274
Аноним 2017/11/02 18:56:10  №1086274 160
>>1086266
Наступай на все грабли сам, че ты как не июнь?
Аноним 2017/11/02 19:19:04  №1086302 161
>>1086173
давай я дополню. винда говно, и апач тоже говно. ставь линукс, нжинкс и постгрес.

а вообще неясно в чем твой вопрос и что значит "скрипт крутится". php в контексте веб-сервера работает по запросу, он "крутится" только если сервер очередей настроен или если это просто клишный скрипт.
Ответы: >>1086325 >>1086334
Аноним 2017/11/02 19:19:20  №1086303 162
>>1086173
давай я дополню. винда говно, и апач тоже говно. ставь линукс, нжинкс и постгрес.

а вообще неясно в чем твой вопрос и что значит "скрипт крутится". php в контексте веб-сервера работает по запросу, он "крутится" только если сервер очередей настроен или если это просто клишный скрипт.
Аноним 2017/11/02 19:39:20  №1086320 163
>>1086173
давай я дополню. винда говно, и апач тоже говно. ставь линукс, нжинкс и постгрес.

а вообще неясно в чем твой вопрос и что значит "скрипт крутится". php в контексте веб-сервера работает по запросу, он "крутится" только если сервер очередей настроен или если это просто клишный скрипт.
Аноним 2017/11/02 19:52:45  №1086325 164
>>1086302
Я думал запускать php скрипт на самом сервере средствами ос. Видимо да, это CLI.
Вопрос собственно:
1) корректно ли для получения данных не по запросу пользователя использовать пхп, или это забивание гвоздей микроскопом? Можно ведь использовать bash или powershell какой-либо, но это же еще в этом разбираться придется...
2) правильно ли засовывать эти постоянно (раз в 5 секунд) обновляющиеся данные в БД и оттуда вытаскивать их на страницу, или есть смысл избавиться от внешнего скрипта и выполнять запросы непосредственно когда открыта страничка ("по запросу").

Как делают большие дяди? Просто если пользователей больше одного, буду гонять траффик впустую. Да и потом эти данные из бд можно анализировать (вдруг?)
Ответы: >>1086339 >>1086344 >>1087085
Аноним 2017/11/02 20:02:36  №1086334 165
>>1086259
>>1086302
Поясните, почему майскуль - говно?
тоже ньюфаг
Ответы: >>1086351
Аноним 2017/11/02 20:10:04  №1086339 166
>>1086325
Не правильно. Реляционка сдохнет от такой хуйни, если утебя хотя бы больше 10 мил.строк.

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

Майскуль говно потому что не отвечает энерпрайзным стандартам. Для проекта уровня гостевухи - похуй, какая бд.
Ответы: >>1087085
Аноним 2017/11/02 20:17:58  №1086344 167
>>1086325
если все приложение написано на php, то использовать кли-скрипт, который является частью приложения - это самый корректный вариант. он может пользоваться существующими эксепшнами, логгером, который там определен, классами бд и т.д. php в 100 раз лучше баша умеет работать с бд, json и всем вот этим. баш для работы с бекендом я не видел, чтоб использовался. он нужен для автоматизации работы одного пользователя, грубо говоря.

по твоей задаче я не очень понял, что тебе в итоге нужно, просто могу сказать, что в моей бывшей конторе (она достаточно крупна) подобные задачи решались запуском кли-скриптов по крону и сервером очередей (хотя в твоем случае это был бы крон). не исключаю, что это дедовский способ и, возможно, есть что-то посовременнее.
Аноним 2017/11/02 20:25:13  №1086351 168
>>1086334
mysql не говно, она работает быстро и корректно на базах данных небольших объемов. плюс там есть стрикт-режим, который решает много проблем с безопасностью. поэтому для гостевух и интернет-магазинов она вполне ок. но если проект вырастет, надо будет или сильно изъебываться, или менять ее на тот же постгрес.
Ответы: >>1086700
Аноним 2017/11/02 23:03:41  №1086507 169
Чтобы начать работать с гитхабом достаточно скачать клиент по ссылке: https://desktop.github.com/ ?

Ответы: >>1086511
Аноним 2017/11/02 23:08:47  №1086511 170
>>1086507

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

Гит можно изучить по книге https://git-scm.com/book/ru/v2 (все изучать не надо)

Github Desktop - безсполезен, если ты не понимаешь, как работает гит, и не умеешь с ним работать через командную строку.
Ответы: >>1086512
Аноним 2017/11/02 23:10:00  №1086512 171
Аноним 2017/11/02 23:55:15  №1086537 172
Анон, объясни SOLID на пальцах.
Ответы: >>1086677 >>1086735 >>1087085
Аноним 2017/11/03 10:26:18  №1086677 173
>>1086537
Никто на пальцах тебе не объяснит, вникать нужно долго и основательно, параллельно решая задачи и анализируя свой код. Начни с этой статьи: http://blog.byndyu.ru/2009/10/solid.html
Задачи есть в ОП-посте. Я бы ещё добавил какую-нибудь игру консольную - например шахматы.
Аноним 2017/11/03 12:48:20  №1086700 174
>>1086351
Дык блядь, нахуя изъебываться, если можно взять сразу нормальную бд?
Ответы: >>1086802
Аноним 2017/11/03 16:03:47  №1086735 175
>>1086537
S - The Single Responsibility Principle - Принцип единственности ответственности
Класс отвечает за какую-то одну конкретную задачу или область ответственности и не засирается. Например, не должен один класс отвечать за работу с БД и отправкой имейла.

O - The Open Closed Principle - Принцип открытости/закрытости
Если тебе требуется изменить какой-то класс из-за изменившихся требований к этому классу, то не подобает менять еще 100500 классов, которые с этим классом работают, т.к. это не их ответственность. Для того, чтобы соблюсти это условие ты:
1 - не должен урезать интерфейс этого класса таким образом, чтобы тот код, который УЖЕ с ним работает менялся
2 - выстраивать между классами такие отношения, чтобы они не были в курсе внутренней работы друг друга

L - The Liskov Substitution Principle - Принцип замещения Лисков
Если у тебя есть некий родительский класс, который можно отправить аргументом в функцию или метод другого класса, то значит туда же можно безболезненно и не ломая логику отправить все классы, который от этого родительского класса наследуются.

I - The Interface Segregation Principle - Принцип разделения интерфейса
Наследники твоего родительского класса или классы реализующие какой-либо интерфейс не должны делать слишком дохера ненужной для их функционирования работы. Т.е. родитель или интерфейс не должны требовать лишнего от потомков/реализаций.

D - The Dependency Inversion Principle - Принцип инверсии зависимости
Обычный принцип инверсии зависимостей. С него, кстати, я и советую начать разбираться в солид, т.к. это один из самых, на мой взгляд, главных принципов в ООП. Если на пальцах, у тебя есть класс, который работает с 20 другими классами. У этих 20 классов свои конструкторы, свои зависимости и пр. Т.е. просто так взять и создать экземпляры всех этих классов не так-то просто, нужно знать их поднаготную, что подавать в конструктор и какие конкретно экземпляры классов для корректной работы им нужны. Представь, что тебе надо создать объект, а внутри него должны быть еще 20 объектов, у которых есть свои зависимости. С ума можно сойти. В идеале твоем главному объекту вообще должно быть похер как эти 20 объектов, с которыми он работает создаются и откуда они берутся. Для этого и нужен Dependency Injection

Это тебе на пальцах. И этого, конечно, недостаточно, чтобы полноценно следовать принципам SOLID. Их надо дрочить помногу раз, чтобы понять. А еще лучше, не соблюдая эти принципы, пару раз обжечься в достаточно большом проекте.
Ответы: >>1086737 >>1086786
Аноним 2017/11/03 16:08:51  №1086737 176
>>1086735
>т.к. это один из самых, на мой взгляд, главных принципов в ООП
т.к. это крайне полезный принцип и вызывающий наименьшее кол-во споров вокруг себя
fixed
Аноним 2017/11/03 18:02:20  №1086782 177
Что из математики надо знать для веба? И где про это можно почитать?
Ответы: >>1086785
Аноним 2017/11/03 18:06:19  №1086785 178
>>1086782
>Что из математики надо знать для веба?
Сложение, вычитание, умножение, деление, а так же проценты.
Аноним 2017/11/03 18:14:24  №1086786 179
>>1086735
Спасибо, друг.

Смотри, такой пример:

class Shaverma
{
public function __construct(Cat $cat) {...}
}

class Cat
{
public function __construct(Shaverma $shaverma) {...}
}

$shaverma = new Shaverma(new Cat(...бесконечная рекурсия...));

Как быть в таком случае рекурсивной зависимости?
Ответы: >>1086802 >>1087084
Аноним 2017/11/03 18:47:08  №1086802 180
>>1086700
для маленьких неамбиционзых проектов смысл есть. например, на всех хостингах есть мускул. дешевле и быстрее найти разработчиков для поддержки. очевидно, что если ты решишь сделать сайт шиномонтажа на постгресе, тебя заказчик пошлет нахуй.

>>1086786
ну такого не должно быть, это ошибка в проектировании. какие данные классу cat могут понадобиться от shaverma?
Ответы: >>1087085
Аноним 2017/11/03 23:11:59  №1086908 181
Надо ли в php скрипте писать тег <!DOCTYPE HTML>
?
Ответы: >>1086923 >>1087084
Аноним 2017/11/03 23:50:51  №1086923 182
>>1086908
><!DOCTYPE HTML>
Это не php, а html скрипт. Писать его нужно, так как иначе могут появится на странице в разных браузерах разные неожиданные баги.
Ответы: >>1086944
Аноним 2017/11/04 01:01:00  №1086944 183
Аноним 2017/11/04 01:53:40  №1086956 184
На гитхабе php-скрипты не работают, верно? Зачем тогда туда нужно заливать задачу про студентов?
Ответы: >>1086990 >>1087084
Аноним 2017/11/04 06:59:27  №1086990 185
>>1086956
На гитхабе вообще ни один ЯП не работает, он не для этого сделан.
Аноним 2017/11/04 07:17:39  №1086992 186
Чому многие не любят верстку? По мне интересное занятие.
Ответы: >>1086999 >>1087002 >>1087072
Аноним 2017/11/04 08:15:50  №1086999 187
>>1086992
Глючная она, много гемора предоставляет если заниматься вплотную. Впрочем если верстать под один браузер вполне интересно.
Аноним 2017/11/04 08:24:46  №1087002 188
>>1086992
Поработай версталой год. Неблагодарный труд.
Ответы: >>1087055 >>1087117
Аноним 2017/11/04 12:38:28  №1087051 189
Ответы: >>1087072
Аноним 2017/11/04 12:43:45  №1087055 190
>>1087002
а верстальщики щас вообще существуют как профессия кроме как в дизайн-студиях? у нас в конторе, например, верстальщиков вообще нет, есть только фронты. и такой типичной версткой занимается джуниор-фронт
Аноним 2017/11/04 13:28:56  №1087072 191
>>1086992

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

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

>>1087051

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

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

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

Также, имена методов должны начинаться с глагола, сделайЧтоТо. А не с существительного.

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

> public function getInformation($value){
> return $value;
Это неправильный метод. Во-первых, его название ни о чем ни говорит ("получить информацию" - но в программе любая переменная хранит какую-то информацию), во-вторых, он ничего полезного не делает.

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

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

> public function addWorkers(AbstractWorker $worker){
> $worker->CalculationOfInformation($worker->rank, $worker->isBoss);

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

> $worker->getInformation($worker->count);
Что мешает написать просто $worker->count?

> $informarion = array($this->name, 0, 0, 0, 0, 0);
Неудачно выбран формат, в котором возвращаются данные - массив с числовыми индексами. Как понять, что хранится в 2-м или 4-м элементе? И зачем вообще нужно возвращать массив? Этот метод нужен только для одного случая - для вывода одной конкретной таблицы и он не пригодится нигде больше. Значит, не надо его вообще в Департамент добавлять (а надо добавить туда, где будет вывод таблицы). Лучше сделать обычные методы, считающие например среднюю зарплату и итд. Которые можно использовать где-то еще и которые не заточены именно под вывод единственной таблицы.

> class Company{
> public function printInformationOfDepartment(){
Вывод отчета стоит сделать отдельно. Компания должна отвечать только за управление списком департаментов и точно не должна генерировать отчеты. Если мы в нее будем все включть, что к ней отдаленно относится, то получим God Object: https://ru.wikipedia.org/wiki/%D0%91%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82

Тебе надо разделить код на части:

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

Так код будет гораздо аккуратнее.

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

------

Есть Гостиница, в ней есть Номера. Для каждого Номера известен его номер, количество Гостей, которое в него влезет, а также цена за сутки. В Гостиницу приезжают Гости. Нужно сделать объектную модель Гостиницы с такими возможностями (методами):

- получить список свободных номеров на определенную дату
- получить список свободных номеров, которые будут свободны в определенный диапазон дат (от A до B)
- дан список Гостей и диапазон дат, в которые они хотели бы заселиться. Необходимо подобрать им самый дешевый (а среди номеров с одинаковой ценой - самый маленький) Номер, который их вместит и который свободен в это время.
- то же самое, но при отстутствии одного подходящего номера для Гостей разрешается заселить их в несколько номеров, опять же, начиная с самых дешевых. Например, приехало 3 Гостя, но все 3-местные номера заняты и мы выделяем 2 2-местных, или 3 1-местных или 1-местный + 2-местный.
- зарегистрировать проживание данных Гостей в данных Номерах на данный период
- получить историю заселения Номера (кто в нем когда жил)
- получить историю заселения Гостя (в каких номерах он жил)
- получить статистику доходов Гостиницы за данный диапазон дат (в день A отдель заработал X тугриков, в день B - Y тугриков и так далее)


----
Ответы: >>1087084 >>1087119 >>1093270
Аноним 2017/11/04 13:37:34  №1087075 192
image.png (61, 795x631)
631x795
Есть каталог кроватей: некоторые модели бывают разного цвета (одна модель, например, "Кровать А" в двух цветовых вариантах: цвет белый, 3 фотографии и цвет черный, 3 фотографии) и далее несколько размеров и цен, соответственно. У меня получается пока как-так, но кажется, что что-то не так. Использую Симфони и, выходит, Доктрину. Что и как можно улучшить?
Ответы: >>1087092 >>1087093
Аноним 2017/11/04 14:14:06  №1087084 193
>>1086956

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

Ну а если над проектом работает более одного человека, гит (и гитхаб или аналогичный сервис) вообще незаменим. Иначе как объединять изменения от разных разработчиков?

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

>>1086908

В HTML доктайп говорит браузеру о том, что страницу нужно отображать в соответствии с современным и стандартами, а не в Quirks mode (режиме совместимости со старыми сайтами, сделанными до 2000 года).

>>1086786

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

Давай я дам другой пример. Например, рассмотрим дерево категорий (это такая структура, где у узлов может быть 1 родитель и 1 или более детей). Мы хотим допустим, сделать категорию "Бытовая техника", а внутрь нее добавить категории "Телевизоры" и "Холодильники". Каждую категорию бы сделаем объектом, и каждая категория должна "знать" список дочерних и родительскую категорию.

То есть "Бытовая техника" содержит в себе ссылку на "Телевизоры", и наоборот.

class Category
{
private $parent;
private $children = [];

public function addChild(Category $child)
{
if ($child->parent) {
// ошибка: эта категория уже добавлена кому-то в качестве дочерней
throw new Exception("This category already has a parent");
}

$this->children[] = $child;
$child->parent = $this;
}
}

$tech = new Category('Бытовая техника');
$tvs = new Category('Телевизоры');
// Добавляем дочернюю категорию
$tech->addChild($tvs);
$fridges = new Category('Холодильники');
$tech->addChild($fridges);

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

Если нужен пример связи между разными объектами, пожалуйста. Допустим, есть Карта и на ней есть Магазины, между которыми нужно сделать двустороннюю связь (Карта знает про Магазины на ней, а Магазин содержит ссылку на карту):

class Map
{
public function addShop(Shop $shop)
{
$this->shops[] = $shop;
$shop->setMap($this);
}
}

class Shop
{
public function setMap(Map $map)
{
if ($this->map) {
// ошибка
}
$this->map = $map;
}
}

Если ты не очень хорошо понимаешь ООП (судя по странным примерам кода), советую порешать задачи на ООП из учебника в ОП посте или задачу про Гостиницу отсюда: >>1087072
Аноним 2017/11/04 14:14:24  №1087085 194
>>1086802

Для больших тоже может быть. MySQL использовался при разработке Facebook и википедии (а также была статья про переход Uber с постгреса на mysql: https://habrahabr.ru/company/southbridge/blog/322624/ ). Я не говорю, что постгрес чем-то плох, это хорошая СУБД, но аргументация там у анона полностью отсуствует, я думаю, он и сам не знает, в чем именно разница, а пересказывает увиденное где-то мнение. Таких анонов нужно сразу слать подальше.

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

>>1086537

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

Раз уж тебя интересуют аббревиатуры из ООП, познакомлю тебя еще с YAGNI: https://habrahabr.ru/post/153225/

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

Если есть вопросы по ООП, могу попробовать ответить.

>>1086339

"Эксперты" подтянулись. Где написано что MySQL не рассчитана на 10 млн. строк в таблице (я работал с такими таблицами) и что такого особенного в mongoDB, что она лучше для этого подходит? Я могу сказать (аргументированно, в отличие от тебя), что монга рассчитана на какие-то специальные сценарии использования, в ней нет внешних ключей, схемы и транзакций, а это значит что в типичном приложении она превратится в свалку из данных с нарушенными ссылками.

> не отвечает энерпрайзным стандартам.
Это каким?

>>1086325

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

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

>>1086040

CakePHP по моему очень старый.

>>1086030

Не знаю.

>>1085966

В случае с нгинксом надо отдельно запускать нгинкс, а отдельно php-fpm. В случае с Апачом - только Апач. Где ж тут проще?

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

Хотя конечно статику нгинкс раздает лучше и быстрее.

>>1085844

Регулярка верная.

> "/7|8/";
> preg_replace($firstNum,'+7',$plusSeven, 1);
Неудачно сделано, так как в регулярке не сказано, что 7 или 8 должны быть именно в начале номера.

> foreach ($withoutAll as $plusSeven) {
Не надо было тут заводить новые переменные, лучше просто использовать те же самые $correctNumbers и $number.

Код еще оформлен не очень удачно (отступы перед фигурными скобками), установи себе IDE или редактор кода, если ты пишешь прямо в окошке ideone, там наверно неудобно большой объем кода писать.
Аноним 2017/11/04 14:24:39  №1087092 195
>>1087075

Мне кажется, если обобщить, можно сделать так:

- Кровать (название, производитель, материал)
- ВариантКровати (цена, цвет, размер, ссылка на внешний вид) - конкретная конфигурация
- ВнешнийВидКровати (представляет собой все варианты, которые выглядят одинаково, содержит несколько изображений)
- Изображение

Если смотреть на твою схему,то получается:

Кровать = BedModel
ВариантКровати = Bed
ВнешнийВидКровати = BedColorModel
Изображение = Image

В общем, примерно то же самое, просто мне кажется, у тебя названия выбраны неудачно и трудно понять с ходу, что они значат.
Ответы: >>1087133
Аноним 2017/11/04 14:26:48  №1087093 196
>>1087075

Ну и ссылку я чуть-чуть поменял, у меня ВариантКровати напрямую ссылается на Кровать, а у тебя Bed ссылается на BedColorModel.

Ответы: >>1087133 >>1087831
Аноним 2017/11/04 15:27:38  №1087107 197
Как в ActiveRecord сделать следующее:
Есть Главная модель, у которое есть в релейшинах hasMany Модель 2, у Модели 2 есть в релейшинах hasMany Модель 3.
Как будет звучать соединение в одном ActiveQuery всех трёх релейшинов? С двумя всё просто:
Model::search()->innerJoinWith('model2 m2') ... ->andWhere(['m2.attr' => 4]);
как добавить сюда Модель 3 которая в релейшинах с Моделью 2?
Ответы: >>1087108
Аноним 2017/11/04 15:28:17  №1087108 198
Аноним 2017/11/04 16:03:01  №1087117 199
Аноним 2017/11/04 16:04:06  №1087119 200
>>1087072
Я тоже так думаю, все вроде понятно и с практикой просто. Может не каждому дано.
Аноним 2017/11/04 16:20:19  №1087133 201
>>1087092
>>1087093
Хорошо, а что лучше для админки взять, я выбрал Easy Admin? Но как-то в нем все муторно с поиском и сортировкой из-за большой вложенности сущностей, или это я что-то не так делаю?
Аноним 2017/11/04 21:16:25  №1087242 202
Ответы: >>1087341
Аноним 2017/11/04 21:25:48  №1087244 203
Оно не работает без флажка g, но и с ним не работает, пишет ошибку preg_replace(): Unknown modifier 'g'.
Ответы: >>1087341
Аноним 2017/11/04 21:27:41  №1087245 204
А в интернете пишут, что g уже в preg_replace есть. Что-то тут не чисто. Опять жиды воду мутят.
Ответы: >>1089312
Аноним 2017/11/04 23:35:05  №1087307 205
Так. Настроил локальный сервер. Немного умею работать с гитом. Знаю основные теги html и немного css. Чтобы решить студентов нужно еще mysql изучить? Спасибо за ответ!
Ответы: >>1089312
Аноним 2017/11/05 00:30:00  №1087341 206
>>1087242

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

>>1087244

В PHP нет флага g. Он нужен только на regex101.
Ответы: >>1087650
someApprentice 2017/11/05 09:20:09  №1087406 207
>>1085268
>>https://github.com/someApprentice/chat/blob/master/public/js/conversation.js#L53
>>
>>+offset + +1
>Немного странное место. Не многовато ли знаков "плюс"?
Что поделать если js при сложении не преобразует данные в число? Приходиться делать это самому.

>Также, мне кажется, что у тебя в контроллере находится код, относящийся ко view: вызовы jQuery вроде if ($(that.view.moremessages).length) стоило бы перенести во view и писать вместо этого if (that.view.hasMoreMessagesButton()), а еще лучше - if (this.canShowMoreMessages()), так как это довольно коряво, проверять наличие новых сообщений по наличию кнопки на экране. Должно ведь быть наоборот - модель/viewModel сама знает, есть ли новые сообщения.
Всегда нужно пользоваться только высстананвленными наружу методами, даже если код займет одну строку?

>Должно ведь быть наоборот - модель/viewModel сама знает, есть ли новые сообщения.
Должно быть свойство модели/viewModel, например this.canShowMoreMessages = true/false?

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

>Также, твой Crypter является по сути оберткой над openpgp, ничего от себя не добавляя. Непонятно, в чем смысл его существования. Смысл можно добавить, если Crypter начнет например работать не с абстрактными "сообщениями", а с объектами сообщений. Ты ведь скорее всего в будущем захочешь шифровать не только текст, но и метаданные сообщения, и тут удобно сделать 2 сущности - зашифрованное и расшифрованное сообщение.
>Также, твой Crypter является по сути оберткой над openpgp, ничего от себя не добавляя. Непонятно, в чем смысл его существовани
Вы выше делали замечание что нужно делать обёртку. Я запутан.

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

>Ой-ой, изучил ли ты внимательно принцип работы промисов?
Я старался внимательно подойти к промисам, т.к. у меня проблемы с ними, но я оперался только на документацию mdn, а не на спецификацию PromiseA+. Похоже, это большая ошибка. Буду исправлять. Читая ваши замечания, я нахожу ошибки в своем предстовлении о них.


>Я вижу такие пути:
>
>1. явно обрабатывать reject, примерно так:
>
>backend.getData().then(function (data) {
> displayData();
> }, function (error) {
> displayError();
> });
В омем предстовлении backend занимается только получением данных с API, т.е. с бэкенда сервера. Не будет ли вывод данных нарушением инкапсуляции в таком случае?
Ответы: >>1098286 >>1098288 >>1098317
Аноним 2017/11/05 12:33:14  №1087446 208
Привет, ОП, привет, аноны.

Вопрос по doctrine:migrations

Сделал я doctrine:migration:diff, он создал файл миграции,
я запустил (migration:migrate), он вывалил ошибку и не выполнил миграцию. Тут я понял, что мне эта миграция не нужна и ее нужно удалить. Мне просто взять и удалить файл Version20171105082042.php ? Потому что doctrine:migrations:version 20171105082042 --delete не работает, ведь он удаляет только те миграции, которые уже занеслись в таблицу миграций.

Еще вопрос. Была у меня миграция 1, я создал миграцию 2. Там создание новой таблицы и создание связи между таблицами. Первое он сделал, на втором вывалил ошибку.
Смотрю migration:status - текущая миграция 1. Смотрю БД - таблица из миграции 2 создана. Почему он не выполнил down(), чтобы вернуть всё на прежние места? И как мне его правильно вызвать?
Ответы: >>1087635 >>1087635 >>1089311
Аноним 2017/11/05 18:39:28  №1087584 209
Начали в универе учить PHP. Не первым языком, потому я немного скучаю и усложняю себе задания как могу. В связи с чем сталкиваюсь с недостатком знаний о том, как этот язык работает вообще

СУТЬ: абстрактно и в вакууме есть массив, в который запихиваются значения из формы ввода. Я хочу чтоб они засовывались туда несколько раз. Ну, т.е. сначала запихнули A,B,C=>нажали на кнопку подтверждения=>Страница обновилась, показала текущий массив=>Запихнули D,E,F=>Страница обновилась и показала новый, дополненный массив. Так до тех пр пока не заебёт и ты не нажмешь на другую кнопку, которая позволит перейти к другой части задания, где будут проводиться действия с этим массивом.

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

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

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

https://pastebin.com/HXDjHPRw

Ответы: >>1087600 >>1089312
Аноним 2017/11/05 19:17:17  №1087600 210
>>1087584
Новая страница - новые данные.
Сохраняй данные не в PHP.
Например, кода соединил массив сохраняй его в:
- в сессию
- в текстовый фал
- в базу данных
, а при инициализации данных доставай их, потом что- то делай и завого сохраняй.
Ответы: >>1087602 >>1087603
Аноним 2017/11/05 19:18:19  №1087602 211
>>1087600
Хм. Окей, допустим. А для чего тогда все эти суперглобальные штуки нужны, если данные в них обнуляются?
Ответы: >>1087606
Аноним 2017/11/05 19:18:56  №1087603 212
>>1087600
> инициализации данных
При инициализации скрипта.

И в форме используй метод POST.
Ответы: >>1087609
Аноним 2017/11/05 19:22:31  №1087606 213
>>1087602
Для, того для чего нужны и в других языках.
В суперглобальных пременных, хранятся данные полученные от клиента.
А просто глобальные переменные нужны, чтобы данные были доступны из разных скриптов (плохая практика их использовать).
Обнуляются они потому-что скрипт заканчивает свою работу и высвобождает память, как и любая программа если ее завешить.
Ответы: >>1087608
Аноним 2017/11/05 19:28:50  №1087608 214
>>1087606
Хм. Окей, да. Видимо, меня сбило наличие у меня проекта, объединяющего файлы. И я по привычке, ну, как с пространством имён и джавовыми package.

Так-с, значит, я могу все де использовать глобальную переменную и её значение не исчезнет, так? Или нет? Я понял, что лучше через файл, но все же мне интересно.
Ответы: >>1087620 >>1087620
Аноним 2017/11/05 19:30:03  №1087609 215
>>1087603
А разница? Кроме того, что аргументы передадутся не в адресной строке?
Ответы: >>1087620 >>1089312
Аноним 2017/11/05 19:46:31  №1087620 216
>>1087608
Сук, я же написал, что перменные "обнуляются" при завершении скрипта.
Новый запрос -> новый запуск скрипта -> новые данные. -> скрипт обработал данные -> скрипт завешился -> память освободилась
>>1087608
> использовать глобальную переменную
Почитай про глобальные и суперглобальные переменные в пыхе.

>>1087609
>аргументы
Да, гет параметры имеют ограниченный лимит, так что если хочешь что-то сохраниль надо использовать пут



Аноним 2017/11/05 20:32:46  №1087635 217
>>1087446
>он удаляет только те миграции, которые уже занеслись в таблицу миграций.
>>1087446
> Почему он не выполнил down()

а down() не пустой?
Ответы: >>1087640
Аноним 2017/11/05 20:53:05  №1087640 218
Ответы: >>1087646
Аноним 2017/11/05 21:03:41  №1087646 219
>>1087640
Хммм, хуй знает.
Вообще миграции немного косячно сделаны, так что если нету в таблице миграций этой миграции можешь просто удалить сам файл миграции и таблицу которую он создал.
Ответы: >>1087685
Аноним 2017/11/05 21:15:01  №1087650 220
Ответы: >>1089312
Аноним 2017/11/05 22:18:17  №1087685 221
>>1087646
так в итоге и поступил.
И ошибку которая выпадала тоже исправил. Но почему он не делает down(), если какой-то запрос ошибочный - так и не понял.

Ошибка заключалась в том, что в таблице genus создалась sub_family_id со значениями 0. Потом создалась сама таблица sub_family, пустая. А когда попытался связать их - вылезла ошибка. Означает: у меня тут sub_family_id=0, но в sub_family нету записи с таким значением. Решил добавлением 3 и 4 строчек
Ответы: >>1087725
Аноним 2017/11/05 23:08:36  №1087725 222
>>1087685
> down()
Он работает только если ты down, миграция нормально прошла.
И down и delete migration это разные вещи
Аноним 2017/11/06 00:37:12  №1087756 223
Ответы: >>1087888 >>1089310
Аноним 2017/11/06 00:40:14  №1087758 224
Ответы: >>1089311
Аноним 2017/11/06 00:46:13  №1087759 225
Ответы: >>1089311
Числа прописью Аноним 2017/11/06 01:12:10  №1087764 226
Ответы: >>1089310
Аноним 2017/11/06 01:23:08  №1087765 227
https://ideone.com/4IRNDa

Как сделать, чтобы при замене preg_replace не удалялся символ?
Нужно добавить пробел между запятой и буквой, но он удаляет и запятую и букву.
Ответы: >>1087771 >>1087774
Аноним 2017/11/06 02:03:00  №1087771 228
>>1087765
У ОПа написано в мануале. Оттуда:
Если попытаться разбить строку на предложения с помощью preg_split, то знаки в конце предложения потеряются, так как preg_split вырезает из строки захваченные регуляркой (соответствующие ей) символы. Для борьбы с этим можно использовать утверждения в регулярках, которые не захватывают символ, а только проверяют его наличие перед или после определенного места. Например: preg_split("/(?<=\d)/u", "12abc3") разобьет строку по всем позициям, перед которыми стоит цифра; это даст массив ['1', '2', 'abc3', '']. Последний элемент массива появился из-за того что регулярка сработала после цифры 3, а так как за ней символов нет, получилась пустая строка. Избавиться от нее можно с помощью флага PREG_SPLIT_NO_EMPTY, подробности в мануале.
Ответы: >>1087774
Аноним 2017/11/06 02:15:41  №1087774 229
>>1087765
>>1087771
Пардон, не то написал. Проверь регулярное выражение. $1 в preg_replace представляет символы, заключенные в первые круглые скобки в регулярном выражении. У тебя же скобок нет.
Аноним 2017/11/06 12:10:17  №1087831 230
>>1087093
а если напрямую ссылаться на Кровать, то как из ВариантаКровати доставать цвет и изображение?
Ответы: >>1089310
Аноним 2017/11/06 13:54:18  №1087865 231
Заинтересовало как в сосденем треде обсуждают то, как с помощью картинки отслеживать открытия писем.
https://2ch.hk/pr/res/1087462.html

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

Когда все урлы вида:
http://my-srv.ua/emailback/HAEX2ZOH.jpg
http://my-srv.ua/emailback/NAE2BAL3.jpg
http://my-srv.ua/emailback/MAMHAKER.jpg

обрабатываешь, собираешь вот этот вот код "HAEX2ZOH"
и отдаешь картинку.
Ответы: >>1087928 >>1089310
Аноним 2017/11/06 14:53:10  №1087888 232
>>1087756
>preg_match() возвращает 1
Когда научитесь читать ёбана?
Ответы: >>1087927
Аноним 2017/11/06 17:31:47  №1087927 233
>>1087888
Я читаю, но забываю некоторые моменты.
Аноним 2017/11/06 17:33:18  №1087928 234
>>1087865
Какой ещё подмены картинки?
Аноним 2017/11/06 19:06:45  №1087972 235
Как в Symfony с помощью CollectionType сделать так, чтобы можно было либо выбрать из коллекции сущностей, например, размеры уже имеющиеся или создать новый размер в этой же форме?
Ответы: >>1087973 >>1087976 >>1089310
Аноним 2017/11/06 19:16:01  №1087973 236
>>1087972
ой, не Collection, а EntityType
Ответы: >>1087976
Аноним 2017/11/06 19:28:06  №1087976 237
Аноним 2017/11/07 18:05:24  №1088366 238
Какие паттерны лучше изучать первыми начинающему?
Ответы: >>1089308
Аноним 2017/11/08 05:10:28  №1088651 239
Ответы: >>1088653 >>1089308
Аноним 2017/11/08 05:21:44  №1088653 240
Ответы: >>1088654 >>1088661
Аноним 2017/11/08 05:26:25  №1088654 241
>>1088653
Они за 2 года не убрали?
Аноним 2017/11/08 06:33:15  №1088661 242
>>1088653
Вот видите, целую страницу сделали как шутку. А вы, проКАСТинаторы!
Аноним 2017/11/08 07:43:58  №1088673 243
maxresdefault.jpg (141, 1280x720)
720x1280
Безымянный.jpg (54, 1000x1908)
1908x1000
Сап.
Есть цель создать div или табличку с рамочкой, и от рамочки провести линию к другой такой рамочке. Что-то типа пикрила только не такое красочное. Линии будут идти либо вниз, либо в сторону, либо вниз, потом поворачивать под углом 90 градусов в сторону.
Как лучше сделать? Второй пик примерно то, что я хочу в итоге получить.
Вопрос именно в генерации линий и есть ли возможнось их так строить?
Ответы: >>1088717 >>1088769 >>1089308
Аноним 2017/11/08 11:11:41  №1088717 244
>>1088673
Тебе для чего? Для сайта, в общем веба? Мне на ум пришел GraphML. Это язык написания графов в XML.
Можно сделать и в HTML с CSS но рисовать каждый раз с помощью блоков и делать трансформ тебе надоест, если ты не такой поехавший верстальщик как я.
Еще можно использовать SVG для этого, но проще все же ссылки ниже.
http://sigmajs.org/
http://fperucic.github.io/treant-js/
http://arborjs.org/
https://d3js.org/
Аноним 2017/11/08 13:21:53  №1088748 245
image4.jpg (648, 750x500)
500x750
Вопрос по архитектуре приложения: использовать ли логику в SQL или только как тупое хранилище данных?

Есть два стула: https://pastebin.com/hJSzwBNx

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

Передаю 2 параметра: дату начала месяца и дату для которой получаем номера.

На выходе от PDO массив:

[
'employee' => 'invoiceNumber',
...
]

Хорошо, быстро, удобно.


Но! если я захочу что-то поменять в будущем (например имена переменных), мне придется править всё с самого дна, начиная с TDG.


Можно использовать второй вариант: выбирать ВСЕ записи за интересующий промежуток времени и рассчитывать уже специальным сервисом в PHP, который опять же будет возвращать тот же массив.

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

Надеюсь понятно объяснил. И таких ситуаций полно: когда можно сделать больше SQL кода, но меньше PHP.

Так использовать логику в SQL или это тупое животное —
хранилище данных?
Ответы: >>1089016 >>1089202
Аноним 2017/11/08 14:02:56  №1088769 246
Аноним 2017/11/08 15:25:13  №1088794 247
Сейчас делал прогу по заданию с палиндромом, обосрался от удивления, когда все сразу, с первого раза заработало. Попытался вводить разные значения - всегда верно определяет, где палиндром, а где нет. С трудом верю в то, что так просто написал эту прогу, поэтому прошу найти очевидные ошибки, если таковые имеются и различные замечания: https://ideone.com/GSEBqe

(ссылку дал на идеон, чтобы вы видели код, но на идеоне он не включается, из-за ошибки с mb_internal_encoding("UTF-8");, на phptester.net все работает.)
Ответы: >>1088798 >>1089025 >>1089308
Аноним 2017/11/08 15:32:05  №1088798 248
>>1088794
>Сейчас делал прогу
25 строк?
Ответы: >>1088801
Аноним 2017/11/08 15:43:31  №1088801 249
>>1088798
Ну не цепляйся к словам. Сделал задание.
Ответы: >>1088817 >>1088819
Аноним 2017/11/08 16:29:32  №1088817 250
>>1088801
> Сделал задание.

software architect уже
Ответы: >>1089308
Аноним 2017/11/08 16:47:18  №1088819 251
>>1088801
>Сделал задание
25 строк исполняется прямо в мозгу, можно на бумаге писать
Аноним 2017/11/08 18:28:08  №1088844 252
Как быть: есть товары с разными размерами фотографий, но надо расположить их в каталоге в одинаковых размеров блоках. Пока в голову пришло только сделать белый блок, внутри которого уже изображения, тогда пропорции сохраняются и размер не превышает этот блок. Примерно так на Ebay сделано, как я понял, так как пользователи разных размеров фото заливают. Как это сделали на Авито? Я так понял, просто при заливе фото, они создают версию с разрешением 208x156, но почему-то пропорции не выглядит похеренными, или это из-за маленького размера так?
Ответы: >>1089218
Аноним 2017/11/08 20:36:55  №1088921 253
Аноны, хочу научиться верстать, верхов html, css и js нахватался, посмотрел пару видео по теме, но все же не пойму откуда начинать. Подскажите дебилу, плз, разобраться в этой теме.
Ответы: >>1088953 >>1089218
Аноним 2017/11/08 21:41:16  №1088953 254
>>1088921
>не пойму откуда начинать

с левого верхнего угла
Аноним 2017/11/08 23:54:04  №1089016 255
>>1088748
вот хороший вопрос. это я так понимаю простой пример, но более интересно в контексте высоконагруженных проектов.

плюсы использования ЯП понятны, а вот какие есть плюсы у логики в sql-запросах?
Аноним 2017/11/09 00:39:17  №1089025 256
>>1088794
очевидная ошибка в слове length. форматирование довольно странное тоже.

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

$initialData = ...;

$someReferenceData = // тут вычисления всякие
if ($initialData !== $someReferenceData) {
echo 'false':
} else {
echo 'true';
}

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

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

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

$text = str_replace(" ","", $text);
$text = mb_strtolower($text);
$reverse = implode('', array_reverse(preg_split("//u", $text, -1, PREG_SPLIT_NO_EMPTY)));

if ($text !== $reverse) {
echo "Не палиндром";
}
else {
echo "палиндром";
}

можно было бы вместо преобразования в массив и обратно использовать strrev, если бы она поддерживала многобайтную кодировку, но увы.
Ответы: >>1089200
Аноним 2017/11/09 13:43:02  №1089200 257
>>1089025
Да, твое решение получилось гораздо более разумным и логичным, но выходящим, на данный момент, за рамки моих знаний.
>$reverse = implode('', array_reverse(preg_split("//u", $text, -1, PREG_SPLIT_NO_EMPTY)));
Сейчас нужно будет хорошенько разобраться и понять эту строчку.
Спасибо за ответ.
Аноним 2017/11/09 13:45:20  №1089202 258
>>1088748

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

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

Твой подход имеет недостаток:

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

> Но! если я захочу что-то поменять в будущем (например имена переменных), мне придется править всё с самого дна, начиная с TDG.
Это в любом случае придется делать.

> Можно использовать второй вариант: выбирать ВСЕ записи за интересующий промежуток времени и рассчитывать уже специальным сервисом в PHP, который опять же будет возвращать тот же массив.
Довольно неэффективно, брать кучу записей и откидывать большую часть.

> выбирать ВСЕ записи за интересующий промежуток времени и рассчитывать уже специальным сервисом в PHP, который опять же будет возвращать тот же массив.
Вообще-то нет. Выбирать все записи за месяц не надо, достаточно узнать номер первой выбранной записи с начала месяца с помощью запроса SELECT COUNT.
Ответы: >>1089439
Аноним 2017/11/09 14:08:57  №1089218 259
>>1088921

В ОП посте есть задачи по HTML/CSS, начиная с совсем простых, и заканчивая полноценной версткой.

>>1088844

На практике эту задачу удобнее решать средствами CSS. Там есть такие возможности для ограничения размера изображений: max-width, max-height. Обрати внимание, что width/height при этом надо выставлять в auto, иначе возможна ситуация, когда пропорции изображения будут искажены.

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

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

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

(еще есть вариант сделать размеры окошка не фиксированными, а меняющимися от X до Y, что позволит в большинстве случаев показать картинку целиком).

Для центрирования есть несколько методов:

- выводить картинку как фоновую с помощью background, ограничить размеры с помощью background-size
- использовать translate
- использовать translate 2 раза
- использовать object-fit
- использовать display table-cell
- может быть, flexbox ?

Для каждого варианта нужно сделать пример верстки (с картинками разных пропорций), изучить достоинства и недостатки (например в случае фоновой картинки она может не индексироваться поисковиками), проверить по caniuse, с какого года метод поддерживается в браузерах, при желании проверить еще через modern.ie/browsershots, проверить, поддерживается ли srcset с этим методом. Уверен, что проделанная работа не только поможет тебе в изучении CSS, но и не раз пригодится в верстке.

Поговорим еще про размеры картинок и превьюшек. Если пользователь загружает большую картинку, какого размера превьюшки надо делать? Какую из них использовать?

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

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

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

Потому обычно превьюшки делаются как геометрическая прогрессия. Ну например, где каждая картинка в 2 раза меньше: 1024, 512, 256, 128. Можно использовать и другой шаг прогрессии. Размеры конечно можно подправить, чтобы они были ближе к используемым в дизайне (если у тебя например есть окошко размером 400px, то и превьюшки стоит делать такими же). При этом используя атрибут srcset, ты можешь указать ссылки на все имеющиеся превьюшки и браузер сам выберет подходящую в зависимости от требуемого разрешения. Советую изучить и использовать этот атрибут, он незаменим при адаптивной верстке. Обрати внимание, что srcset не будет работать с фоновыми картинками, только с тегом img.

Ответы: >>1090621
Аноним 2017/11/09 15:11:04  №1089287 260
Анон, помоги, как вставить recaptcha в эту гребаную форму? Чтобы при нажатии на саммит, если не введена каптча, ничего не отправлялось?

Вот код:

require_once __DIR__ . '/recaptchalib.php';
// Введите свой секретный ключ
$secret = "6LfEpcUAAAAAEQiimHo_Q2eaVrtbJ5-jcLi1a";
// пустой ответ каптчи
$response = null;
// Проверка вашего секретного ключа
$reCaptcha = new ReCaptcha($secret);
if ($_POST["g-recaptcha-response"]) {
$response = $reCaptcha->verifyResponse(
$_SERVER["REMOTE_ADDR"],
$_POST["g-recaptcha-response"]
);
}


$mail_to = '[email protected]';

if(isset($_POST['name'])){$name ='Имя: '.$_POST['name'].';';}
if(isset($_POST['Phone'])){$Phone = 'Телефон: '.$_POST['Phone'].';';}
if(isset($_POST['Email'])){$Email = 'Email: '.$_POST['Email'].';';}
if(isset($_POST['Text'])){$Text = 'Сообщение:'.$_POST['Text'].';';}


$thm = "Новая заявка с сайта sibstrop.ru";
$msg = $name." \r\n".$Phone." \r\n".$Email." \r\n".$Text ;
$picture = "";



// Если поле выбора вложения не пустое - закачиваем его на сервер
if (!empty($_FILES['file']['tmp_name']))
{
// Закачиваем файл
$path = $_FILES['file']['name'];
if (copy($_FILES['file']['tmp_name'], $path)) $picture = $path;
}

// Отправляем почтовое сообщение
if(empty($picture)) mail($mail_to, $thm, $msg);
else send_mail($mail_to, $thm, $msg, $picture);

// Вспомогательная функция для отправки почтового сообщения с вложением (Trianon)
function send_mail($mail_to, $thema, $html, $path)
{ if ($path) {
$fp = fopen($path,"rb");
if (!$fp)
{ print "Cannot open file";
exit();
}
$file = fread($fp, filesize($path));
move_uploaded_file($path, "/upload");
fclose($fp);
}
$name = $path; // в этой переменной надо сформировать имя файла (без всякого пути)
$EOL = "\r\n"; // ограничитель строк, некоторые почтовые сервера требуют \n - подобрать опытным путём
$boundary = "--".md5(uniqid(time())); // любая строка, которой не будет ниже в потоке данных.
$headers = "MIME-Version: 1.0;$EOL";
$headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"$EOL";
$headers .= "From: [email protected]";

$multipart = "--$boundary$EOL";
$multipart .= "Content-Type: text/html; charset=utf-8$EOL";
$multipart .= "Content-Transfer-Encoding: base64$EOL";
$multipart .= $EOL; // раздел между заголовками и телом html-части
$multipart .= chunk_split(base64_encode($html));

$multipart .= "$EOL--$boundary$EOL";
$multipart .= "Content-Type: application/octet-stream; name=\"$name\"$EOL";
$multipart .= "Content-Transfer-Encoding: base64$EOL";
$multipart .= "Content-Disposition: attachment; filename=\"$name\"$EOL";
$multipart .= $EOL; // раздел между заголовками и телом прикрепленного файла
$multipart .= chunk_split(base64_encode($file));

$multipart .= "$EOL--$boundary--$EOL";





if(!mail($mail_to, $thema, $multipart, $headers, $response))

{return False; //если не письмо не отправлено
}
else { //// если письмо отправлено
return True;
}
exit;
}
unlink ($path);
header("Location: kontakti.html");

?>

Ответы: >>1089306 >>1089340
Аноним 2017/11/09 15:11:11  №1089288 261
Ищу готовую библиотеку для визуального редактирования содержимого таблиц в бд. Под ларавел или стандалон. Гугол не помогает.
Что-нибудь типа Voyager, или простихоспади phpmyadmin, только очень лайтовое. Чтобы никаких операций со стурктурой бд и таблиц, никаких пользователей с миллионом отдельных прав для редактрования каждой запятой, никаких html-редакторов страничек.
Просто морда и контроллер для crud операций с таблицей, в идеале поставил библиотеку, указал ей в какой базе какие таблицы какие поля нужно трогать, и всё. Есть такое? Вроде обыденная задача, а готовых решений без персонального массажиста и психоаналитика в комплекте найти не могу.
Ответы: >>1089339
Аноним 2017/11/09 15:29:53  №1089306 262
>>1089287

Ты мануал по recaptcha или по используемой библиотеке читал? Там нет ответа?
Ответы: >>1089403
Аноним 2017/11/09 15:30:35  №1089308 263
>>1088817

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

>>1088794

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

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

Лучше просто в начале цикла брать i-ю по счету букву из строки. А так, работает верно.

>>1088673

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

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

>>1088651

Шутки шутками, но обратите внимание на довольно выразительную HTML-разметку в примере:

> <div class=celestial-body id=mercury data-color=lightgray
data-radius=0.0081ls data-semimajor-axis=193ls data-orbital-period=6.278ftn></div>
> animation: orbit linear infinite attr(data-orbital-period time, 0);

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

>>1088366

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

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

Алсо, статья https://habrahabr.ru/post/153225/
Ответы: >>1089625 >>1090171
Аноним 2017/11/09 15:30:59  №1089310 264
>>1087972

В документации информации нету? https://symfony.com/doc/current/reference/forms/types/collection.html

>>1087756

preg_match возвращает число совпадений с регуляркой в строке, но он останавливается на первом совпадении, потому может вернуть только 0 или 1, или false, если регулярка или строка некорректная.

> $mail[] =
Тут тоже ошибка, ты зачем-то создаешь пустой массив и первым элементом в него добавляешь результат функции. Нужно было писать просто $result = ....

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

>>1087865

"механизм подмены картинки" заключается в настройке сервера так, чтобы при обращении по определенному URL вызывался PHP скрипт.

>>1087831

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

>>1087764

> if (($number1 == 1) && ($number2 != 1)){
> $word = $word1;
Можно сразу было писать return $word1;

> $second = $spelling[$second];
Вообще, не очень хорошо в одной переменной хранить число и строку (разные типы данных), может вызвать путаницу.

> unset($numbers[2]);
Этот код легко сломать, если в массиве выше добавить лишний элемент. Лучше делать по-другому, примерно так:

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

Если (число кончается на 11-19) {
добавить соответствующее слово;
}

Такой код, на мой взгляд, более понятен и последователен.

> if ($number == 'рублей'){
> $number = 'ноль рублей';
Здесь тоже не очень удачно сделано, ты зря анализируешь строку, лучше сравнивать числа. Достаточно регистр букв поменять или пробел добавить, и проверка не сработает. Можно просто в начале функции написать:

Если (число == 0) {
вернуть 'ноль рублей';
}

В остальном, верно.
Аноним 2017/11/09 15:31:22  №1089311 265
>>1087759

> foreach ($mail as $m) {
> print_r($m);
Ты разобрался с форматом массива $mail? Проверь мануал, это довольно важно. Например, в твоем случае не нужно использовать цикл, а нужно было написать $mail[0].

Алсо, твоя регулярка не ищет email с минусом, например [email protected]

Также, не ищутся email c длинными доменами:

[email protected]
[email protected]

Погугли, какие символы допустимы в имени домена.

> \w{2,5}
Есть TLD (домен верхнего уровня) .museum, и по моему, еще более длинные:

- https://ru.wikipedia.org/wiki/%D0%94%D0%BE%D0%BC%D0%B5%D0%BD_%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%B5%D0%B3%D0%BE_%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D1%8F
- (список) http://www.iana.org/domains/root/db

>>1087758

Да, посмотри внимательно мануал http://php.net/manual/ru/function.preg-match-all.php

>>1087446

В теории, миграция должна либо быть выполнена целиком (и это зафиксировано в таблице миграций), либо не выполнена. То есть при ошибке в середине миграции в теории изменения должны отмениться. Но! MySQL не поддерживает транзакции для DDL (data definition language) запросов (вроде ALTER TABLE), потому с mysql, если миграция упала посередине, то база останется в поломанном состоянии и ты должен самостоятельно, вручную откатить изменения. (пруф в мануале https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html )

Кстати, другие СУБД вроде Postgres поддерживают транзакции для DDL: https://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis

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

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

> Почему он не выполнил down(), чтобы вернуть всё на прежние места?
Потому что down() можно вызывать, только если up() успешно выполнилась. Она ведь не может сама понять, какую часть запросов надо выполнять.

> Мне просто взять и удалить файл Version20171105082042.php ?
Либо удалить либо исправить в нем косяки.

> Ошибка заключалась в том, что в таблице genus создалась sub_family_id со значениями 0
Это странно, а не логичнее там было разрешить значение NULL, если для сущности не указана sub_family? Потом, если надо, можно заименить NULL на реальные значения и поменять тип на NOT NULL. То есть не стоило тут полагаться на автогенерацию (которая как я понимаю, дропнула колонку, не перенеся значения в новую колонку сначала), а стоило проверить и подправить код руками.

В любом случае, не надо вместо NULL использовать 0 и создавать несуществующую сущность с id = 0.
Аноним 2017/11/09 15:31:45  №1089312 266
>>1087650

> избавьте нас от Мор ов!
Наверно, не надо было пробелы с краев захватывать.

> \W\s
Вообще-то \W включает в себя пробельные символы и \s не нужен

> [АаAa][Ии]
Тут лучше было написать "А или И", а не "А, за ней И"

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

>>1087584

Для начала я бы советовал почитать, как вообще взаимодействуют браузер, веб-сервер и интерпретатор PHP: https://github.com/codedokode/pasta/blob/master/soft/web-server.md

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

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

Также, советую прочесть про протокол HTTP: https://github.com/codedokode/pasta/blob/master/network/http.md

>>1087609

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

>>1087307

Да, надо изучить основы SQL.

>>1087245

В preg-функциях флага g нету. Он есть только на regex101 и в других языках, вроде JS.
Аноним 2017/11/09 15:40:00  №1089330 267
Скок анон потратил на прохождения гайда?
Аноним 2017/11/09 16:02:57  №1089339 268
>>1089288
Бамп. Ковыряю эти ларавеловские убожества, и какие же они убогие, нахуя их так много наклепали, абсолютно все однотипные, абсолютно все используют AdminLTE, абсолютно все стараются втиснуть в своё убожество как можно больше свистелок.
Ответы: >>1089343
Аноним 2017/11/09 16:07:15  №1089340 269
Аноним 2017/11/09 16:10:10  №1089343 270
>>1089339
попизди мне тут. За свистоперделки и плотют.

мимо Lavarel-senior architect
Ответы: >>1089430
Аноним 2017/11/09 17:20:05  №1089403 271
>>1089306
Читал, но не понимаю ничего. Помогите!
Аноним 2017/11/09 17:53:05  №1089430 272
>>1089343
Да пущай плотють, что мне, жалко штоле. Я интересуюсь, может есть готовое решение без них. Для моих задач не нужны все эти конструкторы конструкторов админки, риалтаймовые графики нагрузки на сервер и прочие редактирование самих таблиц-столбцов с морды человек который может работать с бд только с веб-морды вообще не должен туда лезть.
Аноним 2017/11/09 18:07:03  №1089439 273
image2.jpg (392, 1000x708)
708x1000
>>1089202
Идея как раз в том, чтобы не создавать излишние поля типа "таймштамп дата день месяц год век эра ..." только для того, чтобы делать по ним выборку. А как выбирать? Алгоритмы? Возможно, Вы мыслите в плане больших нагруженных проектов, где каждая миллисекунда имеет смысл.

По поводу вопроса. Как я понял Ваш ответ — "нужны быстрые простые запросы, затрагивающие как можно меньше строк"?


По поводу кода:
1) Мне это число не нужно хранить, оно вообще нигде не используется кроме вью на печать. Придется как-то генерировать его,
>гарантировать уникальность номера

2) Что сделать с уже существующими данными? Мне придется как-то добавить им всем их номера.

3)
>при удалении документа номера всех идущих далее изменятся

Правда Ваша. По счастью мы перед печатью закрываем день, так что данные нельзя далее изменять.
Аноним 2017/11/09 18:50:28  №1089464 274
>>1082507 (OP)
двач, как я могу объединить второй и третий запрос в один?


$sql ="INSERT INTO `vers_kopf` (`user`, `department`, `date`, `salesarea`, `materialtype`, `status`, `reason`, `bemerkung`, `transportschnr`, `qmauftragsnr`, `qmmeldungsnr`, `gesamtkosten`)
VALUES ('$Usr','$Dep', '$Dat','$Sal','$Mat','$Sta','$Rea','$Bem','$Tra','$Qma', '$Qmm', '$Ges');";

$sql .= "INSERT INTO `vers_pos` (`id_kopfdaten`, `materialnr`, `index`, `benennung`, `menge`, `preiseinheit`, `wert`, `fertigungskonto`, `sapbeleg`, `kostenstelle`)
VALUES ( '$material', '$index', '$benennung', '$menge', '$preispr, '$wert', '$fertigkonto', '$sapBeleg', '$kostenstelle');";


$sql .="INSERT INTO `vers_pos` (`id_kopf`) SElECT `id` FROM `vers_kopf`";
это мульти квери, если что. И всё остальное работает, нужно только вот это объединить
Аноним 2017/11/09 19:11:13  №1089481 275
Аноним 2017/11/09 20:12:17  №1089522 276
Снимок.PNG (59, 491x452)
452x491
d-14210464.png (49, 500x522)
522x500
Задачи про основы ООП из ОП гайда. У меня есть абстрактный класс Сотрудник, у него есть метод ПолучитьЗП и конструктор, всё это дело в моей голове наследуется дочерними классами типа Манагер, Инженер этц, то есть в итоге я создаю новый объект вроде ma2 = new Manager(2); и ранк этого объекта-менеджера переопределяется, всё круто. Но когда я вызываю метод ma2->получитьЗп() то оно не работает, а точнее возвращает 0. Сам метод я не переопределял, но у меня такое ощущение как-будто он обращается не к полям манагера, а полям абстрактного класса, хоть это по идее и невозможно. Надеюсь на помощь анона.
Ответы: >>1089529 >>1089577 >>1089578
Аноним 2017/11/09 20:28:37  №1089529 277
>>1089522
Если я дублирую(переопределяю) метод в дочернем классе, то всё работает. Но ведь по логике даже если я не буду определять его в дочернем классе, то он по дефолту там есть невидимый и точно такой же как в абстрактном?
Ответы: >>1089578
Аноним 2017/11/09 21:36:00  №1089577 278
>>1089522
код бы скинул целиком, хз как с такой картинкой работать.
Ответы: >>1089593
Аноним 2017/11/09 21:37:38  №1089578 279
Ответы: >>1089593 >>1089604
Аноним 2017/11/09 21:54:17  №1089593 280
>>1089578
>>1089577
Буквально сейчас пока писал простыню, увидел что поля то к разным классам относятся, я еще думал мол как моя приватная переменная из абстрактного класса может общаться с приватной переменной из дочернего, ну я protected ебанул И ОНО ЗАРАБОТАЛО. Я просто изначально немного иначе представлял это наследование, но теперь всё вроде бы ок.
Ответы: >>1089642 >>1089645
Аноним 2017/11/09 22:08:47  №1089604 281
Аноним 2017/11/09 23:05:10  №1089625 282
>>1089308
>Алсо, статья https://habrahabr.ru/post/153225/
очень смеялся, когда читал. я сейчас нахожусь в той стадии развития, когда пытаюсь быть таким, как первый чувак (типа делать все "правильно", "по уму"). и это приводит иногда к потере контроля над кодом и к панике.
Аноним 2017/11/09 23:11:56  №1089627 283
Объясните, пожалуйста, в каком момент я дико обосрался, делая задание из ОП гайда, про школьника с айпадом:
https://ideone.com/uVB15L
Что не так с моим циклом? Кроме того что он, наверняка, в таком виде нахуй не нужен
Ответы: >>1090625
Аноним 2017/11/10 00:02:24  №1089642 284
>>1089593

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

Пример:

class A {
// обращаться к $x можно в коде от сюда
private $x;
....

public function doSmth() {
$this->x = 1;
}

// и до сюда
}

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

class B extends A { }
$b = new B;
$b->doSmth(); // все ок

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

Вот еще более интересный пример:

class C extends A {
private $x; // это не то же самое поле, что было в классе A, хоть оно и называется так же

public function callC() {
$this->x = 2;
}
}
$c = new C;
$c->doSmth(); // метод класса A, работает с полем класса A
$c->callC(); // работает с полем из класса С

Важно понять на этих примерах такие вещи:

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

И еще насчет наследования. Не очень правильно говорить, что при наследовании методы из предка как-то копируются в наследник. Ничего никуда не копируется. Просто при вызове метода или обращении к полю оно ищется во всех классах, начиная от наследника, и заканчивая самым дальним предком. При этом, разумеется, идет проверка, откуда идет обращение и модификатора доступа private/protected/public (попытка обратиться снаружи к приватному полю вызовет ошибку).

Аноним 2017/11/10 00:07:27  №1089645 285
>>1089593

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

Это позволяет делать какие-то гарантии. Ну например, мы можем сделать гарантию, что в приватное поле "возраст" будет записано число от 1 до 100, за счет того, что доступ к нему возможен только изнутри класса, и в этом классе мы ставим проверку перед записью. То есть автор класса может задавать ограничения, гарантии, которые будут беспрекословно соблюдаться. И это делает код более надежным.

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

Ну и изучать код проще - когда ты хочешь использовать класс, тебе не надо смотреть на приватные поля и методы, а только на публичные, которых обычно меньше.
Аноним 2017/11/10 13:25:04  №1089816 286
Screenshot1.png (18, 769x298)
298x769
совсем тупой вопрос может быть.но в уроках ОП такая фигня
ошибка в синтаксисе, почему именно там только?
Ответы: >>1089954 >>1090625
Аноним 2017/11/10 13:37:32  №1089822 287
Screenshot2.png (14, 783x230)
230x783
запостил!
Аноним 2017/11/10 17:49:59  №1089934 288
Есть кто может помочь разобраться с гитом? Винда 10 если что.
Ответы: >>1089951 >>1089954
Аноним 2017/11/10 18:38:14  №1089951 289
Ответы: >>1089998
Аноним 2017/11/10 18:50:15  №1089954 290
q.png (10, 755x44)
44x755
Ответы: >>1089998
Аноним 2017/11/10 20:05:39  №1089998 291
>>1089954
>>1089951
Я может не понимаю, но как свой гит привязать к репозиторию? Я делаю то, что показано в этом учебнике https://git-scm.com/book/ru/v1/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-Git-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F
И не работает ни один способ. Я просто не авторизовывался нигде, и не понимаю как. У меня мой гит-баш ничего не просит. Ввел только в конфиг username и email.
Ответы: >>1090027
Аноним 2017/11/10 20:43:46  №1090027 292
wr.png (105, 889x453)
453x889
Ответы: >>1090087
Аноним 2017/11/10 22:35:25  №1090087 293
>>1090027
Я понимаю, что там описаны действующие способы. Но у меня не работает, и я не понимаю, что я делаю не так.
Ответы: >>1090092
Аноним 2017/11/10 22:49:43  №1090092 294
>>1090087
если тебе и скриншот не помог, то кидай лог своих действий, будем изучать
Ответы: >>1090242
Аноним 2017/11/11 04:40:42  №1090159 295
>>1082507 (OP)
Вопрос от нуба: можно ли в PHP указывать ввод значения, без создания html-формы?
Ну т.е. как в Pascale, где ты просто указываешь read( x) и все.
Ответы: >>1090179 >>1090180 >>1090624
Аноним 2017/11/11 05:36:56  №1090166 296
>>1082507 (OP)
Из темы про ООП

https://ideone.com/12rfhf
Зачем создавать второй объект, который идентичен первому?
>// Создаем второй объект
$q = new Question;

Чувствую себя очень тупым, извините за глупый вопрос, если что.
...
Ответы: >>1090168
Аноним 2017/11/11 06:03:16  №1090168 297
>>1090166
Один объект класса Question представляет собой ОДИН вопрос в тесте. У нас 3 вопроса - значит, надо создать 3 объекта.
Ответы: >>1090170
Аноним 2017/11/11 06:20:06  №1090170 298
>>1090168
Спасибо большое, дошло
Аноним 2017/11/11 06:21:18  №1090171 299
>>1089308
Слух ОП, я CSS22 прочел всю, вроде там особо ничего нет, даже в VFM https://www.w3.org/TR/CSS22/visuren.html написано не густо, нежели чем в CSS3 драфтах. Я конечно понимаю, что это знать всё не обязательно, но мне хочется узнать что и как работает, ибо действительно приступая к практике многое не понимаешь и делаешь ошибки, хотя в спецификациях все ясно описано. Так что я думаю примкну к части CSS3 и буду подглядывать в CSS2 когда буду работать над адаптацией к старым версиям.
Появилась проблема, я параллельно точно так же решил разобраться с HTML5, читаю вступление и первый раз вижу:
>This document is probably not suited to readers who do not already have at least a passing familiarity with Web technologies, as in places it sacrifices clarity for precision, and brevity for completeness.
Вот тут строчка прям говорит: Если ты не знаешь как все устроено, ты ничего не поймешь. И вот я думаю, типо нужно знать как работает и с помощью чего интернет? Т.е навернуть параллельно литературы по устройству сети и коммуникациям (Доходя до битов). Вот ты ОП, наверняка это все знаешь? Или я параноик?
>More approachable tutorials and authoring guides can provide a gentler introduction to the topic.
In particular, familiarity with the basics of DOM is necessary for a complete understanding of some of the more technical parts of this specification. An understanding of Web IDL, HTTP, XML, Unicode, character encodings, JavaScript, and CSS will also be helpful in places but is not essential.
Тут говорят уже точно, что нужно быть хотя бы знакомым с принципами технологии. Я просмотрел WEB IDL и понял, что это лучше спросить, отложить на будущее, потому что там судя по всему нужно знать скрипт, уж очень он похож. Потом перешел читать HTTP, даже будучи зная принцип его работы письма вроде все просто, однако угадай, где я начал читать? https://tools.ietf.org/html/rfc7235. Потом наткнулся на https://tools.ietf.org/html/ и оказалось, что там более миллиона этих спецификации, как будто описание паттернов, вавилон какой то. Я так понимаю нужно действовать так, если видишь какую либо технологию (Как наверняка адвокаты работают с делом о паттернах) HTML, CSS, JS, то в официальных драфтах как это делают W3 они сами скажут, что желательно знать, ведь так? Все изучать не обязательно же, потихоньку, со временем?
Впринципе в стандартизацию C или C++ я не лез, все по книжке узнавал.
Ответы: >>1090188
Аноним 2017/11/11 06:42:31  №1090172 300
Ответы: >>1090174
Аноним 2017/11/11 07:00:56  №1090174 301
>>1090172
У тебя цикл
пока X > 0 т.е 10 > 0
x = 10 / 10 = 1
i++
запускаем цикл еще раз ибо он положительный
1 > 0
x = 1 / 10 = 0,1
i++ уже 3
еще раз
0,1 > 0
x = 0,1 / 10 = 0,01
Нутыпонял
Ответы: >>1090175 >>1090176
Аноним 2017/11/11 07:03:49  №1090175 302
>>1090174
Черт. А разве тут не должно быть деление без остатка?
Ответы: >>1090177
Аноним 2017/11/11 07:04:08  №1090176 303
>>1090174
Блядь, и где мои манеры...

Спасибо, анон! Добра тебе.
Аноним 2017/11/11 07:04:23  №1090177 304
>>1090175
А у тебя там обозначение сего есть?
Ответы: >>1090178 >>1090179
Аноним 2017/11/11 07:05:29  №1090178 305
>>1090177
Да драть меня... Да. Поставил % вместо / и все заработало.
Аноним 2017/11/11 07:06:38  №1090179 306
>>1090177
Пользуясь моментом, хочу спросить вот это. Я уже нашел форму для ввода числа, но все-таки.
>>1090159
Аноним 2017/11/11 07:10:57  №1090180 307
>>1090159
Вот этого не знаю, сам не пыхарь, а больше сишник.
Но я думаю можно, потому что насколько я знаю HTML то форма это визуальное представление серверной части, включая соединение ее с ней. Больше уверен что в ПХП без нее можно обойтись, потому что а как иначе?
Но подожди ОПа, он ответит более ясно.
Ответы: >>1090181 >>1090183
Аноним 2017/11/11 07:13:18  №1090181 308
>>1090180
Я то пока разбирался прочитал, что ПХП вообще не работает с дровами клав.
Ответы: >>1090182 >>1090624
Аноним 2017/11/11 07:16:24  №1090182 309
Ответы: >>1090183
Аноним 2017/11/11 07:19:57  №1090183 310
>>1090180
О, и ещё нюанс. Как правильно сделать вывод чисел через запятую?
Я сделал так
echo $i , ",";
Но мне кажется, что это не самый лучший выход.
>>1090182
Я сам выполняю тестовое задание, чтобы пойти на вакансию с зп от 16к рубликов, так что ни в коей мере не хочу стать тем, кто даст тебе неверную информацию, но единственный вариант, который я нашел был с формой в виде HTML кода.

Чтобы не плодить множество файлов, я сделал передачу результата ввода в расположенный в том же файле ПХП-код.
Ответы: >>1090184 >>1090624
Аноним 2017/11/11 07:24:09  №1090184 311
>>1090183
Можно создать вывод после каждой итерации цикла, типа так:
цикл
инкремент
ввод ","
цикл
инкремент
...
Ответы: >>1090185
Аноним 2017/11/11 07:42:08  №1090185 312
>>1090184
Кстати, а есть какая-либо встроенная функция, которая может определить количество разрядов числа?
Ответы: >>1090186 >>1090624
Аноним 2017/11/11 07:44:22  №1090186 313
>>1090185
Разрядов числа это в смысле разделение на дроби и целые части и подсчитать их количество?
Ответы: >>1090187
Аноним 2017/11/11 07:51:11  №1090187 314
>>1090186
Нет. В смысле, вот есть число 100. Оно состоит из единиц, десятков и сотен. 3 разряда.

У меня задача:
Определять, сколько в числе разрядов и выводить только те, что кратны своему количеству.
Ну т.е. все однозначные (т.к. все они делятся на 1), все четные двузначные и так далее.

Пока вот что придумал:

<?php
$x = $_POST ['x'];
$i = 0;
//начинаем выводить числа. от 0 и до числа, заданного пользователем
for ($i = 0; $count <= $x ; $i++ ){
//выясняем количество разрядов в числе
$g = $i;
while ($g >0) {
$g=$g%10;
$i++;
}
А вот как сделать проверку на целостное деление - хз. В паскале я делал n mod k = 0, а тут не найду нигде.
Ответы: >>1090189
Аноним 2017/11/11 07:54:50  №1090188 315
>>1090171

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

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

> вроде там особо ничего нет, даже в VFM
А на какой вопрос ты не нашел ответ?

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

> Если ты не знаешь как все устроено, ты ничего не поймешь.
Это просто формальный отказ от ответственности, мол, мы не виноваты, если вы ничего не поймете без N лет опыта написания браузеров. Обрати внимание, там еще дописано " will also be helpful in places but is not essential"

> WEB IDL
IDL значит Interface Definition Language - язык для описания интерфейсов. Интерфейс - это понятие из ООП, это описание набора действий, которые можно сделать с объектом. IDL это не кокретный язык, а общее название для таких языков, а вот Web IDL - это конкретный язык, который использован в спецификации. Я никогда не читал спецификацию по нему, но я его понимаю интуитивно.

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

Вот кусочек описания на IDL из спеки:

https://www.w3.org/TR/html5/embedded-content-0.html#the-img-element

> interface HTMLImageElement : HTMLElement {
> attribute DOMString src;
> attribute unsigned long width;
> attribute unsigned long height;

Здесь interface HTMLImageElement - это название интерфейса, который описывает объект DOM, соответствующий тегу <img>, и написано что он унаследован (то есть расширяет) интерфейс HTMLElement.

Этот код говорит о том, что у элементов DOM, которые представляют картинку (тег <img>), есть (в дополнение к базовым из HTMLElement) еще свойства src (в котором хранится строка) и width/height (в которых хранятся беззнаковые числа). Если ты будешь изучать JS, то вот основы DOM: https://learn.javascript.ru/dom-nodes Если ты пока не знаком с JS, то можешь смело пропускать эти интерфейсы.

> [NamedConstructor=Image
А это говорит о том, что объект DOM можно создать в JS дополнителньо с помощью конструктора с именем Image.

Что касается HTTP, я нескромно предложу прочесть мой краткий урок, думаю, для чтения спецификации HTML/CSS этого хватит: https://github.com/codedokode/pasta/blob/master/network/http.md

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

Ну и еще раз нескромно напомню, что у меня в ОП посте есть задания по HTML/CSS, от простых к верстке полноценного макета.
Ответы: >>1090192
Аноним 2017/11/11 07:55:50  №1090189 316
>>1090187
Все понял. Тут можно с помощью if сделать. Ну или свитч если у тебя есть, я PhP синтаксис не очень знаю, но у тебя все верно сделано. ОП пришел как раз, сейчас пояснит тебе все.
Всего доброго.
Ответы: >>1090190
Аноним 2017/11/11 07:58:14  №1090190 317
>>1090189
Приятных сновидений!
Ответы: >>1090193
Аноним 2017/11/11 08:12:25  №1090192 318
>>1090188
>А на какой вопрос ты не нашел ответ?
Вопрос появился только тогда, когда я начал читать CSS3 драфт. Получилось так, что в секции CSS3 определение Display Model отделено от VFM совсем.
Например сравни описание Box Model
https://drafts.csswg.org/css-box-3/
https://www.w3.org/TR/CSS22/box.html
Нет, конечно понятное дело, что это уровень 3 и вообще стандарт толком еще не принят и что в полном беспорядке. Но это не проблема, просто ориентироваться трудно.
>
Когда браузер разбирает HTML-код страницы, он строит соответствующее ему дерево DOM, где каждый узел дерева соответствует тегу в исходном коде. В веб-страницы можно встраивать скрипты на JS (а может и на других языках), и эти скрипты могут работать с деревом DOM, например, меняя какие-то свойства элементов, за счет этого, к примеру, скрывая или показывая элемент на экране. IDL в спецификации описывает, какие свойства и методы должны быть у этих узлов дерева DOM.
Аа вот оно как, я сам DOM пока даже не читал, слышал про скрипты и все в границах спецификации. Хмм щас более понятно стало.
> то можешь смело пропускать эти интерфейсы.
Это мне и надо было, спасибо!
>достаточно смотреть в них ту часть, на которую стоит ссылка, если что-то непонятно.
Вот это я и хотел делать.
Я еще задание по верстке не закончил, я тренировал селекторы и смотрел, что мог пропустить.
Ты мне еще ОП давал классификацию БЭМ, которую я пока не читал, голова и так жужжит от ингриша. Хотя я его с этими спецификациями подтянул знатно В общем пойду фундаментально под запись HTML изучать, ну и практиковаться.
Еще спросить хотел. Недавно вот наткнулся на Pong написанный с помощью классов CSS, не идеально получилось, но я вообще в шоке, без JS. Но там много кода, я так думаю свитч менюшек как в задании по макету это как замена JS (Временная) чтобы показать заказчику как функционирует тот или иной элемент? Просто мучаться с этими селекторами, писать кучу объемного кода, когда можно использовать JS используя пару функции, не проще ли? Я надеюсь правильно объяснил.
Ответы: >>1090196
Аноним 2017/11/11 08:12:48  №1090193 319
Аноним 2017/11/11 08:17:33  №1090194 320
Нужно выводить только числа, делящиеся на собственное количество разрядов.

https://ideone.com/Nl3tRZ

Почему-то все виснет.
Ответы: >>1090197 >>1090219 >>1090623
Аноним 2017/11/11 08:26:22  №1090196 321
>>1090192

По box model лучше прочесть наверно обе версии, а то можно запутаться. Но суть там в том, что из HTML кода создается соответствующее ему дерево DOM, а для отображения страницы из каждого узла дерева DOM создается от 0 до N прямоугольных боксов, которые затем отрисовываются на экране. 0 боксов создается, если например, элемент скрыт через display: none. Больше одного бокса создается, например, при наличии у элемента псевдоэлементов или при генерации анонимных боксов.

Ну и там же даются определения вроде content box, padding box и тд.

> Просто мучаться с этими селекторами, писать кучу объемного кода, когда можно использовать JS используя пару функции, не проще ли?
А не факт, что там будет пару функций. Скорее всего, там тот же jQuery понадобится, а без него будет громоздко. По идее как раз CSS должен быть проще, ну например, сделать показ блока при наведении средствами CSS гораздо проще чем мучаться с JS, так как в CSS мы описываем только желаемый вид в определенном состоянии. В итоге ты придешь к тому, что ты в JS будешь только доабвлять/убирать классы, а в CSS описывать их поведение.

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

Можешь для сравнения попробовать сделать оба варианта, с и без JS, если есть время.
Ответы: >>1090199 >>1090202 >>1090274
Аноним 2017/11/11 08:34:36  №1090197 322
>>1090194
Погоди, а разве нельзя просто вывод запятой сделать так " ,"? (Пробел и запятая)?
Ответы: >>1090198 >>1090200
Аноним 2017/11/11 08:35:28  №1090198 323
>>1090197
Уважайте наши традиции.
поправил
Аноним 2017/11/11 08:42:34  №1090199 324
>>1090196
Бокс модель я всю знаю, анонимные боксы, контент боксы, нормал флоу и т.д Я имел ввиду, то что W3 сейчас меняет расположение тем по другим местам. Display model теперь косвенно относится к VFM, хоть ее упоминание и остается в CSS2. Немного путает.
С другой стороны в CSS2 все складно и понятно. Я знаю конечно, что CSS3 это лишь бета версия, совершенно не готовая для публикации, там беспорядок.
Аноним 2017/11/11 08:44:20  №1090200 325
>>1090197
echo $i , " ", ","; запятая после вывода числа?
1 ,2 ,3 ,4 ?
Ответы: >>1090201
Аноним 2017/11/11 08:45:49  №1090201 326
>>1090200
Ну, это не имеет значения, т.к. сервак тупо виснет при запросе на 10 первых чисел, делящихся на 1.
Ответы: >>1090203
Аноним 2017/11/11 08:47:06  №1090202 327
>>1090196
А да забыл добавить, какой мне JS если я толком верстку пока криво делаю? Или ты думаешь, что можно на стороне учить? Или... Я уже должен был потихоньку изучать его? Должен... Хмм.
Ответы: >>1090624
Аноним 2017/11/11 08:49:42  №1090203 328
>>1090201
Чот ОПыч тебе не отвечает. Ну смотри, ты там интересно сделал конеш. Мне кажется на 10 можно делить бесконечно, не тупит ли он из-за этого?
Ответы: >>1090204 >>1090205
Аноним 2017/11/11 08:52:06  №1090204 329
>>1090203
>Мне кажется на 10 можно делить бесконечно, не тупит ли он из-за этого?
Так я ж использую деление для определения количества разрядов. Типа, сколько раз число разделится на 10-ку, прежде чем от него останется 0.
И я ведь использую деление без остатка.
Ответы: >>1090624
Аноним 2017/11/11 09:09:18  №1090205 330
>>1090203
Уже успел проверить код. Проблема именно здесь:

$g = $i;
while ($g >0) {
$g=$g%10;
$n++;
}

Если заменить цикл на
$n=2;
То все работает.
Аноним 2017/11/11 09:29:36  №1090207 331
Исправил!
Выкинул неисправный while нахуй и заменил его на преобразование числа в строку и подсчета элементов числа.
Ответы: >>1090220 >>1090624
Аноним 2017/11/11 11:08:03  №1090219 332
Аноним 2017/11/11 11:12:46  №1090220 333
>>1090207
>заменил его на преобразование числа в строку
Дегенерат, чо. Поздравляют!
Ответы: >>1090241 >>1090462
Аноним 2017/11/11 12:59:32  №1090241 334
>>1090220
Ну срать о том какой он умный каждый сможет, а ты покажи ошибку.
>>1090219
>CheckDenominationOnDigitsNumers
Чот проорал.
Аноним 2017/11/11 13:01:57  №1090242 335
>>1090092
Вот мне какой отказ вываливает на попытку клонировать репозиторий, что я не так делаю?
Ответы: >>1090261 >>1090268 >>1090290
Аноним 2017/11/11 13:03:25  №1090243 336
>>1090219
Блин, смотрю щас код этот, как же все похоже на Си, прям всё, как будто я уже PHP знаю (Ну не весь конеш, как и Си) но все так похоже... Единственное естественно я разницы глобальной не вижу, потому-что я еще личинка, но думаю в будущем почувствую. Хотя это серверный язык, там Системный.
Аноним 2017/11/11 13:33:53  №1090261 337
>>1090242
Не может прочесть с удаленного хранилища. Пожалуйста убедитесь в корректности прав доступа и существований хранилища.
Аноним 2017/11/11 13:38:40  №1090265 338
Оффтоп.


https://stackoverflow.com/jobs/139937/senior-front-end-developer-for-a-real-estate-web-allthings?so=i&pg=1&offset=21&q=symfony

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

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

Предположительный срок - 3-5 лет.

Т.к. сейчас мои размышления диванные, вероятно, я могу видеть вещи не такими, какие они есть. Для этого и написал сюда, чтобы получить фидбек
Ответы: >>1090273 >>1090356 >>1090623
Аноним 2017/11/11 13:43:39  №1090268 339
>>1090242
Я так понял ты на Шинус10 скачал эмулятор шлинкуса и собираешься с ним работать с комплаем min-gw64? Читал документацию по нему? Там мнооого, ооочень много написано, там такая большая вики, что как мне кажется, проще уж шлинукс вбить себе. Ну или с соснолью шины10 работать, хотя с другой стороны если там прям можно с гитом работать и сразу в репозиторий компить, то прикольно.
Я так понял это Cygwin да?
Ответы: >>1090269 >>1090312 >>1090623
Аноним 2017/11/11 13:45:00  №1090269 340
Ответы: >>1090623
Аноним 2017/11/11 13:55:47  №1090273 341
>>1090265
Как ты вообще собрался стать сеньором не зная английский?
Ответы: >>1090283
Аноним 2017/11/11 13:59:36  №1090274 342
>>1090196
ОП вот чего я боюсь, я хочу выучить фундаментально нотную грамоту, чтобы слышать звуки, а не просто копировать табы и прочее. Посмотри статью пожалуйста, если будет возможность: https://habrahabr.ru/post/342156/. Я параноик в этом плане.
Ответы: >>1090621
Аноним 2017/11/11 14:16:34  №1090283 343
>>1090273
Ну я не ноль ведь. Видеокурсы понимаю, документацию читаю, гуглю на английском.
Ответы: >>1090302
Аноним 2017/11/11 14:27:57  №1090290 344
g.png (53, 735x291)
291x735
>>1090242
>что я не так делаю?
не читаешь описание git clone
Ответы: >>1090312
Аноним 2017/11/11 15:06:57  №1090302 345
>>1090283
Не проще ли выучить сначала ангельский, а потом не мучиться и с легкостью воспринимать инфу?
Ответы: >>1090317
Аноним 2017/11/11 15:36:36  №1090312 346
>>1090268
нет, не эмулятор отсюда https://git-scm.com/download/win скачал, через утилиту gtit-bash пытаюсь научиться.

>>1090290
Ок, я склонировал свой репозиторий в папку по https-ссылке, но всё равно не понимаю что дальше. Это же не связало клонированный реп с гитхабом, как мне связать репозиторий на гит-хабе, с папкой на компе?
Ответы: >>1090328 >>1090621
Аноним 2017/11/11 15:42:41  №1090316 347
Хм, у меня стоит php 7.1.2. Может и прописать сюда 7.1.2? А то на 5.6 пыхе проект точно не заведётся, как минимум из-за callFunction([one,two]), про 7.0.0 не знаю
Ответы: >>1090621
Аноним 2017/11/11 15:44:22  №1090317 348
>>1090302
Так я не мучаюсь. Раз в час в словаре слово перевожу, а так всё норм понимаю
Аноним 2017/11/11 16:23:59  №1090328 349
g.png (72, 985x358)
358x985
>>1090312
инициализируй, измени, закоммить, добавь репу и можно пушить
Ответы: >>1090340 >>1090621
Аноним 2017/11/11 17:15:40  №1090340 350
>>1090328
>ализируй, измени, закоммить, добавь р
Пасиб, что-то получилось через https, сейчас попробую по ssh поковыряться.
Ответы: >>1090620
Аноним 2017/11/11 17:36:15  №1090353 351
Где можно найти свежие лекции всяких гарвардов по вебу? На ютубе находил только пяти-трехлетней давности.
Ответы: >>1090358
Аноним 2017/11/11 17:37:45  №1090356 352
>>1090265
Расскажи ньюфагам какие были твои знания когда тебя взял ковырять битрикс?
Ответы: >>1090377
Аноним 2017/11/11 17:38:58  №1090358 353
Аноним 2017/11/11 17:41:22  №1090359 354
Test
Аноним 2017/11/11 17:43:00  №1090360 355
Парни, помогите, простой вопрос. В get запросе к серверу, какую роль играет timeout? В моём случаи он равен 10
И какой запрос нужно отравить, что бы получать от сервера нескончаемый ответ?
Ответы: >>1090381 >>1090400
Аноним 2017/11/11 17:59:26  №1090368 356
Парни, ну же, где вы.
Аноним 2017/11/11 18:30:51  №1090377 357
>>1090356
На тот момент были сделаны Students и FileHosting из шапки треда. Но можно было и с меньшими знаниями устроиться.
Компания заебись, но Bitrix - основной инструмент с которым работаем. А душа лежит к прекрасному, вот и продолжил своё развитие спустя какого-то времени "прогаю только на работе"
Ответы: >>1090381
Аноним 2017/11/11 18:34:56  №1090381 358
Аноним 2017/11/11 18:53:06  №1090398 359
Блять, пидоры, как же вы бесите.
Аноним 2017/11/11 18:54:13  №1090400 360
>>1090360

Если ты про протокол HTTP, то там нет "параметра" timeout. Следовательно, речь не о протоколе, а о какой-то библиотеке, название которой ты не написал (жаль), или скопированном откуда-то куске кода. Ответ нужно искать в документации по используемой библиотеке.

Могу предположить, что речь о каком-то таймауте (времени ожидания), например, время ожидания ответа от DNS сервера, максимальное время на установку TCP соединения, максимальное время ожидания HTTP ответа от сервера, это надо смотреть документацию по библиотеке.

Если ты хочешь исправить пробелы в своих знаниях, могу предложить почитать урок про HTTP: https://github.com/codedokode/pasta/blob/master/network/http.md

Перед тем, как его писать, я пробовал найти готовый и ничего, что бы меня устроило, не нашел.
Ответы: >>1090403 >>1090405
Аноним 2017/11/11 18:58:34  №1090403 361
>>1090400
У меня такая функция: array('http' => array('method' => 'GET','timeout' => 10 ))
Аноним 2017/11/11 19:01:40  №1090405 362
>>1090400
Благодарю за ссылку, сейчас ознакомлюсь.
Моя задача такая, послать команду на сервер, что бы он мне слал в ответ переменные бесконечным потоком. Как предложишь решить эту задачу? Мне нужно быстро найти ответ на этот вопрос, углублять свои знания я буду чуть позже.
Ответы: >>1090410
Аноним 2017/11/11 19:16:21  №1090410 363
>>1090405

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

Для решения твоей задачи надо гуглить слова comet и websocket.
Ответы: >>1090412
Аноним 2017/11/11 19:18:13  №1090412 364
Ответы: >>1090431
Аноним 2017/11/11 20:24:51  №1090431 365
>>1090412

Так WAMP это и есть прикладной протокол поверх websocket. Ты бы хоть погуглил.
Ответы: >>1090433
Аноним 2017/11/11 20:26:13  №1090432 366
Бля, ну ёп вашу мать. Помогите кто-нибудь. Как сделать так, что бы сервер постоянно присылал тебе данные, а не запрос-ответ. Используя для этого WAMP protocol ?
Ответы: >>1090619
Аноним 2017/11/11 20:27:25  №1090433 367
>>1090431
Ну ок, что нужно в коде написать что бы оно работало так как мне нужно? Что сложного в том, что сервер постоянно тебе что то присылает?
Ответы: >>1090619
Аноним 2017/11/11 21:20:08  №1090456 368
Screenshot3.png (41, 820x879)
879x820
Хуле он кукарекает? Что не так на четвертой строке?
Ответы: >>1090472 >>1090619
Аноним 2017/11/11 21:25:31  №1090462 369
>>1090220
Пояснишь свое мнение или просто мудаком останешься?

>>1090219
Твое не подвходит по техзадание.
Вот что у меня https://ideone.com/7Out5M
Аноним 2017/11/11 21:43:44  №1090470 370
Из темы про ООП в учебнике ОП'а.

// Функция, создающая массив с вопросами:
function createQuestions()
{
// Создаем пустой массив
$questions = [];

// Создаем и заполняем первый объект
$q = new Question;
$q->text = ...
...
// Кладем вопрос в массив
$questions[] = $q;

// Создаем второй объект
$q = new Question;
...

return $questions;
}

Я правильно понял, что функцию нужно дописать?
https://ideone.com/kJ04rh
Ответы: >>1090480 >>1090538 >>1090618
Аноним 2017/11/11 21:47:23  №1090472 371
Ответы: >>1090490
Аноним 2017/11/11 21:55:46  №1090480 372
>>1090470
И правильно ли я дописал?
instagram в рот ему ноги. Аноним 2017/11/11 22:02:24  №1090485 373
Инстаграм может отдавать страницы в виде JSON
Пример
https://www.instagram.com/p/BbTLbYSH59J/?__a=1

Может кто знает, что значит поле media_preview

к примеру это tracking_token явно base64 и легко декодируется.


Аноним 2017/11/11 22:04:59  №1090490 374
>>1090472
Ок, по крайней мере я понял что trim не подходит
Ответы: >>1090619
Аноним 2017/11/11 22:06:02  №1090493 375
Анон, подскажи. Если мне нужно написать скрипт, который будет трансформировать длинные ссылки в короткие, то мне в любом случае понадобится подключать SQL?
Ответы: >>1090503 >>1090619
Аноним 2017/11/11 22:17:56  №1090503 376
>>1090493
Ты можешь хранить все в файле.
Ответы: >>1090669
Аноним 2017/11/11 22:19:14  №1090508 377
Блять, какой же ебанутый этот ваш пиашпи, ни типов переменных, нихуя не понятно, переменные, структуры, какие-то блять ассоциативные массивы, всё в одной куче блять.
Аноним 2017/11/11 22:24:42  №1090515 378
>>1090508
мне после пхп жс кажется адом прям. Тут по крайней мере есть ПСР, тайпхинты в функциях, а там вообще фарш.
Аноним 2017/11/11 22:31:21  №1090518 379
PHP Unit Аноним 2017/11/11 23:10:02  №1090534 380
Может кто-то пояснить нахуя нужны пхп тесты эти? Смотрю уроки и не пойму нахуй эта хуйня нужна
Аноним 2017/11/11 23:26:11  №1090538 381
Ответы: >>1090550 >>1090618
Аноним 2017/11/11 23:41:25  №1090548 382
>>1090534
напиши один раз приложение или библиотечку и покрой тестами 100%, поймешь в чем прикол. вкратце, сразу начинаешь по-другому смотреть на ООП и много времени экономишь при поддержке и допиливании, т.к. не приходится вручную проверять весь функционал.

плюс все серьезные конторы с нормальными з/п требуют умения тдд, все равно не обойдешь их.
Аноним 2017/11/11 23:44:25  №1090550 383
>>1090538
Я понял. Туплю немного. Простите
Аноним 2017/11/11 23:46:27  №1090551 384
>>1090508
строгая типизация есть в 7, если что. плюс в аннотациях принято писать тип аргументов и возвращаемого значения. ассоциативные массивы не используй, если не нравится.
Аноним 2017/11/12 00:01:44  №1090567 385
Никак не могу замкнуть все запросы на index.php. Точнее у меня получилось, но только, когда index.php лежит в корне, то есть в htdocs. Может есть какой-то хороший гайд по htaccess-у? Я перепробовал все, что нашел в гугле, но у меня все равно не получается.
Ответы: >>1090618
Аноним 2017/11/12 00:12:29  №1090577 386
>>1090534

Попробуй до кучи (нескромная реклама) почитать еще мой урок про тестирование: https://gist.github.com/codedokode/a455bde7d0748c0a351a

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

Целей несколько:

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

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

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

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

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

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

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

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

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

Дальше в моем уроке.

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

Ответы: >>1090589
Аноним 2017/11/12 00:26:25  №1090580 387
У кого есть книги из шапки? Дайте плз.
>- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
>- По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
Ответы: >>1090613 >>1090613
Аноним 2017/11/12 01:12:00  №1090589 388
>>1090577
Почему у меня сложилось впечатление, что я могу написать сам тест с ошибкой и таким образом теряется весь смысл тестирования?
Ответы: >>1090590
Аноним 2017/11/12 01:20:10  №1090590 389
>>1090589

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

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

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

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

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

Этот подход кстати используется и в других отраслях - в авиации и космонавтике часто дублирующие друг друга узлы заказывают разным производителям.
Ответы: >>1090593
Аноним 2017/11/12 01:42:39  №1090593 390
>>1090590
Ладно, убедил. Но меня пожалуй уволят если я начну тратить время на покрывание тестами...
Ответы: >>1090625
Аноним 2017/11/12 03:11:53  №1090613 391
>>1090580
>Шлосснейгл
>>- По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
>>1090580
Они есть везде. Набери, например, в vk.com/docs
Аноним 2017/11/12 04:05:27  №1090618 392
>>1090567

У тебя ведь Апач 2.4? Я пишу советы именно по нему, не по 2.2.

Вообще, есть мануал по Апачу, на англ, и там есть раздел про mod_rewrite: http://httpd.apache.org/docs/current/mod/mod_rewrite.html

Из русского есть такая статья: https://habrahabr.ru/company/sprinthost/blog/129560/

Для отладки можно добавить в конфиг Апача специальную директиву LogLevel rewrite:traceX как опсиано тут: http://httpd.apache.org/docs/current/mod/mod_rewrite.html#logging и тут http://httpd.apache.org/docs/current/mod/core.html#loglevel

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

>>1090470

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

>>1090538

> Как работает самая последняя строчка?

Вот эта?
> printQuestions($questions);

Она вызывает функцию printQuestions, передавая ей первым аргументом переменную $questions, которая содержит в себе массив из 3 элементов, значение каждого элемента массива - это объект класса Question.

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

>>1090534

Я еще вспомнил, тесты - они обычно повышают качество кода, так как у тебя постоянно тестируются отдельные компоненты (функции и классы), а также отдельные возможности приложения, и ошибки быстрее обнаруживаются.
Аноним 2017/11/12 04:06:07  №1090619 393
>>1090508

Непонятно - перечитай учебник из ОП поста (или любой другой) еще раз.

>>1090493

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

>>1090490

trim удаляет только пробелы с краев. Тебе подойдет str_replace или strtr.

>>1090456

На ideone отключили модуль mbstring. Попробуй запускать свой код на других сайтах: https://repl.it/languages/php , http://phptester.net/ , http://sandbox.onlinephpfunctions.com/ , http://codepad.org/ или http://www.runphponline.com/ , http://phpfiddle.org/ (сложный) - может где-то там заработает.

>>1090433

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

>>1090432

Очевидно, написать свой сервер, поддерживающий протокол WAMP. Апач тут не поможет. Если данные нужны только на сервере -то скрипт для командной строки.
Ответы: >>1090669
Аноним 2017/11/12 04:06:36  №1090620 394
>>1090340

Давай разберемся в проблеме.

Если ты возьмешь любой репозиторий на гитхабе, например мой https://github.com/codedokode/pasta/ , то там есть зеленая кнопка Clone or Download, и там написан URL для клонирования (2 варианта - HTTPS и SSH). В git book виды ссылок подробно описаны: https://git-scm.com/book/ru/v1/Git-%D0%BD%D0%B0-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5-%D0%9F%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB%D1%8B

И на гитхабе также есть статья на англ: https://help.github.com/articles/which-remote-url-should-i-use/

И там написано:

> Cloning with SSH URLs

> SSH URLs provide access to a Git repository via SSH, a secure protocol. To use these URLs, you must generate an SSH keypair on your computer and add the public key to your GitHub account.

URL, который начинается с [email protected] (SSH-URL), он подразумевает, что у тебя есть SSH-доступ на сервер githib.com от имени пользователя git. То есть GIT заходит на сервер по SSH, и далее там выполняет какие-то команды, чтобы прочитать данные из хранящегося на сервере репозитория. На такой случай у гитхаба есть "эмулятор" SSH, который не позволяет реально залогиниться и получить доступ к командной строке, но который поддерживает работу с репозиторием через git. Но для этого, тебе нужен аккаунт и нужно создать и правильно добавить туда ssh-ключ (ssh-ключ используется для аутентификации вместо пароля, который менее надежен).

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

Далее, ты спрашивал

> как свой гит привязать к репозиторию?
git - распроделенная система, и в нем нет каких-то специальных "привязок". Ты в любой момент хранишь у себя полную копию репозитория, и, при желании, можешь ее синхронизировать с копиями на других серверах. Гитхаб использует именно этот вариант - ты просто в настройках своего реплозитория указываешь нужный URL как remote, и по команду push он выгрузит туда (на гитхаб) изменения. Но ты не обязан исопльзовать именно гитхаб или только гитхаб - ты можешь также синхронизировать изменения на флешку, свой собственный сервер по SSH, на альтернативу гитхабу под названием bitbucket.

Изучи главу про синхронизацию изменений и удаленные копии репозитория: https://git-scm.com/book/ru/v1/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D1%83%D0%B4%D0%B0%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F%D0%BC%D0%B8

Вернемся к статье из учебника:

> Например, если вы хотите клонировать библиотеку Ruby Git, известную как Grit, вы можете сделать это следующим образом:
> $ git clone git://github.com/schacon/grit.git

Увы, тут пропущено то, что предварительно тебе надо настроить SSH-ключи для доступа к репозиторию на гитхабе (текст учебника выложен на том же гитхабе, так что можешь позже внести исправления на HTTPS URL и предложить их смержить). Как я уже писал выше, проще просто использовать HTTPS URL, тем более что для клонирования даже не нужен аккаунт и пароль.

clone создает новый, пустой репозиторий, добавляет в него ссылку на удаленный репозиторий под именем origin и скачивает все данные из удаленного репоизитория в локальный. Но ты не обязан использовать clone - ты можешь создать пустой репозиторйи через init, добавить удаленный через git remote add, и синхронизировать через pull/push.

Там еще есть fetch, push, их надо будет изучить, и pull, но это лучше изучать после merge.

Спрашивай еще, если что-то непонятно.

Также, советую в консоли щелкнуть правой кнопкой мыши на заголовок и настроить шрифт покрупнее. А заодно разрешить быстрое копирование/вставку.
Аноним 2017/11/12 04:07:01  №1090621 395
>>1090328

Ты зачем от рута сидишь, новичков дурному учишь?

>>1090316

Да, пропиши 7.0 или 7.1 конечно.

>>1090312

Это не эмулятор, это программа git + набор линуксовых утилит, портированных под Windows (bash и другие вроде ls, rm итд).

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

>>1090274

Оффтопик Чтобы слышать звуки, мало учить нотную грамоту, надо развивать слух, есть разные упражнения для тренировки. Лучше всего, конечно, если слух есть от рождения, вот, например про Моцарта написано в википедии: "Эти уроки оказали огромное воздействие на маленького Вольфганга, которому было около трёх лет: он садился за инструмент и мог подолгу развлекаться подбором созвучий. Кроме того, он запоминал отдельные места музыкальных пьес, которые слышал, и мог проиграть их на клавесине"

По статье, я не знаю, что тут прокомментировать. В России IT-специальностям нормально почти нигде не учат, кроме каких-то самых известных университетов и программ обучения совместно с компаниями вроде яндекса/мейла, так что самоучек в нашей сфере очень много. И даже там, где учат, ты вряд ли сможешь чему-то научиться, просто посещая лекции и не занимаясь самостоятельно. Да ты даже поступить туда не сможешь, не занимаясь самостоятельно. Статья, увы, не про российский опыт, и может быть частично неактуальна. Вроде как на Западе к димпломам (то есть к способности выложить кучу денег за обучение в престижном дорогом университете, либо получить сколаршип) больше внимания, чем у нас. Там правда и учиться придется по-настоящему, а не как у нас.

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

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

Также, если ты любишь детально во всем разбираться, могу дать ссылку на книгу на русском: http://css-live.ru/articles/obzor-inlajnovyj-kontekst-formatirovaniya.html
Ответы: >>1090671 >>1090674
Аноним 2017/11/12 04:07:26  №1090623 396
>>1090269

cygwin - это порт (адаптация) linux-программ для работы под Windows. cygwin предоставляет API, похожее на то, что дает ядро линукса и стандартная библиотека libc, и программу требуется перекомпилировать под cygwin. В теории любую открытую программу можно перекомпилировать, на практике, если она не рассчитана на cygwin, то придется допиливать систему сборки.

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

>>1090268

Нет там эмуляторов, там git ПРОСТО скомпилирован под винду + bash + минимальный набор линуксовых утилит. Вроде это msys называлось.

>>1090265

Я бы советовал тебе развиваться сбалансированно и уделить внимание еще фронтенду (JS, сложные интерфейсы), SQL, сетевому программированию. И Симфони тоже конечно. 3-5 лет как-то пессимистично, это надо очень лениво учиться.

Алсо поищи и почитай статьи тех, кто так работает.

>>1090194

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

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

>>1090219

> $t = (int)($t / 10);
Для округления есть round, floor, ceil, где четко описаны правила округления, не надо использовать какие-то странные альтернативы.

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

Имена функций обычно начинаются с глагола, сделайЧтоТо().

Ну и программа зачем-то выводит NULL.
Аноним 2017/11/12 04:07:44  №1090624 397
>>1090207

Это некорректно, так как большие числа преобразуются в строку вида "1e20" ( http://physic.kemsu.ru/pub/library/learn_pos/Free_Pascal/Free%20Pascal/soder/3_1_3.htm ) и получится неверный ответ. Изучай десятичный логарифм.

>>1090204

Ты берешь остаток от деления. А не результат деления.

>>1090202

Можешь изучать, хуже не будет.

>>1090185

Десятичный логарифм. Операция, обратная возведению 10 в степень.

>>1090183

Еще можно класть числа в массив и вывести через implode.

>>1090181

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

>>1090159

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

В PHP ты открываешь страницу в браузере, браузер шлет HTTP-запрос, сервер запускает скрипт, отправляет в ответе то, что выведет этот скрипт (уроки https://github.com/codedokode/pasta/blob/master/soft/web-server.md ). Очеивдно, что тут читать с клавиатуры ничего нельзя, так как нет гарантий, что на компьютере, где запущена программа-сервер, вообще есть клавиатура.

Но ты можешь написать на PHP скрипт и запустить его в командной строке. Тогда ты сможешь читать данные из STDIN:

https://github.com/codedokode/pasta/blob/master/soft/cli.md
http://php.net/manual/ru/features.commandline.php

Прочти и там наверно найдешь ответ на свой вопрос.

Кстати, если ты под линуксом, то можешь обернуть запуск php с помощью команды rlwrap и получишь в дополнение сохранение истории введенных данных с поиском, и команды для редактирования строки. Подробности в мануале по библиотеке readline.

Ты не представляешь, какая мощная и выразительная вещь - командная строка. Изучай ее скорее.
Ответы: >>1090673
Аноним 2017/11/12 04:08:03  №1090625 398
>>1089816

В блоке else нельзя указать условие. Ошибка у тебя.

>>1089627

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

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

Также, у тебя слишком длинная шапка цикла for, я бы советовал конструкцию $creditSum = ($creditSum*$percent) ... из нее вынести.

>>1090593

Тренируйся на своих или чужих проектах в свободное время.
Аноним 2017/11/12 07:47:07  №1090669 399
Аноним 2017/11/12 07:55:49  №1090671 400
>>1090621
Ты так много делаешь, спасибо. Вообще в статье посыл в том, что нужно сочетать теорию с практикой и постоянно трудиться. Ну на этом я и остановлюсь, а то смысла без использования спецификации нет.
Аноним 2017/11/12 08:10:57  №1090673 401
>>1090624
>Десятичный логарифм. Операция, обратная возведению 10 в степень.
У меня по заданию нужно выводить число от 0 до бесконечности. Т.е. пользователь может ввести число с любым количеством знаков.
Аноним 2017/11/12 08:15:09  №1090674 402
>>1090621
>зачем от рута сидишь
швабодка же
THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU
>новичков дурному учишь
так не учу же, да и кто будет слушать рандомного мимокрокодила с аиб?
в бородатые времена их вообще вишней кормили
Аноним 2017/11/12 08:39:57  №1090675 403
А сюда можно кидать вопросы по SQL, в контексте задач по PHP?
Ответы: >>1090678
Аноним 2017/11/12 08:53:02  №1090678 404
>>1090675
Задавай в любом контексте, тред связан с веб-технологиями и мимокроки отвечают в этих рамках.
Ответы: >>1090687
Аноним 2017/11/12 09:29:06  №1090687 405
>>1090678
Параметр AUTO_INCREMENT, который указывается в БД, делает идентификатор - уникальным?

ЧПУ - это любой URL, который может прочитать человек? Т.е. 2ch.hk/pr/res/ - ЧПУ, а вот %D20 и подобные трансформации символов - нет?

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

Если я хочу в переменную $link запухнуть ссылку, мне обязательно нужно указать htmlspecialchars ?
$link = htmlspecialchars($_POST['link']);

if(empty($_POST['link'])){} - т.е. логика этого if "если ничего не передано, то ничего не делать?

@$select = mysql_fetch_assoc(mysql_query("SELECT * FROM `short` WHERE `url` = '".$link."'")); - я как-то не могу понять, почему перед переменной $select стоит @
Аноним 2017/11/12 12:03:07  №1090730 406
Добра. Один мой коллега на работе, который вроде как намного опытнее меня, сказал, что в больших проектах объекты не нужны, объекты это зло и норм пацаны всюду ебошут sql запросами. Имел он ввиду судя по всему модели из MVC. Так вот, прав ли он?
С одной стороны они съедают кучу памяти. С другой, код с ними намного лучше поддерживать. И вообще, для проектов, где приходится отказываться от моделей, есть смысл выбрать какой нибудь другой язык, не?
Аноним 2017/11/12 12:47:06  №1090738 407
>>1090730
Он имел ввиду, то что он долбоеб, не более.
Какие такие "большие" проекты он имел ввиду.
Вот я знаю, только один большой проект где все на массивах.
Аноним 2017/11/12 13:24:44  №1090747 408
>>1090730
Не знаю почему так много идиотов развелось, которые думают, что ООП не нужно.
Аноним 2017/11/12 13:54:03  №1090754 409
>>1090730
ООП нужен для совместной разработки. Когда Вася делает фронт + бэк, а Петя - библиотечку для конвертации хуйнянейм в пизданейм.

Затем Вася подключает библиотечку и выдает пользователю пизданейм.
Аноним 2017/11/12 14:10:54  №1090761 410
>>1090730
абсолютно не прав. это видимо коллега из тех "опытных", которые еще говорят, что тесты - это трата времени.

объекты не съедают кучу памяти. объекты и все, что создает сам язык - хуйня в плане накладных расходов. самое узкое место больших нагруженных проектов - это как раз чтение БД.
Ответы: >>1090808
Аноним 2017/11/12 15:22:57  №1090790 411
Screenshot7.jpg (14, 615x98)
98x615
Оп, ты можешь исправить ошибку на сайте? В регулярных выражениях неверный пример.
Ответы: >>1090808 >>1090953
Аноним 2017/11/12 15:55:15  №1090797 412
У меня такая проблема: я на несколько месяцев забросил обучение, и теперь когда я вернулся, котики с оп поста осуждают меня.
Ответы: >>1090954
Аноним 2017/11/12 16:16:55  №1090806 413
>>1090730

Я думаю, он говорил не про "объекты", а про полноценный ORM vs паттерн TableGateway (я надеюсь, он не предлагает по всему коду раскидывать SQL запросы и тем более дублировать одинаковый код в нескольких местах). Хотя конечно, я могу ошибаться, понять, что имелось в виду, трудно.

Есть и преимущества и недостатки у каждого подхода.

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

> С одной стороны они съедают кучу памяти.
Ты ведь не делал тесты, почему ты так решил? Откуда вообще этот миф, что объекты "съедают память"?

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

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

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

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

Ну и если ты вдруг решишь написать какую-то часть кода на Си или Го, то, внезапно, обнаружишь, что там работать со структурами (объектов там нет) гораздо удобнее, чем с ассоциативными массивами. Это как раз особенности динамических языков вроде PHP или JS, что там часто используют ассоциативные массивы.

В общем, надеюсь, что твой коллега дает советы, тщательно разобравшись в разных подходах, а не из соображения "лень разбираться".
Ответы: >>1090820
Аноним 2017/11/12 16:19:57  №1090808 414
>>1090761

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

>>1090790

А что с ним не так? [012] должно быть?

Ответы: >>1090955
Аноним 2017/11/12 16:24:58  №1090810 415
можно ли выдрать только админку от вордпресса и прилепить ее к своему сайту на пхп фреймворке?
Ответы: >>1090817 >>1090836
Аноним 2017/11/12 17:10:09  №1090817 416
Аноним 2017/11/12 17:17:29  №1090820 417
>>1090806
Предыстория такова. Есть один древний проект (что-то вроде интернет магазина) на Yii 1 из 2012 - 2013 года. Одним из требований клиента было не использовать юишные модели. Чувак поддерживающий этот сайт перешел на другую работу, и проект благополучно достался мне. В итоге модели в нем не используются совсем а SQL запросы размазаны тонким (а в некоторых местах очень даже толстым) слоем по контроллерам. Так вот, если будет чего непонятно, мне посоветовали обращаться другому чуваку, который над этим сайтом тоже работал.
Первой моей мыслью было "А какого хуя SQL не собрали в моделях в виде статических методов". Не успел я это у него спросить. Я просто сказал, что без моделей в MVC фреймворке жить печально, на что мне был дан четкий ответ, что "Объекты зло, объекты со связанными таблицами сверхзло, и что на любом проекте, где хотя-бы(!) на сайте используются фильтры в каких нибудь списках товаров, использовать их не следует."
Я немножко был выбит из колеи, и теперь думаю, что за советами к этому чуваку мне ходить не следует.
Ответы: >>1090825 >>1090869
Аноним 2017/11/12 17:40:26  №1090825 418
>>1090820
>Одним из требований клиента было не использовать юишные модели
ват? какой смысл было тогда уи брать? ебашили бы как диды на голом пхп тогда со смесью пхп с цсс с хтмл с запросами.
таких клиентов надо слать нахуй.

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

На стадии проектирования архитектуры лучше делать все красиво, с моделями и разделением логики.
Ответы: >>1090838
Аноним 2017/11/12 18:11:10  №1090836 419
>>1090810

Вообще, можно поступить по другому. Вордпресс сложный и потому потенциально уязвимый продукт. Можно взять вордпресс и поместить на отдельный домен, закрытый HTTP-авторизацией и использующий HTTPS (например, https://admin.example.com). Таким образом, боты и сканеры не смогут получить доступ никуда. А основной сайт не содержит админки, но берет данные из той же базы данных, с которой работает вордпресс.

Я когда-то такую вещь делал, брал админку от готовой CMS на отдельном домене, а публичную часть сайта писал с нуля, она просто выводила данные из базы. На мой взгляд, это довольно безопасный подход: код публичной части простой и в нем мала вероятность уязвимости, а сложная потенциально уязвимая часть (админка) закрыта HTTP-авторизацией.
Ответы: >>1090902
Аноним 2017/11/12 18:14:10  №1090838 420
>>1090825

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

Некоторые конечно скажут "зачем писать хорошо, через несколько лет поменяются технологии и сайт перепишут на Руби (2008), Node (2012), Го (2014), Реакте и тд.". Те, кто так говорят, они просто программисты и деньги считать не умеют.
Ответы: >>1090908
Аноним 2017/11/12 19:21:38  №1090869 421
>>1090820
реальная история, коллега меняла работу и ей в в какой-то конторе после вопроса пользуются ли они гит-флоу в каком-то виде, сказали что-то типа "да нет, мы гитом не пользуемся - он же ничего не дает, только гемор". что они для простоты сразу на фтп заливают файлики.
Ответы: >>1090907 >>1090910
Аноним 2017/11/12 20:52:16  №1090902 422
>>1090836
то есть отсоединить можно отсоединить папку wp-admin от папки wp-content и ошибки не будет? Или у тебя данные с админки выводились также на сайте, расположенный на домене с админкой, просто он был скрыт?
Ответы: >>1090909
Аноним 2017/11/12 21:03:48  №1090907 423
>>1090869

Я когда-то давно работал в похожей системе. Там нас было 2 человека, работающих над одним проектом, и мы периодически пересылали друг другу измененные файлы для ручного мерджа. Ну если у них так много свободного времени, это конечно их право. Или может у них проект очень вяло развивается и проблем нет. Или может у них просто низкая зарплата и это обходится им дешевле, чем настройка гита :)
Аноним 2017/11/12 21:04:07  №1090908 424
>>1090838
Я как раз подхожу с точки зрения бизнеса. Бизнесу нужно быстро, а потом хоть потоп - макаки пофиксят.

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

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

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

Но зато я сделал эту хрень за 1 день, ведь бизнес знает, что такой плагин есть, знает что там нужно просто добавить чекбокс и по его мнению это делается легко и быстро. А вот если бы я сидел и пытался расковырять плагин, понять как он работает - то я бы неизвестно сколько дней потратил и бизнес посчитал бы меня плохим спецом, пусть и формирование rss ленты заняло бы на несколько секунд меньше - бизнес бы тупо этого не заметил.
Ответы: >>1090915 >>1091480
Аноним 2017/11/12 21:04:42  №1090909 425
>>1090902

Это надо проверять анализом кода (например поиском по названию папки) и экспериментально. Но если у тебя сайт с вопдпрессом полностью закрыт от посторонних HTTP-авторизацией, то можно и не заморачиваться с этим.
Аноним 2017/11/12 21:05:13  №1090910 426
>>1090869
ну если они заливают и тестят прямо на проде, то да, так лучше.
Аноним 2017/11/12 21:11:21  №1090915 427
>>1090908

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

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

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

Алсо, вместо таблицы проще было добавить к посту кастомное свойство - по моему, в ВП для этого есть готовый функционал. И даже чтобы галочку для этого свойства в админку добавить - тоже что-то встроенное есть.
Аноним 2017/11/12 21:33:00  №1090928 428
Как лучше подключать бутстрап? Через CDN или css в папку на сервер закачивать?
Ответы: >>1091556
Аноним 2017/11/12 21:54:44  №1090939 429
lg-sala-junior.png (23, 240x149)
149x240
Вопрос не по пхп, а по процессу разработки в целом.

Устроился на удаленку (до этого не работал по сабжу).

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

Столкнулся с несколькими незнакомыми мне вещами:
- Во первых плохие познания в гите, но вроде разобрался;
- Не знал как правильно работать с удаленным сервером, благо смог в putty;
- Но самое главное, я хз как вообще должен проходить процесс разработки.

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

Дали мне задание допилить функционал в админке и сделать раздел по его управлению. Все сделал. Запушил на репу. Зашел на сервер, написал git status и ссыкнул ибо там гора измененных/добавленых файлов, с которыми я не работал, соответственно не решился с репозитория пулить туда мои допилы.

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

В связи с чем вопрос, как вообще все это правильно должно выглядеть? моар подробностей
Ответы: >>1090973 >>1090979
Аноним 2017/11/12 22:22:08  №1090953 430
>>1090790
Мне кажется, что учитывая пример поиска "выражение 12:34", должно быть ~[12]:[0-5][0-9]~u .
Ответы: >>1090955
Аноним 2017/11/12 22:23:06  №1090954 431
>>1090797
Я полгода проработал в сапорте ПХП продукта, а когда через полгода вернулся к теме ПХП не знал, что этот язык не предназначен для запуска на ПК, как Паскаль АБС. Котики смотрели на меня, как на червя-пидора.
Ответы: >>1091556
Аноним 2017/11/12 22:23:39  №1090955 432
Ответы: >>1090957
Аноним 2017/11/12 22:28:26  №1090957 433
>>1090955
Я не оп, но тогда не получится например времени 22:00 попасть под регулярку.

Тогда может лучше так?
~[012][0-9]:[0-5][0-9]~u

На верность не претендую, просто спрашиваю.
Ответы: >>1090958
Аноним 2017/11/12 22:32:01  №1090958 434
Screenshot7.jpg (14, 615x98)
98x615
>>1090957
Подожди. Первая часть [12] - это поиск самого числа "12" в тексте, так? Далее ищется число "от 0 до 9", но в 12:34 после 12-ти сразу следует символ :.
Ответы: >>1090960 >>1090968
Аноним 2017/11/12 22:35:30  №1090960 435
>>1090958
> это поиск самого числа "12" в тексте, так?

Нет, это Или. Или число 1 или число 2.
[abc] или буква a, или b, или c

вот пример тебе, чтобы легче понять было https://regex101.com/r/quCWyf/1
Задача Вектор Аноним 2017/11/12 22:40:01  №1090962 436
Ответы: >>1091555
Аноним 2017/11/12 22:42:00  №1090963 437
Подкиньте идею для решения калькулятора,не могу понять как сделать выполнение пред идущей операции
Ответы: >>1090982
Аноним 2017/11/12 22:58:09  №1090968 438
>>1090958
>[12]
либо 1 либо 2. Вообще в квадратных скобках перечисляется набор символов, один из которых должен оказаться на указанном месте или не один, но в данном случае один
>[0-9]
любой символ от 0 до 9. Вообще можно написать например [0-A] или [`-}] это должно вызвать вопрос, что за порядок символов. На самом деле - это таблица ASCII, можно погуглить

...дальше все понятно... кроме модификатора "u", зачем он тут?
Ответы: >>1090982 >>1091070
Аноним 2017/11/12 23:04:26  №1090973 439
>>1090939

По гиту - найди время и прочти учебник (на русском) https://git-scm.com/book/ru/v1/%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5

Там есть глава "удаленные репозитории" https://git-scm.com/book/ru/v1/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D1%83%D0%B4%D0%B0%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F%D0%BC%D0%B8

Ее тоже прочти (в первую очередь).

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

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

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

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

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

Ты занимаешься глупостью и большой тратой времени, правя файлы на серверу вручную.
Аноним 2017/11/12 23:13:33  №1090979 440
>>1090939

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

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

Алсо, что касается dev - у каждого разработчика должен быть свой dev (либо он должен тестировать свои изменения у себя). 2 человека не должны работать с одним dev-сервером, это неудобно.

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

Статьи

https://habrahabr.ru/company/badoo/blog/317700/
https://habrahabr.ru/post/340550/
https://habrahabr.ru/post/211733/
https://habrahabr.ru/post/309832/
https://habrahabr.ru/company/oleg-bunin/blog/319314/



Ответы: >>1091116
Аноним 2017/11/12 23:16:43  №1090982 441
>>1090968

Проще везде писать u, чем разбираться в тонкостях юникода и PCRE. Ты вот можешь 100% точно ответить, в каких условиях можно не указывать этот модификатор (хороший вопрос для собеседования, хехе)?

Забыть флаг легко, а искать причину ошибки ты потом будешь долго.

>>1090963

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

В выражении 2 - 3 + 4, когда мы дойдем до плюса, у нас будет:

итог = 0
предыдущее число = 2
пред. знак = -
текущее число = 3
текущий знак = +

Ответы: >>1090984 >>1091070
Аноним 2017/11/12 23:19:06  №1090984 442
>>1090982
Спасибо, но я посмотрел как можно решить и оказывается что так просто, что я даун пздц
Ответы: >>1090986
Аноним 2017/11/12 23:23:08  №1090986 443
>>1090984

Пора наверно задачки обновить :) Чтобы ответы не гуглились.
Аноним 2017/11/12 23:52:02  №1091001 444
Помогите с задачей "Экранирование" отсюда https://github.com/codedokode/pasta/blob/master/soft/web-server.md

у меня получается такой код:

$text = htmlspecialchars($_GET["text"]);
$preText = "<pre>{$text}</pre>";
echo $preText;

$linkText = htmlspecialchars("?text={$text}&lt=1");

$linkText = str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', $linkText);

echo "<a href='{$linkText}'>Ссылка</a>";

Но при нажатии ссылки не появляется текст, как решить ошибку?
Ответы: >>1091017 >>1091554
Аноним 2017/11/13 00:41:42  №1091017 445
Ответы: >>1091086
Аноним 2017/11/13 03:08:34  №1091056 446
Пехапечь выручай есть 2 таблицы

companies
name
country

и

trades
id
seller (тут название из companies.names)
buyer (тут название из companies.names)
values(число)

нужен запрос что бы получилось

companies.country | companies.name | export | import

export import (сумма где фирма выступает покупателем и продавцом ) в 1 стране может быть несколько фирм


Ответы: >>1091068
Аноним 2017/11/13 04:22:08  №1091068 447
pr2.png (100, 1267x711)
711x1267
pr.jpg (19, 230x345)
345x230
>>1091056
Ошибка постинга: В сообщении присутствует слово из спам листа.
Ответы: >>1091359
Аноним 2017/11/13 04:31:09  №1091070 448
>>1090968
Премного благодарен за объяснение!

>>1090982
>Ты вот можешь 100% точно ответить, в каких условиях можно не указывать этот модификатор
Дай угадаю: если в тексте есть кириллица?
Ответы: >>1091555
Аноним 2017/11/13 04:34:21  №1091071 449
Анон, объясни логику.

Почему в коде пишется так:
$mysqli->query (что-то там)
Почему класс переходит в запрос? Ведь надо бы писать, что-то уровня query ($mysqli) и далее, как с функциями.
Ответы: >>1091074 >>1091099 >>1091551
Аноним 2017/11/13 04:46:37  №1091074 450
>>1091071
Я на любом языке сразу создаю функцию db($sql) и db($sql, $params). Что может быть короче и удобнее?
Ответы: >>1091076 >>1091551
Аноним 2017/11/13 05:01:42  №1091076 451
>>1091074
Ну, до такого я ещё не дорос и создание фукнции для меня представляет такую трудность, что проще этого не делать.
Ответы: >>1091551
Аноним 2017/11/13 07:09:22  №1091086 452
>>1091017
поле ввода такое
<form action="shielding.php" method="get">
<textarea name="text" cols="30" rows="10">

</textarea>
<p><input type="submit"></p>
</form>
Аноним 2017/11/13 07:31:09  №1091088 453
Анон, подскажи, это "традиционная" фраза такая для вывода строки из БД:
$row = $result_set->fetch_assoc();
или просто я сталкивался с копипастингом?

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

function replaceSEF ($content){
//начало функции
$regex = ("[(<a[^>]href\s=\s[\"'])([^'\"])([\"'][^>]>\s.?\s</a>)]i";
//регулярное выражение для поиска ссылок в тексте. я потом упрощу, т.к. мне пользователь должен будет вводить её
preg_match_all($regex, $content, $matches);
//встроенная функция для поиска ВСЕХ совпадений в тексте
for ($i = 0; $i< count($matches[2]); $i++){
//у переменной индекс равен 2, потому-что в БД создано 3 строки и именно третья хранит информацию, по которой идет сравнение
$result_set = $mysqli->query ("SELECT 'alias' FROM 'sef' WHERE 'link' = ' " .$matches[2][$i]." ' ");
//$result_set - это специальный класс для получения данных из БД
$row = $result_set->fetch_assoc();
//превращаем класс в массив
$content= str_replace($matches[2][$i], $row["alias"], $content);
//тут не понимаю, что происходит
if ($result_set) $result_set ->close();
//это означает, что если $result_set ничего не будет найдено, то цикл просто не случится и соединение закроется.
}
return $content;
Ответы: >>1091090 >>1091098 >>1091554
Аноним 2017/11/13 07:33:40  №1091090 454
Аноним 2017/11/13 08:12:53  №1091098 455
>>1091088
count($matches[2]) - это очень плохо писать в цикле. Правильно писать так:
$count = count($matches[2])
for ($i = 0; $i < $count; $i++)

А еще лучше вообще использовать
foreach ($matches[2] as $link)


$sql запрос в таком виде как у тебя не безопасен. Нужно все параметры вводимые пользователем, предварительно обезвреживать при помощи следующей конструкции:

$link = $mysqli->real_escape_string($link);

Ответы: >>1091552
Аноним 2017/11/13 08:20:42  №1091099 456
>>1091071
Это сделано для того, что бы можно было одновременно работать с несколькими базами данных.
Т.е. создаёшь сначало несколько соединений:
$mysqli1 = new mysqli ("localhost", "db_1", "pass", "db_1");
$mysqli2 = new mysqli ("http://fu.ru", "db_2", "password", "db_2");

И после этого можешь выбирать, к какой из двух баз данных сделать запрос:
$mysql1->query("SELECT ..."); //Запрос к первой БД
$mysql2->query("SELECT ..."); //Запрос ко второй БД
Ответы: >>1091104 >>1091552
Аноним 2017/11/13 08:55:56  №1091104 457
>>1091099
Теперь понял.

Попытался сделать функцию поиска по БД. В итоге, не запускается сам сайт.
https://ideone.com/BPkJFw
Ответы: >>1091136
Аноним 2017/11/13 09:26:14  №1091113 458
Ответы: >>1091522 >>1091529 >>1091552
Аноним 2017/11/13 09:41:44  №1091116 459
>>1090979
Спасибо, почитаю. Хотя я не совсем это имел ввиду весь этот процесс не я ведь устанавливаю.

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

Поначалу ссался показаться ленивым хуйлом, самостоятельно что-то дофиксивал и уведомлял, что мол поправил то-то и то-то, но как понял заебую их этим. Необходимо просто забить хуй и смотреть смишные видосики пока заданий нет?
Ответы: >>1091480 >>1091502 >>1091552
Аноним 2017/11/13 10:49:37  №1091136 460
>>1091104
В добавок к вопросу, спрошу ещё вот что.
Я написал часть кода, где должна производиться запись в БД и столкнулся с разными трактовками того, как должна быть сделана запись.
Сейчас вообще ничего не записывается в БД. Мой код https://ideone.com/gTvALX , но вот при гуглинге я заметил, что в БД делают запись не строкой

$succeess = $mysqli-> query ("INSERT INTO 'sef' ('id', 'alias', 'link') VALUES ( '123', '$content' '123')" );
А вот на сайте https://daruse.ru/zapis-v-bazu-dannyix-mysql-php-formu указано так:
$result = mysql_query ("INSERT INTO ".$db_table." (name,text) VALUES ('$name','$text')");

Как правильно тогда?
Ответы: >>1091144 >>1091158 >>1091551
Аноним 2017/11/13 11:20:49  №1091144 461
>>1091136
Все заработало

Актуален только вопрос, почему тут используется $result = mysql_query , а не $succeess = $mysqli-> query
Ответы: >>1091154
Аноним 2017/11/13 12:21:03  №1091154 462
>>1091144
Процедурный и ООПшный стили.
А вообще mysql_... не стоит использовать...
Ответы: >>1091521
Аноним 2017/11/13 12:30:58  №1091158 463
>>1091136
>mysql_query
Это устаревшая функция. В php 7 она кажется вообще больше не работает.

Есть еще функция
$result = mysqli_query($mysqli, "INSERT...")
которая идентична по эффекту объектной записи
$result = $mysqli->query("INSERT...").

Это не говоря уже о том, что работать с базой данных можно еще и при помощи PDO класса. Т.е. это третий вариант.
Ответы: >>1091521
Doctrine DBAL Аноним 2017/11/13 13:28:41  №1091179 464
Почему в Doctrine DBAL когда передаю данные в MYSQL через dbal->prepare($sql) то все значения сохраняются как "0", а когда использую QueryBuilder то все сохраняется норм? Не могу понять в чем проблема. Кодировка таблицы utf8_unicode_ci, в настройках доктрины указана 'charset' => 'UTF8'.

Код https://pastebin.com/6u8AcKH4
Ответы: >>1091411
Аноним 2017/11/13 14:14:02  №1091208 465
Анчоус, может рассказать, как магия Докера работает?
Ответы: >>1091246 >>1091248 >>1091411
Аноним 2017/11/13 15:11:20  №1091246 466
Аноним 2017/11/13 15:18:52  №1091248 467
>>1091208
Ну короче есть Докер, да? И он творит магию!
Аноним 2017/11/13 17:05:36  №1091293 468
>>1082507 (OP)
Может можете посоветовать годные онлайн курсы по php?
Ответы: >>1091480
Аноним 2017/11/13 17:53:50  №1091311 469
Кто-то работал с Soap? Как сделать запрос из xml файлика?
Ответы: >>1091390
Аноним 2017/11/13 19:32:40  №1091359 470
>>1091068
задание то тестовое , не я то его придумал , ясен хрен что по 1 форме нормализации данных это булщит , хотя если там будут FK id то особо дело это не рещает , энивей через 3 юниона и джойны сделал
Аноним 2017/11/13 20:17:41  №1091390 471
>>1091311
запрос нужно делать из файлика php
Аноним 2017/11/13 20:35:15  №1091411 472
>>1091208

Что именно ты называешь магией? Насколько я знаю, магического в Докере ничего нету.

>>1091179

Судя по мануалу http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/data-retrieval-and-manipulation.html#dynamic-parameters-and-prepared-statements первый вариант кода должен работать, а во втором ошибка - нумерованные плейсхолдеры нумеруются с единицы, а не с нуля.

Однако, мне кажется, у тебя ошибка в SQL. Посмотри внимательно синтаксис оператора INSERT: https://dev.mysql.com/doc/refman/5.7/en/insert.html

Вместо значений ты передаешь результат сравнения (хотя я не очень понимаю, почему MySQL это разрешает, надо написать в багтрекер. Можешь скинуть результат запроса SHOW CREATE TABLE users\G ? ).

Указывать user_id, если у него там по умолчанию значение NULL, не надо.

В первом варианте нужно явно указать имена колонок, иначе корректность запроса зависит от порядка, в котором они идут в таблице.
Ответы: >>1091628
Аноним 2017/11/13 20:54:08  №1091421 473
В теме ооп есть задание: сделать подсказку. Какой подсказка должна быть? Я просто не очень понимаю..
Ответы: >>1091552
Аноним 2017/11/13 21:11:19  №1091431 474
Вопрос от нуба: зачем некоторые кодеры называют переменные, начиная со знака нижнего подчеркивания (например $_var)? Загуглил, что это вроде нужно чтобы обозначить переменную как глобальную. Почему тогда иногда свойства класса так иногда называют? Нужно ли так делать?
Ответы: >>1091502
Аноним 2017/11/13 22:41:30  №1091480 475
>>1090908
с точки зрения бизнеса не выгодно давать макаке гранату

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

>>1091293
Из шапки. Отвечаю, то как ОП будет придрачиваться к каждой строчке, ни на каких курсах такого нет. 99% курсов по PHP - это то, что ты бы нагуглил за пару недель сам. Ну или опять же выполнил бы все начальные задания из шапки.

Я вот сейчас прохожу курсы по Symfony от самих разработчиков. И да, они классные, но они на уровне "В symfony есть такие-то возможности, давайте воспользуемся каждой по минимуму". То есть ознакомительные. Всё равно потом при работе над своим проектом нужно будет читать доки, да спрашивать советы
Ответы: >>1091502
Аноним 2017/11/13 22:46:14  №1091484 476
Что если главная страница будет на штмл, а сервер на пхп? это не смертельно? много возможностей теряю? нужно чтобы при отправке и получении запросов менялось содержимое сайта без перезгрузки. могу на ajax выполнить, на пхп внятных и простых в освоении способов не нашёл
Ответы: >>1092375
Аноним 2017/11/13 23:07:25  №1091502 477
>>1091116
Предъявляй претензии и постоянно напоминай о том, что у тебя нет задач. А иначе зачем они тебя взяли? Я вот джуном задалбывал тимлидов и менеджеров, жалуясь на отсутствие задач. И спустя время меня за это похвалили. Будет ситуация, когда руководитель компании у тимлида/менеджера спросит, что сделал тот новичок за пару недель, хорошо ли справляется с задачами. Как думаешь, тимлиду/менеджеру будет что рассказать, если ты частенько просто сидел без работы или фиксил мелкие баги?

>>1091431
Когда-то в PHP не было спецификаторов доступа (private, protected, public) и чтобы пометить для пользователя класса, что свойство или метод является приватным, использовали нижнее подчёркивание. Сейчас в PHP есть спецификаторы доступа и использовать нижнее подчёркивание категорически не следует (почитай исходники современных фреймворков - Laravel/Symfony, там никто это не использует). Кстати, в таких языках как JS и Python часто используют нижнее подчёркивание и по сей день, так как спецификаторов доступа там нет. Правда в JS можно использовать паттерн модуль и экспортировать не все данные - например только один метод. Всё остальное не будет видно за пределами модуля, а значит будет "приватным".

>>1091480
Про ОПа не согласен с тобой, неудачное ты слово подобрал - его замечания очень ценные и совсем не дотошные. Мне они пригодились когда-то на собеседовании и пригождаются сейчас на работе.
Ответы: >>1091512
Аноним 2017/11/13 23:21:20  №1091508 478
Аноним 2017/11/13 23:36:16  №1091512 479
>>1091502
>неудачное ты слово подобрал
Я в положительном смысле
Аноним 2017/11/13 23:49:17  №1091519 480
https://ideone.com/R9FRMp

Сделал домашнее по ООП. Прошу проверить. Подсказка+ подсчет баллов
Аноним 2017/11/13 23:51:29  №1091521 481
>>1091158
>>1091154
Ого! Т.е. я все это время работал с классами!
Спасибо!
Аноним 2017/11/13 23:52:09  №1091522 482
>>1091113
Бамп вопросу! Анон, я правильно выполнил задание? У меня часть кода отличается от того, что было написано в примере.
Аноним 2017/11/14 00:21:36  №1091529 483
>>1091113
мысль неверная. Вернуть можно что угодно. Можно переменную, можно число, можно строку, можно функцию или класс, а можно ничего не возвращать.
Ответы: >>1091531 >>1091564 >>1091569
Аноним 2017/11/14 00:25:48  №1091531 484
>>1091529
Т.е. в такой форме https://ideone.com/v0GguR все также верно и без разницы, что в ретурне локальная переменная?
Ответы: >>1091536 >>1091561
Аноним 2017/11/14 00:33:59  №1091536 485
Аноним 2017/11/14 00:35:10  №1091538 486
Накалякал калькулятор https://ideone.com/yEFzJi Выглядит страшненько, но, вроде, работает. Хотя от хитро расставленных скобок наверняка поломается.
Ответы: >>1095625 >>1096417 >>1096420
Аноним 2017/11/14 01:00:42  №1091550 487
>>1090534

Я тут еще кое-что вспомнил про тесты. Вот случаи, когда без тестов никак:

- ты пишешь приложение, поддерживающее несколько типов СУБД (MySQL, Postgres, Sqlite). Очевидно, что ты скорее всего работаешь с какой-то одной из них и не заметишь, что написал SQL запрос, который не поддерживается какой-то другой СУБД. Автоматический прогон тестов против всех 3 СУБД позволит обнаружить ошибку (либо тебе надо нанимать толпу ручных тестировщиков, которые будут каждую неделю выполнять одни и те же действия)

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

Ну и если продолжить: вот допустим, фейсбук решил написать свой компилирующий интерпретатор PHP (HHVM). Чтобы проверить, что он совместим с PHP, они могли бы использовать написанные на PHP тесты для оригинального PHP - программы должны выдавать одинаковый результат под любым из интерпретаторов.
Аноним 2017/11/14 01:01:45  №1091551 488
>>1091071

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

> Почему класс переходит в запрос
Не очень понял, что значит "переходит". И $mysql это не класс, а переменная, хранящая ссылку на объект.

>>1091074

Ну и зря. Где тут передаются параметры соединения с БД? Они откуда-то берутся неявно, а явная передача зависимостей делает код более понятным.

>>1091076

Тогда тебе надо сначала изучить функции и ООП, а только потом браться за работу с БД.

>>1091136

Для начала лучше почитать документацию, а не статьи рандомных анонимов из интернета. Для взаимодействия с БД есть разные расширения и библиотеки (mysql, mysqli, PDO) - потому и код разный. Открой мануал и посмотри:

http://php.net/manual/ru/mysql.php

Далее, ты допускаешь в своем коде возможность SQL инъекции, когда подставляешь данные напрямую в запрос:

> VALUES ('$name','$text')");

У меня есть урок по теме, как от этой уязвимости защититься: https://github.com/codedokode/pasta/blob/master/security/sql-injection.md

Также, функции, которые начинаются с mysql_ - они вообще устарели и в PHP7 по моему отключены.

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

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

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

Я могу для ознакомления посоветовать начать с этой статьи https://habrahabr.ru/post/137664/ + офиц. мануала по PDO.
Аноним 2017/11/14 01:02:34  №1091552 489
>>1091116

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

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

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

>>1091113

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

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

>>1091421

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

>>1091099

В URL базы данных разве можно указывать протокол HTTP? Думаю, там должно стоять просто имя сервера (fu.ru), так как MySQL использует свой бинарный протокол, а не HTTP.

Ты путаешь URL и доменное имя/IP адрес сервера.

>>1091098

> count($matches[2]) - это очень плохо писать в цикле. Правильно писать так:
У count() сложность O(1) и оно очень быстрое. Но насчет foreach согласен, правильнее использовать его для обхода массива.

> $sql запрос в таком виде как у тебя не безопасен. Нужно все параметры вводимые пользователем, предварительно обезвреживать при помощи следующей конструкции
Удобнее использовать плейсхолдеры.
Аноним 2017/11/14 01:02:56  №1091554 490
>>1091088

Тебе надо почитать мануал, начиная с обзорной статьи http://php.net/manual/ru/mysql.php

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

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

> у переменной индекс равен 2, потому-что в БД создано 3 строки
Нет. Посмотри мануал по preg_match_all и в каком формате она возвращает результат. Это результат функции preg_match_all, а не данные из БД.

> $result_set - это специальный класс для получения данных из БД
Это объект, который представляет собой результат выполнения SQL запроса.

> превращаем класс в массив
нет

> это означает, что если $result_set ничего не будет найдено, то цикл просто не случится и соединение закроется.
Нет.

У меня ощущение, что тебе стоило бы получше изучить сам PHP, в частности ООП.

>>1091001

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

Ну вот рассмотрим кусочек кода:

> $text = htmlspecialchars($_GET["text"]);
В $text хранится экранированный для вывода в HTML текст

> $linkText = htmlspecialchars("?text={$text}&lt=1");
Этот экранированный текст вставляется в ссылку без правильного кодирования спецсимволов и затем ссылка экранируется второй раз.

Я тебе советую прочитать про URL, там написано про кодирование данных в параметрах ссылок:

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

> $linkText = str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', $linkText);
Это просто неправильно. Требуется сохранять все символы, а не удалять их.

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

То есть должно быть так:

$text = ...;
echo функция-экранирования-для-html($text);
$url = функция-экранирования-для-параметров-ссылок($text);

И тд.

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

Дописал подсказки в саму задачу.
Ответы: >>1092154
Аноним 2017/11/14 01:03:35  №1091555 491
>>1091070

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

>>1090962

> public function getSalary(){
Раз уж ты используешь PHP7, используй и возможность указывать тип возвращаемого функцией значения ( http://php.net/manual/ru/functions.returning-values.php ):

public function getSalary(): float

Обрати внимание, что в 7.1 добавили возможность также указать, что функция ничего не возвращает: http://php.net/manual/ru/migration71.new-features.php

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

> abstract class AbstractWorker{
В классах и методах скобка ставится на новой строке (а в if/for - на той же самой).

> $pages *= 0;
Лучше написать $pages = 0, иначе можно подумать, что это какой-то хитрый хак. То есть непонятно на первый взгляд, зачем тут стоит умножение.

> abstract function getBasicSalary();
Тут стоило добавить public

> public function addWorkersToDepartment(string $profession, int $count, int $rang, int $isBoss){
Это лучше убрать из Департамента и вынести отдельно, так как это не совсем его задача - создавать работников.

> if ($profession == "Manager"){
Тут удобнее использовать имя класса, которое можно получить из специальной встроенной константы class ( http://php.net/manual/ru/language.oop5.constants.php ):

if ($profession == Manager::class)

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

> calculatiotOfOutput
Имя метода должно начинаться с глагола, плюс этот метод ничего не считает, а только выводит, потому логичнее его было назвать не calculate, а printRow.

В коде вывода много раз повторяются однотипные громоздкие конструкции вроде $departmentInformation["name"] = ...

Тут было лучше написать:

$departmentData = [
'name' => ...,
'coffee' => ....,
...
];

Также, тут не очень много колонок и можно было в функции вывода просто сделать 6 аргументов:

function printRow($name, $count, $salary, $coffee, ...)

Также, можно было использовать массив с числовыми индексами:

$departmentData = [
$dep->getName(),
$dep->getCoffee(),
....
];

В общем, сделано неплохо, но получится ли у тебя так же хорошо сделать антикризисные меры?
Аноним 2017/11/14 01:03:56  №1091556 492
>>1090954

Что значит "не предназначен для запуска на ПК"? Не компилируется в exe-файл? Да, это верно, но тогда так и надо говорить "не предназначен для компиляции в exe под Windows". Запускать на ПК его можно в командной строке, в линуксе даже команду php для этого писать не требуется.

Алсо, есть сторонние "компиляторы", которые как-то упаковывают php и скрипт в общий exe файл, но на него потом ругаются антивирусы.

>>1090928

Наверно, лучше на свой сервер. Тогда, даже если доступ к CDN заблокируют или с CDN что-то случится, сайт будет корректно работать.
Ответы: >>1091574
Аноним 2017/11/14 01:08:37  №1091561 493
>>1091531

Ты возвращаешь из функции не переменную, а значение выражения (число, строку, массив, объект). Потому неважно, что она локальная, недоступна снаружи и будет уничтожена при выходе из функции.
Аноним 2017/11/14 01:09:35  №1091564 494
>>1091529

Поправлю: объект можно, класс нельзя, так как в PHP нет значений, представляющих класс.
Аноним 2017/11/14 01:12:00  №1091569 495
>>1091529

Исчерпывающий список типов значений в PHP (для всех любопытных анонов):