«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Клуб изучающих PHP и webdev #99 Аноним 2018/02/08 23:39:30  №1135053 1
15181223711270.png (33, 500x500)
500x500
15181223711271.jpg (157, 1024x683)
683x1024
15181223711292.jpg (194, 1024x768)
768x1024
15181223711303.png (3449, 1920x1080)
1080x1920
Добро пожаловать. Тут мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет сделать себе блог, кто-то приобрести новую профессию, кому-то просто нечего делать.

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

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

Предыдущий тред был тут: >>1118555 (OP) . Остальные треды есть в архиве: https://phpclub.tech/ или ищутся в гугле по словам "клуб изучающих php" и в архиваче.

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

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

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

С чего начать

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

Устанавливать пока что ничего не требуется, разве что редактор кода вроде 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

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

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

Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания 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
- Новости IT на англ. https://news.ycombinator.com/

Оформляй код аккуратно!!! — например пропусти через 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? — Да, однозначно. Посмотри любую вакансию.
Оформляйте код будьте людьми Аноним 2018/02/08 23:41:29  №1135054 2
15181224894890.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
Аноним 2018/02/08 23:43:35  №1135056 3
В прошлом треде:

- написал еще комментарии по https://github.com/TheSidSpears/testhub/ >>1135039
- ответил про ER диаграмму базы данных: >>1135042
- проверил задачу про антикризисные меры >>1135043

Если я кому-то не ответил, напомните о себе тут.
Аноним 2018/02/08 23:53:58  №1135068 4
ОП, подскажи плз статьи по вопросу >>1134788
а то задача прилетела, а я с синтаксическим разбором никогда не сталкивался
Ответы: >>1135122
Аноним 2018/02/09 01:37:45  №1135122 5
>>1135068
>>1134788

Ты можешь посмотреть в сторону компонента Symfony ExpressionLanguage: https://symfony.com/doc/current/components/expression_language.html - там уже есть парсер выражений. Но если тебе интересно, как вообще это делается, читай пасту:

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

Для записи грамматики есть разные стандартные способы:

- BNF https://en.wikipedia.org/wiki/Backus%E2%80%93Naur_form
- EBNF https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form
- ABNF https://en.wikipedia.org/wiki/Augmented_Backus%E2%80%93Naur_form (спецификация на рус: https://rfc2.ru/5234.rfc )
- и даже можно использовать регулярки https://habrahabr.ru/post/171667/

Все эти грамматики определяют правила составления конструкций из минимальных неделимых кусочков языка (терминалы) и других составных конструкций. Например, для математического выражения терминалами могут быть числа и знаки арифметических операций, а составной конструкцией - "сумма", определенная как последовательность конструкций ЧИСЛО "+" ЧИСЛО.

Традиционно разбор выражения делают в 2 этапа:

1) В рамках лексического анализа лексер (токенайзер) разбивает выражение на массив токенов (лексем): "-(22 + 2) ^ 3 ^ 4" -> ['-', '(', '22', '+', '2', ')', '^', '3', '^', '4']. На этом этапе числа группируются в токен, удаляются незначащие символы. Токен может быть представлен строкой, массивом, объектом, в зависимости от задачи. Последовательность токенов можно представить в виде массива или объекта.

2) В рамках синтаксического анализа парсер получает на вход поток токенов и строит дерево выражения их узлов. Тут есть разные алгоритмы: https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7

Дерево выражения удобно представлять в виде дерева из объектов-узлов разного типа (AST). Ну например, математическое выражение 10 + 2 + 3 ^ 4 можно представить в виде дерева объектов:

SumNode(
NumberNode(10),
NumberNode(2),
PowerNode(
NumberNode(3),
NumberNode(4)
)
)

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

Для твоей задачи самым простым будет метод "рекурсивного спуска". На вход алгоритм получает "поток токенов", на выходе выдает объект-корень дерева выражения (AST). С деревом потом можно делать что угодно.

Мы представляем поток токенов в виде некоей сущности tokens (это может быть объект, итератор, и тд), которая поддерживает по сути 2 операции: "подглядеть" текущий токен (peek) и "поглотить" (consume) текущий токен с переходом к следующему. Таким образом, парсер читает последовательность токенов за один проход и никогда не "отступает" назад. Это позволяет нам подсоединить выход лексера так, что мы не накапливаем массив токенов, а сразу же разбираем их по мере получения. Вот пример потока токенов, представленного в виде класса:

class TokenStream
{
// Возвращает текущий токен либо null, если они закончились
public function peek(): ?Token { ... }

// Берет токен, проверяет, что он указанного типа, возвращает его
// и переходит к следующему токену
public function consume($type = null): Token { ... }
}

Для начала, мы записываем "грамматику", то есть полный набор правил, по которым разбираются выражения, начиная с верхнего уровня. Я использую синтаксис ABNF ( https://en.wikipedia.org/wiki/Augmented_Backus%E2%80%93Naur_form , советую почитать также про BNF и EBNF):

-------

; Правила записываются в виде "конструкция = определение"
; Например, ниже "операнд" может быть одной из перечисленных ниже конструкций
; Знак / обозначает "или"
; ЧИСЛО - это один токен, который далее не делится на части (терминал)
; строки в кавычках вроде "(" обозначают соответствующие символы (скобку)
операнд = ЧИСЛО / "(" выражение ")" / унарный-минус / унарный-плюс

унарный-минус = "-" операнд
унарный-плюс = "+" операнд

; * значит, что выражение в скобках повторяется сколько угодно раз, включая ноль,
; то есть конструкция "степень" может содержать много операндов и знаков ^,
; а может состоять из одного операнда без знака ^
степень-или-операнд = операнд *( "^" операнд )

; произведение - это набор конструкций "степень", разделенный
; знаками деления и умножения
произведение = степень-или-операнд *( ( "*" / "/" ) степень-или-операнд )
сумма = произведение *( ( "+" / "-" ) произведение )

выражение = сумма

-------

Читать правила удобнее снизу вверх (а писать - наоборот).

Эти правила по сути задают алгоритм разбора той или иной конструкции. Ну например, правило 'операнд = ЧИСЛО / "(" выражение ")" / унарный-минус / унарный-плюс' значит следующее:

Когда мы хотим разобрать конструкцию "операнд", мы должны:

- проверить, является ли токен ЧИСЛОм ? Если да - создаем из него узел и разбор закончен
- является ли первый токен скобкой? Если да, поглощаем его, затем вызываем правило разбора "выражение", затем поглощаем закрывающую скобку
- является ли первый токен минусом? Если да, разбираем конструкцию "унарный-минус"
- является ли первый токен плюсом? Если да, разбираем конструкцию "унарный-плюс"
- иначе, выдаем синтаксическую ошибку

Правило 'сумма = произведение *( ( "+" / "-" ) произведение )' надо читать так:

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

Эти правила можно записать и по-другому. Например, "степень-или-операнд" можно сформулировать так:

; правоассоциативное выражение
степень-или-операнд = операнд "^" степень-или-операнд / операнд

; левоассоциативное
произведение = степень-или-операнд ( "*" / "/" ) произведение / степень-или-операнд

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

function parseSomething(tokens): [Node, tokens]

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

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

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

parseOperand
parseUnaryMinus
parseUnaryPlus
parsePower
parseMultiplication
parseSum = parseExpression

Опишу для примера алгоритм функции parseOperand(tokens):

- если текущий токен == ЧИСЛО, то создаем узел типа NumberNode и возвращаем его
- иначе, если текущий токен = "(", то поглощаем его, вызываем parseExpression и поглощам идущий далее токен ")". И возвращаем получившийся узел.
- если текущий токен - знак минус, то, вызываем parseUnaryMinus и возвращаем результат
- если текущий токен - знак плюс, то вызвыаем parseUnaryPlus и возвращаем результат
- сигнализируем об ошибке

Пример:

class Parser
{
...
function parseOperand(TokenStream $tokens)
{
$token = $tokens->peek();

if ($token->type == Token::TYPE_NUMBER) {
$tokens->consume();
return [new NumberNode($token), $tokens];
}

if ($token->value == "(") {
$tokens->consume("(");
list($node, $tokens) = $this->parseExpression($tokens);
$tokens->consume(")");
return [$node, $tokens];
}

if ($token->value == "-") {
return $this->parseUnaryExpression($tokens);
}

if ($this->value == "+") {
return $this->parseUnaryExpression($tokens);
}

$this->throwExpectedError("expected NUMBER, (, +, or -");
}


Мои правила предполагают, что узел может содержать не 2, а более детей. То есть для выражения "2 + 4 - 3" я создаю один узел SumNode с 3 детьми: 2, 4 и 3. Но это можно поменять и на узлы с 2 детьми, это не принципиально.

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

Если хочешь усложнить задачу, попробуй добавить в выражение: дроби (1/3), функции (sin(x)). Также, можешь попробовать сделать парсер какого-нибудь языка программирования, например, урезанной версии PHP, поддерживающей переменные, функции, конструкции if и for. Начать можешь с описания грамматики.

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

Потому для таких случаев придуманы генераторы парсеров. Довольно известный - ANTLR ( https://github.com/antlr/antlr4 ), он написан на Яве, но умеет генерировать парсеры на разных языках программирования. Для него, например, есть куча грамматик разных языков: https://github.com/antlr/grammars-v4.

Также, есть написанный на PHP PEG: https://github.com/hafriedlander/php-peg

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


Ответы: >>1135131 >>1135133
Аноним 2018/02/09 02:33:02  №1135131 6
>>1135122
спасибо! это как раз то, что нужно

еще вопрос: я правильно понимаю, что в QueryBuilder доктриновский (а именно в его метод where()) просто так не всунешь условие селекта типа '((ID = 10) OR (NAME = 'VASYA' AND ID < 5))' ну то есть которое в обычный sql бы переварил?
и для этого там есть всякие методы типа expr()?
Аноним 2018/02/09 02:49:38  №1135133 7
>>1135122
возможно ли вообще в некий свой метод типа filterNews('where ((id > 5 or (name = ... ))') в качестве аргумента подать подобное условие и на выходе каким-то образом получить queryBuilder, который подставляя свои методы-хелперы такую логику реализует? или лучше использовать доктриновский query() для таких целей?
Ответы: >>1137291
Аноним 2018/02/09 03:14:23  №1135138 8
Ответы: >>1135481
Аноним 2018/02/09 03:57:37  №1135141 9
15181378574360.jpg (15, 310x280)
280x310
>>1135053 (OP)
Великовозрастный долбоёб и php с pdo;

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

Как правильно упаковать запись в таблицу с помощью pdo? Есть два файла: index.php, pdo.php. В индексе, в шапке, инклуд файла pdo.php, и сама форма с кнопкой. В файле pdo.php - простой коннект к бд. Пишу корявый prepare вместе с bindParam (допустим без массива, а данные с поля - попадают в переменную) - нихуя не происходит. В то время как форма по загрузке файла, с добавлением в бд инфы по нему - рабочие. Что за магия?

try {
$dbh = new PDO('mysql:host = localhost;dbname = $dbname', $user, $pass, array(PDO::ATTR_PERSISTENT => false));
// само подключение

$addUsr = $dbh->prepare("INSERT INTO user (group, name, pass, salt, email) VALUES (:group, :name, :passwd, :salt, :email)");
$addUsr->bindParam(':group', $group);
$addUsr->bindParam(':name', $usrName);
$addUsr->bindParam(':passwd', $salted);
$addUsr->bindParam(':salt', $salt);
$addUsr->bindParam(':email', $email);
// подготовленное выражение

} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
// закрываем трай

Допустим на подобном ублюдском примере с "значение поля = переменная". После условия формы, в индексе, стоит $addUsr->execute();

Ну и вариант "красивой" передачи, пожалуйста. Пробовал, кстати, $dbh->exec в начале скрипта, с болванистыми данными, которые должны забиваться при отработке скрипта, но ему похуй. В бд ничего не появляется. Как так, ёбаный в рот? Вопрошал в факе, но там всем настолько похуй, что нихуя вообще не написали.
Ответы: >>1135464 >>1137291
Аноним 2018/02/09 13:11:03  №1135297 10
подскажите, кто шарит.
есть доктрина и симфони. есть некие входные данные (прилетают по апи), в которых лежит sql-условие where типа "(name='ABC' AND (category1 = 'X' OR category2 = 'X' OR category3 = 'X')
AND price > 10)" в виде строки. оно всегда валидное, т.к. проверяется до попадания и может быть очень сложным с большим уровнем вложенности. задача - отдать выборку по нему.

оно всегда относится к выборке одной и той же сущности. как это условие скормить доктрине?
Ответы: >>1135368
Аноним 2018/02/09 14:47:14  №1135368 11
Ответы: >>1135489
Аноним 2018/02/09 14:54:23  №1135377 12
Вопрос: делал приложение на Symfony c Doctrine, понял, что зря создавал отдельные сущности, так как в будущем их слишком много может быть и не понятно, как потом поддерживать. Сейчас думаю сделать все же одну сущность Product, одну Appearance и одну Variant, ну и Category общую тоже. Однако не понял, как хранить разные характеристики, ну есть, конечно, json, ну как по нему условия, читай фильтры в каталоге, делать. Сейчас у меня есть <select> и в нем все размеры кроватей, все размеры матрасов, где надо, чекбоксы всякие и так далее. Какой есть современный удобный подход. Может, тут даже и Doctrine не нужна.
Ответы: >>1135380 >>1135389 >>1137291
Аноним 2018/02/09 14:56:33  №1135380 13
>>1135377
EAV вроде как уродство и все значения в строках. Как вообще делаются современные интернет-магазины/витрины, не особо крупные, например
Аноним 2018/02/09 15:14:28  №1135389 14
>>1135377
смотрю в сторону NoSQL
Ответы: >>1137292
Аноним 2018/02/09 17:16:10  №1135464 15
>>1135141
Какие у тебя ошибки появляются?
Ответы: >>1135467
Аноним 2018/02/09 17:24:36  №1135467 16
>>1135464
А вот никаких. Данные в переменные передаются, проверял. Оно просто не пишет в базу. Я хуй знает чому. Скрипт отрабатывает и... пусто. Попробую ещё параноидальный режим ошибок ебануть, чтоб на каждый пёрд выводилось, посмотрю. поле id имеется, оно автоинкрементируемое, его, я так понял, в запросе можно не указывать - оно само ложится. По крайней мере то что мне файл в бд кладёт - так и делает
Ответы: >>1135482
https://github.com/moabit/student-list/ Аноним 2018/02/09 17:51:29  №1135481 17
>>1135138
>>1131535

По тестам. Их лучше вынести в отдельную папку (например, /tests), и классы в отдельный неймспейс, чтобы отделить продакшен-код от тестов. Написать для них отдельное правило автозагрузки в autoload-dev, чтобы оно не применялось на продакшене.

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

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

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

На мой взгляд, тут разве что третий вариант подходит. В фреймворках вроде Симфони контроллеры лучше поддаются тестированию: там используются объекты Request (вместо $_GET, POST) и Response (вместо вывода страницы напрямую), и там мы можем создать Request, вызвать контроллер и проверить Response. У тебя, к сожалению, это невозможно и контроллер можно тестировать только через end-to-end тесты.

Вдобавок, у тебя в тесте ошибка: REQUEST_URI почти всегда начинается со слеша (еще я видел вариант, когда он начинается с вопроса), а не с букв.

По https://github.com/moabit/student-list/blob/master/app/Tests/UtilTest.php

Для readJson() можно было добавить еще позитивный сценарий: чтение файла с правильным путем и извлечение из него какой-то строчки. Файл можно положить в папку вроде assets, resources или создать перед тестом во временной папке (наверно, не стоит).

Далее, если мы посмотрим на testCheckCSRFToken(), то видим, что тут явно не очень удобный для тестирования код. Он не принимает входные параметры явно, а берет их из каких-то глобальных переменных. Тестировать код, который работает с объектами вроде Request было бы конечно удобнее.

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

- вызвать setCSRFToken() и записать выставленные им куки (это было бы удобно делать, если бы он не работал с setcookie(), а записывал бы куки в объект Response), сохранить возвращенный токен
- сформировать объект Request с запросом от формы, подставить туда полученный токен и выданные куки
- вызвать проверку

Но это требует добавления Request/Response. Еще один вариант - использовать end-to-end тест - сделать тестовую страницу с формой и защитой от CSRF, поднять временный веб-сервер, зайти на страницу, заполнить форму, отправить, проверить ответ. Опять же, требует значительных усилий.

Но зато оба этих варианта могут дать более надежные тесты.

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

- если дан токен в POST и кука, то проверка проходит
- если дан токен и кука, но они не совпадают, проверка не проходит
- если токен в POST пустой, проверка не проходит
- если куки нет, проверка не проходит

На каждое требование можно написать свой метод: testCheckSuccessWIthCookieAndToken, testCheckFailsWithInvalidToken, checkTestFailsWithMissingToken, итд. Для надежности, сам токен можно генерировать с помощью setCSRFToken, чтобы он был гарантированно правильный. Это потребует немного больше писанины, но зато:

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

То же можно сказать и про тест валидатора. Можно было бы тестировать каждую проверку в отдельности (testInvalidEmailFails, testInvalidNameFails и тд). Также, если бы у тебя валидатор не был заточен только на проверку студентво, а был бы разбит на компоненты (отдельно метод или класс проверки email, отдельно имени), то их тоже можно было бы тестировать по отдельности.

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

Также, в тесте testStudentValidation() у тебя есть одно слабое место - там ведь есть проверка уникальности email, и если в БД есть email rabinovich@gmail.com, то она может провалиться. Можно наверно этим пренебречь, а можно попробовать придумать email, которого в базе точно не может быть. Тем более, что этот же email используется в тесте вставки студента.

https://github.com/moabit/student-list/blob/master/app/Tests/StudentDataGatewayTest.php#L30
> public function testCountStudents()
> {
> $this->assertNotFalse($this->studentDataGateway->countStudents());
Этот тест полагается на то, что в тестовой базе есть хотя бы один студент. Можно избавить его от этой проблемы, например, добавив студента в тесте и проверив, что количество увеличилось на один.

> public function testGetStudentsWithWrongField()
> {
> $this->expectException(\PDOException::class);
> $this->studentDataGateway->getStudents('wrongOrderField', 'asc', 15, 0);
Этот тест полагается на знание внутреннего устройства StudentGateway. Что, если ым там поменяем PDO на mysqli? Решить это можно, сделав специальный класс исключений на такой случай или взяв одно из SPL исключений: http://php.net/manual/ru/spl.exceptions.php

В README:
> To add more students uncomment addStudents function in index.php file
лучше написать про вызов cli-скрипта

> echo "Please enter a number of students you want to add to the database:\n";
> $input=intval(fgets(STDIN));
В CLI-скриптах обычно параметры передают как аргументы командной строки, то есть пишут

php addStudents.php 10

Почитай про $argv, $argc и getopt:

- http://php.net/manual/ru/features.commandline.usage.php
- http://php.net/manual/ru/reserved.variables.argv.php
- http://php.net/manual/ru/reserved.variables.argc.php
- http://php.net/manual/ru/function.getopt.php

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

Также, ты в cli скрипте почему-то не подключил ErrorHandler.

https://github.com/moabit/student-list/blob/master/app/Controllers/ProfileController.php#L90
> ucfirst
Эта функция не поддерживает кириллицу в utf-8: https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md

Плюс, ты не делаешь проверку, что в POST есть нужный элемент. Лучше писать $_POST['name'] ?? ''.

https://github.com/moabit/student-list/blob/master/app/Entities/Student.php
тут не помешали бы тайп хинты.

https://github.com/moabit/student-list/blob/master/app/Helpers/Authorisation.php
Вот этот класс обладает состоянием. Было бы логичнее в контейнере пометить его ,чтобы при каждом обращении создавался бы новый экземпляр. А иначе, представь что ты попробуешь обработать 2 запроса подряд: обработчик первого запроса поменяет состояние объекта и это может повлиять на обработку заипроса от второго пользователя.

Также, метод getStudent возвращает объект студента, но signIn() принимает токен, а не студента. Было бы лучше и тут сделать аргументом студента и таким образом скрыть подробности авторизации (какие поля используются) внутри класса. Это позволит нам менять алгоритм авторизации, не трогая остальной код.

https://github.com/moabit/student-list/blob/master/views/templates/profileForm.twig#L22
> {% if user.gender is defined and user.gender =="f" %}
лучше сделать, чтобы user всегда бы передавался в шаблон. Если это так, то is defined можно убирать.

Класс pager назван не очень удачно, он же не только за пагинацию отвечает. Лучше назвать его ViewParams, TableParams или TableFilter. И тогда можно добавить туда методы вроде isSearchActive() вместо {% if pager.search is not null %}.
Аноним 2018/02/09 17:53:01  №1135482 18
>>1135467

PDO по умолчанию никак не сообщает об ошибках. Включи в PDO ERRMODE_EXCEPTION и увидишь подробности ошибки.

http://php.net/manual/ru/pdo.error-handling.php

Также, если какая-то функция может вернуть false или другой признак ошибки, ты обязан его проверять.
Ответы: >>1135720
Аноним 2018/02/09 18:02:10  №1135489 19
>>1135368
cпасибо, анон. я жестко тупанул
Аноним 2018/02/09 18:32:00  №1135505 20
Ребятки, есть вопрос по Доктрине!

Дано две таблицы mysql, их условная структура:

orders(
id,
created,
... // всякие обычные неинтересные поля
)

orders_properties(
id,
order_id,
param enum('height', 'weight', 'length', 'color'),
value varchar(100)
)

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

Как из этого сделать сущность Доктрины?

Типа такой:
class Order
{
private $id;
private $created;
private $height;
private $weight;
private $length;
private $color;
...
}

Чтобы оно обновлялось само и значения брались из orders_properties либо были пустыми, если там нужных нет.

Те способы, которые я нашел (например, http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/mysql-enums.html) мою проблему, увы, не решают.
Ответы: >>1135541
Аноним 2018/02/09 19:50:05  №1135541 21
>>1135505

Сущности Доктрины должны довольно-таки близко соответствовать таблицам. Но это касается только полей. Методы ты можешь делать любые.

Соответственно, ты можешь сделать метод Order#getWeight(), а он будет искать вес в связанных с Order свойствах OrderProperty.

Многие задачи решаются именно через методы. Ну например, ты можешь сделать поле неизменяемым, убрав метод setX().
Ответы: >>1135546 >>1135578 >>1135580
Аноним 2018/02/09 20:15:08  №1135546 22
>>1135541
То есть не делать такие поля вообще?
А как тогда задавать условия поиска по этим полям в QueryBuilder?
Ответы: >>1137292
Аноним 2018/02/09 21:23:57  №1135578 23
>>1135541
Пошел по твоему пути (но не совсем), сделал так:

В классе сущности написал
private $weight;

public function getWeight(OrderRepository $repo)
{
return $repo->findWeightByOrder($this->getId());
}

Затем в классе репозитория:
public function findWeightByOrder(int $id)
{
$conn = $this->getEntityManager()->getConnection();
$sql = 'SELECT o.value FROM orders_properties o WHERE o.param = \'weight\' AND o.order_id = :id';
$stmt = $conn->prepare($sql);
$stmt->execute(['id' => $id]);
return $stmt->fetch();
}

Плюс тут в том, что не надо заморачиваться с привязкой поля типа ENUM к сущности, т.к. он по дефолту в Доктрине не поддерживается (хотя если бы это была единственная заморочка, было бы заебись), но у меня есть ощущение, что это пиздец костыли и можно как-то намного лучше и изящнее.
Ответы: >>1137292
Аноним 2018/02/09 21:29:56  №1135580 24
>>1135541
То есть, мне кажется, не должно быть такого, чтобы Entity обращался к Repository. По идее должно быть Controller > Repository > Entity
Аноним 2018/02/09 23:47:24  №1135658 25
Короче целый день проебался с этой Доктриной и понял, что там невозможно вменяемым путем объединить две таблицы в одну сущность. Печально, что для такой хуйни придется делать сущность с названием OrderProperties
Ответы: >>1137292
Аноним 2018/02/10 02:45:56  №1135720 26
15182199564330.jpg (11, 228x200)
200x228
>>1135482
Да, я помню что в ПЕДЕО надо отдельно включать обработку ошибок. В общем че я выяснил:

- каким-то хуем я указал путь до файла с подключением в относительном виде "./pdo.php", вместо просто "pdo.php" - начало мне ошибки выводить;
- ошибка такая:
> Warning: PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near

По гуглению понял, что из формы данные по POST не экранируются и получается пиздос. Но я сонный и нихуя не понял. Данный из формы жкранировать отдельно? Форма загрузки файла не предполагает введённые данные, а только путь до файла.

алсо, как, всё-таки, более правильно формочки такие ебенить? По минимуму и аккуратно. В массив всё подбивать?
Ответы: >>1137293
Аноним 2018/02/10 09:06:35  №1135741 27
Господа, почему нельзя в дочернем классе присвоить значения родительским(унаследованным) параметрам?

Делаю вот такую штуку

abstract class A
{
protected $var;
}

class B extends A
{
$this->var = '2ch';
}

И шторм начинает светить мол unexpected assign, и пiзда.
Но та же хуйня через метод работает. Как без метода то переназначить?
Ответы: >>1135993 >>1137293
Аноним 2018/02/10 12:24:00  №1135813 28
Чем лучше слить содержимое чьего-то твиттера и сделать из него новости на своем сайте? Guzzle? Twitter Api client? Может есть какой-то бандл для Symfony?
Ответы: >>1136958 >>1137223
Аноним 2018/02/10 13:00:17  №1135827 29
Хочу вкатиться в symphony, стоит сразу переходить в 4 версию?
Посоветуйте годный курс, можно платный. Пока только нашел на английском https://knpuniversity.com
Ответы: >>1135836 >>1135864
Аноним 2018/02/10 13:12:44  №1135836 30
>>1135827
в симфони без английского делать вообще нечего. если хочешь на русском, иди битрикс учи.

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

кстати на knpuniversity платно только видео, а оно везде дублируется бесплатным текстом, даже где видео само по себе скрыто. то есть, тебе бесплатно доступны ЛЮБЫЕ уроки. я думаю, там люди платят, чтобы поддержать проект (другая ментальность мол).

стоит сразу на 4, конечно.
Аноним 2018/02/10 14:01:08  №1135864 31
>>1135827
алсо, все эти материалы (особенно мануал) знать нужно, но они достаточно базовые. самый лучший курс - это взять на хх.ру какое-нибудь тестовое задание на симфони мидла-удаленщика и попробовать его решить в срок.
Аноним 2018/02/10 17:00:13  №1135993 32
>>1135741
потому что надо сначала ее переопределить. иначе это динамически объявленная переменная, что считается плохой практикой из-за своей неявности
Аноним 2018/02/10 17:27:57  №1136012 33
Аноны, я вкатываюсь, но у меня видимо какой-то стандартный вопрос.
Вот я написал скрипт на пхп, который перебирает 100 миллионов значений (допустим, там только массив и цикл перебора, ничего более) и тратит на это 1 минуту. В течении этой минуты я хочу запустить другой скрипт с этого же домена (допустим test.localhost), но второй скрипт не запускается до тех пор, пока не отработает первый, перебирающий значения. Из-за чего это? Сессий внутри скрита нет, но второй всегда ждет выполнения первого? Какова "природа" этого явления и как по возможности это обойти?
Ответы: >>1136015
Аноним 2018/02/10 17:38:53  №1136015 34
>>1136012
cli-cкрипт? если да, то тебе нужно запускать его со значком &, чтобы запустить в бэкграунде. либо открыть новую вкладку с консолью.
Ответы: >>1136017
Аноним 2018/02/10 17:45:55  №1136017 35
>>1136015
>cli-cкрипт?
Нет, скрипт я запускаю через сервер, например так:
запускаю test.localhost/1.php и он выполняется минуту, параллельно в другой вкладке я запускаю test.localhost/2.php и он не "отрабатывает" до тех пор, пока первый не завершит работу.
Ответы: >>1136023 >>1136025 >>1136085
Аноним 2018/02/10 17:59:14  №1136023 36
>>1136017
> я запускаю через сервер
Через какой сервер?
Кто запускает твой php скрипт? Кто принимает запрос? апач, нгникс?
Ответы: >>1136025
Аноним 2018/02/10 18:02:35  №1136025 37
>>1136023
Апач.
Я запускаю скрипты через браузер, ну а дальше, как тут: >>1136017
Ответы: >>1136027 >>1136032
Аноним 2018/02/10 18:04:43  №1136027 38
>>1136025
Как именно ты понимаешь, что ждет завершение первого скрипта? Работаешь ли ты с какими-то файлами в этих скриптах? Что в процессах у тебя в этот момент происходит? Сколько процессов php висит\запускается?
Ответы: >>1136037
Аноним 2018/02/10 18:08:05  №1136032 39
>>1136025
Уверен, что браузер не использует тот же коннект к серверу? Попробуй, запустить второй скрипт в другом браузере параллельно. Или вовсе вызвать через какой-нибудь wget
Ответы: >>1136037
Аноним 2018/02/10 18:12:44  №1136037 40
>>1136027
>Как именно ты понимаешь, что ждет завершение первого скрипта?
Да я же на тестовом серве делаю на тестовых скриптах. Запускаю первый скрипт, он выполняется, вертится "загрузка" на вкладке. Параллельно запускаю второй скрипт во второй вкладке, в нем одна строка "echo 1", но он выполняется и выводит "1" только после того, как первый скрипт закончит перебирать массивы отработает. Если я запускаю второй отдельно (то есть, первый на этот момент не запущен), то он сразу мне выдает в браузер"1", выполняется он меньше секунды. Короче, я делаю вывод, что он ждет выполнение первого.
>Работаешь ли ты с какими-то файлами в этих скриптах?
Нет, там просто огромный цикл, который перебирает миллионные массивы несколько раз, он вообще выполняется дольше минуты (почти 2).
>>1136032
Если запускаю в другом браузере - то он выполняется сразу, то есть, второй скрипт не ждет выполнение первого.
Ответы: >>1136049
Аноним 2018/02/10 18:22:28  №1136049 41
>>1136037
>Если запускаю в другом браузере - то он выполняется сразу, то есть, второй скрипт не ждет выполнение первого.
Поясняю. Причины может быть две.
Одна - браузер использует одно и тоже соединение до сервера, а так как ты не написал\не заточил сервер для такого юзкейса, то он ждет, и поэтому все тсопорится. Гугли http 1.1вот это все.

Вторая - браузер может использовать для рендеринга вкладок на одном домене один и тот же процесс с целью оптимизации, в заивисмости от браузера и его настроек. Поэтому у тебя просто стопарится рендеринг, пока не будут получены результаты от первого.
Ответы: >>1136051 >>1137293
Аноним 2018/02/10 18:25:36  №1136051 42
>>1136049
А какая причина наиболее вероятная? Мне кажется, что первая. И где можно поподробнее почитать про это? Или если нагуглю http 1.1 - то понимание придет?
Ответы: >>1136052
Аноним 2018/02/10 18:27:53  №1136052 43
>>1136051
>И где можно поподробнее почитать про это?
Начинай отсюда https://ru.wikipedia.org/wiki/Постоянное_HTTP-соединение

>А какая причина наиболее вероятная?
Замени во втором скрипте echo на file_put_cintents в какой-нибудь файл. И смотри, если файл появился сразу, до завершения первого скрипта, значит дело в рендеринг. Если после, значит в запросах.
Ответы: >>1136053
Аноним 2018/02/10 18:29:09  №1136053 44
>>1136052
Окей, спасибо большое!
Аноним 2018/02/10 19:09:36  №1136085 45
>>1136017

Если ты используешь сессии, то они блокируются: https://habrahabr.ru/company/bitrix/blog/179803/

Нефиг их везде использовать.

Также, длительные скрипты надо запускать через командную строку.
Ответы: >>1136099
Аноним 2018/02/10 19:29:52  №1136099 46
>>1136085
Он же написал, что неиспользует сессии. И ко всему прочему, мы выяснили, что при одновременном запросе из разных браузеров, все отрабатывает нормально. Так что дело либо в общей песочнице webview, либо в кип-аливе.
Ответы: >>1136211
Аноним 2018/02/10 21:46:32  №1136207 47
пацаны, а что это за такой архитектурный ход, когда ты mysql-таблицу делаешь таким образом
attributes(param enum('param1','param2','param3'), value varchar)

зачем так делать? какая выгода? как связывать такие сущности с другими в контексте ОРМ?
Ответы: >>1136361 >>1137293
Аноним 2018/02/10 21:49:26  №1136211 48
>>1136099

В браузере есть ограничение на число параллельных коннектов к серверу, но оно в районе 6-8. Правда, там еще есть HTTP/2, у которого все как-то по другому.

> либо в кип-аливе.
вряд ли

> в общей песочнице webview
Какой песочнице?
Аноним 2018/02/10 21:51:41  №1136214 49
>>1135048
>Также, открою секрет за 1 евро в мес. можно у арубы арендовать.
Благодарю, так и сделал. Единственное что мне не понравилось у арубы - это плохой дизайн. Я ожидал выбор датацентра в процессе создания, а оказалось (потом), что выбор был вкладками в личном кабинете. Поднял OpenVPN - всё отлично, пинг правда 200 (Италия по умолчанию, хотел Германию).

Такой вопрос, ОП у тебя нет статей по настройке рабочего окружения через системы виртуализации?
Ответы: >>1136224 >>1136225
Аноним 2018/02/10 21:59:22  №1136224 50
>>1136214

Наверно нет. Это вопрос про vagrant/docker? Там нужно просто знание линукса и bash.
Ответы: >>1136317
Аноним 2018/02/10 22:00:06  №1136225 51
>>1136214

То есть прочесть любой учебник по линуксу, команды, оболочка, файлы, права, сервисы и тд.
Ответы: >>1136317
Аноним 2018/02/10 23:54:19  №1136317 52
>>1136224
>>1136225
Меня не сами юникс-системы интересуют, скорее процесс развертывания проектов на докере и для чего он.
Я работаю на win10, на vbox у меня ubuntu17.04, в /var/www я примаунтил проекты. Удобно,
так как IDE работает с локальными файлами, а сам проект поднят на апаче убунту.
Встречал в интернете упоминания о том, что на докере/вагранте разворачивают себе рабочее окружение и мне стало интересно насколько это будет удобнее (и будет ли)
Ответы: >>1137299 >>1137309
Аноним 2018/02/11 00:04:29  №1136321 53
Аноны, изучаю laravel и не понимаю некоторые моменты в маршрутизации.
Сайт состоит из разных статей и их разделов. Например, при переходе к статьям articles_IT, в раздел PHP выводятся данные из таблицы БД - articles_it, где в записи указана секция PHP. И в итоге есть 4 вида статей articles_X, в которых разное количество их секций. Главное, что в итоге модель узнает, что это за статьи и их секции, и в итоге выполняет необходимое действие исходя из этих данных. Меняется по факту только один лишь запрос к БД.
Сейчас написал действие только для главной страницы, в роутах вызывается метод контроллера:
Route::get('/', 'MainController@showArticle');
Этот метод возвращает вид, с данными из модели Article:
return view('index', ['article'=> Article::loadArticle()]);
В модели формируется одна запись из рандомных статей, рандомной секции.
Так как передать модели вид статей и их секцию исходя из запроса, как правильно описать в этом случае роут? Посмотрел в документации, дошёл до параметров роутов, но плохо понимаю, как их применять.
Ответы: >>1137300
Аноним 2018/02/11 00:54:57  №1136355 54
Анон, как можно в конце лучше сделать? Ну т.е. чем можно заменить повторное написание удаление последнего массива?

<?
$x= __DIR__;
$y= explode( '/', $x);
array_pop($y);
array_pop($y);
var_dump($y);
?>

Типа (array_pop($y)) * 2 ;
Ответы: >>1136360
Аноним 2018/02/11 01:12:12  №1136360 55
Ответы: >>1136362
Аноним 2018/02/11 01:13:22  №1136361 56
>>1136207
выгода -- удобная запись в одну строку, всё

вопрос по контексту ORM неясен.
Ответы: >>1136373 >>1136375
Аноним 2018/02/11 01:14:25  №1136362 57
Аноним 2018/02/11 01:33:14  №1136373 58
>>1136361
запись в одну строку - это что имеется в виду? я не очень понял.

>вопрос по контексту ORM неясен.
если у нас есть доп.таблица user_attributes(age, sex)
то мы сущности User (которая лежит в таблице users) можем задать поле $sex, которое по связи OneToOne будет ссылать на столбец sex из таблицы с аттрибутами.

а если у таблицы структура users_attributes(param enum('age','sex'), value), то мы так сделать уже не можем.

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

короче я не понимаю, в чем плюсы. может, это во времена динозавров так делали
Ответы: >>1137038 >>1137300
Аноним 2018/02/11 01:40:00  №1136375 59
>>1136361
а еще тебя ждет огромное веселье, если нужно в одном запросе сделать where по произвольному количеству этих param. попробуй напиши автоматизацию where с подготовленными запросами. чтобы на вход подавать условие типа 'age = m AND age >= 18' а на выходе получать соответствующие сущности.
Ответы: >>1136376 >>1137038
Аноним 2018/02/11 01:40:47  №1136376 60
Аноним 2018/02/11 02:59:55  №1136406 61
>Используй математику. Есть 2 функции для разделения чисел на части, $x % 1000 - берет 3 последние цифры, floor($x / 1000) - отбрасывает 3 последние цифры.

А если я не знаю, что там за число?
Допустим, я подобрал для сотен тысяч форму слова, отбросив по три цифры с концов, а на деле число оказалось миллиардом. Остальные шесть цифр не переведутся же.
Или нужно делать сперва проверку, не будет ли делимое меньше делителя?
Ответы: >>1137301
Аноним 2018/02/11 17:07:38  №1136720 62
как с помощью Symfony ExpressionLanguage превратить такую строку '((ID >= 10) OR (Gravatar = true))' во что-то типа:

$result[0] = $this->repo->findByWhereCondition('u.id >= 1000'); // дернулись из репозитория 10, 11, 12
$result[1] = $this->repo->findByGravatarCondition('equals', 'true'); // дернулись по АПИ 7, 11
$result[2] = $this->repo->findByLogicCondition('OR', [$result[0], [$result[1]]) // отдал 7, 10, 11, 12

?
Ответы: >>1136722 >>1136741 >>1137301
Аноним 2018/02/11 17:08:21  №1136722 63
>>1136720
>findByWhereCondition('u.id >= 10');
быстрофикс
Аноним 2018/02/11 17:52:37  №1136741 64
>>1136720

Изучи Query Builder. Symfony Expression может превратить строку в AST (дерево выражения). Ты должен обойти это дерево и составить соответствующее ему условие для Query Builder:

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/query-builder.html

Обрати внимание на выражение

$qb->expr()->orX(
$qb->expr()->eq('u.id', '?1'),
$qb->expr()->like('u.nickname', '?2')
)

Тебе надо что-то похожее составить на основе AST.
Ответы: >>1136794 >>1136958
Аноним 2018/02/11 17:57:13  №1136744 65
Планирую по работе не айти создать приложение для расчётов. Выбрал js, небольшой опыт имеется. Так вот, есть несколько вопросов:
1. Можно ли расчёты будет сохранять в каком-нибудь формате прямо из браузера, а потом их туда загружать?
2. В чем сейчас актуально рисовать? Канвас или уже что-то лучше и новее есть? Может существуют библиотеки для построения простых чертежей/эскизов в браузере?
3. Не ошибся ли я с выбором джс? Сейчас считаем в экселе.
Ответы: >>1136816 >>1136840
Аноним 2018/02/11 18:54:23  №1136794 66
Аноним 2018/02/11 19:14:52  №1136816 67
>>1136744
1.Local storage
2.SVG
3.Ошибся
Ответы: >>1136831 >>1136836
Аноним 2018/02/11 19:26:47  №1136831 68
>>1136816
>1.Local storage
У него есть лимит.
Ничто не мешает загружать файлы с пеки, работать с ними и потом сохранять на пеку.
Аноним 2018/02/11 19:30:16  №1136836 69
>>1136816
>Ошибся
Ну так на чем писать?
Аноним 2018/02/11 19:33:18  №1136840 70
>>1136744

Если тебе надо работать с чертежами, может тебе лучше писать скрипты для какого-то CAD приложения? Ну там автокад, компас, или какой-нибудь из открытых CAD ( https://opensource.com/alternatives/autocad )?

А так, трудно прокомментировать, не зная задачу. Сам по себе JS неплохой, и к нему много библиотек есть.
Ответы: >>1136855
Аноним 2018/02/11 19:46:43  №1136855 71
>>1136840
Это была бы хорошая идея, если бы потом за программой не должно было бы сидеть пол офиса дамочек. И каждой ставить автокад, хехмда. Я там один его знаю, мне нужно чтобы канвас или что-то подобное само отрисовывало картинку на основе 3.5 введённых данных, чтобы дамочки могли распечатать и сохранить на будущее. Эксель норм, но там нельзя адаптивно рисовать. Плюс нужно расширить функционал, и я подумал, что сделать уже нужно нормально.
Ответы: >>1136894
Аноним 2018/02/11 19:57:25  №1136874 72
сап аноны, у меня такой вопрос, можно ли создать регулярку типа как 0-9 или а-яё, только чтоб она искала символы? В самом гайде я видел про поиск только одного символа
Ответы: >>1137301
Аноним 2018/02/11 20:17:08  №1136894 73
>>1136855
С задачей идеально справитс php. Сам писал подобное. Данные в файле (а лучше в майскул базе), отрисовку делает пхп (вместе с расчётами), а отображение в браузере на хтмл+цсс+жс.
Ответы: >>1136902
Аноним 2018/02/11 20:23:26  №1136902 74
>>1136894
Пхп не считает на ходу, я должен сабмиты хуярить с формами или учить ту хуйню, забыл название. Джс удобнее 100% в этом случае.
Ответы: >>1137150
Аноним 2018/02/11 21:16:18  №1136958 75
>>1136741
анон, ты умный, можешь еще по >>1135813 подсказать? какие инструменты оптимально использовать для такой задачи?
Аноним 2018/02/11 22:37:36  №1137038 76
>>1136375
для меня это всё уже не сложно

>>1136373
>я не очень понял
ну что тут непонятного? краткость записи.
Ответы: >>1137079
Аноним 2018/02/11 22:55:53  №1137079 77
>>1137038

краткость записи чего? явно не селекта, если ты хочешь прописать алиас колонке из такой таблицы.

также если для тебя уже все несложно, расскажи как в доктрине запись из таблицы users_attributes с енамами, допустим 'param = age' указать в качестве поля $age сущности User(@ORM\Table(name="users"))
Ответы: >>1137083
Аноним 2018/02/11 22:58:50  №1137083 78
>>1137079
Мне конкртно сейчас лень, для меня это уже слишком мелочи. Мб на днях загляну в тред.
Ответы: >>1137108
Аноним 2018/02/11 23:12:38  №1137100 79
Yii2 или ждать Yii2.1?
Ответы: >>1137134 >>1137155
Аноним 2018/02/11 23:19:52  №1137108 80
>>1137083
лол. ну заглядывай.
Ответы: >>1137138
Аноним 2018/02/11 23:45:34  №1137134 81
>>1137100
для РАБотки Yii2

а для себя это вообще не нужно
Аноним 2018/02/11 23:48:59  №1137138 82
>>1137108
...ну на прощание: просто не заморачивайся и делай.
Ответы: >>1137146
Аноним 2018/02/12 00:02:41  №1137146 83
>>1137138
ага. как сердце подсказывает
Аноним 2018/02/12 00:23:14  №1137150 84
>>1136902
>Пхп не считает на ходу
Считает. Только отправлять нужно не через форму с перезагрузкой страницы, а аяксом. Это чуть сложнее, но не сильно.

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

JS, в принципе, тоже это может, но скорее всего будут подводные камни и тебе придётся осваивать не только кондовый жс, но и серверную ноду.
Ответы: >>1137154
Аноним 2018/02/12 00:30:40  №1137154 85
15183846409430.png (1679, 1000x814)
814x1000
>>1137150
Такой-то поток мысли...

Только не ajax, а sockets, с которыми шикарно работает РНР. И асинхронного РНР также полно, если вдруг ноде-дауны начнут кукарекать.

https://www.youtube.com/watch?v=i07m_TFR9no
Ответы: >>1137302
Аноним 2018/02/12 00:33:16  №1137155 86
>>1137100
для работы здесь и сейчас yii2, т.к. его используют только в легаси и динозавры-тимлиды, которым лень переучиваться. они не будут обновляться еще 10 лет.

а для будущего развития более современные и актуальные фреймворки.
Ответы: >>1137166
Аноним 2018/02/12 00:44:46  №1137166 87
>>1137155
>динозавры-тимлиды
любой убогий вкатывальщик пытается скомпрометировать реалии корпоративного сегмента, за что ему и гореть в аду нищеты.
Ответы: >>1137170 >>1137196
Аноним 2018/02/12 00:49:42  №1137170 88
15183857829290.jpg (161, 500x299)
299x500
>>1137166
проблема двощей в том, что долбоёбы-вкатывальщики 2010+ тут имеют какое-то анонимное мнение, хотчя из приличных контор их гонят ссаными тряпками, ха
Аноним 2018/02/12 01:13:49  №1137196 89
>>1137166
я с симфони работаю и мне заебись. через месяцок перекатимся на четверку, а ты дальше сиди и правь легаси. сказочки про жестокую реальность и проверенные технологии рассказывай на вебмастер.ру
Ответы: >>1137202
Аноним 2018/02/12 01:16:16  №1137202 90
>>1137196
Оставь свои фантазии себе. Что я делаю, никогда тут не заплалю, ты, ссаный неудачник.
Аноним 2018/02/12 01:35:44  №1137223 91
>>1135813
Умный анон не пришел, я в итоге дернул все с помощью Goutte и Symfony DomCrawler. Охуенно получилось.
Аноним 2018/02/12 03:22:25  №1137268 92
15183949454850.png (1355, 1191x799)
799x1191
Аноним 2018/02/12 06:22:51  №1137278 93
>>1132552

Задача про вклад.

> $investor = вкладчику;
Строку надо брать в кавычки.

А так, решено верно.

>>1133423

> Чем отличается инструкция error_reporting(-1) от error_reporting(E_ALL)?
В error_reporting передается число. Функция преобразует его в двоичную систему счисления (двочичные числа - это числа, состоящие только из цифр 0 и 1 вроде 001011001, подробнее http://www.reshinfo.com/dvoichnaya_systema.php ). В этом двоичном числе каждый разряд соответствует виду ошибок, и если он установлен в 0, то PHP игнорирует этот вид ошибок. А если в 1 - то не игнорирует и сообщает о них.

Вообще, мне очень не нравится сама эта идея, что можно игнорировать какие-то ошибки и мне кажется, это очень вредная опция. Но оставим мое мнение в стороне.

E_ALL - это константа, в которой для всех видов ошибок стоит единица (ее значение можно увидеть тут http://php.net/manual/ru/errorfunc.constants.php ). -1 в двоичной форме выглядит как число из всех единиц (то есть единицы стоят даже там, где это не требуется). Зачем писать -1 вместо E_ALL? В старых версиях PHP была такая проблема, что E_ALL раньше не включала в себя определенный вид ошибок (E_STRICT), несмотря на название. Потому люди начали писать -1, чтобы гарантированно все ошибки и предупреждения были включены.

Сейчас конечно писать -1 нет никакого смысла и можно просто использовать E_ALL.

>>1133839

> Создавать класс-валидатор, который будет смотреть сколько файлов было отправлено, их размер и т.д. , или все это через middleware можно сделать?
Миддлвеар не для этого. Оно для вмешательства в процесс обработки запроса (оно может менять Request или Response), например:

- ограничение доступа (требовать пароль для доступа в админку)
- шифрование и подпись содержимого кук
- логгирование обрабатываемых запросов
- модификации HTTP-ответа, например, поддержка gzip-сжатия
- кеширование страниц целиком
Аноним 2018/02/12 07:48:47  №1137291 94
>>1135133

Надо написать преобразователь дерева AST, которое дает Symfony Expressions, в критерии для Query Builder.

>>1135141

> Как правильно добавлять данные с формы в таблицу?
Во-первых, есть урок про обработку данных формы: https://github.com/codedokode/pasta/blob/master/forms.md

Во-вторых, полученные данные надо вставиь в БД. Для этого достаточно подготовить запрос с помощью PDO, а затем выполнить его с данными из формы. Это описывается в любой статье про PDO.

Также, наверно не надо ловить исключения и выводить их содерждимое пользователю. Логичнее логгировтаь подробности ошибки в лог, а пользователю показывать страницу-заглушку. Описано например тут: https://github.com/codedokode/pasta/blob/master/php/exceptions.md

>>1135377

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

> Однако не понял, как хранить разные характеристики, ну есть, конечно, json,
Есть паттерн EAV.

> ну как по нему условия, читай фильтры в каталоге, делать.
По JSON - если БД поддерживает разбор и индексацию JSON (например Postgres), то ещ можно что-то сделать, если нет то EAV. Хотя у тебя с десятком кроватей проблем с производительностью в любом случае не будет.
Аноним 2018/02/12 07:50:09  №1137292 95
>>1135389

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

>>1135546

Никак. Искать по связанным полям:

SELECT o FROM Order o
JOIN o.properties p
WHERE p.type = ? AND p.value = ?

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

>>1135578

Сущность не должна работать с репозиторием. Она лишь представляет одну запись в таблимце и не занимается извлечением оттуда чего-то еще. Твой метод getWeight элементарно реализуется через отношения. Ты можешь почитать про отношения между сущностями в Доктрине: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html

Если получать weight напрямую неэффективно или невозможно (у тебя тысячи свойств на один заказ), и тебе надо работать с репозиторием, то метод getWeight придется перенести в репозиторий тоже:

public function findWeight(Order $order)

> не надо заморачиваться с привязкой поля типа ENUM к сущности, т.к. он по дефолту в Доктрине не поддерживается
Ставится string и вроде как все работает.

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

>>1135658

Не понимаю, что печального. Так и надо делать.
Аноним 2018/02/12 07:50:47  №1137293 96
>>1135720

У тебя ошибка в синтаксисе SQL-запроса. Значения из формы тут вряд ли при чем. Попробуй такой же запрос руками в консоли выполнить и посмотреть, что будет.

>>1135741

Потому что в теле класса нельзя писать код вроде $this->var = '2ch';, а можно писать только определения констант, полей и методов. А вот уже в методах писать код можно. Класс это не функция.

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

>>1136049

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

Проверить можно, открыв инструменты разработчика (Ctrl + Shift + I) на вкладке Network и посмотрев, где висит. Также, можно попробовать strace на сервере посмотреть, где ждет php-fpm/apache.

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

>>1136207

Это EAV.
Аноним 2018/02/12 08:24:33  №1137298 97
Аноним 2018/02/12 08:25:09  №1137299 98
>>1136317

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

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

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

В принципе, ничего плохого в этом нет. Мы ведь используем менеджер пакетов composer для указания зависимостей. Логично, что серверный софт вроде mysql или nginx это тоже зависимости приложения и их стоит описывать. Но почему для этого нужна целая виртуальная машина?

В моем понимании, хватило бы просто строчки в ридми apt-get install php mysql nginx. Не знаю, почему другие так не могут. Для моих проектов обычно этого хватает.

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

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

Как я понимаю, идея в том, что разработчик кладет в проект конфиг с описанием ВМ, а ты скачиваешь проект, запускаешь вагрант, он гудит пару часов и ты (если все хорошо и использованные пакеты не удалили из репозитория ОС) получаешь настроенную ОС в виртуалке, в которой проект 100% (а может и не 100) работает. Из минусов, как я понимаю, то, что там например может быть не тот дистрибутив, который тебе нравится, там может быть vi вместо нормального редактора, то есть все настроено не под тебя (как разработчик захотел, так и настроил). Плюс, виртуалка может работать медленно, занимать много места на диске. Ну например, вместо маленького дебиана кто-нибудь засунет туда многогигабайтный центос или десктопную убунту. Также, у тебя может быть например 3 Гб памяти, а кто-нибудь пропишет для виртуалки 2 Гб и она съест всю память.

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

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

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

Из плюсов - там есть хранилище готовых образов (Docker Hub).

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

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

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

Ансибл - позволяет на основе конфига (они называются плейбуки) настраивать по SSH сервер или группу серверов, можно использовать для деплоя (когда серверов много), для настройки серверов. Ну например, админ может сделать плейбук "поставить nginx, php, postgres" и в одну команду сконфигурировать чистый сервер или несколько серверов вместо того, чтобы заходить на каждый и что-то там править руками.

Хотя мне он не нравится тем, что ему нужен inventory файл и нельзя просто IP сервера в командной строке указать. Плюс, не работает под виндой нормально и под cygwin. Я хотел сделать на его основе playbook, который разворачивает VPN на произвольной чистой машине, но из-за inventory это не удобно и я вернулся к bash скриптам, у которых конечно корявый синтаксис, но нет такой проблемы.

> Встречал в интернете упоминания о том, что на докере/вагранте разворачивают себе рабочее окружение и мне стало интересно насколько это будет удобнее (и будет ли)

Ну проверь.

Ответы: >>1137558
Аноним 2018/02/12 08:26:39  №1137300 99
>>1136321

Я не очень понимаю, как что у тебя сделано, но конечно, тут надо использовать параметры роутов, чтобы был роут вроде /articles/{topic}/, то есть где раздел задан параметром. Контроллер смотрит на параметр и находит статьи из нужного раздела.

Если у тебя 2 уровня категорий, разделы и секции, то нужен еще роут /articles/{topic}/{section}/

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

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

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

- Чем раздел отличается от секции.

> Например, при переходе к статьям articles_IT
Что такое "статьи articles_IT"? Название роута? Название категории статей?

>>1136373

Твой вопрос какой-то странный. Давай лучше рассмотрим товары. Правильно было написать "Есть таблица товаров, товары разной категории, у них бывают разные свойства. В чем плюсы/минусы EAV в сравнении с просто добавлением полей в таблицу с товарами (single table)". И как разные варианты реализовать с помощью ORM.

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

Это называется "наследование таблиц", и там есть разные паттерны:

- http://design-pattern.ru/patterns/single-table-inheritance.html
- http://design-pattern.ru/patterns/concrete-table-inheritance.html
- http://design-pattern.ru/patterns/class-table-inheritance.html

То, что ты предлагаешь, добавлять колонки в одну таблицу - это как раз паттерн Single Table Inheritance.

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

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

Сравниваем:

Плюсы EAV:

- в EAV новые свойства можно добавлять не меняя схему базы данных (не делая ALTER TABLE). Менеджер может делать это через админку, не привлекая программиста. В случае ORM, надо еще переделывать код при добавлении новых свойств.
- в схеме с single table (когда у нас есть одна таблица товара с кучей колонок), если свойств много, то колонок тоже будет очень много - сотни, и мы упремся в разные ограничения БД и потери производительности. В случае ORM, у нас еще будет гигантский класс с сотней полей, с которым неудобно работать.
- в single table, если свойств много, то большинство колонок будут хранить null и просто зря расходовать место
- в single table никак не определено, какие свойства могут быть у той или иной категории товара. В EAV это можно определить через связи.
- в single table для эффективного поиска надо создавать огромное число (десятки и сотни) индексов, что негативно скажется на производительности и требует кучу места

Минусы EAV:

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

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

Если ты знаешь еще минусы, напиши. Но я смотрю на список плюсов/минусов и не понимаю, где выигрыш в использовании Single Table Inheritance.

> если у нас есть доп.таблица user_attributes(age, sex)
То не очень понятно, зачем она нужна и что мешает эти колонки сразу поместить в таблицу users. Не понятно, зачем вы городите EAV для таблицы пользователей, которые явно отличаются от товаров. Ради производительности?

> то мы сущности User (которая лежит в таблице users) можем задать поле $sex, которое по связи OneToOne будет ссылать на столбец sex из таблицы с аттрибутами.
Не можем. Мы не можем в одном классе замапить поле на колонку из другой таблицы. Мы можем только связать поле с другой сущностью (user_attributes).

> а если у таблицы структура users_attributes(param enum('age','sex'), value), то мы так сделать уже не можем.
Доктрина так не работает. Она мапит таблицы на классы так, что одна таблица обычно соответствует одному классу, а колонки в таблице - полям класса. Нельзя в один класс замапить колонки из разных таблиц.

Но это и не нужно. Ты в сущности User можешь получить атрибуты и найти в них то, что тебе нужно.

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

> короче я не понимаю, в чем плюсы.
Скорее всего там у пользователя много атрибутов, большинство их не заполняет и им не хочется хранить NULL. Но вообще, почему так сделано, надо спрашивать у тех, кто это делал.
Ответы: >>1137402
Аноним 2018/02/12 08:26:58  №1137301 100
>>1136406

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

Если тебе нужно число тысяч (от 0 до 999) то ты сначала берешь 6 последних цифр числа, потом отбрасываешь 3 последние цифры. И остается ровно 3 цифры, больше 1000 там никогда не получится.

Если тебе нужно число единиц, ты опять же, берешь только 3 последние цифры и больше 999 там не получится.

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

>>1136720

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

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

Тебе надо формировать условие из того, что предлагает Query Builder, все эти $expr->equals(...).

>>1136874

Какие именно символы? Вот, например, регулярка, которая ищет восклицательные и вопросительные знаки:

/[?!]/u

Это символьные классы: http://php.net/manual/ru/regexp.reference.character-classes.php

Или тебе надо искать "все символы из всех алфавитов мира"? для этого есть юникодные свойства: http://php.net/manual/ru/regexp.reference.unicode.php
Ответы: >>1137402 >>1137837
Аноним 2018/02/12 08:27:29  №1137302 101
>>1137154

Сокеты тут зачем? Тут же не чат. Тут просто пользователь меняет параметры и у него должна обновиться картинка. Сокеты тут не нужны и только все осложнят. Хватит аякса. А может даже это все можно рендерить на стороне браузера не дергая сервер.

> с которыми шикарно работает РНР
Если ты про ReactPHP, то он на мой взгляд не шикарный. Работа с исключениями там сломана везде - в промисах, в потоках. Как и в ноде, впрочем.
Аноним 2018/02/12 08:29:10  №1137303 102
Аноним 2018/02/12 08:32:13  №1137304 103
Аноним 2018/02/12 08:45:40  №1137309 104
>>1136317

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

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

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

Ну и статью вот сегодня увидел про контейнеры: https://queue.acm.org/detail.cfm?id=3185224

Аноним 2018/02/12 10:49:52  №1137350 105
Товарищи, подскажите, хватит планшета на винде с 1гб ОЗУ для изучения азов php+mysql+js?
Ответы: >>1137371
Аноним 2018/02/12 11:33:27  №1137371 106
>>1137350

Читать учебники - хватит. А вот можно ли туда поставить php/mysql - большой вопрос. Какой там процессор? Какая архитектура? Есть ли рут?

То, что там windows не значит, что приложения для десктопа там запустятся. Или все же запустятся?
Ответы: >>1137381 >>1137393
Аноним 2018/02/12 11:45:56  №1137381 107
>>1137371
Запустятся, проц - слабенький атом
Ответы: >>1137385
Аноним 2018/02/12 11:54:41  №1137385 108
>>1137381
Процессор
Intel Atom Z3735G 1330 МГц 
Количество ядер
Аноним 2018/02/12 12:07:50  №1137393 109
15184264706630.jpg (319, 1536x2048)
2048x1536
>>1137371
Что бы заниматься на php достаточно поставить Notepad++?
Ответы: >>1137403 >>1137410
Аноним 2018/02/12 12:35:03  №1137402 110
>>1137300
спасибо! не знал про EAV, буду изучать.

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

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

>Попробуй написать выражение посложнее чем A AND B

да, там получаются пугающие конструкции
Аноним 2018/02/12 12:43:25  №1137403 111
Аноним 2018/02/12 13:03:54  №1137410 112
>>1137393
Львиная доля работы, у меня, проходила только в нотпаде. Его хватало с головой. А так, есть ещё Brackets, от Adobe. Сорта говен. Когда пд рукой тяжелые проекты, то потребуется какая-нибудь IDE, чтоб проводник в интерфейсе был, да и наглядность проекта не страдала.
Аноним 2018/02/12 13:13:52  №1137419 113
Алсо, для локального пхп сервера с мускулем гига не хватит?
Ответы: >>1137444
Аноним 2018/02/12 13:40:16  №1137444 114
>>1137419

Хватит конечно, даже меньше. Майскул будет потреблять столько, сколько ты ему пропишешь в конфиге, если база маленькая, то сотни Мб хватит. PHP скрипты обычно потребляют в районе 50 Мб, но композер с большим числом пакетов может иногда и гиг откушать - тут вся надежда на своп.
Ответы: >>1137514
Аноним 2018/02/12 14:08:30  №1137474 115
Как лучше назвать класс, который занимается тем, что добавляет спарсенные новости из твиттера в качестве сущностей "статьи" на сайт?

Что-то типа "СоздательКонтента", но не так по-уебански. Фантазия закончилась
Ответы: >>1137483 >>1137603
Аноним 2018/02/12 14:12:34  №1137483 116
Ответы: >>1137509
Аноним 2018/02/12 14:18:41  №1137490 117
Хочу глянуть 1 глазком на решения задач из учебника. конкретно задача про поиск пути по карте. Кто-то даст ссылку на idone
Ответы: >>1137603
Аноним 2018/02/12 14:28:58  №1137509 118
>>1137483
лол, ты не поверишь, я пока так и назвал сам.
хотя это не совсем точно, он ведь его не делает, а добавляет - делает-то его твиттер.

но думаю, так тоже ок.
Аноним 2018/02/12 14:32:32  №1137514 119
>>1137444
Хорошо, большое спасибо!
Аноним 2018/02/12 15:12:06  №1137558 120
>>1137299
Большое спасибо, именно то, что мне хотелось прочитать!
Аноним 2018/02/12 15:40:38  №1137577 121
Дайте чего толкового почитать по редиректу, сессиям и кукам. Желательно с рабочим примером.
Ответы: >>1137580 >>1137581 >>1137603
Аноним 2018/02/12 15:43:00  №1137580 122
>>1137577
ЗЫ редирект надо на то место на странице, откуда был произведен переход. Т.е. скроллю страницу, клацнул линк, перешел и что-то сделал, затем обратно.
Ответы: >>1137582
Аноним 2018/02/12 15:44:24  №1137581 123
Аноним 2018/02/12 15:46:01  №1137582 124
>>1137580
header('Location: '. $_SERVER['HTTP_REFERER']);
Ответы: >>1137603
Аноним 2018/02/12 15:51:04  №1137589 125
Собираюсь учить по 5 часов в сутки / 5 дней в неделю. Будут ли шансы при таком режиме устроиться джуном в конце лета? Первый яп, в универе только бейсик и матлаб ковыряли.
Кун с тех вышкой, не ит
Ответы: >>1137597 >>1137601
Аноним 2018/02/12 15:59:35  №1137595 126
15184403755210.png (170, 1126x786)
786x1126
15184403755221.png (43, 1013x466)
466x1013
В задаче "Игра в кубики" что я де так делаю?
Ответы: >>1137596
Аноним 2018/02/12 16:02:27  №1137596 127
>>1137595
у тебя кавычки в фигурных скобках
Ответы: >>1137600 >>1137615
Аноним 2018/02/12 16:03:45  №1137597 128
Аноним 2018/02/12 16:06:13  №1137600 129
15184407731880.png (41, 996x492)
492x996
>>1137596
Всё равно не работает!
Аноним 2018/02/12 16:07:05  №1137601 130
>>1137589
будут большие шансы, что через неделю ты без вести пропадешь из треда
Аноним 2018/02/12 16:08:28  №1137603 131
>>1137474

TweetLoader, TweetScraper.

>>1137490

Берешь любой алгоритм поиска пути вроде https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B5%D0%B9%D0%BA%D1%81%D1%82%D1%80%D1%8B и ищешь его реализации на нужном тебе языке.

>>1137577

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

>>1137582

Это плохой вариант, плюс нет никакой проверки что в реферере, и есть ли он вообще, лучше явно указывать ?from=feed для указания, куда надо вернуться. Естественно, надо этот параметр тщательно проверять, чтобы не отправить юзера по какой-то плохой ссылке.
Аноним 2018/02/12 16:15:29  №1137610 132
Как пользоваться функцией str_getcsv(...)?

https://secure.php.net/manual/ru/function.str-getcsv.php

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

>escape
>Устанавливает экранирующий символ (только один символ). По умолчанию равен обратному слешу (\).
И от чего и что будет экранироваться?


Данные примерно в таком варианте

NAME
SOME_STRING = SOMEDATA
COLUMNS = something,another,somethinganother,...
1,135.02,135.09,133.25,133.47,33226223
2,135.51,136.27,134.62,135.52,35623100
3,135.345,135.9,134.8398,135.67,22584555

Нужно получить что-то вроде

[
"NAME",
"SOME_STRING" => "SOMEDATA",
"COLUMNS" => ["something", "another", "somethinganother", ...],

"DATA" => [[1, 135.02, 135.09, 133.25, 133.47, 33226223 ], [2, 135.51, 136.27, 134.62, 135.52, 35623100], [3, 135.345, 135.9, 134.8398, 135.67, 22584555]]
]

Текущих знаний мне хватает чтобы спарсить каждую строчку с помощью str_getcsv($s, "\n"), и затем вручную преобразовать массив с помощью регулярных выражений
Это лучший способ и данная функция не предусматривает лучших решений?
Ответы: >>1137667
Аноним 2018/02/12 16:19:47  №1137615 133
15184415881730.png (48, 1142x563)
563x1142
>>1137596
Заработало, спасибо.
Аноним 2018/02/12 16:27:28  №1137620 134
почему на сегодняшний таймстамп

dump(new \DateTime(1518441713));die;

выдает
DateTime @-8106433893 {#1894
date: 1713-02-12 15:18:44.0 Europe/Moscow (+02:30)
}

?
Ответы: >>1137629
Аноним 2018/02/12 16:36:45  №1137629 135
>>1137620
понял. он не понимает таймстамп, ему надо дату слать.
Аноним 2018/02/12 17:36:22  №1137664 136
ОП, как знать столько же, сколько и ты? я знаю некоторых синьоров-тимлидов, у них даже близко таких знаний нет.
Аноним 2018/02/12 17:39:26  №1137667 137
>>1137610

Глянь https://ru.wikipedia.org/wiki/CSV

Прочти это, там немного и на русском: http://tradeincome.ru/useful-content/RFC%204180%20rus.pdf

Там определены 3 символа:

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

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

> И от чего и что будет экранироваться?
Если у тебя есть строка в кавычках "xxx" и тебе надо внутрь нее вставить кавычку, то можно писать "xx\"x" c использованием экранирующего символа. Я не вижу этой особенности в RFC, наверно это какое-то дополнение. В RFC экранирующий символ это кавычка и надо писать "xx""x"

> Это лучший способ
Вполне хороший способ.
Аноним 2018/02/12 17:42:28  №1137669 138
>>1137664

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

Ну и я не так и много знаю - на Хаскелле написать программу не смогу и рассчитать нейронную сеть тоже вряд ли.
Ответы: >>1137694
Аноним 2018/02/12 17:43:26  №1137670 139
>>1137664

Также, не ограничивай себя одним языком, или только высокоуровневыми скриптовыми языками, изучай разные вещи.
Аноним 2018/02/12 18:01:15  №1137678 140
>>1137664
шо там в вашей деревне называют синьерами тогда )
Ответы: >>1137694
Аноним 2018/02/12 18:28:13  №1137694 141
>>1137669
сенкс. решаю задачку про тестхаб, чтобы послушать твои комменты, но мало свободного времени, поэтому небыстро идет.

>>1137678
такое дело, я из дс, братюнь
Ответы: >>1138652
Аноним 2018/02/12 18:40:30  №1137701 142
>>1137664
Разве в похапе используется такая же классификация как и у программистов?
Ответы: >>1137705 >>1137743
Аноним 2018/02/12 18:43:48  №1137705 143
>>1137701
твои попытки троллить вызывают жалость, братюнь
Ответы: >>1137738
Аноним 2018/02/12 19:21:20  №1137738 144
>>1137705
Ответить на вопрос не смог.
Так и запишем.
Аноним 2018/02/12 19:31:39  №1137743 145
Аноним 2018/02/12 21:00:29  №1137790 146
Мда, ОП. Какая же сложная хуйня этот Angular. Да и остальные варианты не лучше. Без этого вот всего не получится SPA?
Ответы: >>1137791 >>1137814 >>1138593
Аноним 2018/02/12 21:07:39  №1137791 147
>>1137790
vk это тоже spa
и они не использзуют ни ангуляров ни реактов, ничего, все на ваниле
так что дело лишь в твоих прямых руках
Ответы: >>1137807 >>1137984
Аноним 2018/02/12 21:37:05  №1137807 148
>>1137791
Счас бы вк написать.

>Таким образом, у тебя есть выбор из как минимум

>backbone + knockout angular 2 react + redux vue.js

ОП требует фреймворк!

И да, на ванилле я охуею писать все это, я не смогую.
Ответы: >>1137817
Аноним 2018/02/12 21:49:50  №1137814 149
>>1137790
Пиши на ваниле. Потихонечку захочется согласованности данных, инъекций зависимостей, реактивности и прочего. В результате через пару лет напишешь свой гуляр, только кривой.
Сложный он потому, что сложен из множества решений, которые необходимы для больших команд и длительной поддержки. А тебе они не очевидны потому, что у тебя таких потребностей не возникает пока.
Аноним 2018/02/12 21:52:35  №1137817 150
>>1137807
>Счас бы вк написать.
Это как пример большого весьма сложно SPA, написанного без хайп-фреймворков. И работающий, заметь, быстрее чем те же фейсбук и инстаграм на реактах.
Аноним 2018/02/12 22:26:51  №1137837 151
>>1137301
>Какие именно символы?
Я имел ввиду всё, кроме букв и цифр, но сейчас внезапно сам во всём разобрался
оказалось достаточно было написать \\D вместо \D
Аноним 2018/02/13 00:35:30  №1137896 152
если у меня в доктрине есть две сущности, Article и Tag (связь many-to-many), то как мне выбрать теги с сортировкой по количеству статей, с которыми они связаны?

т.е.

class Tag
{
/
@var ArrayCollection

@ORM\ManyToMany(targetEntity="Article", mappedBy="tags")
/
private $articles;

пока придумал только так:
return $qb
->select('t')
->from('App:Tag', 't')
->addSelect('COUNT(a.id) as HIDDEN articles')
->join('t.articles', 'a')
->groupBy('t.id')
->orderBy('articles', 'DESC')
->getQuery()
->getResult();

есть какой-то более очевидный способ? задача-то, мне кажется, типовая
Ответы: >>1151822
Аноним 2018/02/13 08:03:09  №1137984 153
>>1137791

Вконтакте не SPA. Там используется штука вроде pajax, то есть оно перехватывает клики по ссылкам, отправляет аякс-запрос и обновляет DOM. По сути только экономит немного времени на перезагрузке страницы. Он не хранит данные локально, не работает в оффлайне, итд.

Ответы: >>1138022
Аноним 2018/02/13 11:00:53  №1138010 154
Ананасы, ищу пхпшника на текущий проект (уии2) на удаленочку. Где вас можно найти? Какие ресурсы?
Ответы: >>1138109
Аноним 2018/02/13 11:41:08  №1138022 155
>>1137984
А когда просто фреймы использовали...
Ответы: >>1138043
Аноним 2018/02/13 12:12:26  №1138043 156
>>1138022

Просто фреймы это очень неудобно для разработчика и плохо для SEO.
Аноним 2018/02/13 13:06:56  №1138080 157
15185164162150.png (50, 821x355)
355x821
15185164162151.png (43, 1021x518)
518x1021
Не понимаю, что сделал не так и почему вообще ничего не выводит мне из echo?
Ответы: >>1138091 >>1138101 >>1138102
Аноним 2018/02/13 13:27:34  №1138091 158
>>1138080
>procent
>komisia
>zaplacheno
>nachalo
>mesyac
Прекрати.
Ответы: >>1138099 >>1138166
Аноним 2018/02/13 13:44:13  №1138099 159
>>1138091

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

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

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

Ну и конечно, анону, если он не знает английский, стоило бы потихоньку начинать его осваивать. Наверняка на собеседовании про знание английского спросят, и знать какие-то основы лучше, чем ничего. Уроков для начинающих, я думаю, в интернете полно.
Аноним 2018/02/13 13:46:13  №1138101 160
>>1138080

У тебя в условии цикла for стоит $mesyac <=0 то есть цикл выполняется только ПРИ УСЛОВИИ ЧТО месяц меньше или равен нулю. Это условие не выполняется и цикл потому не выполняется не разу.
Ответы: >>1138166
Аноним 2018/02/13 13:47:37  №1138102 161
15185188577410.png (28, 420x480)
480x420
>>1138080

Вот кстати у меня в уроке даже картинка с алгоритмом нарисована ведь.
Ответы: >>1138166 >>1138456
Аноним 2018/02/13 14:03:24  №1138109 162
>>1138010
fl.ru, upwork если на проект
Аноним 2018/02/13 14:52:54  №1138166 163
15185227751480.png (46, 982x547)
547x982
>>1138091
Что прекратить? Ну не знаю я английский и денег нет пойти на курсы.
>>1138101
Спасибо, частично заработала.
>>1138102
Отдельное спасибо тебе за гайд с примерами, ты молодец! :3
Ответы: >>1138209 >>1138932
Аноним 2018/02/13 15:35:12  №1138209 164
>>1138166
с таким подходом денег и не будет много. какие блядь курсы? в инторнете что ли мало бесплатных ресурсов для изучения языка?
Ответы: >>1138224
Аноним 2018/02/13 15:44:45  №1138215 165
Пацаны, есть вопросик по регуляркам.

Есть две переменные: $query и $content.
В $query, например, лежит "foo bar", а в $content "bar baz baz foo".

Задача: заменить в $content каждое найденное слово на его же, окруженное в <i></i>. Я делаю это костыльно вот так:

$pattern = explode(' ', $query);
foreach ($pattern as $item) {
$content = preg_replace("~$item~", "<i>$item</i>", $content);
}

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

$pattern = preg_replace(' ', '|', $query);
$content = preg_replace("~($item)~", "<i>$item</i>", $content);

Но каждый раз подставляется foo|bar. Как можно решить задачу, используя переменные рерулярок типа (?<item>.+?)?
Ответы: >>1138931
Аноним 2018/02/13 16:00:37  №1138224 166
15185268372570.jpg (232, 1024x682)
682x1024
15185268372591.jpg (10, 372x274)
274x372
>>1138209
>какие блядь курсы?
Alibra School например, в прошлом году хотел пойти туда, но денег нет (они простят 30к за 9 месяцев обучения).
В интернете тяжело учить, пробовал duolingo, но мотивации не хватило и обучение мне показалось сомнительным.
Ответы: >>1138322 >>1138327 >>1138593
Аноним 2018/02/13 16:07:09  №1138226 167
15185272293470.png (85, 887x827)
827x887
15185272293481.png (88, 895x771)
771x895
15185272293492.png (104, 1067x600)
600x1067
Кстати о курсах. Что лучше выбрать из этого? будет возможность поехать на обучение на 8 месяцев.
Аноним 2018/02/13 18:11:03  №1138322 168
>>1138224
не знаю, я начинал с того, что смотрел симпсонов на английском, а щас вообще не употребляю русский контент (кроме двачей, конечно). правда я этой хуйней много лет занимаюсь
Аноним 2018/02/13 18:20:15  №1138327 169
>>1138224
у меня просто пунктик такой, мол стыдно английский не знать. поэтому я всегда если незнакомое слово встречаю, не подаю вида, а потом бегу в словарь смотрю.
Аноним 2018/02/13 19:02:55  №1138348 170
Ответы: >>1138624
Аноним 2018/02/13 22:54:57  №1138456 171
15185516972640.png (27, 1011x403)
403x1011
15185516972651.png (28, 833x192)
192x833
>>1138102
Хотел сделать задачку, а она не решается (ну скорее Я тупой).

Типо:
1 год :
10000руб. x 1.1 = 11000 руб.
2год:
11000 руб. x 1.1 = 12100 руб.
3год:
12100 руб. x 1.1 = 13310 руб.

и т.д.
Но что-то пошло не так.
Ответы: >>1138931
Аноним 2018/02/13 23:12:13  №1138462 172
Нужно реализовать такую вещь: есть сайт, на нем нужно сделать GUI реализацию смены бэкграунда по css. То есть есть кнопка - жмем, загружаем на сервак файл и этот файл применяется как фон сайта. Всяко разно пробовал гуглить, но не нашел
Ответы: >>1138471 >>1138472
Аноним 2018/02/13 23:23:26  №1138471 173
>>1138462
Ну а хули тут сложного, анонче? Нужно css загружать, да, чтобы он заменял собой исходный?
Ну, я бы сделал так.
Написал бы форму, которая отправляла бы css на сервер и упаковывала его в отдельную папочку. Путь к этому новому файлику прописывался бы куда-нибудь (в базу, например).
В базе (опять же, например), указано какой из файлов является в данный момент активным.
Вместо пути к статическому файлу в ссылке можно указать ссыль на файл-обработчик, типа ttps://site.ru/getcss.php
Там файл бы отдавал нужный (активный) файл, указывая необходимые заголовки.
Ну или тупо заменять один файл другим, если старый не нужен.

Я не уверен, что правильно понял твою задачу, анон, но она, в любом случае, не сложная. Тут не гуглить нужно, а включать воображение. Решить можно разными способами.
Ответы: >>1138473 >>1138560
Аноним 2018/02/13 23:26:08  №1138472 174
>>1138462
Две части задачи: загрузка файла на сервер и изменение css
По первому куча примеров в гугле. По второму, в принципе, тоже. Изменение css - это что-то типа вот этого кода (вытащил со своего проекта, суть, думаю, понятна):
$('#overlay').fadeIn(400, function(){ $('#popup')
.css('display', 'block')
.animate({opacity: 1, top: '50%'}, 200);});
Ответы: >>1138477
Аноним 2018/02/13 23:32:47  №1138473 175
>>1138471
Бля, я тупой, кажется. Неправильно понял. Сорянъ.
Аноним 2018/02/13 23:37:52  №1138477 176
>>1138472
>$('#overlay').fadeIn(400, function(){ $('#popup')
>.css('display', 'block')
>.animate({opacity: 1, top: '50%'}, 200);});
Как я понимаю это окошко для загрузки и правило его анимации. Я полный нуп, крайне сложно вникать в это все.
Ответы: >>1138489 >>1138491
Аноним 2018/02/14 00:01:28  №1138489 177
>>1138477
Я в своей cms-ке сделал настройку темы через GUI (ну там, размеры шрифтов, цвета основных элементов, отступы и пр.) самым тупым способом - все данные храняться в базе в одном поле, которое сериализовано (количество полей статично, поэтому undefined index не будет), но в html-ке вся эта залупа выводится в теге style после подключения основных css.
Ну что-то типа

<style>
<?php if( $theme["background-color"] ):?>
body {background-color: #<?php echo $theme["background-color"]; ?>}
<?php endif; ?>
...
</style>

Да, довольно нубски, но какая разница? Работате же.

В противном случае, может есть шанс при загрузке генерировать отдельный css для background-image? Дополнительный css для фонового изображения типа. Там тупо вставляешь строку, дополняя путем до новой имаги.
Ответы: >>1138490
Аноним 2018/02/14 00:02:06  №1138490 178
>>1138489
>храняться
Стыдно пиздец
Аноним 2018/02/14 00:07:28  №1138491 179
>>1138477
Я имел в виду, что таким же образом ты можешь работать и с другими свойствами css. Например, backround-color
Аноним 2018/02/14 07:16:23  №1138560 180
>>1138471

Там анону нужно только фоновую картинку загружать. Вместо скрипта генерации CSS проще нужные стили вписать в <style>.
Аноним 2018/02/14 10:35:19  №1138593 181
>>1137790
Попробуй Vue.js, он проще и совместим с jQuery
правда, это бед практис

И вообще SPA можно и на jQuery написать

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

>>1138224
В /fl есть годные гайды по изучению английского. В этом, как раз главное погружение, та что когда пишешь код представляй что ты флюент и используй только английский.
Ответы: >>1138624 >>1138959
Аноним 2018/02/14 11:24:29  №1138624 182
Аноним 2018/02/14 12:22:47  №1138652 183
>>1137694
>я из дс
Я тоже. Видимо, соц. слои разные ;)
НИД ХЕЛП YII2 Аноним 2018/02/14 12:34:27  №1138662 184
Сап народ, хочу оседлать yii2, до этого на другом языке использовал другой фреймворк, но не суть. У меня есть 2 модели, товар и категории товара. Модель категории содержит поля - id name, модель товары содержит поля, id, name, category_id - связанное с моделью категории. В greedview товары я вывожу id, name, category.name, при создании нового товара вместо category.name приходится указывать category_id. В идеале хочу добиться чтобы в форме создания было выпадающее меню с именами категорий.
Аноним 2018/02/14 13:32:17  №1138698 185
Обязательно нужно уметь верстать бекендеру ?
Ответы: >>1138713 >>1138931
Аноним 2018/02/14 14:01:42  №1138713 186
>>1138698
Нет, но стоит понимать что происходит и как делается на фронте.

Но все сейчас хотят фулстеков т.е. бек + фронт,
правда во фронт не всегда входит вёрстка
Аноним 2018/02/14 16:50:19  №1138863 187
15186162198980.jpg (30, 462x262)
262x462
Подскажите, будет ли такая конфигурация htaccess (пикрелейтед) безопасной.

По умолчанию открывается доступ ко всему, но все, кроме статики (js, css, картинки и прочее) редиректится на /index.php, где уже будет парситься REQUEST_URI и выдаваться 404-ошибка как для несуществующих файлов, так и для запрещенных к просмотру.

Есть ли у такого подхода какие-нибудь изъяны по сравнению со стандартным, когда с помощью htaccess закрывается доступ к папкам и файлам?
Ответы: >>1138931
Аноним 2018/02/14 18:21:45  №1138889 188
15186217058420.png (7, 634x136)
136x634
15186217058421.png (10, 756x251)
251x756
Вообщем попытался решить задачу.Получилось как-то со скрипом.Дайте советов мудрых как всё это надо нормально делать.
Ответы: >>1138892 >>1138904
Аноним 2018/02/14 18:24:20  №1138892 189
>>1138889
>Вообщем
>у.П
>м.Д
Прекрати.
Ответы: >>1138893 >>1138904
Аноним 2018/02/14 18:27:02  №1138893 190
>>1138892
Ну извини я нервный и не заметил
Ответы: >>1138894
Аноним 2018/02/14 18:29:51  №1138894 191
>>1138893
Процент по-английски это percent
Аноним 2018/02/14 18:43:31  №1138904 192
>>1138889

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

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

a = a + b;

можно записывать короче с помощью оператора

a += b;

Это может тут пригодиться.

Также, если ты посмотришь, то в шапке цикла стоит условие $total <= 1000000. Раз оно есть, то if с break не очень-то и нужен. Единственное, в условии неточность - если у нас уже есть ровно миллион, то цикл продолжать не надо. Выполнять цикл надо только пока денег меньше чем миллион.

>>1138892

Не надо замусоривать тред не имеющими пользы комментариями. У нас учебный тред, а не пикабушечка.
Аноним 2018/02/14 19:37:03  №1138931 193
>>1138863

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

Вот тут немного описано это: https://github.com/codedokode/pasta/blob/master/student-list.md#Выносим-код-за-корень-сервера

>>1138698

Какие-то простые вещи сверстать или поправить существующую верстку - конечно. Кстати, в ОП посте есть набор задач по HTML/CSS, после прохождения которого как раз будет нужный уровень.

>>1138215

Тебе нужен preg_replace_callback либо preg_replace с массивом слов и замен. Посмотри мануал по этим функциям.

>>1138456

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

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

$x = ... - создает переменную или меняет значение существующей
echo ... - выводит строки и числа, в том числе переменные
if (условие) { действия } - выполняет действия, если выполняется условие
for (...) { ... } - выполняет одни и те же действия много раз в цикле
break - немедленно выходит из цикла

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

Если мы посмотрим на твой код, то мы увидим там куски, которые не имеют никакого смысла, например:

($rubley < 1000000);

Эта строчка проверяет, меньше ли $rubley чем указанная сумма, но с результатом проверки ничего не делает - она не сохраняет результат в переменную и не использует его в конструкции if. То есть она бесполезна.

Далее, если мы посмотрим сюда, то увидим другую ошибку:

$rubley = ($seychas * $procent) + $rubley;

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

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

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

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

------

пусть суммаНаСчету равна 10000;
пусть процент равен 1.1;

меняем возраст вкладчика от 16 до 108 лет с шагом 1 год, выполняя каждый год {

увеличить суммуНаСчету на процент;

если (на счету миллион или больше) {
выйти из цикла;
}

увеличить возраст вкладчика;
}

вывести ответ к задаче;

------

Ну а дальше надо переписать это с помощью команд выше.

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

пока (на счету меньше миллиона) {
увеличить сумму на счету;
увеличить возраст на 1;
}

Но как эту конструкцию "пока" перевести в код? Тут есть такой вариант:

for (; $sum < 1000000 ;) {
...
}

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

while ($sum < 1000000) {
тело цикла выполняется до тех пор, пока условие вверху выполняется;
}

Подробнее: http://php.net/manual/ru/control-structures.while.php

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

Если что-то непонятно, задавай вопросы.
Ответы: >>1139233
Аноним 2018/02/14 19:37:26  №1138932 194
>>1138166

Пока еще не все, надо, чтобы выводился тот ответ, который требуется в задаче. А у тебя только какие-то отладочные данные, и непонятно, где окончательный ответ.
Аноним 2018/02/14 20:20:11  №1138941 195
Анон, проблема с JS помоги.я немного туп
window.onload = function() {
btn.onclick = function() {
var test = document.getElementById('test'),
btn = document.getElementById('btn'),
my_img = document.createElement('img');
my_img.src = 'picture134.jpg';
test.appendChild(my_img);

что мне тут пофиксиить, чтобы появлялась только одна картинка и чтобы была пауза 5 секунд перед появлением.
Ответы: >>1139003
Аноним 2018/02/14 21:05:47  №1138959 196
>>1138593
>бед практис
чому же? всё, что работает = вери гуд практис
Ответы: >>1139181
Аноним 2018/02/14 22:20:17  №1139003 197
>>1138941
добавь функцию setTimeOut. Получится так
btn.onClick = setTimeOut(function(){...}, 5000);
Ответы: >>1139125
Аноним 2018/02/15 07:39:06  №1139125 198
>>1139003
Понял, спасибо, но не понял куда ее добавить
Ответы: >>1139153
Аноним 2018/02/15 09:54:55  №1139153 199
>>1139125
Алсо добавь проверку, что картинка уже прикреплялась.

>Понял, спасибо, но не понял
Так ты понял или нет?
Ответы: >>1139156
Аноним 2018/02/15 10:08:04  №1139156 200
15186784843910.png (25, 300x300)
300x300
Аноним 2018/02/15 11:10:49  №1139178 201
Нужно ли использовать функцию addslashes? Для работы с базой данных используются ведь специальные функции типо real_escape_string или плейсхолдеры. Могут ли неэкранированные строки нанести какой-то вред в самом php-скрипте или экранирование нужно исключительно для работы с бд?
Ответы: >>1139629 >>1139630 >>1151822
Аноним 2018/02/15 11:14:29  №1139181 202
Аноним 2018/02/15 12:05:48  №1139203 203
Прочитал шапку, не нашёл рекомендованного списка литературы. Мне нужен учебник по пхп, по которому я могу ВЫЗУБРИТЬ основные моменты (список функций для массивов и строк, арифметические действия, типы переменных и прочая справочная информация). Нужно для собеседований.
Ответы: >>1139239
Аноним 2018/02/15 12:46:50  №1139233 204
>>1138931
>Тебе нужен preg_replace_callback либо preg_replace с массивом слов и замен
благодарю
Аноним 2018/02/15 12:51:11  №1139239 205
>>1139203
по пхп нет хороших книг. их просто нет, прими это. зубри по мануалу. все твои вопросы (типы, функции для работы с массивами) там описаны.

алсо, на собеседованиях задают очень заковыристые вопросы, которые лучше искать в гугле по запросу "вопросы с собеседований".
Ответы: >>1139361
Аноним 2018/02/15 13:59:06  №1139286 206
Внезапно возник такой вопрос, можно ли в регулярку запихать переменную? К примеру если мне надо в тексте перебрать каждую букву по отдельности, то надо тупо копировать код овердахуя раз?
Ответы: >>1139339 >>1139434
Аноним 2018/02/15 15:26:10  №1139339 207
>>1139286
Короткий ответ, можно.
Опиши задачу.
Ответы: >>1139431
Аноним 2018/02/15 15:59:41  №1139361 208
>>1139239
Мне уже второй интервьюер (или как там их называют) втирает про то, что мне НАСТОЯТЕЛЬНО надо прочитать какую-нибудь книжку, потому что там "подробно разбирают сложные моменты" и "дают базу".
>"вопросы с собеседований".
Уже. Но там короткие ответы, а мне кроме них нужно потихоньку подтягивать "базу", чтобы отвечать более осмысленно.
Ответы: >>1139373 >>1140176
Аноним 2018/02/15 16:18:10  №1139373 209
>>1139361
На каких вопросах ты сыпался?
Ответы: >>1139452
Аноним 2018/02/15 17:17:27  №1139417 210
Как выпилить праздничную тему, о веб девы?
Ответы: >>1139424
Аноним 2018/02/15 17:22:16  №1139419 211
Анон, помоги составить регулярку!

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

12
7 лет
1 год
4года
2,5
3 месяца
4 месяца
1.6
8 месяцев
1,5 года
1,7 года на время вылета
1год и 6месяцев
инфант
до 2х лет
6-7

Нужно как-то обрабатывать по формату число и его значение. Типа "9 лет", "8 месяцев" или "2 годика".

Я запилил свою:
'/[0-9месяцев\s]|[0-9года\s]|[0-9лет\s]*|[0-9]{1,2}/ui'
Но она почему-то пидорасит значения.
Ответы: >>1139529 >>1140076 >>1140499
Аноним 2018/02/15 17:29:46  №1139424 212
>>1139417
Выпадающее меню в самом верху справа
Ответы: >>1139437
Аноним 2018/02/15 17:35:20  №1139431 213
>>1139339
надо посчитать каждую букву в тексте по отдельности, типа сколько а, б, в и тд,
Ответы: >>1139529
Аноним 2018/02/15 17:37:18  №1139434 214
Аноним 2018/02/15 17:42:49  №1139437 215
>>1139424
Спааааасибо, мил человек!
Аноним 2018/02/15 18:07:23  №1139452 216
>>1139373
На простейших. Не помню html тег для нумерованного списка. Не помню название функций "переворачивания" массива и строки. Знаю, что они есть, но на память не помню. В общем, нужно именно зазубривание. Так-то уже начал с общей справочной информации, но в книгах ведь и правда более структурированный подход обычно.
Ответы: >>1139529 >>1151822
Аноним 2018/02/15 19:29:30  №1139529 217
>>1139452
Это нет смысла зубрить, это тупо.
Важно именно знать возможность наличия того или иного функционала в языке.
Обычно это приходит с практикой.
Я вот вообще плохо помню точные имена функций или тегов, всегда гуглю что бы перепроверить и всегда гуглю перед тем, как пилить какой либо свой велосипед.

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

Можешь попробовать https://www.codewars.com,
это сборник задач, есть много базовых и 'классических',
как раз в том же PHP многие решает одна функция или так может показаться,
можно нарешать кучу задач и подтянуть эту базу.

>>1139431
Копай в сторону preg_match_all

>>1139419
Покажи код
Ответы: >>1139539 >>1140070 >>1140078
Аноним 2018/02/15 19:59:37  №1139539 218
>>1139529
>Это нет смысла зубрить, это тупо.
Согласен.
>Важно именно знать возможность наличия того или иного функционала в языке.
>Обычно это приходит с практикой.
Без пройденного собеседования нет практики. Я пилю свои проекты, но этого мало. Сегодня что-то использовал, а завтра уже забыл. Во всяком случае я забываю. Память плохая.
Ответы: >>1139633
Аноним 2018/02/15 21:21:13  №1139629 219
>>1139178

>в самом php-скрипте
Имеешь в виду, можно ли так исковеркать вводимые данные, чтобы выйти из строки и поменять логику скрипта? Нет.
Строка - это переменная, которая содержит последовательность байтов. И поебать вообще, что ты там напишешь. Проблемы начинаются, когда одна строка соединяется с другой. Для генерации SQL-запроса, например.
Аноним 2018/02/15 21:21:47  №1139630 220
>>1139178

>в самом php-скрипте
Имеешь в виду, можно ли так исковеркать вводимые данные, чтобы выйти из строки и поменять логику скрипта? Нет.
Строка - это переменная, которая содержит последовательность байтов. И поебать вообще, что ты там напишешь. Проблемы начинаются, когда одна строка соединяется с другой. Для генерации SQL-запроса, например.
Аноним 2018/02/15 21:22:47  №1139631 221
Как так получилось, что жмякнув на энтер один раз, я отправил два сообщения, при этом "моим" подсвечивается только одно из них?
Аноним 2018/02/15 21:26:27  №1139633 222
>>1139539
Што за долбоебизм? Невозможно помнить всё, да и не получится. Всё равно использовать 100% возможностей того или иного инструмента ты постоянно не будешь, что-то ты будешь помнить лучше, что-то хуже.
Знать, безусловно, нужно. Но знать нужно не названия функций, а возможности, которыми располагает тот или иной инструмент.
Я тоже не помню названий некоторых функций, но если мне понадобится, я за 15 секунд их найду, т.к. знаю что мне нужно.

Хороший интервьюрер будет проверять именно твое мышление, т.к. способность находить выход из трудных ситуаций, способность решать нестандартные задачи и пр. А не дрочить названия функций и тегов.
Ответы: >>1139725 >>1151822
Аноним 2018/02/15 22:15:07  №1139725 223
>>1139633
Они мне перезвонят.

По итогу у меня оффер на 40к. В ДС. Когда собеседовался на что-то повыше, каждый раз не проходил.
Ответы: >>1139788
Аноним 2018/02/15 22:19:14  №1139735 224
есть какие-то сертификаты в пхп, которые стоит получать?
Ответы: >>1139788
Аноним 2018/02/15 22:59:41  №1139788 225
>>1139735
Zend сертификаты котируются

>>1139725
А ты анон, можешь еще полистать книгу подготовки к Zend сертификации, там как раз много вопросов по документации
Аноним 2018/02/16 10:09:30  №1140070 226
>>1139529
>Покажи код
Зачем?
Сам код здесь https://ideone.com/zQztaf , но я просто не видел смысла выкладывать его.

Но сразу кое-что скажу: это часть кода на 200 строк.
Я тогда его здесь выложу https://ideone.com/Lz5R9P .

Если не считать отсутствие PDO (мамой клянусь, на этой неделе исправлю это!), могут быть какие-то рекомендации по коду?
ind4:не пиши его больше
Ответы: >>1140073 >>1140179 >>1140499
Аноним 2018/02/16 10:32:03  №1140073 227
15187663239460.jpg (37, 436x536)
536x436
>>1140070
Доложил.

По факту: так некрасиво, что даже не хочется разбирать.
Ответы: >>1140074 >>1140202
Аноним 2018/02/16 10:34:54  №1140074 228
>>1140073
Ват? Это ж комменты, чтобы сам код был понятен! Что с ними не так-то?
Аноним 2018/02/16 10:36:10  №1140076 229
>>1139419

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

Так ты будешь всегда знать, насколько хорошо работает код, где он делает ошибки, улучшилось ли что-то после изменений.
Аноним 2018/02/16 10:47:43  №1140078 230
Ответы: >>1151823
Аноним 2018/02/16 11:50:48  №1140110 231
Сап, как делать бэкап БД, при возможной потере самой бд? Скажем есть совсем совсем плохой сценарий при котором я потеряю доступ к бд и вообще серверу. Как в таком случае делать бэкапы? Засылать дамп изменений на почту в конце каждого рабочего дня? Или на FTP? Или как-то так?
Ответы: >>1151823
Аноним 2018/02/16 12:00:44  №1140120 232
Пехач, как надо ставить на пеху библиотеки? Я хотел накатить imagick и phpv8, но у меня windows вместо серверной ос.
Ответы: >>1140121
Аноним 2018/02/16 12:07:16  №1140121 233
>>1140120
скачать библиотеку в файле dll, положить в директорию c:\path\to\php\ext и прописать её в файле php.ini:
extension=php_yourlibrary.dll

Важный нюанс, что php.ini может находиться где угодно. Нужно найти все и прописать в каждый.
Ответы: >>1140153 >>1140496
Аноним 2018/02/16 13:06:50  №1140153 234
>>1140121

Узнать, где находится php.ini, можно вставив в скрипт phpinfo() и открыв его через браузер и веб-сервер.

Обратите внимание, что при запуске из командной строки может использоваться один php.ini, а из-под Апача - другой.
Ответы: >>1140496
Аноним 2018/02/16 13:33:37  №1140167 235
Кто шарит в Симфони, подскажите, как по уму сделать.

Допустим, у меня есть сайт с новостями, там на главной странице слева новости, а справа теги, допустим.

Я на ShowIndex() на ретурн подаю что-то типа
return this->render('index.html.twig', ['news' => $someNews, 'tags' => $popularTags]);

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

В итоге можно сделать так:
return this->render('article.html.twig', ['article' => $someArticle, 'tags' => $popularTags]);

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

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

Я пока придумал только что-то типа return this->render('article.html.twig', ['article' => $someArticle, 'tags' => $this->getPopularTags()]);

и наследовать контроллер от своего базового (который наследуется от симфоневского AbstractController) в котором в защищенные методы вынести эти обращения к доктрине. Есть еще варианты?
Ответы: >>1140224 >>1140243 >>1140249
Аноним 2018/02/16 13:49:50  №1140176 236
>>1139361
возможно интервьюер говорит тебе о книжках по программированию независимо от языка, а не про книжки на пхп.

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

нормальных книг по пхп нет, забудь про них. тебе никто не разжует и не вложит в голову инфу как стать программистом с нуля. только всякие высеры котеровых с кодом типа
if($peremennaya = '2') echo '<b>'.$_GET['ADMIN'].' вы админ!</b>';

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

вот хорошие книги: https://github.com/jupeter/clean-code-php
http://www.phptherightway.com/

но они не "дают базу". "базу" ты соберешь по кусочкам потом, через год изучения. также есть много хороших книг по джаве, по ооп.
Ответы: >>1140238
Аноним 2018/02/16 13:58:01  №1140179 237
Так что? Нобади керс мой пост >>1140070 ?
Ответы: >>1151823
Аноним 2018/02/16 14:24:17  №1140202 238
>>1140073
Просто, если ты про отступы - то там они на месте, кроме как на 82-ой строке.
Там же нет вложенных циклов/условий и прочего.
Ответы: >>1140414
Аноним 2018/02/16 14:54:54  №1140224 239
>>1140167

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

Почитай где нибудь про Fat Ugly Conttollers.
Ответы: >>1140236
Аноним 2018/02/16 15:09:33  №1140236 240
>>1140224
братюнь, я читал. в контроллере получаю теги - это занчит обращаюсь к репозиторию, который занимается получением. тонкий контроллер как раз это и делает - обращается к модели за данными и отдает их представлению.

у меня контроллер из 5 строк состоит и тем не менее, там есть это дублирование.
Аноним 2018/02/16 15:12:36  №1140238 241
>>1140176
Спсибо за ссылки.

Практика у меня уже была. Полтора года (даже год и 9 месяцев). А вот теорию знаю (вернее помню) слабо.
Ответы: >>1140246
Аноним 2018/02/16 15:20:58  №1140243 242
>>1140167

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

- базовый контроллер, который выставляет глобальные переменные для твига (глобальные переменные конечно не очень хорошо): http://symfony.com/doc/current/templating/global_variables.html
- то же самое, но вызывающееся не через базовый контроллер, а через события kernel вроде before request или before controller. То есть перед вызовом контроллера вызывается твой код и что-то передает в твиг (опять же, глобальные переменные)
- специальный "хелпер", который передается в шаблон и из которого в нем берутся нужные данные (вроде {% set tags = pageHelper.getPopularTags() %})
- сделать функции получения данных как расширение к твигу и писать там {% set tags = getPopularTags() %}. Минус - эти функции скорее всего ничего не "знают" о запросе, непонятно как передавать в них какие-то параметры.
- заменить объект твига на расширенный, который дополняет переменные нужными данными

Ответы: >>1140267
Аноним 2018/02/16 15:22:34  №1140246 243
>>1140238
под практикой я имею в виду работу в нормальной конторе с аудитами, отгрузками и прочим. без битриксов с версткой и прокладываний витой пары.

ты под теорией что понимаешь?
Аноним 2018/02/16 15:25:21  №1140249 244
Ответы: >>1140267
Аноним 2018/02/16 15:49:22  №1140267 245
>>1140243
>>1140249
благодарю. правда смущает, что некоторые из вариантов нарушают принципы взаимодействия компонентов mvc.
Аноним 2018/02/16 18:11:03  №1140374 246
>>1135053 (OP)
ОП, не знаю, говорили тебе тутошние антоны или нет, но большое тебе спасибо за всю информацию в этом тредике. Очень грамотно и развернуто
Аноним 2018/02/16 19:14:31  №1140414 247
>>1140202
Ну зацени мой код четырехлетней давности
https://ideone.com/IiGQvQ

До сих пор работает как часики.

Одна проблема, понимаю в нем хоть что-то только я.
Ответы: >>1141872
Аноним 2018/02/16 19:53:12  №1140447 248
Пилю свой бложик, хочу что бы категории в шапку сайта выводило прям из бд.
код:
https://pastebin.com/0zsCzrkQ
Вся страница завалена первым значением из массива.

> $menu_array = mysqli_fetch_assoc($menu_query)
Если переместить эту конструкцию в цикл то все работает. Не могу догнать, разве не одно и тоже записать в цикле $menu_array = mysqli_fetch_assoc($menu_query) и $menu_array ?
Ответы: >>1140499
Аноним 2018/02/16 21:44:01  №1140496 249
>>1140153
>Обратите внимание, что при запуске из командной строки может использоваться один php.ini, а из-под Апача - другой.

Именно поэтому
>Нужно найти все и прописать в каждый.
>>1140121
Аноним 2018/02/16 21:50:56  №1140499 250
>>1139419
>>1140070
Я так и не понял что должно получиться на выходе, сори я сонный.


>>1140447
Ты используешь неверный цикл, почитай, как работает while
Ответы: >>1140527 >>1141873
Аноним 2018/02/16 22:48:32  №1140527 251
Аноним 2018/02/17 00:42:52  №1140577 252
15188173731860.png (18, 791x406)
406x791
15188173731861.png (35, 1920x972)
972x1920
Как такое может быть?

Я комментирую строчку $date->modify("+{$matches[1]} day"), которая находиться в ложном условии, которая не должна выполниться, и к датам не добавляется астрономическое значение.

Вот копипаста этого кода: https://3v4l.org/uEeGP
Ответы: >>1140699 >>1151824
Аноним 2018/02/17 04:26:19  №1140636 253
15188307793590.png (6, 281x320)
320x281
Нубо-вопрос: на пикрелейтед "делаю что-то 2" всегда ли гарантированно выполнится только после полной отработки функции check() ? Или нужно обернуть "делаю что-то 2" в if?

Посоветуйте, как вообще делать такой алгоритм, где в одной функции вызывается много проверок
Ответы: >>1140686 >>1140790 >>1140793
Аноним 2018/02/17 07:34:29  №1140686 254
>>1140636
"2" не выполнится только если в ф-ции check будет выброшено исключение throw new Exeption() или где-нибудь там встретится ф-ция exit, die. Еще мог бы быть вариант, если ф-ция check() асинхронная, но в php такого нет, там все выполняется последовательно, даже запросы к удаленным серверам.
Аноним 2018/02/17 09:37:58  №1140699 255
>>1140577
Починилось после того как каждой новой итерации создавалась новая дата. Но почему при первой, всё равно, выполнялось ложное условие, и добавлялось астрономическое число?
Аноним 2018/02/17 14:24:07  №1140790 256
>>1140636
Да, анон. Когда вызывается функция, управление передается именно ей, а также в стек добавляется адрес возврата, там же существует локальная область памяти для данной функции. Функция выполняется, сохраняет данные в определенном месте, а затем управление передается вызывающей функции, которая получает адрес в памяти данных, которые вернула функция.

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

Об этом же вопрос был?
Аноним 2018/02/17 14:30:06  №1140793 257
15188670069390.jpg (58, 515x445)
445x515
>>1140636
>Посоветуйте, как вообще делать такой алгоритм, где в одной функции вызывается много проверок

Я всегда делаю в таком йоба-стиле. Если нужно сделать множество проверок внутри какой-то функции, вместо кучи вложенностей, отбрасываю неудачные варианты. Хз красивое это решение или нет.
Ответы: >>1140848 >>1141223
Аноним 2018/02/17 15:39:36  №1140831 258
if (isset(
$foo,
$bar,
$baz
)
) {
...
}

Это приемлемая конструкция?
Ответы: >>1140849
Аноним 2018/02/17 16:00:57  №1140848 259
>>1140793

Лучше писать

$result= check();
if (!$result) {
...
}

Во-первых, не стоит совмещать 2 действия в 1 строке. Во-вторых, ты нарушаешь правило приоритетов операторов - !$result = ... эквивалентно (!$result) = ... и некорректно. Это просто в PHP стоят костыли, которые такое разрешают.
Ответы: >>1140902 >>1141136 >>1141223
Аноним 2018/02/17 16:01:44  №1140849 260
>>1140831

Это странная конструкция. Зачем проверять, существует ли переменная? Ты сам не видишь по коду выше, создавал ты ее или нет?
Аноним 2018/02/17 17:07:51  №1140902 261
>>1140848
Спасибо, буду знать
Аноним 2018/02/17 20:17:11  №1141013 262
Помогач, помоги!
Нужно подгрузить скрипт в зависимости от выбранной страницы. Скрипт для страницы/2/ отказывается работать. Как я понял — загвоздка скорее в wordpress, а не в пхп.

https://developer.wordpress.org/reference/functions/is_page/ — тут описывается подобный случай, но пхп я совсем не знаю. Если не сложно, помогите с кодом:

add_action('wp_enqueue_scripts', 'qg_enqueue');
function qg_enqueue() {
if (is_page( 'new-page-testing/2/' )) {
wp_enqueue_script(
'qgjs',
plugin_dir_url(__FILE__).'cae2.js'
);
} elseif (is_page( 'new-page-testing' )) {
wp_enqueue_script(
'qgjs',
plugin_dir_url(__FILE__).'cae1.js'
);
}
}
Ответы: >>1151824
Аноним 2018/02/17 21:33:02  №1141083 263
давайте расскажу свою success стори.

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

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

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

алсо, могу сказать, что на работе по предыдущей специальности я получал больше, чем 100к, но в любом случае 100к больше, чем 40, лол.
Аноним 2018/02/17 22:34:50  №1141133 264
>>1141083
ну да, "успех" уровня вкатывальщика, большего ты и не заслуживаешь
Ответы: >>1141167
Аноним 2018/02/17 22:36:13  №1141136 265
>>1140848
>в PHP стоят костыли, которые такое разрешают
Тем PHP и хорош. И одновременно плох.
Аноним 2018/02/17 23:21:21  №1141167 266
>>1141133
конечно пока не заслуживаю. этапы карьеры не перескочить, очевидно, что сразу синьором не стать и я радуюсь каждому небольшому достижению. к чему призываю всех анонов.

если ты ждешь 500к в месяц, чтобы начать радоваться, мне тебя жаль. хотя я сомневаюсь, что у тебя в принципе есть реальный опыт работы.
Ответы: >>1141710
Аноним 2018/02/17 23:26:41  №1141173 267
>>1141083

Я вообще не понимаю тех кто переживает что им уже аж целых 30 лет. Вы в 30 лет на пенсию что ли выходите, или у вас руки в 30 лет отваливаются? Люди на заводе и в 30, и в 40, и в 50 бодро работают. Вот исполнится вам 50-60, тогда и можете жаловаться
Ответы: >>1141189
Аноним 2018/02/17 23:51:43  №1141189 268
>>1141173
ну многие паникуют, кто более трусливый. кто посмелее, хуй кладет я где-то посередине
Аноним 2018/02/18 00:56:33  №1141223 269
>>1140848
да, "одна строка - одно действие". правда часто даже в современном "правильном" коде это правило не выполняется, например

return $this->someMethod();

$someVar = array_map($callback, array_values($result));

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

но в примере >>1140793 в одной строке даже не 2, а 4 действия и все абсолютно разноплановые. налицо желание анона изобрести свой велосипед и всех наебать вместо того, чтобы открыть какой-то реальный код (из того же symfony) и посмотреть, как там сделано. тот же код можно посмотреть для ознакомления с такой штукой как PSR-1/PSR-2
Аноним 2018/02/18 08:16:05  №1141330 270
https://ideone.com/hEJMlZ
Застрял на задании в строках с массивами и стихотворением.
Проблема следующая: я изначально делал задание не через array_rand (так же, как и предыдущие), потому что не понял как это в принципе работает. Мануал читал, в английский могу, но я не въехал, как сделать так, чтобы он выбирал случайное число и при этом выводил из массива его значение. В мануале же описано по сути перемешивание значений и вывод случайного через соотв. команду (echo $input[$rand_keys[1]]), или я что-то не так понимаю?
Короче, решал через mt_rand, нашел решение в гугле. Но если с предыдущими заданиями это прокатило, то тут первая и вторая строки (где значения из 1, 2 и 3 массива) получаются абсолютно идентичными. Подскажите плз, можно ли это решить таким путем, чтобы строки были разными или поясните за array_rand, или я вообще все не так делаю, и там нужно использовать что-то другое?
Ответы: >>1143231
Аноним 2018/02/18 10:10:52  №1141341 271
Пару раз в коде видел синтаксис такого вида:
getHuita()['huita']. Что он обозначает?
Ответы: >>1141344
Аноним 2018/02/18 10:42:34  №1141344 272
>>1141341
Я думаю эта функция возвращает элемент массива с ключом ['huita']
phpunit Аноним 2018/02/18 11:04:00  №1141356 273
Привет, есть вопрос про тестирование.

Я написал несколько классов-мапперов для сохранения и получения объектов из базы данных, а также мапперы для трансформации этих объектов в JSON объекты. Поскольку их нужно тестировать, я подумал что это хороший случай, чтобы разобраться с phpunit. И как всегда у меня есть несколько вопросов:
1. Что курить кроме Зандстры и доков phpunit?
2. С чего начать?
3. Как организовать тестирование мапперов для ДБ и JSON, чтобы в дальнейшем при добавлении новых связок "сущность-мапперДБ-мапперJSON" создание тестов не требовало много усилий?
Ответы: >>1141364 >>1141364 >>1141402
Аноним 2018/02/18 11:54:46  №1141364 274
>>1141356
>1. Что курить кроме Зандстры и доков phpunit?
Хабр
>2. С чего начать?
С написания тестов, очевидно же!
Для преобразования в JSON функции протестируй. Это не маппер как ты называешь, а сериализатор (php объект -> json обьект).
>>1141356
>3. Как организовать тестирование мапперов для ДБ и JSON, чтобы в дальнейшем при добавлении новых связок "сущность-мапперДБ-мапперJSON" создание тестов не требовало много усилий?

Не нужно писать тесты на каждый свой пердёж. Тестируй только то что будешь переиспользовать. Добавление НОВЫХ сущностей вообще ничего не должно менять, это ведь тоже самое что и другие сущности, просто в них информация другая. А вот если ты добавил функционал в базовый класс, то этот функционал уже можно (по идее нужно) тестировать, чтобы эта йоба не ломалась при добавлении новой йобы.

Писать тесты заебывать пиздец, нудное и не интересное занятие.
Ещеесли напишешь кучу ебланских тестов, то их тоже придется ПРАВИТЬ, лол.
Аноним 2018/02/18 13:07:04  №1141402 275
>>1141356

Для начала, а ты смотрел мою статью по тестированию? https://gist.github.com/codedokode/a455bde7d0748c0a351a

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

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

Но обычно сценарии тестов строятся по схеме "Дано - Если - То". Ну например, "ЕСТЬ пустая база данных, ЕСЛИ вызвать метод подсчета числа записей в ней, ТО он вернет ноль".

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

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

Рассмотрим пример составления сценария тестирования.

Например, у тебя есть класс для сохранения и получения объектов из БД. Какие к нему есть требования? Ну очевидно, первое что в голову приходит:

- маппер должен уметь сохранять объект в БД
- маппер должен уметь загружать объект из БД

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

Как проверить требования выше? Тут могут быть разные идеи. Например:

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

А можно чуть схитрить и проверить обе функции сразу:

- сделать пустую БД
- вызвать функцию вставки сущности в БД
- вызвать функцию загрузки сущности из БД
- проверить, что данные вернулись корректные

Как-то так.

Помни еще, что тесты должны быть независимы и не полагаться на очередность вызова, или на то, что другой тест вообще будет вызван.
Ответы: >>1141455
Аноним 2018/02/18 14:44:45  №1141450 276
15189542852730.png (53, 1068x626)
626x1068
Привет, возник вопрос о том, как лучше будет выбрать 3 последних ответа каждого треда? Решил, что можно сделать как на пике(union'ы склею потом).
Может, есть какое-нибудь более лучшее решение? Буду благодарен.
Ответы: >>1141487
Аноним 2018/02/18 14:47:20  №1141452 277
>>1141364
Маппер - тоже подходящее название, не придирайся. Есть даже функция Map в функциональном программировании и она как раз обозначает отображение одного списка на другой: https://en.wikipedia.org/wiki/Map_(higher-order_function)

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

>>1141364
На хабре старьё, читай доки PHPUnit и смотри как пишут тесты другие люди на гитхабе:
- https://github.com/slimphp/Slim/tree/3.x/tests
- https://github.com/silexphp/Pimple/tree/master/src/Pimple/Tests
- https://github.com/j0k3r/banditore/tree/master/tests/AppBundle
Ответы: >>1141469 >>1141859 >>1143255
Аноним 2018/02/18 14:54:48  №1141455 278
Аноним 2018/02/18 15:12:57  №1141469 279
>>1141452
Что делать с ситуациями, когда тебе нужен чужой код, а у него нет тестов?
Ответы: >>1141488
Аноним 2018/02/18 15:33:53  №1141487 280
>>1141450

У тебя не написано, как выглядит схема БД. Альтернатива - сделать денормализацию и явно хранить связь между тредом и последними 3 постами.
Ответы: >>1141492
Аноним 2018/02/18 15:35:33  №1141488 281
>>1141469

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

Можно написать небольшие приемочные тесты, тестирующие его в целом.

Если это опен сурс, можно предложить разработчикам помощь в добавлении и написании тестов.
Аноним 2018/02/18 15:38:16  №1141492 282
15189574968110.png (38, 886x270)
270x886
Ответы: >>1143231
Аноним 2018/02/18 17:10:25  №1141528 283
Подскажите, что можно почитать по алгоритмам и структурам данных для гуманитария. Я накачал седжвика и всяких книжек типа алгоритмы на джава скрипте. Код, который там опубликован, и его логику я понимаю, но теорию не очень. Может есть совсем что то простое?
Ответы: >>1141531 >>1143231
Аноним 2018/02/18 17:13:43  №1141531 284
>>1141528
Введение в Алгоритмы Кормена
Ответы: >>1141533
Аноним 2018/02/18 17:14:43  №1141532 285
15189632840250.jpg (51, 750x728)
728x750
Кстати о тестах, есть какой-нибудь минимальный путь/метод их написания?

Все движки тестов, которые я видел, слишком занудные (слишком подробный синтаксис, слишком много времени уходит).
Ответы: >>1141534 >>1141539 >>1143231
Аноним 2018/02/18 17:15:16  №1141533 286
>>1141531
Вернее, называется "Алгоритмы. Вводный курс". Но я хз что там, ибо читал "Алгоритмы. Построение и анализ".
Аноним 2018/02/18 17:15:45  №1141534 287
>>1141532
Олсо, как лучше тестировать void-функции?
Ответы: >>1151824
Аноним 2018/02/18 17:40:30  №1141539 288
Ответы: >>1141711
Аноним 2018/02/18 19:15:23  №1141595 289
3 неделю назад я попробовал вкатиться в это ваше погроммирование, ибо сижу на шее у мамки вот уже 28 лвл. Полная залупа оказалось! Буду дальше смотреть аниме и пить пиво и кушать пончики, которые мне принесла бабка. Удачи, ботаны!
Ответы: >>1141597
Аноним 2018/02/18 19:20:54  №1141597 290
>>1141595
Тонко шутишь, фраерок
Аноним 2018/02/18 23:11:53  №1141710 291
>>1141167
ха-ха, сладкие оправдания

а о себе рассказывать не буду, не заслужил, вкатывальщик
Ответы: >>1142199
Аноним 2018/02/18 23:12:37  №1141711 292
>>1141539
ну как вариант, но тоже достаточно занудно
Аноним 2018/02/18 23:22:14  №1141716 293
Ответы: >>1142306
Аноним 2018/02/19 01:36:52  №1141811 294
Какого черта в каждой статье про Ларалев тонны кода с вызовами статичных методов? Что за склонение к нетестируемому говнокоду?
Ответы: >>1142203 >>1143230
Аноним 2018/02/19 03:07:20  №1141834 295
15189988411600.png (112, 1585x828)
828x1585
15189988411611.png (31, 1575x835)
835x1575
15189988411612.png (35, 1575x857)
857x1575
15189988411623.png (102, 1577x857)
857x1577
Хосспаде!
Оно не работает! Оно не живо! Оно мертво!
https://ideone.com/9P02fe
Оно даже ошибок не выдаёт! Оно пусто! Что я не так сделал?
Очевидно же, что проблема в spellSmallNumber. Но где?
Я кусочек этой функции запускал отдельно, оно работало. Господи, горе мне!

А ещё PDO истязает мою и без того измученную душу.
Как в PDO заменить mysql_real_escape_string так, чтобы оно работало? Нужно при неверном наборе символов перенаправлять на другую страницу с помощью header. Без строки PDO:Quote, которую я пытался использовать, всё работает, но как только я её вставляю, оно не перестаёт переходить, а лишь перезагружает текущую страницу без вывода чего-либо. Отправившись на покорение просторов интернета, я попытался использовать и с try и с prepare, но это было неверным действием. Вот так. Я не понимаю, где моя ошибка?


На первых трёх пиках мои скверные письмена, на последнем, четвёртом, рабочий вариант, но с mysql.




Аноним 2018/02/19 03:12:35  №1141835 296
>>1141834
>оно не перестаёт переходить
оно не переходит
фикс
Аноним 2018/02/19 05:56:35  №1141846 297
>>1141834
А говорили, что нельзя вернуться в 2007. Откуда ты это принес, фриланс?
Ответы: >>1141999
Аноним 2018/02/19 08:21:17  №1141859 298
>>1141452
>Есть даже функция Map в функциональном программировании и она как раз обозначает отображение одного списка на другой

Педагог и педофил - тоже одно и тоже?
Сравнить функцию высшего порядка с ООП термином это сильно блять.
Ответы: >>1143255
Аноним 2018/02/19 10:01:59  №1141872 299
>>1140414
Хорошо. Добавлю комменты и выложу.
Аноним 2018/02/19 10:02:35  №1141873 300
>>1140499
Я уже решил задачу, лол.
Но продемонстрировать код все ещё хочу.
Ответы: >>1143113
Аноним 2018/02/19 12:39:24  №1141962 301
>>1135053 (OP)
Аноноимусы, что можете сказать о книге "php быстрый старт" ? стоит ее прочесть, чтобы быстро освоить основы языка и приступать к практике, которая есть в шапке? парочку яп я знаю, но вебом не занимался никогда
Кстати, что можете сказать про "php в подлиннике" ? Везде ее нахваливают, но объем ее меня очень отталкивает, так как печальный опыт чтения книг по яп на 1000+ страниц есть
Ответы: >>1141963 >>1141983 >>1142192
Аноним 2018/02/19 12:40:46  №1141963 302
>>1141962
В шапке и так все с "это называется переменная, а вот это - строка".
Никаких предварительных ласок не нужно.
Ответы: >>1141976
Аноним 2018/02/19 13:07:03  №1141976 303
>>1141963
Да, учебник из шапки я просматривал, поэтому и спрашиваю о альтернативах, в виде настоящих книг, хотелось бы поближе познакомится с ооп в пхп, связку с sql и так далее.
Ответы: >>1141981 >>1143229
Аноним 2018/02/19 13:18:53  №1141981 304
>>1141976
Чувак, я тебя не понимаю.
Если тебе просто не нравится оформление ОП-а, то можешь взять http://php720.com/ , например.

В общем, учебник ОП-а самодостаточен для первого этапа. "Настоящие" книги мне не нравятся из-за долгого вступления и всяких расшаркиваний, которые НАХУЙ не нужны нубасу, который впервые учится кодить на чем-то кроме ХТМЛ.
Аноним 2018/02/19 13:23:05  №1141983 305
>>1141962
Тебе нужна книга ОПа и справочник Скляра и Трахтенберга. Больше почти нет годных книг, смирись@покайся.
Аноним 2018/02/19 13:58:09  №1141999 306
Ответы: >>1142298
Аноним 2018/02/19 15:09:40  №1142020 307
Где посмотреть php-код двача?
Ответы: >>1142023
Аноним 2018/02/19 15:16:24  №1142023 308
>>1142020
На серваке у Абу. Это бэкенд и простой юзер не имеет к нему доступ.
Аноним 2018/02/19 17:56:36  №1142192 309
>>1141962
книги про пхп учат говнокоду. потрать несколько месяцев на изучение, чтобы потом прийти на собеседование и понять, что надо переучиваться.
Аноним 2018/02/19 18:02:11  №1142199 310
>>1141710
>а о себе рассказывать не буду
тебя и не просили
Аноним 2018/02/19 18:03:33  №1142203 311
>>1141811
такой вот ларавел. зато быстро!
Аноним 2018/02/19 18:06:02  №1142208 312
>>1141083
Лол, а я переживал, что хуево вкатываюсь, ибо вкатился в саппорт по PHP в 27, а сейчас макакой подрабатываю за 40 (ДС2).
Ответы: >>1142306
Аноним 2018/02/19 19:17:58  №1142298 313
>>1141999
я другой анон, но

1. процедурный код
2. mysql_query
3. пхп и html в одном файле, закрывающие теги ?>
4. глобальные переменные

ну и просто неуловимое ощущение, что попал во времена пхп4
Ответы: >>1142302 >>1142313 >>1142591
Аноним 2018/02/19 19:21:11  №1142302 314
>>1142298
А еще отсутствие какой-либо нормальной архитектуры.
Аноним 2018/02/19 19:23:24  №1142306 315
>>1141716
спасибо!

>>1142208
главное сразу учить то, что потребуется потом на нормальных работах - ооп, тестирование, фреймворки, бд, линукс и пр. чтобы через два года не оказаться с навыками, подходящими только для дизайн-студии какой-нибудь. все, что у ОПа есть в пасте, грубо говоря, надо выучить (кроме фронта и верстки, лол)
Ответы: >>1142626
Аноним 2018/02/19 19:26:11  №1142313 316
>>1142298
> пхп и html в одном файле, закрывающие теги ?>
И что в этом такого?
Ответы: >>1142393 >>1142397
Аноним 2018/02/19 20:18:26  №1142393 317
Ответы: >>1142399 >>1142591
Аноним 2018/02/19 20:21:34  №1142397 318
>>1142313
с другой стороны ты не объявляешь функции, классы или константы в этом файле, так что формально ИМЕННО ЭТО не является нарушением именно этого пункта пср. но смешивать логику с представлением - плохая практика.
Аноним 2018/02/19 20:23:02  №1142399 319
15190609830310.jpg (82, 593x722)
722x593
>>1142393
Покажешь, как согласно современным стандартам должен выглядеть этот код ?
Ответы: >>1142404 >>1142503
Аноним 2018/02/19 20:28:44  №1142404 320
>>1142399
я тебе так скажу, по этим самым стандартам нужно использовать например твиг с набором дополнительных расширений к нему (которые ты напишешь сам), которые будут заниматься всякой логикой типа получения путей для картинок и т.д. в твиге (или другом шаблонизаторе) можно легко выводить списки, таблички по три ячейки в столбце и т.д.

а в этом коде прям чувствуется, что подпихивали-подпихивали костылей по одному и в итоге все достаточно запутано.
Аноним 2018/02/19 20:54:33  №1142417 321
Вопрос по слиму и прочим фреймворкам. Почему, чтобы отобразить шаблон используют return, а не echo?
Ответы: >>1142555 >>1143229
Аноним 2018/02/19 20:59:02  №1142420 322
15190631431680.png (17, 968x236)
236x968
Привет, бартики. Помогите разобраться с тем, как написать свой язык разметки по типу Wakaba mark. Буду очень благодарен.
Ответы: >>1142437 >>1142628
Аноним 2018/02/19 21:19:24  №1142437 323
Ответы: >>1142445 >>1142927
Аноним 2018/02/19 21:25:23  №1142440 324
>>1135053 (OP)
В node.js можно прослушивать определенный порт и обрабатывать поступающие на него запросы. Как такое делается в php?
Ответы: >>1142461
Аноним 2018/02/19 21:29:23  №1142442 325
>>1141834
.php
.PHP
На юникс-сервере это будут разные файлы. лучше используй lowercase всегда.
Ответы: >>1142486
Аноним 2018/02/19 21:31:45  №1142445 326
>>1142437
Я даун. Сори за тупой вопрос. Очень благодарен, братишка.
Аноним 2018/02/19 21:53:26  №1142461 327
>>1142440
Apache сам это делает. Он же балансирует нагрузку и прибивает скрипты, когда они зациклились или отожрали слишком много памяти.
Ответы: >>1142474
Аноним 2018/02/19 22:01:17  №1142467 328
Как реализованы в магазинах разнообразные сортировки по цене/имени/характеристикам/производителю и т.п.?
Километровые if?
Ответы: >>1142479 >>1143229
Аноним 2018/02/19 22:10:24  №1142474 329
>>1142461
Ну а если я захочу обрабатывать запросы php кодом без проксирующего сервера? Будут ли запросы в таком случае нормально обрабатываться?
Ответы: >>1142504
Аноним 2018/02/19 22:14:02  №1142479 330
>>1142467
Найн. Я реализовал через таблицы с атрибутами товаров и атрибутами категорий.

Есть категория, у неё есть десяток атрибутов. Эти атрибуты могут быть у товаров.

Далее на странице мы выводим все атрибуты в форме (с чекбоксами) и там уже просто ищем те товары, которые им соответствуют.

Ну у меня немного сложнее, т.к. присутствуют атрибуты разных типов (единичный чекбокс, множественный чекбокс, диапазон и т.д.)
Ответы: >>1142492
Аноним 2018/02/19 22:18:35  №1142486 331
>>1142442
Всё равно не перенаправляет.
Аноним 2018/02/19 22:24:10  №1142490 332
Господа, нормально ли использовать underscores в названиях методов?

То есть писать как-то так
$obj->method_name();

Я знаю, что в стандарте (PSR-1) указано, что использовать нужно camelCase, но с нижними подчеркиваниями выглядит аккуратнее имхо.
Ответы: >>1142519 >>1142547
Аноним 2018/02/19 22:27:18  №1142492 333
>>1142479
Ммм.
А можно на пальцах?
Допустим, создал я формочку, где есть чекбокс сортировки по цене или алфавиту.
Запросы в БД будут вида
order by name asc
order by name desc
или
order by price asc
order by price desc

Или ты предлагаешь сразу выгружать всю категорию? Но сортировать по условиям все равно придется - но уже массивы, в которые выгружена таблица.
Ответы: >>1142505
Аноним 2018/02/19 22:36:20  №1142503 334
Аноним 2018/02/19 22:38:15  №1142504 335
>>1142474

Сокеты в PHP доступны, так что ты можешь открыть сокет и принимать коннекты. Но в 1 поток. Чтобы сделать асинхронность, как в node, нужны неблокирующие сокеты и библиотека вроде ReactPHP. Но скажу честно, что с ней не все работает асинхронно: тот же PDO синхронный и блокирующий.
Ответы: >>1142605
Аноним 2018/02/19 22:39:22  №1142505 336
>>1142492
Сортировка - это одно. Я говорил именно про выборку товаров.

Хорошо. Попробую рассказать подробно.

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

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

Теперь у нас есть товары. У каждого товара должны быть эти атрибуты (но это необязательно). Какие именно значения должны быть?
Допустим у нашего мобильного телефона значения такие: черный, iOS, 3200.

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

Разумеется, между таблицами лучше сделать связи.

Теперь поиск.

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

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

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

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

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

1. Подсчитываем количество значений в запросе (то есть количество чекбоксов, которые юзер отметил).

2. Далее делаем выборку товаров по данным чекбоксам и отсеиваем те, количество которых не совпадает с количеством чекбоксов.

Но это мой способ, никто не говорит, что всё так и нужно делать. Я пришел к такому решению, оно меня устраивает - работает быстро и надежно.
Аноним 2018/02/19 23:09:07  №1142519 337
>>1142490
Нет, не стоит писать как тебе вздумается, лучше использовать единый стандарт, для питона руководствоваться PEP, для PHP - PSR2

В любой нормальной конторе тебя будут просить писать так, как принято в коммьюнити.
Ответы: >>1142529
Аноним 2018/02/19 23:39:39  №1142529 338
>>1142519
Спасибо. Найс, мне опять переписывать весь проект. Какой же я тупой, пиздец.
Ответы: >>1142547 >>1142555
Аноним 2018/02/20 00:39:13  №1142547 339
>>1142490
>>1142529

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

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

Если вдруг IDE не поддерживает такое, освоишь поиск/замену в файлах.

Зачем переписывать? Отрефакторь.
Ответы: >>1142633
Аноним 2018/02/20 00:55:02  №1142549 340
15190773031160.gif (78, 900x278)
278x900
Ковыряюсь с загрузкой файлов.
В PHP есть такая странная фича - если добавить в форму поле <input type="hidden" name="PHP_MAX_SIZE" value="кол-во байт">, то пхп сам проверит, умещается ли файл в эту цифру, иначе ошибка загрузки, как я понимаю. Конечно, это ни разу не безопасно, ведь число передать можно любое.
Есть хоть какие-то профиты от этой дырявой фичи? Например, может, пхп не будет грузить целый гиг, а сразу после 10мб - если лимит таков - выдаст ошибку?
Ответы: >>1142555 >>1143228
Аноним 2018/02/20 01:10:23  №1142553 341
Сап давч. Пытаюсь сделать схему бд для хранения инфы о загруженных файлах. В идеале это всё использовать через доктрин орм просто чтобы потрогать. Создал я в общем сущность файл с полями название и вес файла. Унаследовал её сущностью картинка, которая имеет так же поля ширина и высота например. И тут я понял что я нихера не понимаю как это реализовать в mysql. По идее мне нужно две таблицы, таблица картинка будет иметь внешний ключ таблицы файл, но файл может быть и не картинкой, тогда поля картинки будут null или что? А если добавить еще таблицы типа аудио/видео, там же вообще дичь будет твориться. Мне эти связи в бд даются крайне трудно.
Ответы: >>1143228
Аноним 2018/02/20 01:27:41  №1142555 342
>>1142529
Не нужно переписывать. Есть php-cs-fixer, который сам всё поправит, использовать через консольную команду php-cs-fixer fix path/to/project

Некоторые люди идут дальше - делают precommit hook - скрипт который срабатывает при попытке создать коммит - этот скрипт в автоматическом режиме фиксит кодстайл. Во многих библиотеках на гитхабе такое тоже используется, ещё там можно настроить бота (Style CI), который автоматически будет слать пулл-реквесты в репозиторий с кодстайл фиксами.

>>1142549
Лучше просто на стороне PHP провалидировать файл и только после аплоадить. Пример как это можно делать в Symfony: https://symfony.com/doc/current/reference/constraints/File.html#options
Ты же можешь просто if'ом проверить.

>>1142417
Загляни в исходники, это же микрофреймворк. Slim использует абстракцию для работы с HTTP: https://www.php-fig.org/psr/psr-7/

С объектами работать проще, чем с суперглобальными переменными, так как в коде становится видно зависимости, что облегчает юнит-тестирование и подмену таких зависимостей. И еcho ведь не всегда нужен, если я хочу просто отредиректить пользователя на другую страницу, то я выставлю HTTP заголовок 301 без тела HTTP ответа.
Ответы: >>1142633
Аноним 2018/02/20 01:34:14  №1142558 343
Как вкатиться в backend?
Ответы: >>1143228
Аноним 2018/02/20 01:46:56  №1142559 344
Сап пехепач, в последнее время испытываю сложности с проектированием архитектуры приложения. Простейшее мвс приложение могу построить с роутингом и мини орм, но код выглядит как то убого, не знаю как описать даже. Нету в нем завершенности, удобности. У меня небольшой опыт, хотелось бы понять как быть дальше. Читал банды четерех, может я тупой, но я вообще нихера не раскурил, куда мне себе все эти патерны вставлять. Тоесть я понимаю как работает синглтон, но когда его лучше использовать? Так же и с интерфейсами, фабриками. Я напилил кучу интерфейсов, сижу и путаюсь в них, мне кажется смысл был в другом же? Что бы все понятно было. Когда пишешь объектно, код становится каким то неуклюжим, трудно изменяемым, хотя пытаешься применять di, ioc, solid dry kiss. Но в итоге ты углубляешься в код ради кода, а не ради решения задачи. О великий гуру пхп треда, помоги как мне быть.
Аноним 2018/02/20 04:52:56  №1142591 345
15190915767560.jpg (34, 800x603)
603x800
>>1142298
>>1142393
> глобальные переменные
И че?

> php и html
И ЧЕ?

Блядь, вот я охуеваю. КТО СКАЗАЛ ЧТО ГЛОБАЛЬНЫЕ ПЛОХО? Кто-то пёрнул и ты тоже перди, мол, эта плохо, хотя всё на них и работает, блядь. Область видимости притащили, используй. Но кто-то со времён 2007го года тащит эту хуйню и оно идёт и едет.

Потом эти пидарасы, с шаблонизацией мозга. ЛОГИКА И ПРЕДСТАВЛЕНИЕ НЕ ДОЛЖНЫ СМЕШИВАТЬСЯ - на каждый чих твиги прикручивают, всякие тупорылые смарти и прочую хуйню. А шаблонизатор тоже предоставляет ЛОГИКУ и простые условия и прочую хуйню. Ну и нахуй мне логика в логике? Нахуй мне ещё пердолить какие-то тупорылые, блядь шаблонизаторы, когда в Yii всё работает адекватно и никто туда лезть не должен, сука. SaaS дохуя?

Из за таких пидарасов вкатываение становится проблемой. Припрутся, пёрнут, что всё плоха и всё. На пике кусочки кода, которым похуй на шаблонизацию. НЕТ, БЛЯДЬ. ДАВАЙ ПРО НЕЁ ПОПИЗДИМ. Уходи из треда и не возвращайся. Ты тут не поможешь ни чем, если будешь в таком же ключе отвечать людям и предлагать твиг вкорячивать.
Аноним 2018/02/20 08:01:09  №1142605 346
>>1142504
Легких потоков тоже нет, только процессы операционной системы?
Ответы: >>1143227
Аноним 2018/02/20 10:29:42  №1142626 347
>>1142306
>ооп
Это отдельная дисциплина?

>тестирование
Есть.

>фреймворки
С этим вот беда, лол.

>бд
Знаком.

>линукс
Достаточно хорошо знаю.

Спасибо за советы!
Аноним 2018/02/20 10:32:12  №1142628 348
Аноним 2018/02/20 10:51:00  №1142633 349
Аноним 2018/02/20 11:47:23  №1142655 350
>>1142559
Бамп, меня уже не вылечить? Или анон куратор тхреда еще не пришел?
Ответы: >>1142659 >>1142661
Аноним 2018/02/20 11:49:47  №1142659 351
>>1142655
Выбрось и то и другое быстрорешительно.
Ответы: >>1142665
Аноним 2018/02/20 11:51:15  №1142661 352
>>1142655
>куратор тхреда
Сука, я проиграл на весь дом.
Представил как куратор заставляет детишек писать на PHP, даёт задание запилить магазин, а потом в новостях его показываю как он заставил 2000 детей писать на PHP. Как же я проиграл
Ответы: >>1142663 >>1142664
Аноним 2018/02/20 11:55:17  №1142663 353
>>1142661
> заставляет детишек писать на PHP
Есть
>даёт задание запилить магазин
Есть, но только это файловый обменник
>а потом в новостях
Пока что нету, ждем на ньюсаче.
Аноним 2018/02/20 11:55:40  №1142664 354
>>1142661
Синий слон, все дела.

разбуди меня в 4.20 к дедлайну
Аноним 2018/02/20 11:56:08  №1142665 355
Ответы: >>1142682
Аноним 2018/02/20 12:25:54  №1142682 356
>>1142665
Скачай какой-нибудь фреймворк и смотри как он устроен. Со временем сам всё поймешь.
Ответы: >>1142686
Аноним 2018/02/20 12:35:43  №1142686 357
>>1142682
Ты еще банду 4х скажи почитать и скажи: "а там дальше разберешься". Это вопервых, во вторых в этих фремворках напихано оверхеда дохуя. Я читал и симфони и ларавель и юи. И теперь я могу тебе сделать говносимвони, шмаравель и хуюи, своим кодом, только это мне не помогло научится объектно что ли делать, хз как объяснить.
Иногда тебе надо применить ооп, на некой бизнес логике или каком либо сервисе, но тут уже попадаешь в тупик, так как это не скопировать просто структуру приложения от крутых дядек, а надо понимать самому, как сделать удобнее.
Поэтому я хоть и смотрел другие фреймворки, но все равно после этого не особо получается собрать все мысли в кучу, и написать что то более менее читабельное и понятное.
Ответы: >>1143225
Аноним 2018/02/20 12:43:12  №1142692 358
Анон, как сделать на PHP запрос к API с JSON?
Ответы: >>1142695 >>1143063
Аноним 2018/02/20 12:45:43  №1142695 359
>>1142692
что ТЫ хочешь СДЕЛАТЬ с JSON?
Ответы: >>1142696
Аноним 2018/02/20 12:48:21  №1142696 360
>>1142695
Дали задание: написать запрос к API и взять необходимые данные.
Сервак отвечает в JSON.
Вот мне и нужно записать код, чтобы при его запуске скрипт опрашивал сервак и забирал с него данные.
Ответы: >>1142697
Аноним 2018/02/20 12:51:38  №1142697 361
Аноним 2018/02/20 13:15:16  №1142711 362
>>1142591
>КТО СКАЗАЛ ЧТО ГЛОБАЛЬНЫЕ ПЛОХО
много кто, лол. в том числе, ОП. почитай в инторнете, если интересно

>Но кто-то со времён 2007го года тащит эту хуйню и оно идёт и едет
кто-то на дельфи пишет и оно все едет

>шаблонизатор тоже предоставляет ЛОГИКУ
не нужно воспринимать буквально. под "логикой и представлением" имеется в виду "логика МОДЕЛИ и представление".

>когда в Yii всё работает адекватно
лол, codeigniter еще вспомни

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

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

пиши дальше простыни кода с глобальными переменными, mysql_query и евалами, другим даже лучше. чем больше таких динозавров как ты, тем проще адекватным анонам устроиться на нормальную работу на нормальный фреймворк за приличную зп.
Ответы: >>1142741 >>1143247
Аноним 2018/02/20 13:47:00  №1142719 363
Почему header:location может не работать?
Ответы: >>1142721 >>1143225
Аноним 2018/02/20 13:47:32  №1142721 364
Аноним 2018/02/20 14:13:22  №1142733 365
посоны, чому fopen () создать файл не может? шоибок нету.
Ответы: >>1143225
Аноним 2018/02/20 14:23:36  №1142738 366
Привет анон. Только начинаю вкатываться. Хочу вкатится в админство. Уже могу в телнет и настройку свичей, управление/мониторинг l2 l3 l4 уровнями. Хочу вкатится еще глубже в админство. Так понял надо знания php, mySQL. В каком порядке стоит учить ? знания php на уровне работы с массивами. SQL на уровне создавал запросики для лаб в универе.
Ответы: >>1142742 >>1143225
Аноним 2018/02/20 14:32:00  №1142741 367
>>1142711
>твиги прикручивают, всякие тупорылые смарти
лол, слышал звон не знаю где он. твиг используют все, в т.ч. его часто используют на Yii2, а смарти - это мамонт из того же 2007, откуда и ты вылез.

ты поди и файлы на сервер по фтп заливаешь
Ответы: >>1142743 >>1143105
Аноним 2018/02/20 14:32:54  №1142742 368
>>1142738
нахуй админу пхп? ему скорее питон нужен
Ответы: >>1142744
Аноним 2018/02/20 14:33:38  №1142743 369
Ответы: >>1143247
Аноним 2018/02/20 14:34:43  №1142744 370
>>1142742
Ну под бзню. Чтоб апачем как бох владеть.
Аноним 2018/02/20 16:35:49  №1142805 371
Котятки, как можно автоматизировать синхронизация локальных файлов с теми, что на сервере валяются? Вручную делать как-то долбоебично, ибо нужно помнить какие файлы ты отредактировал и всё такое, что неудобно.
Аноним 2018/02/20 16:38:57  №1142810 372
>>1142805
И да, желательно без использования phpstorm
Ответы: >>1142867
Аноним 2018/02/20 17:38:42  №1142867 373
>>1142810
очень жаль, потому что в шторме это делается одним кликом

а так можно коммитить в удаленный репозиторий и по сценарию сборки автоматом прогонять тесты и загружать их на сервер. но это достаточно заебно в настройке
Ответы: >>1142892
Аноним 2018/02/20 18:17:23  №1142892 374
>>1142867
Через netBeans тоже можно такое настроить. Я покурил гугл, вроде что-то нашел.

Но а как это делают вообще все нормальные белые люди, не использующие phpStorm?

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

Так что ли?
Ответы: >>1142934
Аноним 2018/02/20 19:04:55  №1142927 375
По совету форумчан (>>1142437) решил установить bbcode. Почитал, посмотрел. В итоге час просидел в неудавшихся попытках установить это ссаное расширения PECL. Есть только для пхп 5.6. Пытаюсь ее пропердолить, вылазит ошибка php5ts.dll. Что делать?
опен сервер, винда 7
Ответы: >>1143039 >>1143224
Аноним 2018/02/20 19:11:21  №1142934 376
>>1142892
>Но а как это делают вообще все нормальные белые люди, не использующие phpStorm?
таких не существует лол

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

обычно простой деплой файлов используется для работы с дев-сервером, где у разработчика своя папка и свой хост, а сценарии сборки применяются для деплоя на продакшн или всякие стейджы.
Аноним 2018/02/20 20:49:10  №1143039 377
Ответы: >>1143049 >>1143050
Аноним 2018/02/20 21:00:51  №1143049 378
Ответы: >>1143053
Аноним 2018/02/20 21:03:32  №1143050 379
>>1143039
Порыскал на гите, есть отличные решения, но больно громоздкие для нескольких требующийся мне тэгов. Если что можно и на регулярках пописать в регулярки вообще не знаю, лол
Ответы: >>1143225
Аноним 2018/02/20 21:10:05  №1143053 380
>>1143049
>pear
Это менеджер пакетов. Тебе нужно поставить пакет для bbcode ручками или через менеджер.
Ответы: >>1143057
Аноним 2018/02/20 21:13:52  №1143057 381
Аноним 2018/02/20 21:26:19  №1143063 382
>>1142692
для запроса использоовать curl. Для парсинга json_decode()
Ответы: >>1143224
Аноним 2018/02/20 21:30:58  №1143066 383
>>1142805
использовать FTP/SSH клиент. Например, CuteFTP. Но он будет перезаливать все файлы. Для выборочной заливки нужно поставить на сервер SVN и использовать svn-клиент на своем компе.
Ответы: >>1143077
Аноним 2018/02/20 21:45:20  №1143077 384
>>1143066
>CuteFTP
>SVN
из каких берлог вы выползаете? там щас потепление что ли или что?
Аноним 2018/02/20 21:46:12  №1143078 385
Аноним 2018/02/20 21:53:17  №1143083 386
>>1142559
не надо пытаться впихнуть паттерны, потому что прочитал о них. открой код какого-нибудь компонента симфони (ОП рекомендует symfony form) и посмотри, как там сделано.

синглтон признан антипаттерном и вместо него следует использовать DI.
Ответы: >>1143096 >>1143223
Аноним 2018/02/20 22:19:00  №1143096 387
>>1143083
А как вообще лучше проектировать, Например у меня есть какое то стороннее апи отдающее жсон. И разные типы запросов и ответов.
Как спроектировать сервис на пхп? с какой стороны подойти?
Выделить объекты и установить связи между ними?
Ответы: >>1143215 >>1143223
Аноним 2018/02/20 22:24:32  №1143099 388
Давайте помолимся за создателя этого треда.
Ответы: >>1143118 >>1143208
Аноним 2018/02/20 22:28:44  №1143105 389
>>1142741
>ты поди и файлы на сервер по фтп заливаешь
А как их нужно заливать? просто интересно, другой анон
Ответы: >>1143215 >>1143223
Аноним 2018/02/20 22:39:07  №1143113 390
>>1141873
Демонстрируй давай
Аноним 2018/02/20 22:41:20  №1143114 391
>>1142591
>вкатываение становится проблемой
Ну если ты будешь себя так вести и так писать код, то для тебя проблемой станет работа и собеседования.
И вообще, не тролируй.
Ответы: >>1143220 >>1143247
Аноним 2018/02/20 22:44:51  №1143118 392
>>1143099
Я готов кидать ОПу копеечку на Патреон, но у него нет Патреона...
ОП, не думал о таком?
Мне хочется тебя отблагодарить, за твои добрые дела.
Ответы: >>1143224
Аноним 2018/02/21 01:31:02  №1143208 393
>>1143099
Я плачу каждый день, потому что не знаю как отблагодарить его.
Аноним 2018/02/21 01:45:51  №1143215 394
>>1143096
да легко, возьми существующую библиотеку для работы с АПИ, например google php api client и посмотри как там сделано.

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

обычно нужно сделать классы, отвечающие непосредственно за коннект и работу с данными (сам Client, всякие коннекторы, менеджеры паролей и т.д.), условно Request, и классы, которые представляют сущности того АПИ, с которым ты хочешь работать, условно Entity. а дальше нахуярить еще много всяких вспомогательных. короче смотри реальный код из библиотек.

>>1143105
по ssh конечно. фтп - небезопасный протокол.
Аноним 2018/02/21 01:56:09  №1143220 395
>>1143114
почему же, это типичная позиция какого-нибудь битрикс-программиста. мол все эти твиги и прочую бесовщину используют только хипстеры из кремниевой долины лол, а настоящий код он такой, страшный но работающий, с глобальными переменными и на 5.3.

представляю какой шок его ждет, если он узнает, что существуют конторы, где покрывают код тестами.
Ответы: >>1143247
Аноним 2018/02/21 02:03:49  №1143222 396
>>1142559

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

В программировании (как и в вообще в инженерных науках) для каждого решения есть обоснование. Почему мы хотим сделать так, а не иначе. Чаще даже есть не одно решение, а несколько, мы сравниваем плюсы и минусы и выбираем то, что лучше подходит. Вот например, если у тебя есть свободное время, ты можешь почитать отчет о разработке радиопередатчика для первого спутника (он длинный): http://russianspacesystems.ru/wp-content/uploads/2017/10/Otchet-o-razrabotke-bortovoy-radiostancii-pervogo-sputnika.pdf . В этом отчете формулируется задача, разбираются разные варианты ее решения, и каждый раз обосновывается, почему выбран тот или иной вариант. Например, почему были выбраны лампы, а не транзисторы. Вот в идеале у тебя в голове должен происходить такой же мыслительный процесс. Начинающему, может, это и сложно, но со временем надо к этому стремиться.

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

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

Есть хорошая статья по этой теме (как программисты пекли хлеб): https://habrahabr.ru/post/153225/ - обязательно прочти.

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

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

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

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

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

> Так же и с интерфейсами, фабриками.

Про интерфейсы есть урок - https://github.com/codedokode/pasta/blob/master/php/interfaces.md - там есть немного, но в общем интерфейсы мы используем, когда хотим дать возможность писать новые классы, с которыми сможет работать существующий код. Ну например, интерфейс логгера PSR-3 - мы используем в коде интерфейс, а не название конкретного логгера, и благодаря этому можем подключить любой логгер. Почитай про PSR-3 как пример использования интерфейсов, если не знаком с ним.

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

Из примеров использования фабрик я могу вспомнить разве что https://github.com/symfony/form - там есть класс FormFactory (он создает объекты форм и полей в формах - и те и другие там называются Form). Я, кстати, советовал бы тебе разбрать эту библиотеку, в том числе код, и нарисовать диаграмму классов в ней - там много интересного.

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

> Я напилил кучу интерфейсов
Зачем?

> Что бы все понятно было.
Да, так и должно быть.

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

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

> помоги как мне быть.
Так как ты не описал свою задачу и не показал куски кода, которые тебе не нравятся, то я могу только дать общие советы.
Аноним 2018/02/21 02:04:23  №1143223 397
>>1143096

Ты хочешь написать сервер API (раздавать данные всем), или клиент (получать данные из стороннего сервиса)?

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

>>1143083

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

>>1143105
>>1142805

Это называется "деплой". Гуглится по словам вроде "автоматизация деплоя php", если нет результатов - то же самое по-англйиски. Вот ссылка на гугл, изучай: https://www.google.ru/search?q=%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F+%D0%B4%D0%B5%D0%BF%D0%BB%D0%BE%D1%8F+php&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&newwindow=1&dcr=0&gbv=1

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

FTP точно использовать не надо, так как он не защищен и позволяет атакаующему просматривать и подменять информацию. Как замена FTP, есть SCP и SFTP - они работают через SSH. Правда, не так много программ, которые их поддерживают.

Ну а вообще, я обычно стараюсь автоматизировать деплой. Глупо тратить время на выделение файлов, нажатие кнопок в GUI, когда можно написать скрипт. В простой ситуации - bash-скрипт (программа на языке bash) с использованием утилиты rsync (он поддерживает передачу файлов по SSH), в сложной - плейбук для ansible. Учти, что многое из этого плохо работает или вовсе не работает под Windows.

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

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

Хотя конечно скриптами автоматизировать такие вещи удобнее, на мой взгляд.
Ответы: >>1143239 >>1143609 >>1143636
Аноним 2018/02/21 02:04:45  №1143224 398
>>1143118

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

>>1143063

Это не самый удачный вариант. curl требует указания разных опций, обработку ошибок и тд. Проще по моему взять библиотеку-HTTP клиент Guzzle.

>>1142927

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

- http://php.net/manual/ru/bbcode.installation.php

отсюда идем по ссылке:

- http://php.net/manual/ru/install.pecl.php

И изучаем все, что написано. Обычно это работает так:

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

Если ты используешь винду, то надо либо искать готовую dll-ку для твоей версии PHP на сайте pecl, либо собирать самому из исходников (это требует установить компилятор вроде Windows SDK или Visual Studio, качать исходники PHP, ставить их в нужную папку, возиться с командной строкой - в общем, будет больно. Описан процесс тут http://php.net/manual/ru/install.pecl.windows.php но без подробностей, а далее подробности надо искать тут https://wiki.php.net/internals/windows/stepbystepbuild_sdk_2#building_pecl_extensions ).

Ты не написал, какой версии у тебя PHP. Тут вот https://pecl.php.net/package/bbcode есть ссылка DLL, и если перейти по ней https://pecl.php.net/package/bbcode/1.0.3b1/Windows то какие-то добрые люди уже собрали расширение для PHP5.3, 5.4, 5.5 и 5.6. Для PHP7 они конечно не подойдут.

Ну и судя по истории релизов, оканчивающейся в 2010 году, с PHP7 это расширение вряд ли совместимо.

Гугление по "bbcode php7" выдает проект - https://github.com/esminis/php_pecl_bbcode - но там нет сборок под винду, то есть там дан только исходный код и надо его самому собирать. В принципе, наверно, это было бы неплохим опытом для тебя, попробовать собрать расширение под виндой, но рассмотрим еще другие варианты.

В документации написано, что есть аналог расширения в виде библиотеки на PHP - http://pear.php.net/package/HTML_BBCodeParser . Он ставится через PEAR - это менеджер библиотек, который умеет их скачивать и устанавливать, но сначала придется научиться им пользоваться, например, найти статью про него или изучить документацию. Но это точно проще, чем компилировать.

Также, есть еще другие разметки, кроме BBCode. Берешь список тут https://en.wikipedia.org/wiki/Lightweight_markup_language изучаешь каждую и проверяешь, есть ли для данной разметки php-библиотека. Например, поиском в packagist.org (репозиторий библиотек для композера).
Ответы: >>1143258
Аноним 2018/02/21 02:05:12  №1143225 399
>>1143050

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

>>1142738

Изучи linux, bash, основные утилиты. По PHP - от админа требуется только умение его установить и может чуть подправить php.ini (почитав мануал), по MySQL - установить и настроить, и на сайте MySQL есть 2 раздела специально для администраторов:

- https://dev.mysql.com/doc/refman/5.7/en/installing.html
- https://dev.mysql.com/doc/refman/5.7/en/server-administration.html

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

>>1142733

Может у тебя отключен их вывод через опцию display_errors в php.ini? Или включено их игнорирование через error_reporting? Проверь настройки (с помощью phpinfo()) и изучи логи, может там есть ошибка.

>>1142719

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

>>1142686

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

А еще, если вдруг ты не очень уверен в ООП, то у меня еще есть пара задач - про Гостиницу и Агенство - не хочешь хотя бы глянуть? https://phpclub.tech/pr/chain/1108694/

> во вторых в этих фреймворках напихано оверхеда дохуя.
А ты не думал, что это может быть сделано по какой-то причине? Вряд ли у них есть цель просто так увеличивать объем кода.
Ответы: >>1143724 >>1148023
Аноним 2018/02/21 02:05:40  №1143227 400
>>1142605

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

>>1142591

> КТО СКАЗАЛ ЧТО ГЛОБАЛЬНЫЕ ПЛОХО?
Вот ты бы разобрался сначала. Конечно, глобальные переменные плохо, если у тебя скрипт больше 200 строчек. Потому что их можно изменять из любой точки кода и понять, что в них находится в тот или иной момент времени, не изучая весь код, сложно. Более подробно про них ты можешь прочесть кусочек в пасте про DI: https://github.com/codedokode/pasta/blob/master/arch/di.md#Чем-плохи-глобальные-переменные

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

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

> ЛОГИКА И ПРЕДСТАВЛЕНИЕ НЕ ДОЛЖНЫ СМЕШИВАТЬСЯ
Конечно, не должны. Тяжело же читать код, когда идет 5 строк HTML кода, потом SQL запрос на 10 строк, потом разбор результатов этого запроса, потом еще 10 строк HTML и так далее. Удобнее в одном файле получать данные, а в другом выводить их на страницу. Особенно когда у тебя сложные страницы, содержащие много разных блоков и сложная логика получения данных. Почитай урок про шаблоны https://github.com/codedokode/pasta/blob/master/php/templates.md

> твиги прикручивают
Чем твиг лучше встроенного в PHP шаблона, подробно и доходчиво объясняется на главной странице сайта твига: https://twig.symfony.com/ - пробовал почитать?

> А шаблонизатор тоже предоставляет ЛОГИКУ
Логику представления, а не получения данных.

> вкатываение становится проблемой.
Проблема скорее всего в тебе и твоем восприятии. Заходи чаще в наш тред, проходи задачи из ОП-поста и может быть, ты все же сможешь разобраться, зачем нужна та или иная библиотека. У нас тебе всегда этого готовы объяснить.
Ответы: >>1143249
Аноним 2018/02/21 02:06:09  №1143228 401
>>1142558

"вкатиться" это значит "устроиться на работу"? В шапке же написано, ищешь вакансии на сайте вакансий, отправляешь отклик, проходишь собеседование и тд. Или тебя что-то конкретное интересует?

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

>>1142553

> И тут я понял что я нихера не понимаю как это реализовать в mysql.
Есть 3 паттерна наследования: Single Table Inheritance, Concrete Table Inheritance, Class table inheritance - погугли их для начала и потом задай вопрос, если непонятно.

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

>>1142549

Не стоит на нее полагаться, но добавить инпут можно. Что касается защиты от загрузки больших файлов, во-первых, есть опции в php.ini вроде post_max_size ( http://php.net/manual/ru/ini.core.php ), во-вторых, опции в конфиге веб-сервера, например в nginx https://nginx.ru/ru/docs/http/ngx_http_core_module.html#client_max_body_size

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

Тут объяснение https://phpclub.ru/talk/threads/%D0%97%D0%B0%D1%87%D0%B5%D0%BC-%D0%BD%D1%83%D0%B6%D0%BD%D0%BE-%D1%83%D0%BA%D0%B0%D0%B7%D1%8B%D0%B2%D0%B0%D1%82%D1%8C-%D0%B2-%D1%84%D0%BE%D1%80%D0%BC%D0%B5-max_file_size.76276/
Ответы: >>1144020
Аноним 2018/02/21 02:07:02  №1143229 402
>>1142467

Если построение SQL запроса, то использовать можно query biulder. Также, удобно сделать объект для представления фильтра.

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

>>1142417

В документации чуть-чуть упомянуто: https://www.slimframework.com/docs/v3/objects/router.html#route-callbacks

В Слиме используется подход, когда "контроллер" получает на вход объекты Запроса и пустой Ответ, и должен заполнить этот Ответ данными (кодом статуса, телом страницы, заголовками, и всем, что HTTP позволяет возвращать в ответе). Есть еще немного другой подход - в Симфони контроллер получает на вход HTTP-Запрос и должен создать и вернуть HTTP-Ответ.

Зачем? Ну, тут есть несколько причин:

- логичность. Теперь у нас контроллер не создает какие-то побочные эффекты (что-то выводит, создает заголовки, куки), а возвращает на выходе результат свой работы - HTTP-Ответ. Логично же, получаем Запрос, обрабатываем и возвращает Ответ
- взаимодействие с middleware. В Слиме есть middleware - обертки, которые могут модифицировать Запрос до его получения контроллером и модифицировать Ответ после того, как он создан, но до того, как он отдан в браузер пользователя. Очевидно, что для этого контроллер должен именно возвращать Ответ. Вывод через echo можно конечно перехватить (и он перехватывается), а вот выставленные через функцию header() заголовки перехватить нельзя и middleware их не получит и не сможет с ними ничего сделать.
- тестирование. Мы можем в тесте создать Запрос, вызвать контроллер, получить Ответ и проверить его правильность. Опять же, в случае использования echo/header напрямую, это невозможно.
- многоразововость. Мы можем в ходе работы скрипта вызвать контроллер(ы) несколько раз и получить несколько Ответов, и что-то с ними делать, как-то их использовать. Можно например сделать несколько контроллеров, каждый из которых отвечает за свою часть страницы.

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

>>1141976

В ОП посте упомянуты книги Зандстры и Шлосснейла(?). Единственный недостаток - староватые, но зато учат в правильном направлении. Ну и php the right way.


>>1142591

Ты вбросил в тред код - получил ожидаемую критику. Такие правила этого треда. Но, конечно, важно писать о недостатках корректно. Наша цель ведь не доказать, кто умнее, а обучить.
Аноним 2018/02/21 02:07:58  №1143230 403
>>1141834

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

> Как в PDO заменить mysql_real_escape_string так, чтобы оно работало?
Оно там не нужно, используй плейсхолдеры для вставки значений в запрос. Прочти ты уже любую статью про PDO, где объясняются плейсхолдеры.

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

По работе с формами - не надо использовать сессии для ошибок, есть алгоритм гораздо лучше: https://github.com/codedokode/pasta/blob/master/forms.md

В коде есть и просто ошибки, например, бессмысленная строка

$dateTime;

Далее, quote() в первом примере испоьзован неверно.

strlen тоже использован неверно, почитай урок https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md

По поводу архитектуры - я бы советовал прочесть урок про MVC ( https://github.com/codedokode/pasta/blob/master/arch/mvc.md ), заметь что он не требует ООП и ты можешь получить его, просто вынеся часть кода (например, получение данных из БД) в отдельные функции. Это, например, облегчит повторное использование кода (сейчас у тебя код получения данных вплавлен в шаблон и его нельзя вызвать из другого места) и тестирование.

В четвертом примере у тебя SQL инъекция: https://github.com/codedokode/pasta/blob/master/security/sql-injection.md

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

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

>>1141811

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

Может они так пытаются упростить код, избавившись от DI? Так там внутри вроде как есть DI конейнер, просто эти статические "фасады" скрывают его наличие.
Ответы: >>1145616 >>1145618
Аноним 2018/02/21 02:08:21  №1143231 404
>>1141532

Какие именно тесты? Юнит-тест например можно просто написать руками. Ну допустим, протестируем функцию mb_strlen:

$len = mb_strlen("Привет");
if ($len != 6) {
throw new TestFailedException("Expected 6, got $len instead");
}

Дальше ты можешь сделать какие-то вспомогательные функции. А потом ты обнаружишь что написал слабый и кривой аналог phpunit.

>>1141528

Есть хороший учебник на примере Питона http://aliev.me/runestone/

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

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

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

>>1141492

Как я написал выше, либо юнион, либо денормализация с добавлением таблицы, хранящей ссылки на 3 последних поста для каждого треда.

>>1141330

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

- array_rand возвращает не значения элементов, а их ключи. Тебе надо самому получить значение из массива по ключу (подсказка: для этого есть квадратные скобки: $value = $array[$key]).
- если попросить 1 ключ, array_rand вернет его. А если 2 или больше - то вернет массив ключей. (это плохой подход, возвращать результат в разных форматах, не делай так). Потому в мануале там использованы квадратные скобки.

> то тут первая и вторая строки (где значения из 1, 2 и 3 массива) получаются абсолютно идентичными.
А это потому что у тебя код в стиле:

- взять случайное слово и записать его в переменную $rand1
- вывести в первой строке $rand1
- вывести во второй строке $rand1

Очевидно, что строки будут одинаковые. Тебе нужны разные переменные для первой и второй строк. Либо же использовать цикл из 2 шагов (на каждом шаге генерируем и выводим одну строку).
Ответы: >>1143238
Аноним 2018/02/21 03:03:29  №1143237 405
Аноны, сам Господь спустился с небес и отвечает нам!

Спасибо большое, отпишусь. Я делал на PHP клонирование части логики с одного сервера на другой, когда выстраивал систему обновления сайта. Там по одной кнопочке запаковывался архив с .php файлами, отправлялся просто по https, далее там уже распаковывался и всё такое.
Разумеется, все с использованием хеша от (данные + секретный ключ), так как с этим нужно осторожнее быть.
Но я отказался от этой системы, т.к. боюсь, она не слишком надежная.

>>1142805 анон

Ответы: >>1143238 >>1143239
Аноним 2018/02/21 03:03:48  №1143238 406
Аноним 2018/02/21 03:04:49  №1143239 407
Аноним 2018/02/21 03:47:33  №1143242 408
Не стукайте, я тут задачу с кредитным айфоном принес. Правильно ли я решил? https://ideone.com/wjQilA
Аноним 2018/02/21 03:59:06  №1143243 409
15191747464430.png (15, 785x125)
125x785
>>1143242
и еще пара вопросов
1. подскажите обязательно ли заключать переменные находящиеся в echo внутрь скобок {}, пробовал без них все работает. Зачем они нужны?
2. Что выделено на пике является дурным тоном в написании кода? html так вставлять нельзя, как я понял.
Ответы: >>1143248 >>1151825
Аноним 2018/02/21 04:39:53  №1143247 410
>>1142743
>>1142711
ЯСНА ВСЁ. Не передёргивай, говорит, а сам передёргивает. Смарти ему из 2007го... а условий, операторы и прочее в твиг не завезли, да? Ладно, ты уточнил на счёт отделение "логики". Но ведь её и отделяют. Модели и пр. Какая, нахуй, разница - видишь ли хтымыло вместе с пшп, или видишь свой ебучий твиг?

> пиши дальше простыни кода с глобальными переменными, mysql_query и евалами
Ниче ты ПЕРЕДЁРГИВАЕШЬ

>>1143114
>>1143220
Я насмотрелся уже на хипстеров, которые работая над одним говносайтом, накручивают на него твиги и ебашат его через ГИТ, просто потомушто модно. А если туда надо прикрутить пару процедурок, которые он ниасилил в ходе понимания seo, то ОБЯЗАТИЛЬНА ДАВАЙ ЧЕРЕЗ ГИТ, МНЕ ВАЖНА, НИКТО НИРАБОТАИТ С МАИМ САЙТАМ, НО Я ПАСТАЯННА ГИТПУШУ И ГИТАПДЕЙТЮ И ТЫ ТАК ДЕЛАЙ, НА ХАБРЕ ТАК СКОЗАЛИ.

Про читаемость они мне будут тереть. Научите тут лучше людей классы писать, вызывать всё это, а свои советы про твиги уносите. Принесут догматы про глобалы, твиги, ТЕСТЫ... в тред начинающих, гиты свои прилепят, со словами ТАК НАДА, и рады, ёпт.
Ответы: >>1143339 >>1143354
Аноним 2018/02/21 04:41:23  №1143248 411
>>1143243
это с простыми именами переменных всё нормально

Если будешь выводишь массивы или объекты (не уверен на счет них), то уже не будет работать так просто.
https://ideone.com/YKEYEP

Ты можешь делать так, как тебе больше нравится, просто знай что можно делать, а что нельзя.
Ответы: >>1143454
Аноним 2018/02/21 04:41:57  №1143249 412
>>1143227
А вот тебе спасибо, пишешь лучше.
Аноним 2018/02/21 06:50:12  №1143255 413
>>1141364
>>1141452
>>1141859
Думаю превращение экземпляра класса PHP в JSONAPI объект нельзя назвать просто сериализацией, т.к. мы не только сериализуем класс, когда получаем JSON объект, но предварительно трансформируем класс в объект JSONAPI, например resourceObject, который в свою очередь имеет определенную структуру с обязательными свойствами. И обратная трансформация в большинстве случаев невозможна, т.к. resourceObject не содержит методов класса.

>>Мапирование (иногда маппинг, маппирование, мэппинг, но не путать с маппингом игровых уровней) — определение соответствия данных между потенциально различными семантиками одного объекта или разных объектов. Термин понимается очень широко от отображения одной последовательности элементов на другую последовательность до банальной конвертации файлов.
Мапер / мапирование норм слово для этого случая.
Аноним 2018/02/21 07:45:47  №1143258 414
>>1143224
Понял, брат. Здоровья тебе.
Аноним 2018/02/21 10:02:02  №1143280 415
Плохо ли хранить JSON в SQL и если да, почему?
Я тут пришел джуниором в реальный проект с хайлоадом, и тут дохера чего в базе лежит джсоном. Например, если брать прикрепление файлов к посту. По методичке тебе нужна таблица files, где каждая строка хранит id поста. У нас же в таком случае просто в таблице posts будет поле files, а в нем json с массивом файлов. Это норм?
Аноним 2018/02/21 10:50:51  №1143291 416
>>1143280
Тоесть они хранят в базе, формат передачи данных для JS?
>У нас же в таком случае просто в таблице posts будет поле files, а в нем json с массивом файлов.
Это даже не говнокод, это уже клиника.
Ответы: >>1143295
Аноним 2018/02/21 10:54:20  №1143295 417
>>1143291
JSON - это форматы передачи данных между приложениями. Он основан на JS, но может быть использован где угодно.
Ответы: >>1143298
Аноним 2018/02/21 10:55:58  №1143296 418
>>1143280
Если не будет поиска по имени файлов или еще каким-то их параметрам, не нужно будет mysql с ними работать, вывести и все,
тогда норм.


Иначе избыточно получается.
Ответы: >>1143300
Аноним 2018/02/21 11:00:32  №1143298 419
>>1143295
Я знаю что такое JSON.
Только фишка в том, что он предназначен для формирования из БД. ПРи хранении его в самой бд ты теряешь всю суть JSON, надо получить немного другие данные - хрен, надо изменить выборку - хрен, надо провести другой запрос отличный от задачи - хрен. Надо улучшить бд - хрен, надо решить новую задачу и добавить полей к базе - заново перелопачивать каждое поле.
Аноним 2018/02/21 11:03:18  №1143300 420
>>1143296
А потом все стоят и кумекают почему это хайлоап забивает 99% процессора, когда там всего-то неиндексированные имена файлов. Поэтому. Я вот удивляюсь кто в команду берёт людей на архитектуру приложений без знаний даже начальных по БД. И причём смысл то непонятен. Ну вот убрал он ID, а взамен что получил? Ничего же. Где профит то?
Аноним 2018/02/21 12:39:27  №1143339 421
>>1143247
>условий, операторы и прочее в твиг не завезли, да?
все завезли

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

и опять же я не предлагаю вводить новые ("новые" лол) технологии только ради того чтобы они были.

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

>Научите тут лучше людей классы писать
одно другому не мешает. изучение технологий - это такая же часть обучения, как изучение ООП
>работая над одним говносайтом
тут сидят не только те, для которых работа программистом - это работа с говносайтами
>в тред начинающих
и не только начинающие
Аноним 2018/02/21 12:42:08  №1143345 422
>накручивают на него твиги и ебашат его через ГИТ, просто потомушто модно

это реально же смешно, это как бабка из того видоса "нам инторнет ваш нахуй не нужон!"
Ответы: >>1143354
Аноним 2018/02/21 12:49:57  №1143354 423
билядь опять промахнулся
>>1143247
>>1143345

>Научите тут лучше людей классы писать
я какбэ на такие вопросы тоже отвечаю
Аноним 2018/02/21 15:45:09  №1143439 424
>>1143280
>Плохо ли хранить JSON в SQL и если да, почему?
Если нет выборки по содержимому JSON, то хорошо, если есть такая выборка - то плохо. Потому что индексация.
Ответы: >>1143441
Аноним 2018/02/21 15:46:54  №1143441 425
>>1143439
А если нет выборки, зачем вобще JSON в БД хранить? Можно запилить папку где всё это складировать и получить эдакую документоориентированную СУБД простейшую.
Ответы: >>1143559 >>1143605
Аноним 2018/02/21 16:01:43  №1143454 426
Аноним 2018/02/21 17:29:39  №1143559 427
>>1143280
это сложный вопрос. возможно в вашем случае это экономит ресурсы. если, например, вы точно знаете, что никогда не нужно будет переформатировать этот жсон, добавлять туда что-то и т.д. тут лучше спросить у начальника, наверняка он знает причины.

субд то какая?

>У нас же в таком случае просто в таблице posts будет поле files, а в нем json с массивом файлов. Это норм?
возможно, это денормализация (второй вариант - просто всем похуй, что вряд ли в хайлоаде). ее применяют, если запрос в рамках соответствия 3нф выполняется слишком долго (большие объемы данных и/или много джоинов).

>>1143441
это тебя на такую мысль сподвиг анон любитель глобальных переменных?

зачем его хранить в бд - а зачем данные типа "текст" хранить в бд? странный вопрос. если они у тебя в базе, ты можешь:
1. подрубить к ним сфинкс в случае необходимости
2. перекатиться на другую субд
3. раскатать данные по разным шардам
4. обращаться к ним в рамках одного запроса к базе, без костылей. если ты используешь ОРМ, то вообще без вариантов
5. ограничивать права (это можно сделать и ограничением прав на папку, но там есть лазейки)
6. делать бэкапы теми же средствами, которыми ты бэкапишь бд

это первое что в голову пришло. а какие плюсы у твоего решения?
Аноним 2018/02/21 17:31:55  №1143562 428
Ответы: >>1147348 >>1149556
Аноним 2018/02/21 17:33:22  №1143565 429
>>1143559
>>1143280
>возможно, это денормализация (второй вариант - просто всем похуй, что вряд ли в хайлоаде)

кстати третий вариант: всем раньше было похуй, а потом это стал хайлоад. обычно бывает как раз так
Ответы: >>1143571
Аноним 2018/02/21 17:33:26  №1143566 430
>>1143559
>это денормализация
Тогда создаётся плоская таблица и в ней столбики.
Аноним 2018/02/21 17:34:40  №1143569 431
>>1143559
Ну опять же всё перечисленное можно сделать и без БД.
>6. делать бэкапы теми же средствами, которыми ты бэкапишь бд
Делать бэкапы вообще любыми средствами.
Ну хз я вообще не вижу преимужеств хранений JSON в БД. Какое-то извращение по моему.
Ответы: >>1143581 >>1143601
Аноним 2018/02/21 17:35:43  №1143571 432
>>1143565
Обычно это бывает когда кто-то слишком "Хорошо" оптимизирует БД. И после этого простое приложение превращается в хайлоад.
Аноним 2018/02/21 17:42:49  №1143581 433
>>1143569
>>1143559

Блин, я вообще сложно себе представляю именно запрос по которому нужно получить JSON именно из БД. Я привык к логике когда запос обрабатывается в бэке и потом бэк формирует JSON. А тут походу они получают миллиард JSON, или мудрят очень навороченные запросы чтобы получить что-то определённое. Опять же всё это даёт довольно большую нагрузку на сервер, на СУБД, на саму обработку запроса. Но при этом на формирование JSON сервер не тратит ресурсов. Или они просто отдают с десяток мегабайт JSON клиенту, а тот сам всё обрабатывает на своей стороне.
Вот хоть убей не вижу профитов такой схемы.
А в >>1143559 ну хорошо, вот только опять же просто в полях хранить данные хранить проще же, и обслуживать проще, и редактировать. Я уже представляю как неверный запрос редактирования случайно редактирует пару сотен лишних ячеек. Короче какая-то странная архитектура если это не документо ориентированная БД.
Ответы: >>1143592 >>1143601
Аноним 2018/02/21 17:51:29  №1143592 434
>>1143581

Вообще, такое иногда бывает нужно. Например, в файлообменнике мы собираем информацию о файле, которая бывает разная в зависимости от типа файла (длительность видео, битрейт, кодек, параметры кодека и тд). Ее удобно хранить как JSON, альтернатива - использовать EAV. Поля под нее делать неудобно, так как свойств может быть много, они сами по себе могут содержать массивы и тд.
Ответы: >>1143597
Аноним 2018/02/21 17:55:45  №1143596 435
>>1143280

Я думаю, дело тут не в хайлоаде, а просто в лени. Из недостатков - поиск по имени файла сделать почти невозможно (в postgresql впрочем можно сделать индекс по отдельному полю JSON документа). Какие-то запросы (вроде найти посты с большим числом файлов) делать неудобно.
Аноним 2018/02/21 17:56:47  №1143597 436
>>1143592
А как потом собирать эту информацию? Ну вот например мне нужны все файлы MKV весом больше 5 метров и меньше 250. Я вижу тут только запрос через LIKE. И тут же я понимаю что это ведь довольно сильно даст нагрузки по СУБД. Или вот. Надо все JPG разрешением больше 4к, пережать. Как в таком случае редактировать уже занесённые данные?
Ответы: >>1143599 >>1144475
Аноним 2018/02/21 17:58:35  №1143599 437
>>1143597

Вообще, в Postgres и в новой MySQL есть функции для разбора JSON, а postgres даже позволяет делать индексы по произвольным выражениям, в том числе по полю в JSON.

Аноним 2018/02/21 17:59:20  №1143601 438
>>1143569
>Ну опять же всё перечисленное можно сделать и без БД
только с костылями

>я вообще не вижу преимужеств хранений JSON в БД
если ты имеешь в виду "в сравнении с хранением их в файлах", то я тебе назвал шесть. а если про саму идею хранения данных сразу в json, то я согласен.

>>1143581
>просто в полях хранить данные хранить проще же

я и не защищаю такую хуйню, просто пытаюсь восстановить логику событий
Аноним 2018/02/21 18:03:37  №1143605 439
>>1143441

Тут есть недостатки:

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

То есть я вообще плюсов не вижу. В чем они? Если тебе хочется хранить данные в файле, есть встраиваемая СУБД sqlite, которая именно это делает.

Пока просто ощущение, что анон думает, что написать свою БД будет быстрее, чем разобраться в уже написанной.
Аноним 2018/02/21 18:05:09  №1143607 440
ОП, а как ты автоматизируешь деплой проекта?

допустим, у тебя есть локальный дев-сервер, приватный "главный" репозиторий на битбакете, куда ты пушишь изменения. какие средства используешь?
Ответы: >>1143609
Аноним 2018/02/21 18:08:08  №1143609 441
>>1143607

Выше же было про деплой >>1143223

Самый простой вариант - сделать bash скрипт и в нем написать команду обновления файлов из удаленного репозитория. Заходишь по ssh на сервер и выполняешь этот скрипт.
Ответы: >>1143636
Аноним 2018/02/21 18:16:39  №1143617 442
Аноним 2018/02/21 18:34:53  №1143636 443
>>1143609
>
>Выше же было про деплой >>1143223
я читал, поэтому и стало интересно, что именно ты используешь. я конечно имею в виду уже существующие решения. искал, нашел вот что:
https://deployer.org/docs/getting-started
как раз вариант простого скрипта, о котором ты говоришь. он занимается вопросами типа установки пакетов композера, нпм и т.д., блокировки проекта на момент обновления, но не решает (насколько я понял) с АВТОМАТИЧЕСКИМ обновлением, т.е. ты запушил - он спуллил.
https://www.phing.info/
тут честно говоря черт ногу сломит, но я так понимаю он умеет все

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

>>Заходишь по ssh на сервер и выполняешь этот скрипт
вот этот процесс и хотелось бы автоматизировать (не заходить и не запускать каждый раз)
Ответы: >>1143644 >>1143662 >>1151825
Аноним 2018/02/21 18:43:56  №1143644 444
>>1143636
Пихаешь в крон, ну сириосли, что за вопросы.

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

П.С Если влом курить баш (что зря), напиши ПХП скрипт.
Ответы: >>1143663
Аноним 2018/02/21 18:57:06  №1143662 445
>>1143636

Ты можешь сделать репозиторий на том же сервере и настроить хуки, чтобы при пуше в него запускался деплой. Также можно установить какой-нибудь Jenkins и попробовать там настроить запуск деплоя при коммите.
Ответы: >>1143673
Аноним 2018/02/21 18:57:26  №1143663 446
>>1143644
я чот сомневаюсь, что это типичный флоу - использовать крон вместо того, чтобы просто ловить вебхук, который шлет гит-сервер.

я перефразирую вопрос (хотя думал, что он достаточно понятно сформулирован): какими КОНКРЕТНО решениями пользуются аноны и почему?
Ответы: >>1143668 >>1143671
Аноним 2018/02/21 19:02:39  №1143668 447
Ответы: >>1143673
Аноним 2018/02/21 19:03:14  №1143669 448
По wordpress есть ветка или здесь спрашивать можно?
Ответы: >>1151825
Аноним 2018/02/21 19:03:34  №1143671 449
>>1143663
бля, сорян, обосрался, то не офф дока.
Пойду выпилюсь
Аноним 2018/02/21 19:04:48  №1143673 450
>>1143662
>>1143668
спасибо

>Офф дока гита сойдет не?
подойдет
Аноним 2018/02/21 20:15:00  №1143724 451
>>1143225
>Открой в браузере инструменты разработчика на вкладке Network и изучи, какие заголовки отдает твой скрипт. Так не сказать.

Да там примитив. Год назад работало, сейчас откопал и решил скопировать схему авторизации - а нихрена.
Код вида

extract($_POST);
if(isset($login) && isset($password)) {
if($login == 'условие' && $password == 'условие') {
header("Location:адрес.страницы");
setcookie("имя_кука", "true", time() + 3600247, "/", null, false, false);
}
else {
setcookie("имя_кука", "false");
header("Location:адрес_другой.страницы");
}
}
Ответы: >>1151825
Аноним 2018/02/21 21:15:20  №1143784 452
15192369209660.png (72, 768x431)
431x768
15192369209671.png (41, 912x651)
651x912
Как сделать так что бы команда break завершала цикл после достижения 0
Ответы: >>1143795
Аноним 2018/02/21 21:23:06  №1143795 453
>>1143784
0 - это creditbalance?
if (creditbalance == 0)
break;
Аноним 2018/02/21 22:41:53  №1143875 454
15192421136020.jpg (1308, 1920x1200)
1200x1920
ньюфаг в треде. Сразу пара вопросов про контору "Вектор"

1. Почему количество коффе,которое задается в условии для каждой профессии не является свойством? (так написано в подсказках)

2. Зачем нужно свойство "профессия" (так написано в подсказках)?

я только началл ООП и сильно плаваю не стукайте

Ответы: >>1144441 >>1151826
Аноним 2018/02/21 23:13:55  №1143907 455
Не совсем понимаю как в задаче про калькулятор, сделать так, чтобы выполнилось действие, которое находиться в переменной $op.
Только ли через if/else это можно сделать?
Ответы: >>1151826
Аноним 2018/02/21 23:56:53  №1143947 456
какой-то пиздос. этот гопник совместил паттерн пул объектов и синглетон и получился какой-то вырвиглазовый ужас:

<?php
/
Общий интерфейс пула одиночек
/
abstract class FactoryAbstract
{

/

@var array
/
protected static $instances = array();


/
Возвращает экземпляр класса, из которого вызван

@return static
/
public static function getInstance()
{
$className = static::getClassName();
if (!(self::$instances[$className] instanceof $className)) {
self::$instances[$className] = new $className();
}
return self::$instances[$className];
}

/

Удаляет экземпляр класса, из которого вызван

@return void
/
public static function removeInstance()
{
$className = static::getClassName();
if (array_key_exists($className, self::$instances)) {
unset(self::$instances[$className]);
}
}

/
Возвращает имя экземпляра класса

@return string
/
final protected static function getClassName()
{
return get_called_class();
}

/

Конструктор закрыт
/
protected function __construct()
{
}

/
Клонирование запрещено
/
final protected function __clone()
{
}

/

Сериализация запрещена
/
final protected function __sleep()
{
}

/
Десериализация запрещена
/
final protected function __wakeup()
{
}
}

/

Интерфейс пула одиночек
/
abstract class Factory extends FactoryAbstract
{

/
Возвращает экземпляр класса, из которого вызван

@return static
/
final public static function getInstance()
{
return parent::getInstance();
}

/

Удаляет экземпляр класса, из которого вызван

@return void
/
final public static function removeInstance()
{
parent::removeInstance();
}
}

/
=====================================
USING OF MULTITON
=====================================
/

/
Первый одиночка
/
class FirstProduct extends Factory
{
public $a = [];
}

/

Второй одиночка
*/
class SecondProduct extends FirstProduct
{
}

// Заполняем свойства одиночек
FirstProduct::getInstance()->a[] = 1;
SecondProduct::getInstance()->a[] = 2;
FirstProduct::getInstance()->a[] = 3;
SecondProduct::getInstance()->a[] = 4;

print_r(FirstProduct::getInstance()->a);
// array(1, 3)
print_r(SecondProduct::getInstance()->a);
// array(2, 4)
Аноним 2018/02/22 02:03:11  №1144020 457
>>1143228
>Есть 3 паттерна наследования: Single Table Inheritance, Concrete Table Inheritance, Class table inheritance - погугли их для начала и потом задай вопрос, если непонятно.
В общем почитал я про них, как я понял единого верного варианта нет. Я могу просто прикинуть что расширяющих файл сущностей у меня будет точно не много (изображение, аудио, видео), и использовать одну общую таблицу. Хотя более логичным мне кажется использовать паттерн одна сущность - одна таблица без явных связей с другими таблицами(Concrete Table Inheritance), ведь объект полностью имеет поля своего предка, и раз в бд нельзя провернуть наследование, то может оно и не нужно? Хотя говорю я это без опыта работы с любыми орм и паттернами бд, на практике хз как выйдет.

И у меня еще вопрос по поводу хранения файлов. Я правильно понимаю что в бд я записываю путь к файлу, который лежит на диске, а потом при отправке пишу нужные заголовки и вставляю туда же путь к файлуу слима вроде обёртка есть для переменной _FILES,
но я в подробности не вникал
, и он оп и отправился?
Ответы: >>1151826
Аноним 2018/02/22 02:09:22  №1144022 458
Сап.
Друзья, вопрос...
Есть верстка сайта школы стилистов. На одной из страниц выводятся все курсы с кнопкой "Узнать подробнее", при нажатии на которую, открывается страница с подробной информацией об этом курсе.

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

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

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

Спасибо, очень жду ответа, потому что время поджимает...
Ответы: >>1144208 >>1146708
Аноним 2018/02/22 09:49:15  №1144074 459
Учите симфони, битрикс это пиздец.
Ответы: >>1144090 >>1144180 >>1144222
Аноним 2018/02/22 10:53:38  №1144089 460
Как реализовать роутинг на мапах или деревьях? Во всех статьях что находил только на регулярках.
Ответы: >>1144091 >>1151828
Аноним 2018/02/22 10:56:22  №1144090 461
>>1144074
Работу не найти по симфоне. На битрикс дофига вакансий. А если с английским разговорным плохо, то вообще не найти симфони.
Ответы: >>1144098 >>1144193
Аноним 2018/02/22 10:58:15  №1144091 462
>>1144089
лол, подставляешь в качестве ключа, название роута, а в качестве значения, либо функцию которая открывает тебе твой контроллер, либо другой массив с ключами других роутов.
Ответы: >>1144122
Аноним 2018/02/22 11:13:54  №1144098 463
>>1144090
Коллега устроился на 15к на первый месяц наработал стаж - год и ушел из этой конторы в другую на 50к. Вышки у него нет.
Ответы: >>1144099 >>1144126
Аноним 2018/02/22 11:15:34  №1144099 464
>>1144098
Такое только до 2010 прокатывало. Сейчас такого простого вката нету, только битрикс, край вп.
Аноним 2018/02/22 11:49:33  №1144119 465
15192893737890.png (372, 640x480)
480x640
Сап обучающий. Хочу сделать сайт среднего функционала в качестве хобби. Сайт этот никуда не пойдет, буду делать фор фан. Хочу использовать php движок, раньше были DLE и Joomla! в связи с этим интересуюсь появилось ли чегонибудь интересного в этой сфере, конкретно движки. Гуглить пробовал, но интересует Ваше мнение.
Ответы: >>1144202 >>1151828
Аноним 2018/02/22 11:57:17  №1144122 466
>>1144091
Если по твоему это так просто, то почему статей нет, почему все пишут на регулярках? А на деревьях знаешь как сделать?
Аноним 2018/02/22 12:00:05  №1144126 467
>>1144098
Это в каких-таких Мухосрансках нет симфони?

Симфони ща в любой дырке затычка:
Ларавель - юзает библиотеки Симфони
Друпал 8 - юзает компоненты Симфони

Тем более Симфони, это автоматически юзание композера.. Со знанием Композера заехать в тот же YII2 вообще на изи.

Даже в моей ебучей провинции 3-4 ваканчии в пару месяцев появляется. Какой нахой Битрикс.
Битрикс программист вообще не программист а собиратель говна и палок, чтобы клеить костыли.
Нм одна блять здравая контора не возьмет Битрикс как основу для проекта выше обычного.
Интеграция с Адинэс из коробки (единственный плюс Битрикса) не является сколь либо сложно задачей для имея на руках библиотеку уровня Симфони/ЮаЙаЙ
Ответы: >>1144144
Аноним 2018/02/22 12:06:13  №1144131 468
В этом задании
https://phpclub.tech/pr/chain/1108694/
Тут просто надо методы прописать и параметры объектов? Или надо еще указать как взаимодействуют объекты между собой? Надо ли подключить базу и как то настроить все?
Ответы: >>1144258
Аноним 2018/02/22 12:18:00  №1144144 469

>>1144126
Какая разница кто что юзает, причем тут композиры?

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

В битрикс вкатываешься стажером и все. Хотя постепенно битрикс тоже переходит такую модель, как брать только опытных с 1-3 года опыта. Становится труднее вкатится, но все еще можно.

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

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

Ты в какой провинции живешь? Квебек? В провинция ойти вообще нету. Одни 1с и битриксоиды. А если и появляется то надо чтоб в мухосрани ты откуда то получил опыт в 3 - 5 лет чтобы взяли.

Насмешил меня, спасибо.
Ответы: >>1144154 >>1144193
Аноним 2018/02/22 12:31:56  №1144154 470
>>1144144
>Какая разница кто что юзает, причем тут композиры?
>Вопрос в другом, каких контор больше, битрикс клепальщиков или симфони ковыряльщиков и куда вкатиться проще.
Вопрос в том что вкатиться ты вкатишься, а вот выкатиться из этого говна будет проблематично.
Лучше сразу вкатываться где прямые руки писали, чем потом переучиваться в пряморукий кодинг.

>В битрикс вкатываешься стажером и все. Хотя постепенно битрикс тоже переходит такую модель, как брать только опытных с 1-3 года опыта. Становится труднее вкатится, но все еще можно.
В крупных компаниях есть Trainee, есть фриланцы и т.д. было бы желание

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

>Ты в какой провинции живешь? Квебек? В провинция ойти вообще нету. Одни 1с и битриксоиды. А если и появляется то надо чтоб в мухосрани ты откуда то получил опыт в 3 - 5 лет чтобы взяли.

Хохлостанская южная мухосрань. У нас тут около 15 компаний в городе. Есть такие же битрикс-клепальщики, есть малые стартапы за доширак и опыт, если филиалы крупных компаний типа ДатаАрта. Короче на любой вкус.

Плюс опять же никто не отменял удаленку.

На серьезных щщах реально втирать что Битрикс тру - ну это пиздец. Есть задачи, для которых он хорош (тот же 1С), и дядя доволен что сайт быстро заработал и за десять тыщь - но в целом это тупиковая ветка если есть желание уйти куда в хай лоад или биг дату со временем.
Ответы: >>1144163 >>1144193
Аноним 2018/02/22 12:51:47  №1144163 471
>>1144154
>Хохлостанская
Ну я так и понял. Ты вообще не вкурсе, что тут происходит. О чем с тобой говорить.

>мухосрань
>15 компаний
Ну ну, мухосрань, конечно.

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

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

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

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

Смысл бесполезного хейта битрикса? Тебе говорят как есть, причем в другой стране, ты говоришь да как такто, у нас же все так. Никто не спорит, что есть у него свои недостатки. Но нету выбора, по описаным выше причинам.
Ответы: >>1144193 >>1144197
Аноним 2018/02/22 13:20:16  №1144180 472
>>1144074
Добавлю, что если и вкатываетесь, начиная с битрикса, то лучше, когда вы будете работать над проектом в команде, а не в одиночку.
Аноним 2018/02/22 13:39:07  №1144193 473
>>1144090
работу на битриксе не найти. в макдаке дофига вакансий.

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

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

>>1144144
>Зависит от тебя, если ты собираешь говно и палки, то это не проблема битрикса
какой "зависит от тебя". битрикс это позволяет и поощрает. если ты работаешь на симфони, ты по крайней мере пишешь тесты, т.к. это практикуется в конторе. а на битриксе ты глушишь все нотисы и ворнинги, которые он генерит.

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

https://habrahabr.ru/post/282333/ вот есть статья, объясняющая, почему говнокод в битриксе - это проблема битрикса.

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

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

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

>>1144154
>это тупиковая ветка если есть желание уйти куда в хай лоад или биг дату со временем
я работал в конторе, которая начинала с битрикса и потом продукт стал хайлоадом. это боль, конечно.
Аноним 2018/02/22 13:46:07  №1144196 474
да, щас перечитал статью про битрикс и вспомнил код моей предыдущей конторы, где каждый файл и каждый метод начинался с
global $DB, $USER;

бррр
Аноним 2018/02/22 13:48:25  №1144197 475
>>1144163
>Смысл бесполезного хейта битрикса?
смысл защищать битрикс? если перестанешь его защищать и станешь ненавидеть как все, то со временем перекатишься на нормальный фреймворк. необязательно симфони, хоть на yii. на yii дохера работы в провинциях же.
Ответы: >>1144255
Аноним 2018/02/22 13:59:10  №1144202 476
>>1144119
на друпал обрати внимание.
Аноним 2018/02/22 14:12:23  №1144208 477
>>1144022
вообще, это достаточно объемная задача, если ты раньше такого не делал. человек, который этим уже занимался и владеет инструментами, сделает такую задачу за рабочий день спокойно. а если ты не делал, это может занять от дня до нескольких недель.

у тебя три варианта:
1. написать все с нуля на голом пхп. это не варик для продакшна, так делают только в учебных целях
2. взять фреймворк, тот же Симфони и там уже есть необходимые решения - doctrine, security, easyadminbundle. но нужна какая-то база, чтобы те же сущности ОРМ правильно выстроить.
3. взять CMS: drupal, wodrpress или любой другой. думаю, для тебя это самый быстрый путь, но там тоже придется покопаться.

вот еще есть http://cmf.symfony.com/ но я не могу его рекомендовать, т.к. сам не пользовался. по презентации http://cmf.symfony.com/slides/why_symfony_cmf.html понял, что это что-то среднее между друпалом и симфони. может другие аноны подскажут по нему
Ответы: >>1145475
Аноним 2018/02/22 14:54:07  №1144222 478
>>1144074
Мне недавно прилетел заказ на 500 рублей (мой первый заказ лол), допилить форму продажи, допилить загрузку фоток, и сделать им превьюшки. В общем до этого ковырялся я в пхп пару месяцев и буквально на базовом уровне знал html и css, ну думаю ща тут все раскидаю на изи. Открываю я этот битрикс, нихуя не понимаю, какая-то статистика скорости сайта, предлагают прям там пройти какие-то тесты блять, десять тыщь папок, шаблоны страниц в одной папке, заголовки и футеры в другой, стили в третей, оче сложная навигация, потом оказалось что у чувака сайт сверстан на таблицах, я об этом только читал на самом деле, а сейчас сам столкнулся, ну я не растерялся и ебанул таблицу в таблицу(так нужно было). Потом я еще пол дня ебался с джаваскриптом, так как до этого его не трогал вообще, но в итоге всё сделал, все довольны, лол. Пхп так и не трогал. Короче ковыряться в этом говне не вызвало у меня никаких положительных эмоций. Буду дальше пинать фреймворки и созидать.
Ответы: >>1144256
Аноним 2018/02/22 16:00:17  №1144255 479
>>1144197
Дело не в защите, плохому програмисту, всегда другие программисты мешают. Это актуально и для фреймворков.

> если перестанешь его защищать и станешь ненавидеть как все, то со временем перекатишься на нормальный фреймворк.
Вуду магия какая то.
Ответы: >>1144271
Аноним 2018/02/22 16:01:47  №1144256 480
>>1144222
>нихуя не понимаю
А если бы прилетел ларавели, ну или на друпале или вукомерце, ты бы сразу познал дзен?
Ответы: >>1144272
Аноним 2018/02/22 16:07:47  №1144258 481
>>1144131

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

В случае Агенства - достаточно просто написать названия классов, полей и методов в них. Весь код писать не надо, проверяются только навыки проектирования.
Аноним 2018/02/22 16:23:07  №1144271 482
>>1144255
>Дело не в защите, плохому програмисту, всегда другие программисты мешают. Это актуально и для фреймворков.
не понял твою мысль. если ты имеешь в виду, что человек, отказывающийся работать с говном типа битрикса и на фреймворках не сможет что-то сделать, то это не так. и на моем примере, и на примере коллег.

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

это как таксист будет говорить "мне похуй на чем бомбить, на камри или на классике - это всего лишь инструменты".
Ответы: >>1144279
Аноним 2018/02/22 16:24:39  №1144272 483
>>1144256
то не взял бы такой заказ, лол
Аноним 2018/02/22 16:32:27  №1144279 484
>>1144271
>не понял твою мысль
Имел ввиду, что хороший специалист, даже сбитриксом напишет нормальный код, не ухудшающий приложение в целом.
Так и плохой спец взяв фреймворк, все равно будет лепить код как может, сделав практически непригодным для дальнейшей поддержки без глобального рефакторинга.

Про специализацию, это само собой. Я сейчас про вкатывальщиков и начинающих, у которых в мухосрани просто нет выбора. Да и в дсах, можно прождать вакансию для вкатывающегося от года и больше.
Ответы: >>1144286 >>1144320
Аноним 2018/02/22 16:41:28  №1144286 485
>>1144279
Дело не только в коде, битрикс может вести себя непредсказуемо и это бесит. Второе: из коробки в битриcке есть много всего, но используется из этого далеко не все. Вот нахуя мне столько полей в инфоблоке? Это как пример. Я не работал с современным фреймворком, но мне кажется, что используя фреймворк ты используешь только те компоненты, которые тебе действительно нужны.
Ответы: >>1144291 >>1144324
Аноним 2018/02/22 16:47:05  №1144291 486
>>1144286
Как может код вести себя непредсказуемо? Или в фреймворках, какой то пхп, что там все предсказуемо?
В фреймворках тоже всего много, например различия ларавель или слим. Мне тоже много всего ларавельного не надо. Это не основание говорить, что это плохой фреймворк.
Мне кажется ты можешь использовать те поля, которые действительно тебе нужны?
Ответы: >>1144310 >>1144313 >>1144324
Аноним 2018/02/22 17:06:22  №1144310 487
>>1144291
Помню, как не мог понять, почему 404 при переходе на страницу новости. Дело было в том, что нужно было в настройке компонента убрать галочку и поставить ее снова. Два клика мышью у одного и того же чекбокса. Ебля с кэшированием. Разворот локальной версии - access denied, ок, поменял в базе имя хоста на локальный.
Ответы: >>1144325
Аноним 2018/02/22 17:08:35  №1144313 488
>>1144291
>Мне кажется ты можешь использовать те поля, которые действительно тебе нужны?

А потом заказчик спрашивает, почему все так тормозит
Ответы: >>1144321
Аноним 2018/02/22 17:14:21  №1144320 489
>>1144279
с битриксом наверное можно написать хороший код, но это сложно по трем причинам:
1. битрикс не способствует быстрому профессиональному росту
2. битрикс поощрает плохие практики
3. (самое главное) в конторах, где используют битрикс, обычно на хороший код кладут хер. думаю, ты с этим сам согласишься

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

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

>Да и в дсах, можно прождать вакансию для вкатывающегося от года и больше
ну нет конечно. в дс1 можно сегодня устроиться, а завтра выйти на 30к. я даже могу подсказать места, лол
Ответы: >>1144340
Аноним 2018/02/22 17:15:08  №1144321 490
>>1144313
Отвечаешь ему честно, причем тут ты то? Алсо, при отсутствии каких либо особых хотелок, кэш вполне вытягивает. Так что попробуй еще.
Аноним 2018/02/22 17:16:59  №1144324 491
>>1144286
>используя фреймворк ты используешь только те компоненты, которые тебе действительно нужны
если он компонентный, то да

>>1144291
>Мне тоже много всего ларавельного не надо
в симфони 4 ты ставишь symfony/skeleton и там по дефолту только самый минимум компонентов. нет ни профайлера, ни твига, ничего. все ставишь по желанию
Ответы: >>1144328
Аноним 2018/02/22 17:17:56  №1144325 492
>>1144310
Ну не понимание, как работает система, с которой ты работаешь, конечно же затрудняет работу.
Да и отсутствие настроенного деплоя, так же мешает.
Тут уж надо самом с этим что то делать.
Битрикс хоть и предлагает свою систему развертывания, никто ей не пользуется, так как быстрее самому сделать.
Аноним 2018/02/22 17:19:22  №1144328 493
>>1144324
>в симфони 4
А заказчик хочит ларавель, поэтому что эта модна.
То есть теперь мне надо начать ненавидеть ларавель, чтобы перейти на "нормальный фреймворк"?
Ответы: >>1144330
Аноним 2018/02/22 17:23:00  №1144330 494
>>1144328
ну нет, не надо его ненавидеть. ларавел тоже пиздатый, просто я его плохо знаю, чтобы что-то в нем советовать
Аноним 2018/02/22 17:32:43  №1144340 495
>>1144320
Все сказанное про битрикс верно, если ты попал в плохую контору, где нету хороших спецов. Актуально так же для любого другого фреймворка языка. Я как то давно легаси на кодигнайтере поддерживал. Контроллер или модель на 5-7к строк, вполне имело место быть.
Отличие от битрикса было лишь в том, что битрикс со своими компонентами на 5к строк, а тут контроллеры на столько же.

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

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

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

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

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

Ответы: >>1144393
Аноним 2018/02/22 17:48:05  №1144349 496
Нихуя себе у вас тут холивар простынями, аж с нулевой видно.
Аноним 2018/02/22 18:39:50  №1144376 497
Есть тут люди которые работали с woocommerce через rest api? Могут ли клиенты у которых нет доступа в админку для генерации ключей (consumer_key, consumer_secret) логиниться/смотреть списки товаров/покупать?
Ключи ведь привязаны к конкретным юзерам но в документации я не нашел ничего о том, как сгенерировать ключ юзера через API. Такое впечатление, что их API это чисто для юзеров с доступом в админку
Аноним 2018/02/22 19:09:44  №1144393 498
>>1144340
>если ты попал в плохую контору, где нету хороших спецов
битрикс - это низший сегмент рынка по баблу. поэтому в общем случае там экономят на качестве и хороших спецов меньше. если есть битрикс-конторы с хорошим кодом, то заебись. лично я не встречал (а я работал в двух, лол)

>отдавай предпочтения конторе, которая строит бизнес вокруг своего сайта
это 100%

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

>С нуля во фриланс, это самоубийство
ну мб

>Кому вкатывальщик без опыта нужен?
опять же после некоторых курсов могут предложить стажировку за три рубля, а после стажировки релокацию. ну то есть оффер, а ты сам эту релокацию проводишь.
Аноним 2018/02/22 20:16:12  №1144424 499
Бля пачаны первый раз в вашем треде, сильно не бейте.

Короче надо поправить форму обратной связи на лендосе и захотелось это сделать на локальном серве. Какая сейчас прога есть для этого или онлайн песочница чтобы по быстрому скормить этому всем html-css-js-php файлы и оно фурычило? Может какой-то аналог codepen jsfidle?

Алсо на компе стоит Денвер но я его год где-то не трогал, лол. Может что-то попроще есть для такой просто задачи?
Ответы: >>1144437 >>1146708
Аноним 2018/02/22 20:33:13  №1144437 500
Аноним 2018/02/22 20:34:06  №1144441 501
>>1143875
Ты по какому мануалу делаешь? В подсказках предлагают сделать профессии классами
Аноним 2018/02/22 20:44:37  №1144449 502
А задачу на файлообменник можно на mysql сделать, или все же postgres лучше будет?
Ответы: >>1144452
Аноним 2018/02/22 20:49:18  №1144452 503
>>1144449

Можно на любой СУБД. Я бы советовал брать ту, с которой раньше не работал - чтобы расширить кругозор. Если ни с одной не работал, то можно взять postgres.
Аноним 2018/02/22 21:14:30  №1144465 504
Аноним 2018/02/22 21:19:52  №1144469 505
Сука как же у меня горит от вордпресса.....
Ответы: >>1144470
Аноним 2018/02/22 21:24:25  №1144470 506
>>1144469
А что с тобой случилось?
Ответы: >>1144471
Аноним 2018/02/22 21:28:26  №1144471 507
>>1144470
Человеку сделал "фронтендер" на WPBakery Page Builder сайт для крипто-валют без оптимизации, на половину кривой. а я его второй день правлю и ахуеваю.

В конце спрошу сколько он "фронтендеру" отдал чтобы еще раз ахуеть.
Ответы: >>1144484
Аноним 2018/02/22 21:39:50  №1144475 508
>>1143597
>А как потом собирать эту информацию?
Если требуется только показывать её юзеру, то и не надо ничего собирать. А жсон в этом случае используется для удобства обработки жаваскриптом, например. Если когда-нибудь потребуется выборка, тогда и изменят схему БД и распихают жсон по табличкам, это не проблема.
Ответы: >>1144647 >>1144648 >>1144806
Аноним 2018/02/22 21:56:07  №1144484 509
>>1144471
А причем тут вп? Это же какой то бакерибулдер, и фронтендер сделали. Считай ты ему полсайта сделал.
Аноним 2018/02/23 00:18:49  №1144568 510
15193343292490.jpg (120, 1538x596)
596x1538
Почему не отправляется(или не принимается?) post запрос?
С action="register.php" пробовал, так же бесполезно.
Ответы: >>1144575 >>1144610
Аноним 2018/02/23 00:23:33  №1144569 511
Аноним 2018/02/23 00:31:39  №1144575 512
>>1144568

А что ты делаешь? Я просто виду на скриншоте точку останова (или что значит красный кружок) и пытаюсь понять, что ты делал.
Ответы: >>1144580
Аноним 2018/02/23 00:41:26  №1144580 513
15193356862980.png (56, 1221x215)
215x1221
>>1144575
Да то я случайно тыкнул.
Я пытаюсь отправить пост запрос на эту же страницу.
В хроме просто ничего не происходит, в фаерфоксе после отправки (значит, пост запрос все таки отправляет?) вот такая вот херня
Ответы: >>1144583 >>1144590
Аноним 2018/02/23 00:53:38  №1144583 514
15193364182620.jpg (198, 1641x896)
896x1641
>>1144580
upd
Если что-то покажет.
Ответы: >>1144589
Аноним 2018/02/23 01:02:15  №1144589 515
>>1144583
ну у тебя где этот register.php лежит?
у тебя форма должна слать запрос этому файлу именно.

если у тебя обработчик лежит в /htdocs/shop/register.php

то и в форме напиши action="/htdocs/shop/register.php"

Ответы: >>1144592
Аноним 2018/02/23 01:07:25  №1144590 516
>>1144580

Ну вот так и надо было писать:

- открываю такую-то страницу с таким-то URL
- ввожу в форму то-то и то-то
- жму такую-то кнопку
- вижу ошибку 404 и такой-то URL

А ты можешь сравнить URL в адресной строке, когда ты просто открываешь форму в браузере и она видна, и URL при отправке формы?

Я помню, что несколько месяцев назад анон писал про такую же проблему. и мне кажется, что дело может быть в шторме. У тебя наверно установлен PHP, ты не мог бы попробовать запустить встроенный в него сервер и открыть в браузере страницу через него? Это описано тут и потребует немного возни с командной строкой: https://github.com/codedokode/pasta/blob/master/soft/web-server.md#Встроенный-в-php-сервер

Пока моя версия - у встроенного в Шторм веб-сервера какие-то проблемы с обработкой POST запросов.

Тут пишут что $_POST приходит пустым. https://intellij-support.jetbrains.com/hc/en-us/community/posts/115000097930-Can-not-use-POST-method-in-PhpStorm

Тут пишут ( https://stackoverflow.com/questions/34785913/phpstorm-10-0-3-error-502-bad-gateway-due-to-javavm/34787827#34787827 ), что можно проверить логи phpstorm ( PHPstorm/Help/Show Log in Explorer ) - попробуй глянуть, что там?


Ответы: >>1144595 >>1144598
Аноним 2018/02/23 01:10:45  №1144592 517
15193374454410.jpg (290, 1721x1453)
1453x1721
>>1144589
Хоть так, хоть эдак не работает.
Ответы: >>1144610
Аноним 2018/02/23 01:20:15  №1144594 518
Вопрос по папке var/cache в Symfony4. По правам к ней, точнее.

Я корректно понимаю принцип работы на проде? Мы запускаем cache:clear (создается папка prod от имени нашего пользователя, права 755) и далее не позволяем системе создавать свои скомпилированные файлы в эту папку (она этого все равно сделать не сможет, т.к. пользователь у нее www-data), а создаем их сами, п